Skip to content

feat: add subscription CLI providers and devloopd automation - #894

Closed
albert-einshutoin wants to merge 36 commits into
nrslib:mainfrom
albert-einshutoin:feature/subscription-cli-providers
Closed

albert-einshutoin wants to merge 36 commits into
nrslib:mainfrom
albert-einshutoin:feature/subscription-cli-providers

Conversation

@albert-einshutoin

@albert-einshutoin albert-einshutoin commented Jun 24, 2026

Copy link
Copy Markdown

Summary

  • Add subscription CLI provider support and subscription-only policy wiring/docs.
  • Add devloopd automation capabilities for issue runs, safe merge gates, supervisor state, active runs, memory, reconciliation, and ledger export.
  • Fix non-interactive git push authentication failures so completed workflows preserve local results and surface retryable publish failure guidance.

Verification

  • npm test
  • npm run build
  • npm run lint
  • npm audit --audit-level=moderate
  • git diff --check
  • npm run test:e2e:mock

Fixes #866

Summary by CodeRabbit

  • New Features

    • devloopd CLI を追加し、診断、実行、レジャー、タイムライン、メモリ、マージ判定、課題スキャン/選択、常駐監視などの操作ができるようになりました。
    • サブスクリプション専用モードの設定と、利用可能な CLI プロバイダの選択肢が拡張されました。
  • Bug Fixes

    • Git の送信処理を非対話化し、認証プロンプトで停止しにくくなりました。
    • 失敗時も作業内容を保持し、再試行しやすくなりました。
  • Documentation

    • CLI リファレンス、設定、README、CHANGELOG を更新しました。

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 076356e5-7946-4854-bd71-fb7ce5760799

📥 Commits

Reviewing files that changed from the base of the PR and between 83b5eff and 43dbb53.

📒 Files selected for processing (20)
  • bin/devloopd.mjs
  • builtins/en/config.yaml
  • package.json
  • src/__tests__/devloopd-doctor.test.ts
  • src/__tests__/devloopd-issue-scanner.test.ts
  • src/__tests__/devloopd-ledger.test.ts
  • src/__tests__/devloopd-merge-gate.test.ts
  • src/__tests__/postExecution.test.ts
  • src/__tests__/projectConfig.test.ts
  • src/__tests__/subscription-cli-provider.test.ts
  • src/__tests__/subscription-only-policy.test.ts
  • src/core/models/config-schemas.ts
  • src/core/subscription-only/policy.ts
  • src/devloopd/doctor.ts
  • src/devloopd/issueScanner.ts
  • src/devloopd/ledger.ts
  • src/devloopd/mergeGate.ts
  • src/features/tasks/execute/postExecution.ts
  • src/infra/config/project/projectConfig.ts
  • src/infra/subscription-cli/client.ts
💤 Files with no reviewable changes (1)
  • bin/devloopd.mjs

📝 Walkthrough

Walkthrough

devloopd サイドカーCLIを新規追加し、subscription-only(CLIプロバイダのみ許可)ポリシー、issue分類・選択・実行・ledger管理・memory生成・merge-if-safe・supervisorデーモンの各機能を実装した。あわせてCLIプロバイダ型(codex-cli/opencode-cli/cursor-cli/agy-cli)を追加し、git pushを非対話化してpublishing失敗をpr_failedとして記録する仕組みを導入した。

Changes

subscription-only プロバイダと設定

