@deftai/directive 0.126.2 → 0.128.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/deft-hook +14 -0
- package/bin/deft-hook.cmd +14 -0
- package/dist/bin.js +4319 -3
- package/package.json +11 -21
- package/dist/agents-refresh.d.ts +0 -11
- package/dist/agents-refresh.js +0 -90
- package/dist/authz.d.ts +0 -7
- package/dist/authz.js +0 -732
- package/dist/bin.d.ts +0 -3
- package/dist/branch-fixtures.d.ts +0 -45
- package/dist/branch-fixtures.js +0 -156
- package/dist/cache.d.ts +0 -4
- package/dist/cache.js +0 -10
- package/dist/capacity-backfill.d.ts +0 -3
- package/dist/capacity-backfill.js +0 -9
- package/dist/capacity-show.d.ts +0 -3
- package/dist/capacity-show.js +0 -9
- package/dist/change-init.d.ts +0 -3
- package/dist/change-init.js +0 -59
- package/dist/changelog-check.d.ts +0 -3
- package/dist/changelog-check.js +0 -52
- package/dist/check.d.ts +0 -15
- package/dist/check.js +0 -150
- package/dist/cli-package-version.d.ts +0 -3
- package/dist/cli-package-version.js +0 -23
- package/dist/cli-router/index.d.ts +0 -8
- package/dist/cli-router/index.js +0 -44
- package/dist/cli-router/route-argv.d.ts +0 -40
- package/dist/cli-router/route-argv.js +0 -371
- package/dist/codebase-default-extractor.d.ts +0 -3
- package/dist/codebase-default-extractor.js +0 -9
- package/dist/codebase-map-fresh.d.ts +0 -3
- package/dist/codebase-map-fresh.js +0 -9
- package/dist/codebase-map.d.ts +0 -3
- package/dist/codebase-map.js +0 -9
- package/dist/codebase-projection-registry.d.ts +0 -3
- package/dist/codebase-projection-registry.js +0 -9
- package/dist/codebase-provider.d.ts +0 -3
- package/dist/codebase-provider.js +0 -9
- package/dist/commit-lint.d.ts +0 -3
- package/dist/commit-lint.js +0 -44
- package/dist/content-validate-cli/validate-links.d.ts +0 -11
- package/dist/content-validate-cli/validate-links.js +0 -37
- package/dist/content-validate-cli/validate-strategy-output.d.ts +0 -13
- package/dist/content-validate-cli/validate-strategy-output.js +0 -56
- package/dist/content-validate-cli/verify-capacity.d.ts +0 -12
- package/dist/content-validate-cli/verify-capacity.js +0 -54
- package/dist/coverage-hotspots.d.ts +0 -21
- package/dist/coverage-hotspots.js +0 -198
- package/dist/design-critique-spend-resolve.d.ts +0 -18
- package/dist/design-critique-spend-resolve.js +0 -191
- package/dist/directive-finish-loop.d.ts +0 -3
- package/dist/directive-finish-loop.js +0 -10
- package/dist/dispatch.d.ts +0 -193
- package/dist/dispatch.js +0 -3091
- package/dist/doctor.d.ts +0 -19
- package/dist/doctor.js +0 -155
- package/dist/entrypoint.d.ts +0 -6
- package/dist/entrypoint.js +0 -19
- package/dist/escalation-cli.d.ts +0 -4
- package/dist/escalation-cli.js +0 -301
- package/dist/eval-health.d.ts +0 -13
- package/dist/eval-health.js +0 -63
- package/dist/eval-report.d.ts +0 -15
- package/dist/eval-report.js +0 -97
- package/dist/eval-run.d.ts +0 -17
- package/dist/eval-run.js +0 -122
- package/dist/eval-triggers.d.ts +0 -12
- package/dist/eval-triggers.js +0 -56
- package/dist/framework-check-updates.d.ts +0 -10
- package/dist/framework-check-updates.js +0 -68
- package/dist/gates-cli/_helpers.d.ts +0 -24
- package/dist/gates-cli/_helpers.js +0 -115
- package/dist/gates-cli/verify-bridge-drift.d.ts +0 -11
- package/dist/gates-cli/verify-bridge-drift.js +0 -47
- package/dist/gates-cli/verify-go-freeze.d.ts +0 -11
- package/dist/gates-cli/verify-go-freeze.js +0 -48
- package/dist/hook-bin.d.ts +0 -3
- package/dist/hook-bin.js +0 -11
- package/dist/hook-dispatch.d.ts +0 -80
- package/dist/hook-dispatch.js +0 -186
- package/dist/human-presence-mint.d.ts +0 -70
- package/dist/human-presence-mint.js +0 -204
- package/dist/identity-banner.d.ts +0 -13
- package/dist/identity-banner.js +0 -19
- package/dist/index.d.ts +0 -11
- package/dist/index.js +0 -14
- package/dist/init-cli/constants.d.ts +0 -42
- package/dist/init-cli/constants.js +0 -42
- package/dist/init-cli/help.d.ts +0 -9
- package/dist/init-cli/help.js +0 -43
- package/dist/init-cli/init.d.ts +0 -26
- package/dist/init-cli/init.js +0 -80
- package/dist/init-cli/migrate.d.ts +0 -3
- package/dist/init-cli/migrate.js +0 -51
- package/dist/init-cli/resolve-binary.d.ts +0 -34
- package/dist/init-cli/resolve-binary.js +0 -78
- package/dist/init-cli/run-deft-install.d.ts +0 -23
- package/dist/init-cli/run-deft-install.js +0 -71
- package/dist/init-cli/update.d.ts +0 -5
- package/dist/init-cli/update.js +0 -38
- package/dist/install-cli/coverage-map.d.ts +0 -14
- package/dist/install-cli/coverage-map.js +0 -113
- package/dist/install-uninstall.d.ts +0 -3
- package/dist/install-uninstall.js +0 -44
- package/dist/install-upgrade.d.ts +0 -41
- package/dist/install-upgrade.js +0 -86
- package/dist/lifecycle-cli/coverage-map.d.ts +0 -16
- package/dist/lifecycle-cli/coverage-map.js +0 -254
- package/dist/lifecycle-cli/helpers.d.ts +0 -8
- package/dist/lifecycle-cli/helpers.js +0 -20
- package/dist/lifecycle-event.d.ts +0 -11
- package/dist/lifecycle-event.js +0 -45
- package/dist/lifecycle-stats.d.ts +0 -12
- package/dist/lifecycle-stats.js +0 -100
- package/dist/migrate-category-b.d.ts +0 -9
- package/dist/migrate-category-b.js +0 -52
- package/dist/migrate-preflight.d.ts +0 -10
- package/dist/migrate-preflight.js +0 -85
- package/dist/migrate-xbrief.d.ts +0 -11
- package/dist/migrate-xbrief.js +0 -88
- package/dist/occupancy-grant.d.ts +0 -18
- package/dist/occupancy-grant.js +0 -121
- package/dist/occupancy-heartbeat.d.ts +0 -8
- package/dist/occupancy-heartbeat.js +0 -63
- package/dist/occupancy-release.d.ts +0 -23
- package/dist/occupancy-release.js +0 -102
- package/dist/occupancy-steal.d.ts +0 -10
- package/dist/occupancy-steal.js +0 -83
- package/dist/occupancy-unrecognized.d.ts +0 -3
- package/dist/occupancy-unrecognized.js +0 -5
- package/dist/orchestration-cli/coverage-map.d.ts +0 -21
- package/dist/orchestration-cli/coverage-map.js +0 -225
- package/dist/orchestration-cli/helpers.d.ts +0 -11
- package/dist/orchestration-cli/helpers.js +0 -35
- package/dist/ownership-doctor.d.ts +0 -10
- package/dist/ownership-doctor.js +0 -96
- package/dist/ownership-fix.d.ts +0 -10
- package/dist/ownership-fix.js +0 -93
- package/dist/plan-sequence.d.ts +0 -14
- package/dist/plan-sequence.js +0 -258
- package/dist/policy-fixtures.d.ts +0 -33
- package/dist/policy-fixtures.js +0 -118
- package/dist/policy.d.ts +0 -37
- package/dist/policy.js +0 -744
- package/dist/pr-closing-keywords.d.ts +0 -3
- package/dist/pr-closing-keywords.js +0 -10
- package/dist/pr-finish-loop.d.ts +0 -3
- package/dist/pr-finish-loop.js +0 -10
- package/dist/pr-merge-readiness.d.ts +0 -3
- package/dist/pr-merge-readiness.js +0 -10
- package/dist/pr-monitor.d.ts +0 -3
- package/dist/pr-monitor.js +0 -10
- package/dist/pr-protected-issues.d.ts +0 -3
- package/dist/pr-protected-issues.js +0 -10
- package/dist/pr-wait-mergeable.d.ts +0 -3
- package/dist/pr-wait-mergeable.js +0 -10
- package/dist/pr-watch.d.ts +0 -3
- package/dist/pr-watch.js +0 -10
- package/dist/pre-pr-run.d.ts +0 -39
- package/dist/pre-pr-run.js +0 -514
- package/dist/preflight-cache.d.ts +0 -18
- package/dist/preflight-cache.js +0 -113
- package/dist/preflight-gh.d.ts +0 -15
- package/dist/preflight-gh.js +0 -143
- package/dist/probe-session.d.ts +0 -3
- package/dist/probe-session.js +0 -10
- package/dist/release-e2e-fixtures.d.ts +0 -29
- package/dist/release-e2e-fixtures.js +0 -38
- package/dist/release-e2e.d.ts +0 -3
- package/dist/release-e2e.js +0 -10
- package/dist/release-publish.d.ts +0 -3
- package/dist/release-publish.js +0 -10
- package/dist/release-rollback.d.ts +0 -3
- package/dist/release-rollback.js +0 -10
- package/dist/release-wait-npm.d.ts +0 -3
- package/dist/release-wait-npm.js +0 -10
- package/dist/release.d.ts +0 -3
- package/dist/release.js +0 -10
- package/dist/render-cli/deft-ts-runner.d.ts +0 -17
- package/dist/render-cli/deft-ts-runner.js +0 -19
- package/dist/render-cli/export-spec-cli.d.ts +0 -2
- package/dist/render-cli/export-spec-cli.js +0 -6
- package/dist/render-cli/prd-render-cli.d.ts +0 -2
- package/dist/render-cli/prd-render-cli.js +0 -37
- package/dist/render-cli/project-render-cli.d.ts +0 -2
- package/dist/render-cli/project-render-cli.js +0 -6
- package/dist/render-cli/rule-map-cli.d.ts +0 -2
- package/dist/render-cli/rule-map-cli.js +0 -5
- package/dist/render-cli/spec-reconstruct-cli.d.ts +0 -3
- package/dist/render-cli/spec-reconstruct-cli.js +0 -15
- package/dist/render-cli/spec-render-cli.d.ts +0 -2
- package/dist/render-cli/spec-render-cli.js +0 -39
- package/dist/render-cli/spec-validate-cli.d.ts +0 -2
- package/dist/render-cli/spec-validate-cli.js +0 -38
- package/dist/review-monitor-register.d.ts +0 -19
- package/dist/review-monitor-register.js +0 -183
- package/dist/review-monitor-release.d.ts +0 -14
- package/dist/review-monitor-release.js +0 -123
- package/dist/scm-sync-default.d.ts +0 -34
- package/dist/scm-sync-default.js +0 -210
- package/dist/scope-lifecycle.d.ts +0 -4
- package/dist/scope-lifecycle.js +0 -34
- package/dist/scope-record-approved-scope.d.ts +0 -29
- package/dist/scope-record-approved-scope.js +0 -319
- package/dist/scope-record-intent-constraint.d.ts +0 -16
- package/dist/scope-record-intent-constraint.js +0 -202
- package/dist/scope-record-observable-scope.d.ts +0 -16
- package/dist/scope-record-observable-scope.js +0 -204
- package/dist/session-ready.d.ts +0 -15
- package/dist/session-ready.js +0 -144
- package/dist/session-start.d.ts +0 -56
- package/dist/session-start.js +0 -581
- package/dist/slice.d.ts +0 -4
- package/dist/slice.js +0 -34
- package/dist/story-ready-fixtures.d.ts +0 -47
- package/dist/story-ready-fixtures.js +0 -137
- package/dist/subagent-monitor.d.ts +0 -3
- package/dist/subagent-monitor.js +0 -10
- package/dist/subagent-pre-cancel.d.ts +0 -21
- package/dist/subagent-pre-cancel.js +0 -240
- package/dist/subagent-steer-write.d.ts +0 -41
- package/dist/subagent-steer-write.js +0 -333
- package/dist/toolchain-check.d.ts +0 -8
- package/dist/toolchain-check.js +0 -54
- package/dist/triage-actions.d.ts +0 -23
- package/dist/triage-actions.js +0 -233
- package/dist/triage-aux-a-fixtures.d.ts +0 -33
- package/dist/triage-aux-a-fixtures.js +0 -107
- package/dist/triage-aux-b-fixtures.d.ts +0 -30
- package/dist/triage-aux-b-fixtures.js +0 -167
- package/dist/triage-bootstrap-fixtures.d.ts +0 -42
- package/dist/triage-bootstrap-fixtures.js +0 -139
- package/dist/triage-bootstrap.d.ts +0 -24
- package/dist/triage-bootstrap.js +0 -175
- package/dist/triage-bulk.d.ts +0 -17
- package/dist/triage-bulk.js +0 -154
- package/dist/triage-classify-fixtures.d.ts +0 -38
- package/dist/triage-classify-fixtures.js +0 -137
- package/dist/triage-classify.d.ts +0 -45
- package/dist/triage-classify.js +0 -287
- package/dist/triage-evaluate.d.ts +0 -14
- package/dist/triage-evaluate.js +0 -153
- package/dist/triage-help.d.ts +0 -3
- package/dist/triage-help.js +0 -10
- package/dist/triage-queue-fixtures.d.ts +0 -59
- package/dist/triage-queue-fixtures.js +0 -284
- package/dist/triage-queue.d.ts +0 -38
- package/dist/triage-queue.js +0 -391
- package/dist/triage-reconcile.d.ts +0 -11
- package/dist/triage-reconcile.js +0 -76
- package/dist/triage-refresh.d.ts +0 -7
- package/dist/triage-refresh.js +0 -37
- package/dist/triage-scope-drift.d.ts +0 -12
- package/dist/triage-scope-drift.js +0 -117
- package/dist/triage-scope-fixtures.d.ts +0 -32
- package/dist/triage-scope-fixtures.js +0 -131
- package/dist/triage-scope.d.ts +0 -4
- package/dist/triage-scope.js +0 -34
- package/dist/triage-smoketest.d.ts +0 -3
- package/dist/triage-smoketest.js +0 -43
- package/dist/triage-strip-withdrawn.d.ts +0 -21
- package/dist/triage-strip-withdrawn.js +0 -102
- package/dist/triage-subscribe.d.ts +0 -15
- package/dist/triage-subscribe.js +0 -157
- package/dist/triage-summary.d.ts +0 -14
- package/dist/triage-summary.js +0 -83
- package/dist/triage-welcome.d.ts +0 -14
- package/dist/triage-welcome.js +0 -121
- package/dist/ts-check-lane.d.ts +0 -9
- package/dist/ts-check-lane.js +0 -49
- package/dist/umbrella-current-shape.d.ts +0 -9
- package/dist/umbrella-current-shape.js +0 -56
- package/dist/vbrief-activate.d.ts +0 -3
- package/dist/vbrief-activate.js +0 -7
- package/dist/vbrief-build.d.ts +0 -3
- package/dist/vbrief-build.js +0 -8
- package/dist/vbrief-preflight-fixtures.d.ts +0 -32
- package/dist/vbrief-preflight-fixtures.js +0 -79
- package/dist/vbrief-preflight.d.ts +0 -13
- package/dist/vbrief-preflight.js +0 -141
- package/dist/vbrief-reconcile.d.ts +0 -3
- package/dist/vbrief-reconcile.js +0 -7
- package/dist/vbrief-validate.d.ts +0 -3
- package/dist/vbrief-validate.js +0 -8
- package/dist/vbrief-validation.d.ts +0 -3
- package/dist/vbrief-validation.js +0 -8
- package/dist/verify-ac.d.ts +0 -28
- package/dist/verify-ac.js +0 -439
- package/dist/verify-agents-md-advisory.d.ts +0 -19
- package/dist/verify-agents-md-advisory.js +0 -65
- package/dist/verify-agents-md-budget.d.ts +0 -12
- package/dist/verify-agents-md-budget.js +0 -71
- package/dist/verify-branch.d.ts +0 -14
- package/dist/verify-branch.js +0 -81
- package/dist/verify-class-checks.d.ts +0 -11
- package/dist/verify-class-checks.js +0 -71
- package/dist/verify-cohort-review-monitors.d.ts +0 -5
- package/dist/verify-cohort-review-monitors.js +0 -11
- package/dist/verify-completed-tracked.d.ts +0 -19
- package/dist/verify-completed-tracked.js +0 -202
- package/dist/verify-completed-write-guard.d.ts +0 -13
- package/dist/verify-completed-write-guard.js +0 -84
- package/dist/verify-consumer-check-contract.d.ts +0 -12
- package/dist/verify-consumer-check-contract.js +0 -70
- package/dist/verify-consumer-header-placeholder.d.ts +0 -12
- package/dist/verify-consumer-header-placeholder.js +0 -73
- package/dist/verify-consumer-test-lane.d.ts +0 -12
- package/dist/verify-consumer-test-lane.js +0 -57
- package/dist/verify-durable-effect-acquisition.d.ts +0 -13
- package/dist/verify-durable-effect-acquisition.js +0 -70
- package/dist/verify-encoding.d.ts +0 -15
- package/dist/verify-encoding.js +0 -83
- package/dist/verify-eval-health-relocation.d.ts +0 -16
- package/dist/verify-eval-health-relocation.js +0 -93
- package/dist/verify-eval-triggers-relocation.d.ts +0 -14
- package/dist/verify-eval-triggers-relocation.js +0 -74
- package/dist/verify-evaluator-surface.d.ts +0 -15
- package/dist/verify-evaluator-surface.js +0 -87
- package/dist/verify-forward-coverage.d.ts +0 -19
- package/dist/verify-forward-coverage.js +0 -144
- package/dist/verify-hooks-installed.d.ts +0 -24
- package/dist/verify-hooks-installed.js +0 -140
- package/dist/verify-intent-constraint.d.ts +0 -17
- package/dist/verify-intent-constraint.js +0 -110
- package/dist/verify-investigation.d.ts +0 -3
- package/dist/verify-investigation.js +0 -10
- package/dist/verify-judgment-gates.d.ts +0 -3
- package/dist/verify-judgment-gates.js +0 -10
- package/dist/verify-l4-owner.d.ts +0 -15
- package/dist/verify-l4-owner.js +0 -132
- package/dist/verify-lifecycle-visible.d.ts +0 -13
- package/dist/verify-lifecycle-visible.js +0 -68
- package/dist/verify-literal-ac.d.ts +0 -14
- package/dist/verify-literal-ac.js +0 -168
- package/dist/verify-no-task-runtime.d.ts +0 -3
- package/dist/verify-no-task-runtime.js +0 -16
- package/dist/verify-observable-scope.d.ts +0 -17
- package/dist/verify-observable-scope.js +0 -110
- package/dist/verify-operator-scope-limit.d.ts +0 -17
- package/dist/verify-operator-scope-limit.js +0 -285
- package/dist/verify-orphan-active.d.ts +0 -17
- package/dist/verify-orphan-active.js +0 -135
- package/dist/verify-ownership.d.ts +0 -10
- package/dist/verify-ownership.js +0 -90
- package/dist/verify-persisted-planning-narratives.d.ts +0 -12
- package/dist/verify-persisted-planning-narratives.js +0 -82
- package/dist/verify-plan-sequence.d.ts +0 -14
- package/dist/verify-plan-sequence.js +0 -138
- package/dist/verify-pr-closeout-attestable.d.ts +0 -15
- package/dist/verify-pr-closeout-attestable.js +0 -114
- package/dist/verify-presentation-ceiling.d.ts +0 -11
- package/dist/verify-presentation-ceiling.js +0 -71
- package/dist/verify-presentation-coverage.d.ts +0 -14
- package/dist/verify-presentation-coverage.js +0 -90
- package/dist/verify-review-monitor.d.ts +0 -32
- package/dist/verify-review-monitor.js +0 -362
- package/dist/verify-scope-provenance.d.ts +0 -16
- package/dist/verify-scope-provenance.js +0 -91
- package/dist/verify-session-ritual.d.ts +0 -23
- package/dist/verify-session-ritual.js +0 -144
- package/dist/verify-source-cli/rule-ownership-lint.d.ts +0 -12
- package/dist/verify-source-cli/rule-ownership-lint.js +0 -61
- package/dist/verify-source-cli/verify-biome-config.d.ts +0 -11
- package/dist/verify-source-cli/verify-biome-config.js +0 -46
- package/dist/verify-source-cli/verify-closing-keywords.d.ts +0 -35
- package/dist/verify-source-cli/verify-closing-keywords.js +0 -139
- package/dist/verify-source-cli/verify-consumer-hard-stops.d.ts +0 -16
- package/dist/verify-source-cli/verify-consumer-hard-stops.js +0 -99
- package/dist/verify-source-cli/verify-contained-writes.d.ts +0 -13
- package/dist/verify-source-cli/verify-contained-writes.js +0 -67
- package/dist/verify-source-cli/verify-content-manifest.d.ts +0 -12
- package/dist/verify-source-cli/verify-content-manifest.js +0 -61
- package/dist/verify-source-cli/verify-contract-drift.d.ts +0 -11
- package/dist/verify-source-cli/verify-contract-drift.js +0 -47
- package/dist/verify-source-cli/verify-cursor-tier1.d.ts +0 -12
- package/dist/verify-source-cli/verify-cursor-tier1.js +0 -51
- package/dist/verify-source-cli/verify-deposit-closure.d.ts +0 -12
- package/dist/verify-source-cli/verify-deposit-closure.js +0 -52
- package/dist/verify-source-cli/verify-openclaw-tier1.d.ts +0 -12
- package/dist/verify-source-cli/verify-openclaw-tier1.js +0 -51
- package/dist/verify-source-cli/verify-scm-boundary.d.ts +0 -13
- package/dist/verify-source-cli/verify-scm-boundary.js +0 -66
- package/dist/verify-source-cli/verify-semantic-single-source.d.ts +0 -11
- package/dist/verify-source-cli/verify-semantic-single-source.js +0 -49
- package/dist/verify-source-cli/verify-skill-external-fetch-gate.d.ts +0 -11
- package/dist/verify-source-cli/verify-skill-external-fetch-gate.js +0 -46
- package/dist/verify-source-cli/verify-spec-drift.d.ts +0 -3
- package/dist/verify-source-cli/verify-spec-drift.js +0 -15
- package/dist/verify-source-cli/verify-spec-prd-fresh.d.ts +0 -3
- package/dist/verify-source-cli/verify-spec-prd-fresh.js +0 -15
- package/dist/verify-source-cli/verify-stubs.d.ts +0 -11
- package/dist/verify-source-cli/verify-stubs.js +0 -27
- package/dist/verify-source-cli/verify-telemetry-coverage.d.ts +0 -13
- package/dist/verify-source-cli/verify-telemetry-coverage.js +0 -67
- package/dist/verify-source-cli/verify-xbrief-drift.d.ts +0 -15
- package/dist/verify-source-cli/verify-xbrief-drift.js +0 -80
- package/dist/verify-story-ready.d.ts +0 -18
- package/dist/verify-story-ready.js +0 -190
- package/dist/verify-subagent-alive.d.ts +0 -21
- package/dist/verify-subagent-alive.js +0 -219
- package/dist/verify-subagent-steer.d.ts +0 -19
- package/dist/verify-subagent-steer.js +0 -136
- package/dist/verify-test-boundary.d.ts +0 -12
- package/dist/verify-test-boundary.js +0 -80
- package/dist/verify-tools.d.ts +0 -13
- package/dist/verify-tools.js +0 -67
- package/dist/verify-wip-cap.d.ts +0 -13
- package/dist/verify-wip-cap.js +0 -62
- package/dist/windows-bin-ps1.d.ts +0 -39
- package/dist/windows-bin-ps1.js +0 -226
- package/dist/wip-cap-fixtures.d.ts +0 -37
- package/dist/wip-cap-fixtures.js +0 -122
- package/dist/wsl-ownership-guard.d.ts +0 -2
- package/dist/wsl-ownership-guard.js +0 -15
- package/dist/xbrief-create.d.ts +0 -3
- package/dist/xbrief-create.js +0 -9
- package/dist/xbrief-verify.d.ts +0 -3
- package/dist/xbrief-verify.js +0 -9
- package/scripts/remove-windows-ps1-shims.mjs +0 -26
package/dist/policy.js
DELETED
|
@@ -1,744 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Policy CLI (#1722): `policy:show` and `policy:allow-direct-commits` surfaces,
|
|
4
|
-
* mirroring scripts/_policy_show_cli.py and scripts/policy_set.py.
|
|
5
|
-
*/
|
|
6
|
-
import { existsSync } from "node:fs";
|
|
7
|
-
import { resolve as pathResolve, relative } from "node:path";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
|
-
import { ALLOW_BOT_MERGE_CAPABILITY_COST, ALLOW_DESTRUCTIVE_GH_VERBS_CAPABILITY_COST, CEREMONY_DEPTHS, clearValueFeedback, createNoDeftDirectiveFlag, describeShadowedPlanExtension, detectNoDeftDirective, detectShadowedPlanExtensions, disableHostHooks, disclosureLine, enableValueFeedback, FIELD_VALUE_FEEDBACK, FIELD_VALUE_FEEDBACK_CLI_ALIAS, formatValueFeedbackStatusLine, humanMergeDisclosureLine, inspectAllPolicies, inspectOnePolicy, loadProjectDefinition, NO_DEFT_DIRECTIVE_DISABLED_MESSAGE, NO_DEFT_DIRECTIVE_FLAG_NAME, NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE, POLICY_AUDIT_NOOP_STDOUT, parseHookHost, policyColonInvocation, projectDefinitionPath, promoteSpecGuardDriftEnforcement, pythonListRepr, pythonStringRepr, registeredPolicyNames, removeNoDeftDirectiveFlag, renderJson, renderText, resolveHumanMergePolicy, resolvePolicy, resolveValueFeedback, SPEC_GUARD_ENFORCEMENTS, setAllowDestructiveGhVerbs, setCeremonyDial, setPolicy, setRequireHumanMerge, } from "@deftai/directive-core/policy";
|
|
10
|
-
const CAPABILITY_COST_DISCLOSURE = "\u26a0 Capability-cost disclosure -- enabling direct commits to the default " +
|
|
11
|
-
"branch turns OFF the deft branch-protection policy.\n" +
|
|
12
|
-
" \u2022 Pre-commit + pre-push hooks will no longer block default-branch " +
|
|
13
|
-
"commits.\n" +
|
|
14
|
-
" \u2022 verify:branch will pass on the default branch.\n" +
|
|
15
|
-
" \u2022 The CI sanity check (head_ref != base_ref) is still independent and " +
|
|
16
|
-
"will continue to flag master->master PRs.\n" +
|
|
17
|
-
" \u2022 This change is reversible: run `" +
|
|
18
|
-
policyColonInvocation("enforce-branches") +
|
|
19
|
-
"` to " +
|
|
20
|
-
"re-enable the gate.\n" +
|
|
21
|
-
" \u2022 The change is recorded to meta/policy-changes.log for auditability.";
|
|
22
|
-
function makeSetError(message) {
|
|
23
|
-
return {
|
|
24
|
-
cmd: "show",
|
|
25
|
-
confirm: false,
|
|
26
|
-
actor: "",
|
|
27
|
-
note: "",
|
|
28
|
-
projectRoot: ".",
|
|
29
|
-
format: "text",
|
|
30
|
-
changedOnly: false,
|
|
31
|
-
field: null,
|
|
32
|
-
error: message,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
function parseProjectRoot(argv) {
|
|
36
|
-
let projectRoot = ".";
|
|
37
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
38
|
-
const arg = argv[i];
|
|
39
|
-
if (arg === "--project-root") {
|
|
40
|
-
const v = argv[i + 1];
|
|
41
|
-
if (v === undefined) {
|
|
42
|
-
return { projectRoot: ".", error: "argument --project-root: expected one argument" };
|
|
43
|
-
}
|
|
44
|
-
projectRoot = v;
|
|
45
|
-
i += 1;
|
|
46
|
-
}
|
|
47
|
-
else if (arg?.startsWith("--project-root=")) {
|
|
48
|
-
projectRoot = arg.slice("--project-root=".length);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
return { projectRoot: ".", error: `unrecognized argument: ${arg}` };
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return { projectRoot };
|
|
55
|
-
}
|
|
56
|
-
/** Parse policy:show flags (mirrors _policy_show_cli.py). */
|
|
57
|
-
export function parseShowArgs(argv) {
|
|
58
|
-
const parsed = {
|
|
59
|
-
format: "text",
|
|
60
|
-
changedOnly: false,
|
|
61
|
-
field: null,
|
|
62
|
-
projectRoot: ".",
|
|
63
|
-
};
|
|
64
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
65
|
-
const arg = argv[i];
|
|
66
|
-
if (arg === "--format") {
|
|
67
|
-
const v = argv[i + 1];
|
|
68
|
-
if (v !== "text" && v !== "json") {
|
|
69
|
-
return {
|
|
70
|
-
...parsed,
|
|
71
|
-
error: v === undefined ? "argument --format: expected one argument" : `invalid choice: '${v}'`,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
parsed.format = v;
|
|
75
|
-
i += 1;
|
|
76
|
-
}
|
|
77
|
-
else if (arg?.startsWith("--format=")) {
|
|
78
|
-
const v = arg.slice("--format=".length);
|
|
79
|
-
if (v !== "text" && v !== "json") {
|
|
80
|
-
return { ...parsed, error: `invalid choice: '${v}'` };
|
|
81
|
-
}
|
|
82
|
-
parsed.format = v;
|
|
83
|
-
}
|
|
84
|
-
else if (arg === "--changed-only") {
|
|
85
|
-
parsed.changedOnly = true;
|
|
86
|
-
}
|
|
87
|
-
else if (arg === "--field") {
|
|
88
|
-
const v = argv[i + 1];
|
|
89
|
-
if (v === undefined)
|
|
90
|
-
return { ...parsed, error: "argument --field: expected one argument" };
|
|
91
|
-
parsed.field = v;
|
|
92
|
-
i += 1;
|
|
93
|
-
}
|
|
94
|
-
else if (arg?.startsWith("--field=")) {
|
|
95
|
-
parsed.field = arg.slice("--field=".length);
|
|
96
|
-
}
|
|
97
|
-
else if (arg === "--project-root") {
|
|
98
|
-
const v = argv[i + 1];
|
|
99
|
-
if (v === undefined) {
|
|
100
|
-
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
101
|
-
}
|
|
102
|
-
parsed.projectRoot = v;
|
|
103
|
-
i += 1;
|
|
104
|
-
}
|
|
105
|
-
else if (arg?.startsWith("--project-root=")) {
|
|
106
|
-
parsed.projectRoot = arg.slice("--project-root=".length);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return parsed;
|
|
113
|
-
}
|
|
114
|
-
/** Parse argv for the policy CLI (show + set subcommands). */
|
|
115
|
-
export function parseArgs(argv) {
|
|
116
|
-
if (argv.length === 0) {
|
|
117
|
-
const usage = "usage: policy [show|enforce-branches|allow-direct-commits|allow-destructive-gh-verbs|enforce-destructive-gh-verbs|allow-bot-merge|enable-value-feedback|clear-value-feedback|set-ceremony-dial|set-spec-guard-enforcement|disable-host-hooks|disable-directive|enable-directive|resolve] ...";
|
|
118
|
-
return makeSetError(usage);
|
|
119
|
-
}
|
|
120
|
-
const cmd = argv[0];
|
|
121
|
-
if (cmd === "set-spec-guard-enforcement") {
|
|
122
|
-
let confirm = false;
|
|
123
|
-
let actor = policyColonInvocation("set-spec-guard-enforcement");
|
|
124
|
-
let note = "";
|
|
125
|
-
let projectRoot = ".";
|
|
126
|
-
let specGuardEnforcement;
|
|
127
|
-
for (let i = 1; i < argv.length; i += 1) {
|
|
128
|
-
const arg = argv[i];
|
|
129
|
-
if (arg === "--confirm") {
|
|
130
|
-
confirm = true;
|
|
131
|
-
}
|
|
132
|
-
else if (arg === "--actor") {
|
|
133
|
-
const v = argv[i + 1];
|
|
134
|
-
if (v === undefined)
|
|
135
|
-
return makeSetError("argument --actor: expected one argument");
|
|
136
|
-
actor = v;
|
|
137
|
-
i += 1;
|
|
138
|
-
}
|
|
139
|
-
else if (arg?.startsWith("--actor=")) {
|
|
140
|
-
actor = arg.slice("--actor=".length);
|
|
141
|
-
}
|
|
142
|
-
else if (arg === "--note") {
|
|
143
|
-
const v = argv[i + 1];
|
|
144
|
-
if (v === undefined)
|
|
145
|
-
return makeSetError("argument --note: expected one argument");
|
|
146
|
-
note = v;
|
|
147
|
-
i += 1;
|
|
148
|
-
}
|
|
149
|
-
else if (arg?.startsWith("--note=")) {
|
|
150
|
-
note = arg.slice("--note=".length);
|
|
151
|
-
}
|
|
152
|
-
else if (arg === "--set") {
|
|
153
|
-
const v = argv[i + 1];
|
|
154
|
-
if (v === undefined) {
|
|
155
|
-
return makeSetError("argument --set: expected advise|shadow|enforce");
|
|
156
|
-
}
|
|
157
|
-
if (!SPEC_GUARD_ENFORCEMENTS.has(v)) {
|
|
158
|
-
return makeSetError(`argument --set: expected advise|shadow|enforce, got ${JSON.stringify(v)}`);
|
|
159
|
-
}
|
|
160
|
-
specGuardEnforcement = v;
|
|
161
|
-
i += 1;
|
|
162
|
-
}
|
|
163
|
-
else if (arg?.startsWith("--set=")) {
|
|
164
|
-
const v = arg.slice("--set=".length);
|
|
165
|
-
if (!SPEC_GUARD_ENFORCEMENTS.has(v)) {
|
|
166
|
-
return makeSetError(`argument --set: expected advise|shadow|enforce, got ${JSON.stringify(v)}`);
|
|
167
|
-
}
|
|
168
|
-
specGuardEnforcement = v;
|
|
169
|
-
}
|
|
170
|
-
else if (arg === "--project-root") {
|
|
171
|
-
const v = argv[i + 1];
|
|
172
|
-
if (v === undefined)
|
|
173
|
-
return makeSetError("argument --project-root: expected one argument");
|
|
174
|
-
projectRoot = v;
|
|
175
|
-
i += 1;
|
|
176
|
-
}
|
|
177
|
-
else if (arg?.startsWith("--project-root=")) {
|
|
178
|
-
projectRoot = arg.slice("--project-root=".length);
|
|
179
|
-
}
|
|
180
|
-
else if (arg === "--") {
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
return makeSetError(`unrecognized argument: ${arg}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return {
|
|
187
|
-
cmd: "set-spec-guard-enforcement",
|
|
188
|
-
confirm,
|
|
189
|
-
actor,
|
|
190
|
-
note,
|
|
191
|
-
projectRoot,
|
|
192
|
-
format: "text",
|
|
193
|
-
changedOnly: false,
|
|
194
|
-
field: null,
|
|
195
|
-
specGuardEnforcement,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
if (cmd === "show") {
|
|
199
|
-
const show = parseShowArgs(argv.slice(1));
|
|
200
|
-
return {
|
|
201
|
-
cmd: "show",
|
|
202
|
-
confirm: false,
|
|
203
|
-
actor: policyColonInvocation("show"),
|
|
204
|
-
note: "",
|
|
205
|
-
projectRoot: show.projectRoot,
|
|
206
|
-
format: show.format,
|
|
207
|
-
changedOnly: show.changedOnly,
|
|
208
|
-
field: show.field,
|
|
209
|
-
error: show.error,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
if (cmd === "resolve") {
|
|
213
|
-
const root = parseProjectRoot(argv.slice(1));
|
|
214
|
-
return {
|
|
215
|
-
cmd: "resolve",
|
|
216
|
-
confirm: false,
|
|
217
|
-
actor: "agent",
|
|
218
|
-
note: "",
|
|
219
|
-
projectRoot: root.projectRoot,
|
|
220
|
-
format: "text",
|
|
221
|
-
changedOnly: false,
|
|
222
|
-
field: null,
|
|
223
|
-
error: root.error,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
if (cmd === "enforce-branches" ||
|
|
227
|
-
cmd === "allow-direct-commits" ||
|
|
228
|
-
cmd === "allow-destructive-gh-verbs" ||
|
|
229
|
-
cmd === "enforce-destructive-gh-verbs" ||
|
|
230
|
-
cmd === "allow-bot-merge" ||
|
|
231
|
-
cmd === "enable-value-feedback" ||
|
|
232
|
-
cmd === "clear-value-feedback" ||
|
|
233
|
-
cmd === "set-ceremony-dial" ||
|
|
234
|
-
cmd === "disable-host-hooks" ||
|
|
235
|
-
cmd === "disable-directive" ||
|
|
236
|
-
cmd === "enable-directive") {
|
|
237
|
-
let confirm = false;
|
|
238
|
-
let actor = cmd === "enforce-branches"
|
|
239
|
-
? policyColonInvocation("enforce-branches")
|
|
240
|
-
: cmd === "allow-direct-commits"
|
|
241
|
-
? policyColonInvocation("allow-direct-commits")
|
|
242
|
-
: cmd === "allow-destructive-gh-verbs"
|
|
243
|
-
? policyColonInvocation("allow-destructive-gh-verbs")
|
|
244
|
-
: cmd === "enforce-destructive-gh-verbs"
|
|
245
|
-
? policyColonInvocation("enforce-destructive-gh-verbs")
|
|
246
|
-
: cmd === "allow-bot-merge"
|
|
247
|
-
? policyColonInvocation("allow-bot-merge")
|
|
248
|
-
: cmd === "enable-value-feedback"
|
|
249
|
-
? policyColonInvocation("enable-value-feedback")
|
|
250
|
-
: cmd === "clear-value-feedback"
|
|
251
|
-
? policyColonInvocation("clear-value-feedback")
|
|
252
|
-
: cmd === "set-ceremony-dial"
|
|
253
|
-
? policyColonInvocation("set-ceremony-dial")
|
|
254
|
-
: cmd === "disable-host-hooks"
|
|
255
|
-
? policyColonInvocation("disable-host-hooks")
|
|
256
|
-
: cmd === "disable-directive"
|
|
257
|
-
? policyColonInvocation("disable-directive")
|
|
258
|
-
: policyColonInvocation("enable-directive");
|
|
259
|
-
let note = "";
|
|
260
|
-
let projectRoot = ".";
|
|
261
|
-
let host;
|
|
262
|
-
let ceremonyOverride;
|
|
263
|
-
let ceremonyEnabled;
|
|
264
|
-
let upstreamPrompt;
|
|
265
|
-
for (let i = 1; i < argv.length; i += 1) {
|
|
266
|
-
const arg = argv[i];
|
|
267
|
-
if (arg === "--confirm") {
|
|
268
|
-
confirm = true;
|
|
269
|
-
}
|
|
270
|
-
else if (cmd === "enable-value-feedback" && arg === "--upstream-prompt") {
|
|
271
|
-
upstreamPrompt = true;
|
|
272
|
-
}
|
|
273
|
-
else if (arg === "--actor") {
|
|
274
|
-
const v = argv[i + 1];
|
|
275
|
-
if (v === undefined)
|
|
276
|
-
return makeSetError("argument --actor: expected one argument");
|
|
277
|
-
actor = v;
|
|
278
|
-
i += 1;
|
|
279
|
-
}
|
|
280
|
-
else if (arg?.startsWith("--actor=")) {
|
|
281
|
-
actor = arg.slice("--actor=".length);
|
|
282
|
-
}
|
|
283
|
-
else if (arg === "--note") {
|
|
284
|
-
const v = argv[i + 1];
|
|
285
|
-
if (v === undefined)
|
|
286
|
-
return makeSetError("argument --note: expected one argument");
|
|
287
|
-
note = v;
|
|
288
|
-
i += 1;
|
|
289
|
-
}
|
|
290
|
-
else if (arg?.startsWith("--note=")) {
|
|
291
|
-
note = arg.slice("--note=".length);
|
|
292
|
-
}
|
|
293
|
-
else if (arg === "--project-root") {
|
|
294
|
-
const v = argv[i + 1];
|
|
295
|
-
if (v === undefined)
|
|
296
|
-
return makeSetError("argument --project-root: expected one argument");
|
|
297
|
-
projectRoot = v;
|
|
298
|
-
i += 1;
|
|
299
|
-
}
|
|
300
|
-
else if (arg?.startsWith("--project-root=")) {
|
|
301
|
-
projectRoot = arg.slice("--project-root=".length);
|
|
302
|
-
}
|
|
303
|
-
else if (cmd === "set-ceremony-dial" && (arg === "--override" || arg === "--depth")) {
|
|
304
|
-
const v = argv[i + 1];
|
|
305
|
-
if (v === undefined) {
|
|
306
|
-
return makeSetError(`argument ${arg}: expected one argument (minimal|rapid|standard|elevated|null)`);
|
|
307
|
-
}
|
|
308
|
-
if (v === "null" || v === "none" || v === "clear") {
|
|
309
|
-
ceremonyOverride = null;
|
|
310
|
-
}
|
|
311
|
-
else if (CEREMONY_DEPTHS.includes(v)) {
|
|
312
|
-
ceremonyOverride = v;
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
return makeSetError(`argument ${arg}: expected minimal|rapid|standard|elevated|null, got ${JSON.stringify(v)}`);
|
|
316
|
-
}
|
|
317
|
-
i += 1;
|
|
318
|
-
}
|
|
319
|
-
else if (cmd === "set-ceremony-dial" &&
|
|
320
|
-
(arg?.startsWith("--override=") || arg?.startsWith("--depth="))) {
|
|
321
|
-
const v = arg.slice(arg.indexOf("=") + 1);
|
|
322
|
-
if (v === "null" || v === "none" || v === "clear") {
|
|
323
|
-
ceremonyOverride = null;
|
|
324
|
-
}
|
|
325
|
-
else if (CEREMONY_DEPTHS.includes(v)) {
|
|
326
|
-
ceremonyOverride = v;
|
|
327
|
-
}
|
|
328
|
-
else {
|
|
329
|
-
return makeSetError(`argument --override: expected minimal|rapid|standard|elevated|null, got ${JSON.stringify(v)}`);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
else if (cmd === "set-ceremony-dial" && arg === "--enabled") {
|
|
333
|
-
const v = argv[i + 1];
|
|
334
|
-
if (v === undefined || (v !== "true" && v !== "false")) {
|
|
335
|
-
return makeSetError("argument --enabled: expected true|false");
|
|
336
|
-
}
|
|
337
|
-
ceremonyEnabled = v === "true";
|
|
338
|
-
i += 1;
|
|
339
|
-
}
|
|
340
|
-
else if (cmd === "set-ceremony-dial" && arg?.startsWith("--enabled=")) {
|
|
341
|
-
const v = arg.slice("--enabled=".length);
|
|
342
|
-
if (v !== "true" && v !== "false") {
|
|
343
|
-
return makeSetError("argument --enabled: expected true|false");
|
|
344
|
-
}
|
|
345
|
-
ceremonyEnabled = v === "true";
|
|
346
|
-
}
|
|
347
|
-
else if (cmd === "disable-host-hooks" && arg === "--host") {
|
|
348
|
-
const v = argv[i + 1];
|
|
349
|
-
const parsedHost = parseHookHost(v);
|
|
350
|
-
if (parsedHost === null) {
|
|
351
|
-
return makeSetError("argument --host: expected claude|cursor|grok|codex");
|
|
352
|
-
}
|
|
353
|
-
host = parsedHost;
|
|
354
|
-
i += 1;
|
|
355
|
-
}
|
|
356
|
-
else if (cmd === "disable-host-hooks" && arg?.startsWith("--host=")) {
|
|
357
|
-
const parsedHost = parseHookHost(arg.slice("--host=".length));
|
|
358
|
-
if (parsedHost === null) {
|
|
359
|
-
return makeSetError("argument --host: expected claude|cursor|grok|codex");
|
|
360
|
-
}
|
|
361
|
-
host = parsedHost;
|
|
362
|
-
}
|
|
363
|
-
else if (arg === "--") {
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
return makeSetError(`unrecognized argument: ${arg}`);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
if (cmd === "disable-host-hooks" && host === undefined) {
|
|
370
|
-
return makeSetError("disable-host-hooks requires --host claude|cursor|grok|codex");
|
|
371
|
-
}
|
|
372
|
-
return {
|
|
373
|
-
cmd,
|
|
374
|
-
confirm,
|
|
375
|
-
actor,
|
|
376
|
-
note,
|
|
377
|
-
projectRoot,
|
|
378
|
-
format: "text",
|
|
379
|
-
changedOnly: false,
|
|
380
|
-
field: null,
|
|
381
|
-
host,
|
|
382
|
-
ceremonyOverride,
|
|
383
|
-
ceremonyEnabled,
|
|
384
|
-
upstreamPrompt,
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
return makeSetError(`unknown subcommand: ${cmd}`);
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Emit a loud warning to stderr for every plan-extension key whose bare block
|
|
391
|
-
* silently shadows the namespaced form (#2301). Never fails / throws: a missing
|
|
392
|
-
* or malformed PROJECT-DEFINITION simply yields no warnings.
|
|
393
|
-
*/
|
|
394
|
-
function emitPlanExtensionShadowWarnings(projectRoot) {
|
|
395
|
-
const [data] = loadProjectDefinition(projectRoot);
|
|
396
|
-
if (data === null)
|
|
397
|
-
return;
|
|
398
|
-
const shadows = detectShadowedPlanExtensions(data.plan);
|
|
399
|
-
for (const shadow of shadows) {
|
|
400
|
-
process.stderr.write(`[policy:show] WARNING: ${describeShadowedPlanExtension(shadow)}\n`);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
function valueFeedbackGateSummary(projectRoot) {
|
|
404
|
-
return formatValueFeedbackStatusLine(resolveValueFeedback(projectRoot));
|
|
405
|
-
}
|
|
406
|
-
function runShow(args) {
|
|
407
|
-
const projectRoot = pathResolve(args.projectRoot);
|
|
408
|
-
// Layout-aware (#2302): name the resolved PROJECT-DEFINITION path (xbrief on a
|
|
409
|
-
// migrated tree, else vbrief) instead of the hardcoded vbrief/ literal.
|
|
410
|
-
const pdPath = projectDefinitionPath(projectRoot);
|
|
411
|
-
if (!existsSync(pdPath)) {
|
|
412
|
-
process.stderr.write(`[policy:show] PROJECT-DEFINITION not found at ${pdPath}; ` +
|
|
413
|
-
"rendering framework defaults.\n");
|
|
414
|
-
}
|
|
415
|
-
emitPlanExtensionShadowWarnings(projectRoot);
|
|
416
|
-
if (args.field !== null) {
|
|
417
|
-
const field = inspectOnePolicy(args.field, projectRoot);
|
|
418
|
-
if (field === null) {
|
|
419
|
-
const known = registeredPolicyNames();
|
|
420
|
-
process.stderr.write(`[policy:show] unknown --field=${pythonStringRepr(args.field)}; ` +
|
|
421
|
-
`registered fields: ${pythonListRepr(known)}\n`);
|
|
422
|
-
return 2;
|
|
423
|
-
}
|
|
424
|
-
if (args.format === "json") {
|
|
425
|
-
process.stdout.write(`${renderJson([field])}\n`);
|
|
426
|
-
}
|
|
427
|
-
else {
|
|
428
|
-
process.stdout.write(`${renderText([field])}\n`);
|
|
429
|
-
if (field.name === FIELD_VALUE_FEEDBACK || args.field === FIELD_VALUE_FEEDBACK_CLI_ALIAS) {
|
|
430
|
-
process.stdout.write(`\n${valueFeedbackGateSummary(projectRoot)}\n`);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return 0;
|
|
434
|
-
}
|
|
435
|
-
let fields = inspectAllPolicies(projectRoot);
|
|
436
|
-
if (args.changedOnly) {
|
|
437
|
-
fields = fields.filter((f) => f.source !== "default");
|
|
438
|
-
}
|
|
439
|
-
if (args.format === "json") {
|
|
440
|
-
process.stdout.write(`${renderJson(fields)}\n`);
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
process.stdout.write(`${renderText(fields)}\n`);
|
|
444
|
-
}
|
|
445
|
-
return 0;
|
|
446
|
-
}
|
|
447
|
-
function runResolve(projectRoot) {
|
|
448
|
-
const result = resolvePolicy(projectRoot);
|
|
449
|
-
process.stdout.write(`allowDirectCommitsToMaster=${String(result.allowDirectCommits).toLowerCase()}\n`);
|
|
450
|
-
process.stdout.write(`source=${result.source}\n`);
|
|
451
|
-
if (result.deprecationWarning !== null) {
|
|
452
|
-
process.stdout.write(`warning=${result.deprecationWarning}\n`);
|
|
453
|
-
}
|
|
454
|
-
if (result.error !== null) {
|
|
455
|
-
process.stdout.write(`error=${result.error}\n`);
|
|
456
|
-
}
|
|
457
|
-
process.stdout.write(`${disclosureLine(result)}\n`);
|
|
458
|
-
return 0;
|
|
459
|
-
}
|
|
460
|
-
function runEnableValueFeedback(args) {
|
|
461
|
-
const result = enableValueFeedback(pathResolve(args.projectRoot), {
|
|
462
|
-
confirm: args.confirm,
|
|
463
|
-
actor: args.actor,
|
|
464
|
-
note: args.note,
|
|
465
|
-
subFlags: args.upstreamPrompt === true ? { upstreamPrompt: true } : undefined,
|
|
466
|
-
});
|
|
467
|
-
process.stdout.write(result.stdout);
|
|
468
|
-
return result.exitCode;
|
|
469
|
-
}
|
|
470
|
-
function runDisableHostHooks(args) {
|
|
471
|
-
const host = args.host;
|
|
472
|
-
if (host === undefined) {
|
|
473
|
-
process.stderr.write("policy: disable-host-hooks requires --host claude|cursor|grok|codex\n");
|
|
474
|
-
return 2;
|
|
475
|
-
}
|
|
476
|
-
const result = disableHostHooks(pathResolve(args.projectRoot), {
|
|
477
|
-
host,
|
|
478
|
-
confirm: args.confirm,
|
|
479
|
-
actor: args.actor,
|
|
480
|
-
note: args.note,
|
|
481
|
-
});
|
|
482
|
-
process.stdout.write(result.stdout);
|
|
483
|
-
return result.exitCode;
|
|
484
|
-
}
|
|
485
|
-
function runSet(args) {
|
|
486
|
-
const projectRoot = pathResolve(args.projectRoot);
|
|
487
|
-
if (args.cmd === "allow-direct-commits" && !args.confirm) {
|
|
488
|
-
process.stdout.write(`${CAPABILITY_COST_DISCLOSURE}\n\n`);
|
|
489
|
-
process.stdout.write(`Re-run with --confirm to apply: ${policyColonInvocation("allow-direct-commits", " -- --confirm")}\n`);
|
|
490
|
-
return 1;
|
|
491
|
-
}
|
|
492
|
-
const target = args.cmd === "allow-direct-commits";
|
|
493
|
-
try {
|
|
494
|
-
const { changed, auditEntry } = setPolicy(projectRoot, {
|
|
495
|
-
allowDirectCommits: target,
|
|
496
|
-
actor: args.actor,
|
|
497
|
-
note: args.note,
|
|
498
|
-
});
|
|
499
|
-
const state = target ? "OFF" : "ON";
|
|
500
|
-
process.stdout.write(`\u2713 plan.policy.allowDirectCommitsToMaster=${target ? "true" : "false"} ` +
|
|
501
|
-
`(branch-protection ${state}).\n`);
|
|
502
|
-
if (changed) {
|
|
503
|
-
process.stdout.write(` audit: meta/policy-changes.log :: ${auditEntry}\n`);
|
|
504
|
-
}
|
|
505
|
-
else {
|
|
506
|
-
process.stdout.write(`${POLICY_AUDIT_NOOP_STDOUT}\n`);
|
|
507
|
-
}
|
|
508
|
-
process.stdout.write(`${disclosureLine(resolvePolicy(projectRoot))}\n`);
|
|
509
|
-
return 0;
|
|
510
|
-
}
|
|
511
|
-
catch (err) {
|
|
512
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
513
|
-
if (message.includes("PROJECT-DEFINITION not found")) {
|
|
514
|
-
process.stderr.write(`\u274c ${message}\n`);
|
|
515
|
-
const pdRel = relative(projectRoot, projectDefinitionPath(projectRoot));
|
|
516
|
-
process.stderr.write(` Recovery: run \`task setup\` to generate ${pdRel}.\n`);
|
|
517
|
-
return 2;
|
|
518
|
-
}
|
|
519
|
-
process.stderr.write(`\u274c Config error: ${message}\n`);
|
|
520
|
-
return 2;
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
function runClearValueFeedback(args) {
|
|
524
|
-
const result = clearValueFeedback(pathResolve(args.projectRoot), {
|
|
525
|
-
actor: args.actor,
|
|
526
|
-
note: args.note,
|
|
527
|
-
});
|
|
528
|
-
process.stdout.write(result.stdout);
|
|
529
|
-
return result.exitCode;
|
|
530
|
-
}
|
|
531
|
-
/** Create root `.no-deft-directive` opt-out flag (#2926). Does not delete deposits. */
|
|
532
|
-
function runDisableDirective(args) {
|
|
533
|
-
const projectRoot = pathResolve(args.projectRoot);
|
|
534
|
-
const before = detectNoDeftDirective(projectRoot);
|
|
535
|
-
if (before.present) {
|
|
536
|
-
process.stdout.write(`${NO_DEFT_DIRECTIVE_DISABLED_MESSAGE} (already present)\n`);
|
|
537
|
-
if (before.inconsistent) {
|
|
538
|
-
process.stderr.write(`${NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE}\n`);
|
|
539
|
-
return 1;
|
|
540
|
-
}
|
|
541
|
-
return 0;
|
|
542
|
-
}
|
|
543
|
-
const path = createNoDeftDirectiveFlag(projectRoot, {
|
|
544
|
-
rationale: args.note.trim().length > 0 ? args.note.trim() : undefined,
|
|
545
|
-
});
|
|
546
|
-
process.stdout.write(`Created ${NO_DEFT_DIRECTIVE_FLAG_NAME} at ${path}\n`);
|
|
547
|
-
process.stdout.write(`${NO_DEFT_DIRECTIVE_DISABLED_MESSAGE}\n`);
|
|
548
|
-
const after = detectNoDeftDirective(projectRoot);
|
|
549
|
-
if (after.inconsistent) {
|
|
550
|
-
process.stderr.write(`${NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE}\n`);
|
|
551
|
-
return 1;
|
|
552
|
-
}
|
|
553
|
-
return 0;
|
|
554
|
-
}
|
|
555
|
-
/** Remove root `.no-deft-directive` so Directive may be installed/used again (#2926). */
|
|
556
|
-
function runEnableDirective(args) {
|
|
557
|
-
const projectRoot = pathResolve(args.projectRoot);
|
|
558
|
-
const removed = removeNoDeftDirectiveFlag(projectRoot);
|
|
559
|
-
if (removed) {
|
|
560
|
-
process.stdout.write(`Removed ${NO_DEFT_DIRECTIVE_FLAG_NAME}\n`);
|
|
561
|
-
}
|
|
562
|
-
else {
|
|
563
|
-
process.stdout.write(`${NO_DEFT_DIRECTIVE_FLAG_NAME} was not present\n`);
|
|
564
|
-
}
|
|
565
|
-
process.stdout.write("Directive opt-out cleared. Run `directive init` or `directive update` to ensure install.\n");
|
|
566
|
-
return 0;
|
|
567
|
-
}
|
|
568
|
-
/** Allow or re-enforce the #1019 destructive-gh-verb gate. */
|
|
569
|
-
function runDestructiveGhVerbs(args) {
|
|
570
|
-
const projectRoot = pathResolve(args.projectRoot);
|
|
571
|
-
const allow = args.cmd === "allow-destructive-gh-verbs";
|
|
572
|
-
if (allow && !args.confirm) {
|
|
573
|
-
process.stdout.write(`${ALLOW_DESTRUCTIVE_GH_VERBS_CAPABILITY_COST}\n\n`);
|
|
574
|
-
process.stdout.write(`Re-run with --confirm to apply: ${policyColonInvocation("allow-destructive-gh-verbs", " -- --confirm")}\n`);
|
|
575
|
-
return 1;
|
|
576
|
-
}
|
|
577
|
-
try {
|
|
578
|
-
const result = setAllowDestructiveGhVerbs(projectRoot, {
|
|
579
|
-
allowDestructiveGhVerbs: allow,
|
|
580
|
-
actor: args.actor,
|
|
581
|
-
note: args.note,
|
|
582
|
-
});
|
|
583
|
-
if (!result.ok) {
|
|
584
|
-
process.stderr.write(`\u274c ${result.message}\n`);
|
|
585
|
-
if (result.message.includes("PROJECT-DEFINITION not found")) {
|
|
586
|
-
const pdRel = relative(projectRoot, projectDefinitionPath(projectRoot));
|
|
587
|
-
process.stderr.write(` Recovery: run \`task setup\` to generate ${pdRel}.\n`);
|
|
588
|
-
}
|
|
589
|
-
return 2;
|
|
590
|
-
}
|
|
591
|
-
process.stdout.write(`\u2713 plan.policy.allowDestructiveGhVerbs=${allow ? "true" : "false"} ` +
|
|
592
|
-
`(#1019 gate ${allow ? "OFF" : "ON"}).\n`);
|
|
593
|
-
if (result.changed) {
|
|
594
|
-
process.stdout.write(` audit: meta/policy-changes.log :: ${result.auditEntry}\n`);
|
|
595
|
-
}
|
|
596
|
-
else {
|
|
597
|
-
process.stdout.write(`${POLICY_AUDIT_NOOP_STDOUT}\n`);
|
|
598
|
-
}
|
|
599
|
-
return 0;
|
|
600
|
-
}
|
|
601
|
-
catch (err) {
|
|
602
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
603
|
-
if (message.includes("PROJECT-DEFINITION not found")) {
|
|
604
|
-
process.stderr.write(`\u274c ${message}\n`);
|
|
605
|
-
const pdRel = relative(projectRoot, projectDefinitionPath(projectRoot));
|
|
606
|
-
process.stderr.write(` Recovery: run \`task setup\` to generate ${pdRel}.\n`);
|
|
607
|
-
return 2;
|
|
608
|
-
}
|
|
609
|
-
process.stderr.write(`\u274c Config error: ${message}\n`);
|
|
610
|
-
return 2;
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
/** Allow agent/bot merge by writing requireHumanMerge=false (#1193). */
|
|
614
|
-
function runAllowBotMerge(args) {
|
|
615
|
-
const projectRoot = pathResolve(args.projectRoot);
|
|
616
|
-
if (!args.confirm) {
|
|
617
|
-
process.stdout.write(`${ALLOW_BOT_MERGE_CAPABILITY_COST}\n\n`);
|
|
618
|
-
process.stdout.write(`Re-run with --confirm to apply: ${policyColonInvocation("allow-bot-merge", " -- --confirm")}\n`);
|
|
619
|
-
return 1;
|
|
620
|
-
}
|
|
621
|
-
try {
|
|
622
|
-
const { changed, auditEntry } = setRequireHumanMerge(projectRoot, {
|
|
623
|
-
requireHumanMerge: false,
|
|
624
|
-
actor: args.actor,
|
|
625
|
-
note: args.note,
|
|
626
|
-
});
|
|
627
|
-
process.stdout.write(`\u2713 plan.policy.requireHumanMerge=false (human merge gate OFF; agent may merge).\n`);
|
|
628
|
-
if (changed) {
|
|
629
|
-
process.stdout.write(` audit: meta/policy-changes.log :: ${auditEntry}\n`);
|
|
630
|
-
}
|
|
631
|
-
else {
|
|
632
|
-
process.stdout.write(`${POLICY_AUDIT_NOOP_STDOUT}\n`);
|
|
633
|
-
}
|
|
634
|
-
const line = humanMergeDisclosureLine(resolveHumanMergePolicy(projectRoot));
|
|
635
|
-
if (line !== null) {
|
|
636
|
-
process.stdout.write(`${line}\n`);
|
|
637
|
-
}
|
|
638
|
-
else {
|
|
639
|
-
process.stdout.write("[deft policy] Human merge gate is OFF; agent may merge when other gates allow.\n");
|
|
640
|
-
}
|
|
641
|
-
return 0;
|
|
642
|
-
}
|
|
643
|
-
catch (err) {
|
|
644
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
645
|
-
if (message.includes("PROJECT-DEFINITION not found")) {
|
|
646
|
-
process.stderr.write(`\u274c ${message}\n`);
|
|
647
|
-
const pdRel = relative(projectRoot, projectDefinitionPath(projectRoot));
|
|
648
|
-
process.stderr.write(` Recovery: run \`task setup\` to generate ${pdRel}.\n`);
|
|
649
|
-
return 2;
|
|
650
|
-
}
|
|
651
|
-
process.stderr.write(`\u274c Config error: ${message}\n`);
|
|
652
|
-
return 2;
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
/** Run the policy CLI; returns process exit code. */
|
|
656
|
-
export function run(argv) {
|
|
657
|
-
const args = parseArgs(argv);
|
|
658
|
-
if (args.error !== undefined) {
|
|
659
|
-
process.stderr.write(`policy: ${args.error}\n`);
|
|
660
|
-
return 2;
|
|
661
|
-
}
|
|
662
|
-
if (args.cmd === "show") {
|
|
663
|
-
return runShow({
|
|
664
|
-
format: args.format,
|
|
665
|
-
changedOnly: args.changedOnly,
|
|
666
|
-
field: args.field,
|
|
667
|
-
projectRoot: args.projectRoot,
|
|
668
|
-
});
|
|
669
|
-
}
|
|
670
|
-
if (args.cmd === "resolve") {
|
|
671
|
-
return runResolve(pathResolve(args.projectRoot));
|
|
672
|
-
}
|
|
673
|
-
if (args.cmd === "enforce-branches" || args.cmd === "allow-direct-commits") {
|
|
674
|
-
return runSet(args);
|
|
675
|
-
}
|
|
676
|
-
if (args.cmd === "allow-destructive-gh-verbs" || args.cmd === "enforce-destructive-gh-verbs") {
|
|
677
|
-
return runDestructiveGhVerbs(args);
|
|
678
|
-
}
|
|
679
|
-
if (args.cmd === "allow-bot-merge") {
|
|
680
|
-
return runAllowBotMerge(args);
|
|
681
|
-
}
|
|
682
|
-
if (args.cmd === "enable-value-feedback") {
|
|
683
|
-
return runEnableValueFeedback(args);
|
|
684
|
-
}
|
|
685
|
-
if (args.cmd === "disable-host-hooks") {
|
|
686
|
-
return runDisableHostHooks(args);
|
|
687
|
-
}
|
|
688
|
-
if (args.cmd === "clear-value-feedback") {
|
|
689
|
-
return runClearValueFeedback(args);
|
|
690
|
-
}
|
|
691
|
-
if (args.cmd === "set-ceremony-dial") {
|
|
692
|
-
return runSetCeremonyDial(args);
|
|
693
|
-
}
|
|
694
|
-
if (args.cmd === "set-spec-guard-enforcement") {
|
|
695
|
-
return runSetSpecGuardEnforcement(args);
|
|
696
|
-
}
|
|
697
|
-
if (args.cmd === "disable-directive") {
|
|
698
|
-
return runDisableDirective(args);
|
|
699
|
-
}
|
|
700
|
-
if (args.cmd === "enable-directive") {
|
|
701
|
-
return runEnableDirective(args);
|
|
702
|
-
}
|
|
703
|
-
return 2;
|
|
704
|
-
}
|
|
705
|
-
/** Persist plan.policy.specGuard.driftGuard.enforcement (#5350). */
|
|
706
|
-
function runSetSpecGuardEnforcement(args) {
|
|
707
|
-
const root = pathResolve(args.projectRoot);
|
|
708
|
-
if (args.specGuardEnforcement === undefined) {
|
|
709
|
-
process.stdout.write("usage: policy set-spec-guard-enforcement -- --set advise|shadow|enforce [--confirm] [--project-root PATH]\n" +
|
|
710
|
-
" Promote ladder: advise → shadow → enforce (advise→enforce skip refused without shadow attestation).\n" +
|
|
711
|
-
` Inspect: ${policyColonInvocation("show", " --field=specGuard")}\n`);
|
|
712
|
-
return 1;
|
|
713
|
-
}
|
|
714
|
-
const result = promoteSpecGuardDriftEnforcement(root, {
|
|
715
|
-
to: args.specGuardEnforcement,
|
|
716
|
-
confirm: args.confirm,
|
|
717
|
-
actor: args.actor,
|
|
718
|
-
note: args.note,
|
|
719
|
-
});
|
|
720
|
-
process.stdout.write(result.stdout);
|
|
721
|
-
return result.exitCode;
|
|
722
|
-
}
|
|
723
|
-
/** Persist plan.policy.ceremonyDial override/enabled (#3214). */
|
|
724
|
-
function runSetCeremonyDial(args) {
|
|
725
|
-
const root = pathResolve(args.projectRoot);
|
|
726
|
-
if (args.ceremonyOverride === undefined && args.ceremonyEnabled === undefined) {
|
|
727
|
-
process.stdout.write("usage: policy set-ceremony-dial -- --confirm [--override minimal|rapid|standard|elevated|null] [--enabled true|false] [--project-root PATH]\n" +
|
|
728
|
-
` Inspect: ${policyColonInvocation("show", " --field=ceremonyDial")}\n`);
|
|
729
|
-
return 1;
|
|
730
|
-
}
|
|
731
|
-
const result = setCeremonyDial(root, {
|
|
732
|
-
confirm: args.confirm,
|
|
733
|
-
actor: args.actor,
|
|
734
|
-
note: args.note,
|
|
735
|
-
...(args.ceremonyOverride !== undefined ? { override: args.ceremonyOverride } : {}),
|
|
736
|
-
...(args.ceremonyEnabled !== undefined ? { enabled: args.ceremonyEnabled } : {}),
|
|
737
|
-
});
|
|
738
|
-
process.stdout.write(result.stdout);
|
|
739
|
-
return result.exitCode;
|
|
740
|
-
}
|
|
741
|
-
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
742
|
-
process.exit(run(process.argv.slice(2)));
|
|
743
|
-
}
|
|
744
|
-
//# sourceMappingURL=policy.js.map
|