Layer / File(s) Summary
プロバイダ型とスキーマ拡張
src/shared/types/provider.ts, src/core/models/provider-profiles.ts, src/core/models/schema-base.ts, src/core/models/config-types.ts, src/core/models/config-schemas.ts, builtins/en/config.yaml, src/__tests__/provider-contract-docs.test.ts
PROVIDER_TYPES/ProviderProfileName/各スキーマにCLI系プロバイダ名4種が追加され、ProjectConfigsubscriptionOnly/allowedProviders/forbiddenProvidersフィールドが追加された。
subscription-only ポリシー検証
src/core/subscription-only/policy.ts, src/core/workflow/types.ts, src/core/workflow/engine/WorkflowValidator.ts, src/features/tasks/execute/workflowExecution*.ts, src/infra/config/global/globalConfigCore.ts, src/infra/config/project/projectConfig.ts, src/infra/config/loaders/workflowFileLoader.ts, src/infra/config/resolutionCache.ts, src/infra/config/traced/tracedConfigSchema.ts, src/infra/config/global/globalConfigSerializer.ts
ポリシー検証関数群(禁止envキー検出、プロバイダ許可/拒否、ワークフロー再帰検証)が追加され、設定読み込みフローに subscription-only 整合性チェックが組み込まれた。
CLI-only プロバイダ実行
src/infra/providers/subscription-cli.ts, src/infra/providers/index.ts, src/infra/subscription-cli/client.ts
SubscriptionCliProviderが実装され、buildSubscriptionOnlyEnvでAPI-key系環境変数を削除してCLIサブプロセスを起動し、stdout/stderrをバッファ上限付きで収集する。
subscription-only テストとdocs
src/__tests__/subscription-only-policy.test.ts, src/__tests__/subscription-cli-provider.test.ts, src/__tests__/projectConfig.test.ts, docs/configuration.md, docs/configuration.ja.md, README.md, docs/README.ja.md, docs/ci-cd.md, docs/ci-cd.ja.md
ポリシー適用・CLI呼び出し・設定保存の各動作を検証するテストスイート、およびsubscription-onlyモードの説明を追記したドキュメントが追加された。

devloopd サイドカーCLI

Layer / File(s) Summary
コマンドランナーとCLIエントリポイント
src/devloopd/commandRunner.ts, bin/devloopd.mjs, package.json, src/app/devloopd/index.ts, .gitignore, .npmignore
DevloopCommandRunner、binラッパー、package.jsonへのbin登録、全サブコマンドを提供するcommanderエントリポイントが追加された。
doctor と run
src/devloopd/doctor.ts, src/devloopd/run.ts, src/__tests__/devloopd-doctor.test.ts, src/__tests__/devloopd-run.test.ts
runDevloopDoctorがsubscription-only条件を検証し、通過後にrunDevloopIssueがTAKTパイプラインを実行する。秘密値のサニタイズと詳細レポート生成を含む。
ledger・memory・active-runs
src/devloopd/ledger.ts, src/devloopd/memory.ts, src/devloopd/activeRuns.ts, src/__tests__/devloopd-ledger.test.ts, src/__tests__/devloopd-memory.test.ts, src/__tests__/devloopd-active-runs.test.ts
TACKTランをJSONL ledgerに取り込み・再調整・エクスポートする機能、タイムライン描画、Markdownメモリスナップショット生成、実行中ランのstale判定が追加された。
issue scanner/selector と merge gate
src/devloopd/issueScanner.ts, src/devloopd/issueSelector.ts, src/devloopd/mergeGate.ts, src/__tests__/devloopd-issue-scanner.test.ts, src/__tests__/devloopd-issue-selector.test.ts, src/__tests__/devloopd-merge-gate.test.ts
classifyIssueがラベル/内容に基づきissueを分類し、mergeIfSafeがラベル・draft・checks・reviewDecision・パスパターン・差分量を評価してgh pr mergeを実行する。
supervisor デーモンループ
src/devloopd/supervisor.ts, src/__tests__/devloopd-supervisor.test.ts
startDevloopがissueスキャン→選択→実行→ledgerインポートを1サイクルとして繰り返し、once/maxCycles/abortSignal/致命的条件で停止する。
devloopd ドキュメント
docs/devloopd.md, docs/devloopd.ja.md, docs/cli-reference.md, docs/cli-reference.ja.md, README.md, docs/README.ja.md
全サブコマンド(doctor/run/import-takt-run/reconcile-runs/export-ledger/timeline/memory/merge-if-safe/scan-issues/select-issue/active-runs/start)のオプション一覧と動作説明が追加された。

publishing 失敗の記録

Layer / File(s) Summary
非対話的 git push
src/infra/task/git.ts, src/__tests__/taskGit.test.ts, src/__tests__/relay-push.test.ts
getNonInteractivePushEnvが追加され、pushBranch/pushHeadToOriginBranch/relayPushCloneToOriginの全push操作にGCM_INTERACTIVE=NeverGIT_TERMINAL_PROMPT=0が渡されるようになった。
publishing 失敗の状態保存とメッセージ
src/features/tasks/execute/postExecution.ts, src/features/tasks/execute/taskResultHandler.ts, src/infra/task/taskLifecycleService.ts, src/__tests__/postExecution.test.ts, src/__tests__/taskResultHandler.test.ts
認証失敗パターンの検出と詳細メッセージ生成が追加され、pr_failed記録時のログ文言が「publishing/PR failed」に統一された。
changelog と task-management ドキュメント
CHANGELOG.md, docs/CHANGELOG.ja.md, docs/task-management.md, docs/task-management.ja.md
pr_failedステータスの追加、publishing失敗時のブランチ/commit保持の説明、takt listからの再試行手順が記載された。

Sequence Diagram(s)

sequenceDiagram
  participant User as ユーザー/CI
  participant devloopd as devloopd start
  participant Doctor as runDevloopDoctor
  participant Scanner as scanIssues(gh)
  participant TAKT as takt --pipeline
  participant Ledger as importTaktRun
  participant Git as git push (non-interactive)

  rect rgba(100, 150, 200, 0.5)
    Note over devloopd,Scanner: サイクル開始
    devloopd->>Scanner: gh issue list で候補分類
    Scanner-->>devloopd: candidates / skipped
    devloopd->>Doctor: subscription-only 検証
    Doctor-->>devloopd: passed / failed
  end

  rect rgba(100, 200, 150, 0.5)
    Note over devloopd,Git: issue 実行フロー
    devloopd->>TAKT: --pipeline --issue --workflow
    TAKT->>Git: git push (GIT_TERMINAL_PROMPT=0)
    alt 認証失敗
      Git-->>TAKT: push error
      TAKT-->>devloopd: pr_failed として記録
    else 成功
      Git-->>TAKT: pushed
      TAKT-->>devloopd: completed
    end
    devloopd->>Ledger: ledger.jsonl に takt_run_imported 追記
  end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning #866とは無関係なsubscription-only policyとdevloopd automationの大規模追加が含まれている。 subscription/devloopdの変更は別PRに分離し、このPRは非対話Git push認証失敗の修正に絞ってください。
Docstring Coverage ⚠️ Warning Docstring coverage is 0.55% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed タイトルはsubscription CLI providersとdevloopd automationという主要変更を簡潔に示している。
Linked Issues check ✅ Passed 非対話Git pushの認証失敗をpublish失敗として扱い、ローカル成果物保持とPR作成スキップも満たしている。

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8b04eaaf62

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/devloopd/mergeGate.ts
Comment thread src/core/subscription-only/policy.ts Outdated
Comment on lines +119 to +120
if (!isRawSubscriptionOnlyEnabled(rawConfig)) {
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Scan credentials after resolving subscription-only

Because this check returns unless the same raw object contains subscription_only: true, credentials in a different config layer are missed: for example, global openai_api_key plus project subscription_only: true, or project provider_options.*.apiKey plus global subscription-only. devloopd doctor checks both files, but a direct takt run only executes these per-file checks and can start under an effective subscription-only policy with forbidden API-key config still loaded.

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@bin/devloopd`:
- Around line 1-24: The devloopd CLI wrapper is still named without an
extension, so Node 20 will not treat it as ESM and the top-level
import/import.meta/await logic in the devloopd entrypoint will fail. Rename the
executable wrapper to use a .js or .mjs extension and update the package.json
bin mapping to point to the new filename, keeping the existing CLI loading logic
in devloopd intact.

In `@builtins/en/config.yaml`:
- Around line 13-16: The sample subscription-only allowlist is missing mock,
which can cause local mock-based validation to be rejected when users copy this
config. Update the commented allowed_providers example in config.yaml to include
mock alongside the existing CLI providers, and keep the sample aligned with the
actual default allowlist used by the subscription-only flow.

In `@src/__tests__/devloopd-merge-gate.test.ts`:
- Around line 77-85: Add a regression test in the merge gate test suite to cover
path-policy edge cases that `.github/**` misses: ensure `mergeIfSafe` denies
changes to a root-level `.env` file and to a nested path like
`src/middleware/auth.ts`, and that the report still shows the forbidden-path
rejection without invoking the merge runner. Use the existing `makeRunner`,
`mergeIfSafe`, and `formatMergeGateReport` test helpers so the new cases are
easy to locate alongside the current `denies forbidden paths before attempting
merge` test.

In `@src/core/models/config-schemas.ts`:
- Around line 91-93: `forbidden_providers` is still validated as arbitrary
non-empty strings, so update the schema in `config-schemas.ts` to use
`ProviderTypeSchema` just like `allowed_providers` in the same config object.
Adjust the `forbidden_providers` field definition so it only accepts the
supported provider enum values, keeping the existing optional/array shape and
ensuring `subscription_only` rules can match correctly at runtime.

In `@src/core/subscription-only/policy.ts`:
- Around line 99-113: `findForbiddenSubscriptionOnlyConfigKeyPaths` currently
stops at arrays because it only recurses through `isRecord`, so forbidden keys
nested inside array elements are missed. Update this helper in `policy.ts` to
also detect arrays and traverse each element while preserving the existing path
format, so keys like `api_key` inside nested list entries are reported by
`FORBIDDEN_CONFIG_KEYS` checks.

In `@src/devloopd/doctor.ts`:
- Around line 266-269: The visibleChecks condition in doctor.ts is incorrectly
using report.passed as part of the same ternary condition as options.verbose, so
passing checks are shown even when --verbose is not set. Update the logic around
visibleChecks to depend only on options.verbose for showing all checks, and
otherwise filter out pass checks so that a passed report still shows only the
summary and non-pass checks. Use the visibleChecks expression in doctor.ts as
the place to adjust the operator grouping/condition.

In `@src/devloopd/issueScanner.ts`:
- Around line 241-247: `parseIssues` is allowing `JSON.parse` failures to escape
and crash the `startDevloop` supervisor loop. Update `scanIssues`/`parseIssues`
to catch invalid-JSON stdout from `gh`, and return a structured failure report
instead of throwing, matching the existing rate-limit and gh-error handling with
a `failureKind` value (for example `gh_error`). Use the `parseIssues`,
`scanIssues`, and `startDevloop` symbols to keep the error path consistent and
prevent the daemon from exiting.
- Around line 161-224: `classifyIssue` is still returning the full
`RawIssueInput` via spread, which leaves the untrusted `body` field on the
runtime `IssueCandidate` object even though the type hides it. Update
`classifyIssue` to stop using `...issue` in every return path and instead build
the candidate explicitly from only the allowed fields, keeping `title` sanitized
with `sanitizeText` and ensuring `body` is never copied into the result. If you
introduce or reuse a helper such as `baseCandidate`, make it the single source
for assembling the sanitized `IssueCandidate` shape.

In `@src/devloopd/ledger.ts`:
- Around line 135-145: The `selectRunSlug` logic currently makes the
`options.latest` check meaningless because the earlier `options.runSlug` early
return leaves `!options.runSlug` always true afterward. Update `selectRunSlug`
in `ledger.ts` so it only falls back to `listRecentRuns(repoPath)[0]?.slug` when
`options.latest === true`, and otherwise returns `undefined` when no `runSlug`
is provided. Keep the explicit `options.runSlug` handling intact and make the
intent of `latest` vs. explicit slug selection clear in the `selectRunSlug`
branch structure.
- Around line 151-166: The sorting logic in listRunSlugs is re-reading each
run’s meta.json repeatedly via readRunMetaBySlug inside the compare callback,
causing avoidable I/O during sort. Precompute and cache each run’s startTime
once before sorting, then sort using that cached value so the comparison in
listRunSlugs does not call readRunMetaBySlug for every pair.
- Around line 255-259: The ledger writer in appendLedgerEvent currently creates
the parent directory and appends to the file with default umask-based
permissions, which is inconsistent with writeMemory in memory.ts. Update
appendLedgerEvent to explicitly set the same access restrictions as writeMemory
by ensuring the ledger directory is created with owner-only permissions and the
ledger file is written with owner-only permissions as well, keeping the behavior
aligned for the same task and issue metadata.

In `@src/devloopd/mergeGate.ts`:
- Around line 87-89: The merge gate path patterns in mergeGate.ts are too narrow
and only match top-level files like src/middleware.ts, not nested files such as
src/middleware/auth.ts. Update the path matching entries near the existing
src/middleware*, src/routes*, and src/config* symbols so they explicitly include
the directories and all descendant files, ensuring the safety gate catches human
review targets anywhere under those trees.
- Around line 126-134: `globToRegExp` の `**/` 変換がルート直下にマッチしないため、`**/.env*` や
`**/*secret*` が先頭階層の対象を取りこぼしています。`globToRegExp` で `segments` を正規表現化する際に、`**`
を単なる任意文字列ではなく「0個以上の階層」に対応させ、区切りスラッシュを含む場合でも先頭直下に一致するように修正してください。特に
`mergeGate.ts` 内の `globToRegExp` の `**` 置換ロジックを見直し、`POLICY_DENY` 判定で `.env` や
`secret.txt` が除外されないことを確認してください。
- Around line 317-322: `merge-if-safe` in `mergeGate.ts` currently calls `gh pr
checks --watch` via `runner.exec` without any upper bound, so it can hang
forever on pending CI. Update the `args`/`runner.exec` flow in `mergeGate` to
either use a non-watching snapshot check instead of `--watch`, or pass an
explicit timeout through `commandRunner.exec` so the wait is bounded; keep the
repo handling and exitCode check intact.
- Around line 166-168: The review decision routing in mergeGate’s handling of
input.pr.reviewDecision is too broad and currently treats REVIEW_REQUIRED as a
change request. Update the condition so requestChanges only receives
CHANGES_REQUESTED, and route REVIEW_REQUIRED into humanReview instead; use the
existing mergeGate logic around input.pr.reviewDecision and
requestChanges/humanReview to keep the classification precise.

In `@src/features/tasks/execute/postExecution.ts`:
- Around line 58-71: The publish failure message built by
buildPublishAuthFailureMessage only includes branch, commit, and detail, so add
the task identifier (and issue number if available) to the returned message.
Update the message assembly in this helper so the failure text clearly names the
affected task/issue for quick retry identification, while keeping the existing
branch and commit context intact.

In `@src/infra/config/project/projectConfig.ts`:
- Around line 272-274: `projectConfig.ts` の `savePayload`
生成ロジックで、`allowedProviders` と `forbiddenProviders`
が空配列のときも保存されてしまう非対称を直してください。`serializeGlobalConfig` と揃えて、`projectConfig`
の該当ループ(`camel`/`snake` のマッピング処理)で配列型は `length > 0` の場合のみ `savePayload`
に入れるようにし、`allowed_providers: []` や `forbidden_providers: []` が書き出されないようにします。

In `@src/infra/subscription-cli/client.ts`:
- Around line 394-437: The codex-cli setup path in callSubscriptionCli currently
builds the invocation before the try/catch, so errors from
buildSubscriptionCliInvocation or mapCodexCliSandboxMode bypass
buildErrorResponse and can also leave the temporary directory uncleaned. Move
the tempDir creation and buildSubscriptionCliInvocation call inside the try
block in callSubscriptionCli, keep the existing finally cleanup, and ensure any
thrown error is always converted through toExecError and buildErrorResponse so
provider failures surface as AgentResponse.error.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a5a20738-9e16-4d43-8043-255af11a887f

📥 Commits

Reviewing files that changed from the base of the PR and between d37cc39 and 8b04eaa.

📒 Files selected for processing (69)
  • .gitignore
  • .npmignore
  • CHANGELOG.md
  • README.md
  • bin/devloopd
  • builtins/en/config.yaml
  • docs/CHANGELOG.ja.md
  • docs/README.ja.md
  • docs/ci-cd.ja.md
  • docs/ci-cd.md
  • docs/cli-reference.ja.md
  • docs/cli-reference.md
  • docs/configuration.ja.md
  • docs/configuration.md
  • docs/devloopd.ja.md
  • docs/devloopd.md
  • docs/task-management.ja.md
  • docs/task-management.md
  • package.json
  • src/__tests__/devloopd-active-runs.test.ts
  • src/__tests__/devloopd-doctor.test.ts
  • src/__tests__/devloopd-issue-scanner.test.ts
  • src/__tests__/devloopd-issue-selector.test.ts
  • src/__tests__/devloopd-ledger.test.ts
  • src/__tests__/devloopd-memory.test.ts
  • src/__tests__/devloopd-merge-gate.test.ts
  • src/__tests__/devloopd-run.test.ts
  • src/__tests__/devloopd-supervisor.test.ts
  • src/__tests__/postExecution.test.ts
  • src/__tests__/provider-contract-docs.test.ts
  • src/__tests__/relay-push.test.ts
  • src/__tests__/subscription-cli-provider.test.ts
  • src/__tests__/subscription-only-policy.test.ts
  • src/__tests__/taskGit.test.ts
  • src/__tests__/taskResultHandler.test.ts
  • src/app/cli/program.ts
  • src/app/devloopd/index.ts
  • src/core/models/config-schemas.ts
  • src/core/models/config-types.ts
  • src/core/models/provider-profiles.ts
  • src/core/models/schema-base.ts
  • src/core/subscription-only/policy.ts
  • src/core/workflow/engine/WorkflowValidator.ts
  • src/core/workflow/types.ts
  • src/devloopd/activeRuns.ts
  • src/devloopd/commandRunner.ts
  • src/devloopd/doctor.ts
  • src/devloopd/issueScanner.ts
  • src/devloopd/issueSelector.ts
  • src/devloopd/ledger.ts
  • src/devloopd/memory.ts
  • src/devloopd/mergeGate.ts
  • src/devloopd/run.ts
  • src/devloopd/supervisor.ts
  • src/features/tasks/execute/postExecution.ts
  • src/features/tasks/execute/taskResultHandler.ts
  • src/features/tasks/execute/workflowExecution.ts
  • src/features/tasks/execute/workflowExecutionBootstrap.ts
  • src/infra/config/global/globalConfigCore.ts
  • src/infra/config/global/globalConfigSerializer.ts
  • src/infra/config/loaders/workflowFileLoader.ts
  • src/infra/config/project/projectConfig.ts
  • src/infra/config/traced/tracedConfigSchema.ts
  • src/infra/providers/index.ts
  • src/infra/providers/subscription-cli.ts
  • src/infra/subscription-cli/client.ts
  • src/infra/task/git.ts
  • src/infra/task/taskLifecycleService.ts
  • src/shared/types/provider.ts

Comment thread bin/devloopd.mjs
Comment thread builtins/en/config.yaml
Comment thread src/__tests__/devloopd-merge-gate.test.ts
Comment thread src/core/models/config-schemas.ts Outdated
Comment thread src/core/subscription-only/policy.ts Outdated
Comment thread src/devloopd/mergeGate.ts Outdated
Comment thread src/devloopd/mergeGate.ts Outdated
Comment thread src/features/tasks/execute/postExecution.ts Outdated
Comment thread src/infra/config/project/projectConfig.ts
Comment thread src/infra/subscription-cli/client.ts
@albert-einshutoin

Copy link
Copy Markdown
Author

Addressed the Codex review findings in 83b5eff7:

  • P1: **/ forbidden path patterns now match repository-root files as well as nested paths, with regression coverage for root .env.local.
  • P2: effective subscription-only mode now scans both raw parsed config layers and normalized config values, so credentials split across global/project config are rejected before workflow execution.

Verification after the fix:

  • npm test
  • npm test -- src/__tests__/it-workflow-loader.test.ts src/__tests__/subscription-only-policy.test.ts src/__tests__/devloopd-merge-gate.test.ts
  • npm run build
  • npm run lint
  • npm audit --audit-level=moderate
  • git diff --check
  • npm run test:e2e:mock

@albert-einshutoin

albert-einshutoin commented Jun 24, 2026

Copy link
Copy Markdown
Author

Verification update for PR #894:

  • CI: lint, test, e2e-mock, and Nix all succeeded.
  • CodeRabbit: succeeded.
  • Active review threads: previously resolved.
  • Merge state: mergeable / clean.
  • Merge attempt still blocked by repository permission: albert-einshutoin does not have the correct permissions to execute MergePullRequest.

No code changes needed from this side; maintainer merge is required.

@albert-einshutoin

Copy link
Copy Markdown
Author

Closing this upstream PR because the work is moving to a personal private repository instead of the official nrslib/takt repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: do not block workflow completion on non-interactive git push authentication prompts

1 participant