approval-md 0.0.1 → 0.2.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/LICENSE +176 -0
- package/NOTICE +5 -0
- package/README.md +940 -4
- package/SPEC.md +476 -34
- package/cli.js +29 -3
- package/dist/src/adapters/agentmail.d.ts +426 -0
- package/dist/src/adapters/agentmail.js +1200 -0
- package/dist/src/adapters/agentmail.js.map +1 -0
- package/dist/src/adapters/conformance.d.ts +149 -0
- package/dist/src/adapters/conformance.js +461 -0
- package/dist/src/adapters/conformance.js.map +1 -0
- package/dist/src/adapters/contract.d.ts +628 -0
- package/dist/src/adapters/contract.js +1035 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/email.d.ts +324 -0
- package/dist/src/adapters/email.js +749 -0
- package/dist/src/adapters/email.js.map +1 -0
- package/dist/src/adapters/env-passphrase.d.ts +93 -0
- package/dist/src/adapters/env-passphrase.js +132 -0
- package/dist/src/adapters/env-passphrase.js.map +1 -0
- package/dist/src/adapters/public.d.ts +11 -0
- package/dist/src/adapters/public.js +11 -0
- package/dist/src/adapters/public.js.map +1 -0
- package/dist/src/adapters/registry.d.ts +59 -0
- package/dist/src/adapters/registry.js +77 -0
- package/dist/src/adapters/registry.js.map +1 -0
- package/dist/src/adapters/smtp.d.ts +213 -0
- package/dist/src/adapters/smtp.js +499 -0
- package/dist/src/adapters/smtp.js.map +1 -0
- package/dist/src/adapters/vault-provider.d.ts +114 -0
- package/dist/src/adapters/vault-provider.js +161 -0
- package/dist/src/adapters/vault-provider.js.map +1 -0
- package/dist/src/adapters/zzz.d.ts +66 -0
- package/dist/src/adapters/zzz.js +299 -0
- package/dist/src/adapters/zzz.js.map +1 -0
- package/dist/src/channels/batch.d.ts +109 -0
- package/dist/src/channels/batch.js +121 -0
- package/dist/src/channels/batch.js.map +1 -0
- package/dist/src/channels/cli.d.ts +193 -0
- package/dist/src/channels/cli.js +468 -0
- package/dist/src/channels/cli.js.map +1 -0
- package/dist/src/channels/conformance.d.ts +92 -0
- package/dist/src/channels/conformance.js +445 -0
- package/dist/src/channels/conformance.js.map +1 -0
- package/dist/src/channels/contract.d.ts +623 -0
- package/dist/src/channels/contract.js +494 -0
- package/dist/src/channels/contract.js.map +1 -0
- package/dist/src/channels/payload-view.d.ts +35 -0
- package/dist/src/channels/payload-view.js +43 -0
- package/dist/src/channels/payload-view.js.map +1 -0
- package/dist/src/channels/render-queue.d.ts +149 -0
- package/dist/src/channels/render-queue.js +564 -0
- package/dist/src/channels/render-queue.js.map +1 -0
- package/dist/src/channels/tagging.d.ts +196 -0
- package/dist/src/channels/tagging.js +723 -0
- package/dist/src/channels/tagging.js.map +1 -0
- package/dist/src/channels/telegram.d.ts +1832 -0
- package/dist/src/channels/telegram.js +3190 -0
- package/dist/src/channels/telegram.js.map +1 -0
- package/dist/src/channels/web.d.ts +341 -0
- package/dist/src/channels/web.js +903 -0
- package/dist/src/channels/web.js.map +1 -0
- package/dist/src/cli/adapter.d.ts +90 -0
- package/dist/src/cli/adapter.js +288 -0
- package/dist/src/cli/adapter.js.map +1 -0
- package/dist/src/cli/amend.d.ts +59 -0
- package/dist/src/cli/amend.js +2171 -0
- package/dist/src/cli/amend.js.map +1 -0
- package/dist/src/cli/args.d.ts +43 -0
- package/dist/src/cli/args.js +86 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/cli/attest.d.ts +41 -0
- package/dist/src/cli/attest.js +307 -0
- package/dist/src/cli/attest.js.map +1 -0
- package/dist/src/cli/audit-card.d.ts +62 -0
- package/dist/src/cli/audit-card.js +201 -0
- package/dist/src/cli/audit-card.js.map +1 -0
- package/dist/src/cli/audit.d.ts +59 -0
- package/dist/src/cli/audit.js +460 -0
- package/dist/src/cli/audit.js.map +1 -0
- package/dist/src/cli/channel-telegram.d.ts +806 -0
- package/dist/src/cli/channel-telegram.js +2063 -0
- package/dist/src/cli/channel-telegram.js.map +1 -0
- package/dist/src/cli/channel-web.d.ts +131 -0
- package/dist/src/cli/channel-web.js +357 -0
- package/dist/src/cli/channel-web.js.map +1 -0
- package/dist/src/cli/channel.d.ts +71 -0
- package/dist/src/cli/channel.js +438 -0
- package/dist/src/cli/channel.js.map +1 -0
- package/dist/src/cli/checkpoint-tap.d.ts +169 -0
- package/dist/src/cli/checkpoint-tap.js +238 -0
- package/dist/src/cli/checkpoint-tap.js.map +1 -0
- package/dist/src/cli/codex.d.ts +2 -0
- package/dist/src/cli/codex.js +172 -0
- package/dist/src/cli/codex.js.map +1 -0
- package/dist/src/cli/coverage.d.ts +61 -0
- package/dist/src/cli/coverage.js +343 -0
- package/dist/src/cli/coverage.js.map +1 -0
- package/dist/src/cli/daemon.d.ts +120 -0
- package/dist/src/cli/daemon.js +631 -0
- package/dist/src/cli/daemon.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +129 -0
- package/dist/src/cli/doctor.js +2762 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/env.d.ts +65 -0
- package/dist/src/cli/env.js +302 -0
- package/dist/src/cli/env.js.map +1 -0
- package/dist/src/cli/execute.d.ts +202 -0
- package/dist/src/cli/execute.js +1682 -0
- package/dist/src/cli/execute.js.map +1 -0
- package/dist/src/cli/exit-codes.d.ts +73 -0
- package/dist/src/cli/exit-codes.js +82 -0
- package/dist/src/cli/exit-codes.js.map +1 -0
- package/dist/src/cli/feedback.d.ts +60 -0
- package/dist/src/cli/feedback.js +205 -0
- package/dist/src/cli/feedback.js.map +1 -0
- package/dist/src/cli/gate-window.d.ts +40 -0
- package/dist/src/cli/gate-window.js +294 -0
- package/dist/src/cli/gate-window.js.map +1 -0
- package/dist/src/cli/gate.d.ts +68 -0
- package/dist/src/cli/gate.js +557 -0
- package/dist/src/cli/gate.js.map +1 -0
- package/dist/src/cli/git-scope.d.ts +190 -0
- package/dist/src/cli/git-scope.js +295 -0
- package/dist/src/cli/git-scope.js.map +1 -0
- package/dist/src/cli/gloss-attach.d.ts +85 -0
- package/dist/src/cli/gloss-attach.js +107 -0
- package/dist/src/cli/gloss-attach.js.map +1 -0
- package/dist/src/cli/gloss-codex-child.d.ts +9 -0
- package/dist/src/cli/gloss-codex-child.js +149 -0
- package/dist/src/cli/gloss-codex-child.js.map +1 -0
- package/dist/src/cli/gloss-codex.d.ts +24 -0
- package/dist/src/cli/gloss-codex.js +255 -0
- package/dist/src/cli/gloss-codex.js.map +1 -0
- package/dist/src/cli/gloss-options.d.ts +42 -0
- package/dist/src/cli/gloss-options.js +79 -0
- package/dist/src/cli/gloss-options.js.map +1 -0
- package/dist/src/cli/gloss.d.ts +265 -0
- package/dist/src/cli/gloss.js +362 -0
- package/dist/src/cli/gloss.js.map +1 -0
- package/dist/src/cli/help.d.ts +103 -0
- package/dist/src/cli/help.js +2339 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hook-codex.d.ts +78 -0
- package/dist/src/cli/hook-codex.js +167 -0
- package/dist/src/cli/hook-codex.js.map +1 -0
- package/dist/src/cli/hook.d.ts +331 -0
- package/dist/src/cli/hook.js +2849 -0
- package/dist/src/cli/hook.js.map +1 -0
- package/dist/src/cli/import.d.ts +35 -0
- package/dist/src/cli/import.js +175 -0
- package/dist/src/cli/import.js.map +1 -0
- package/dist/src/cli/init.d.ts +84 -0
- package/dist/src/cli/init.js +336 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/instructions.d.ts +23 -0
- package/dist/src/cli/instructions.js +262 -0
- package/dist/src/cli/instructions.js.map +1 -0
- package/dist/src/cli/journal.d.ts +41 -0
- package/dist/src/cli/journal.js +238 -0
- package/dist/src/cli/journal.js.map +1 -0
- package/dist/src/cli/log-advance.d.ts +287 -0
- package/dist/src/cli/log-advance.js +840 -0
- package/dist/src/cli/log-advance.js.map +1 -0
- package/dist/src/cli/log-anchor.d.ts +176 -0
- package/dist/src/cli/log-anchor.js +387 -0
- package/dist/src/cli/log-anchor.js.map +1 -0
- package/dist/src/cli/log-checkpoint.d.ts +22 -0
- package/dist/src/cli/log-checkpoint.js +128 -0
- package/dist/src/cli/log-checkpoint.js.map +1 -0
- package/dist/src/cli/log-sync.d.ts +243 -0
- package/dist/src/cli/log-sync.js +849 -0
- package/dist/src/cli/log-sync.js.map +1 -0
- package/dist/src/cli/log-verbs.d.ts +16 -0
- package/dist/src/cli/log-verbs.js +360 -0
- package/dist/src/cli/log-verbs.js.map +1 -0
- package/dist/src/cli/long-help.d.ts +70 -0
- package/dist/src/cli/long-help.js +148 -0
- package/dist/src/cli/long-help.js.map +1 -0
- package/dist/src/cli/main.d.ts +77 -0
- package/dist/src/cli/main.js +1206 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/mcp.d.ts +52 -0
- package/dist/src/cli/mcp.js +306 -0
- package/dist/src/cli/mcp.js.map +1 -0
- package/dist/src/cli/paths.d.ts +56 -0
- package/dist/src/cli/paths.js +79 -0
- package/dist/src/cli/paths.js.map +1 -0
- package/dist/src/cli/payload.d.ts +58 -0
- package/dist/src/cli/payload.js +253 -0
- package/dist/src/cli/payload.js.map +1 -0
- package/dist/src/cli/policy.d.ts +43 -0
- package/dist/src/cli/policy.js +229 -0
- package/dist/src/cli/policy.js.map +1 -0
- package/dist/src/cli/preflight.d.ts +363 -0
- package/dist/src/cli/preflight.js +1175 -0
- package/dist/src/cli/preflight.js.map +1 -0
- package/dist/src/cli/progress.d.ts +78 -0
- package/dist/src/cli/progress.js +112 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/prompt.d.ts +209 -0
- package/dist/src/cli/prompt.js +312 -0
- package/dist/src/cli/prompt.js.map +1 -0
- package/dist/src/cli/quickstart.d.ts +46 -0
- package/dist/src/cli/quickstart.js +297 -0
- package/dist/src/cli/quickstart.js.map +1 -0
- package/dist/src/cli/records.d.ts +34 -0
- package/dist/src/cli/records.js +66 -0
- package/dist/src/cli/records.js.map +1 -0
- package/dist/src/cli/render.d.ts +22 -0
- package/dist/src/cli/render.js +132 -0
- package/dist/src/cli/render.js.map +1 -0
- package/dist/src/cli/sandbox.d.ts +51 -0
- package/dist/src/cli/sandbox.js +150 -0
- package/dist/src/cli/sandbox.js.map +1 -0
- package/dist/src/cli/scaffold.d.ts +79 -0
- package/dist/src/cli/scaffold.js +137 -0
- package/dist/src/cli/scaffold.js.map +1 -0
- package/dist/src/cli/setup-adapter.d.ts +137 -0
- package/dist/src/cli/setup-adapter.js +509 -0
- package/dist/src/cli/setup-adapter.js.map +1 -0
- package/dist/src/cli/setup-channel.d.ts +117 -0
- package/dist/src/cli/setup-channel.js +635 -0
- package/dist/src/cli/setup-channel.js.map +1 -0
- package/dist/src/cli/setup-checkpoint.d.ts +57 -0
- package/dist/src/cli/setup-checkpoint.js +196 -0
- package/dist/src/cli/setup-checkpoint.js.map +1 -0
- package/dist/src/cli/setup-common.d.ts +275 -0
- package/dist/src/cli/setup-common.js +376 -0
- package/dist/src/cli/setup-common.js.map +1 -0
- package/dist/src/cli/setup-flow.d.ts +287 -0
- package/dist/src/cli/setup-flow.js +476 -0
- package/dist/src/cli/setup-flow.js.map +1 -0
- package/dist/src/cli/setup-service.d.ts +96 -0
- package/dist/src/cli/setup-service.js +308 -0
- package/dist/src/cli/setup-service.js.map +1 -0
- package/dist/src/cli/setup.d.ts +202 -0
- package/dist/src/cli/setup.js +473 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/style.d.ts +320 -0
- package/dist/src/cli/style.js +469 -0
- package/dist/src/cli/style.js.map +1 -0
- package/dist/src/cli/token.d.ts +39 -0
- package/dist/src/cli/token.js +274 -0
- package/dist/src/cli/token.js.map +1 -0
- package/dist/src/cli/up.d.ts +155 -0
- package/dist/src/cli/up.js +849 -0
- package/dist/src/cli/up.js.map +1 -0
- package/dist/src/cli/usage.d.ts +37 -0
- package/dist/src/cli/usage.js +91 -0
- package/dist/src/cli/usage.js.map +1 -0
- package/dist/src/cli/values.d.ts +40 -0
- package/dist/src/cli/values.js +189 -0
- package/dist/src/cli/values.js.map +1 -0
- package/dist/src/cli/vault.d.ts +59 -0
- package/dist/src/cli/vault.js +362 -0
- package/dist/src/cli/vault.js.map +1 -0
- package/dist/src/cli/verb-registry.d.ts +76 -0
- package/dist/src/cli/verb-registry.js +2341 -0
- package/dist/src/cli/verb-registry.js.map +1 -0
- package/dist/src/cli/wordmark.d.ts +31 -0
- package/dist/src/cli/wordmark.js +52 -0
- package/dist/src/cli/wordmark.js.map +1 -0
- package/dist/src/codex/doctor.d.ts +13 -0
- package/dist/src/codex/doctor.js +41 -0
- package/dist/src/codex/doctor.js.map +1 -0
- package/dist/src/codex/manifest.d.ts +49 -0
- package/dist/src/codex/manifest.js +103 -0
- package/dist/src/codex/manifest.js.map +1 -0
- package/dist/src/codex/templates.d.ts +41 -0
- package/dist/src/codex/templates.js +319 -0
- package/dist/src/codex/templates.js.map +1 -0
- package/dist/src/codex/trust.d.ts +19 -0
- package/dist/src/codex/trust.js +183 -0
- package/dist/src/codex/trust.js.map +1 -0
- package/dist/src/codex/workspace-plan.d.ts +131 -0
- package/dist/src/codex/workspace-plan.js +561 -0
- package/dist/src/codex/workspace-plan.js.map +1 -0
- package/dist/src/core/actor.d.ts +2 -0
- package/dist/src/core/actor.js +5 -0
- package/dist/src/core/actor.js.map +1 -0
- package/dist/src/core/advance-cycle.d.ts +170 -0
- package/dist/src/core/advance-cycle.js +200 -0
- package/dist/src/core/advance-cycle.js.map +1 -0
- package/dist/src/core/agents-md.d.ts +276 -0
- package/dist/src/core/agents-md.js +747 -0
- package/dist/src/core/agents-md.js.map +1 -0
- package/dist/src/core/apply-patch.d.ts +49 -0
- package/dist/src/core/apply-patch.js +266 -0
- package/dist/src/core/apply-patch.js.map +1 -0
- package/dist/src/core/attest.d.ts +420 -0
- package/dist/src/core/attest.js +589 -0
- package/dist/src/core/attest.js.map +1 -0
- package/dist/src/core/audit.d.ts +492 -0
- package/dist/src/core/audit.js +882 -0
- package/dist/src/core/audit.js.map +1 -0
- package/dist/src/core/budgets.d.ts +238 -0
- package/dist/src/core/budgets.js +449 -0
- package/dist/src/core/budgets.js.map +1 -0
- package/dist/src/core/checkpoint.d.ts +500 -0
- package/dist/src/core/checkpoint.js +738 -0
- package/dist/src/core/checkpoint.js.map +1 -0
- package/dist/src/core/child-env.d.ts +88 -0
- package/dist/src/core/child-env.js +86 -0
- package/dist/src/core/child-env.js.map +1 -0
- package/dist/src/core/clock.d.ts +52 -0
- package/dist/src/core/clock.js +43 -0
- package/dist/src/core/clock.js.map +1 -0
- package/dist/src/core/command-class.d.ts +543 -0
- package/dist/src/core/command-class.js +2356 -0
- package/dist/src/core/command-class.js.map +1 -0
- package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
- package/dist/src/core/coverage-sources/adapter.js +71 -0
- package/dist/src/core/coverage-sources/adapter.js.map +1 -0
- package/dist/src/core/coverage-sources/gh.d.ts +48 -0
- package/dist/src/core/coverage-sources/gh.js +136 -0
- package/dist/src/core/coverage-sources/gh.js.map +1 -0
- package/dist/src/core/coverage-sources/git.d.ts +101 -0
- package/dist/src/core/coverage-sources/git.js +269 -0
- package/dist/src/core/coverage-sources/git.js.map +1 -0
- package/dist/src/core/coverage.d.ts +217 -0
- package/dist/src/core/coverage.js +337 -0
- package/dist/src/core/coverage.js.map +1 -0
- package/dist/src/core/credential-spec.d.ts +72 -0
- package/dist/src/core/credential-spec.js +23 -0
- package/dist/src/core/credential-spec.js.map +1 -0
- package/dist/src/core/dark-session.d.ts +331 -0
- package/dist/src/core/dark-session.js +714 -0
- package/dist/src/core/dark-session.js.map +1 -0
- package/dist/src/core/decision-refusal.d.ts +185 -0
- package/dist/src/core/decision-refusal.js +265 -0
- package/dist/src/core/decision-refusal.js.map +1 -0
- package/dist/src/core/env-file.d.ts +450 -0
- package/dist/src/core/env-file.js +837 -0
- package/dist/src/core/env-file.js.map +1 -0
- package/dist/src/core/execute.d.ts +858 -0
- package/dist/src/core/execute.js +1271 -0
- package/dist/src/core/execute.js.map +1 -0
- package/dist/src/core/frontmatter.d.ts +78 -0
- package/dist/src/core/frontmatter.js +100 -0
- package/dist/src/core/frontmatter.js.map +1 -0
- package/dist/src/core/gate-window.d.ts +312 -0
- package/dist/src/core/gate-window.js +506 -0
- package/dist/src/core/gate-window.js.map +1 -0
- package/dist/src/core/gate.d.ts +1364 -0
- package/dist/src/core/gate.js +3002 -0
- package/dist/src/core/gate.js.map +1 -0
- package/dist/src/core/git-run.d.ts +73 -0
- package/dist/src/core/git-run.js +93 -0
- package/dist/src/core/git-run.js.map +1 -0
- package/dist/src/core/harness-version.d.ts +157 -0
- package/dist/src/core/harness-version.js +211 -0
- package/dist/src/core/harness-version.js.map +1 -0
- package/dist/src/core/harness-wait.d.ts +55 -0
- package/dist/src/core/harness-wait.js +58 -0
- package/dist/src/core/harness-wait.js.map +1 -0
- package/dist/src/core/head-retry.d.ts +107 -0
- package/dist/src/core/head-retry.js +121 -0
- package/dist/src/core/head-retry.js.map +1 -0
- package/dist/src/core/instance.d.ts +253 -0
- package/dist/src/core/instance.js +319 -0
- package/dist/src/core/instance.js.map +1 -0
- package/dist/src/core/intake-limits.d.ts +247 -0
- package/dist/src/core/intake-limits.js +350 -0
- package/dist/src/core/intake-limits.js.map +1 -0
- package/dist/src/core/jcs.d.ts +52 -0
- package/dist/src/core/jcs.js +132 -0
- package/dist/src/core/jcs.js.map +1 -0
- package/dist/src/core/journal.d.ts +144 -0
- package/dist/src/core/journal.js +200 -0
- package/dist/src/core/journal.js.map +1 -0
- package/dist/src/core/live-draw.d.ts +436 -0
- package/dist/src/core/live-draw.js +703 -0
- package/dist/src/core/live-draw.js.map +1 -0
- package/dist/src/core/log-reconcile.d.ts +89 -0
- package/dist/src/core/log-reconcile.js +136 -0
- package/dist/src/core/log-reconcile.js.map +1 -0
- package/dist/src/core/log-subscribe.d.ts +36 -0
- package/dist/src/core/log-subscribe.js +162 -0
- package/dist/src/core/log-subscribe.js.map +1 -0
- package/dist/src/core/log.d.ts +278 -0
- package/dist/src/core/log.js +546 -0
- package/dist/src/core/log.js.map +1 -0
- package/dist/src/core/loop.d.ts +274 -0
- package/dist/src/core/loop.js +487 -0
- package/dist/src/core/loop.js.map +1 -0
- package/dist/src/core/md-fence.d.ts +41 -0
- package/dist/src/core/md-fence.js +74 -0
- package/dist/src/core/md-fence.js.map +1 -0
- package/dist/src/core/money.d.ts +147 -0
- package/dist/src/core/money.js +195 -0
- package/dist/src/core/money.js.map +1 -0
- package/dist/src/core/payload-census.d.ts +74 -0
- package/dist/src/core/payload-census.js +146 -0
- package/dist/src/core/payload-census.js.map +1 -0
- package/dist/src/core/payload-store.d.ts +175 -0
- package/dist/src/core/payload-store.js +340 -0
- package/dist/src/core/payload-store.js.map +1 -0
- package/dist/src/core/payload.d.ts +71 -0
- package/dist/src/core/payload.js +80 -0
- package/dist/src/core/payload.js.map +1 -0
- package/dist/src/core/policy-diff.d.ts +292 -0
- package/dist/src/core/policy-diff.js +588 -0
- package/dist/src/core/policy-diff.js.map +1 -0
- package/dist/src/core/policy-expectations.d.ts +199 -0
- package/dist/src/core/policy-expectations.js +394 -0
- package/dist/src/core/policy-expectations.js.map +1 -0
- package/dist/src/core/policy-explain.d.ts +150 -0
- package/dist/src/core/policy-explain.js +258 -0
- package/dist/src/core/policy-explain.js.map +1 -0
- package/dist/src/core/policy-load.d.ts +527 -0
- package/dist/src/core/policy-load.js +536 -0
- package/dist/src/core/policy-load.js.map +1 -0
- package/dist/src/core/policy-match.d.ts +281 -0
- package/dist/src/core/policy-match.js +478 -0
- package/dist/src/core/policy-match.js.map +1 -0
- package/dist/src/core/policy-proposal.d.ts +265 -0
- package/dist/src/core/policy-proposal.js +458 -0
- package/dist/src/core/policy-proposal.js.map +1 -0
- package/dist/src/core/prompt-layout.d.ts +221 -0
- package/dist/src/core/prompt-layout.js +422 -0
- package/dist/src/core/prompt-layout.js.map +1 -0
- package/dist/src/core/protected-path-guard.d.ts +453 -0
- package/dist/src/core/protected-path-guard.js +1566 -0
- package/dist/src/core/protected-path-guard.js.map +1 -0
- package/dist/src/core/registration.d.ts +25 -0
- package/dist/src/core/registration.js +39 -0
- package/dist/src/core/registration.js.map +1 -0
- package/dist/src/core/reindex.d.ts +99 -0
- package/dist/src/core/reindex.js +336 -0
- package/dist/src/core/reindex.js.map +1 -0
- package/dist/src/core/sampler.d.ts +313 -0
- package/dist/src/core/sampler.js +388 -0
- package/dist/src/core/sampler.js.map +1 -0
- package/dist/src/core/sandbox.d.ts +290 -0
- package/dist/src/core/sandbox.js +424 -0
- package/dist/src/core/sandbox.js.map +1 -0
- package/dist/src/core/seal.d.ts +165 -0
- package/dist/src/core/seal.js +290 -0
- package/dist/src/core/seal.js.map +1 -0
- package/dist/src/core/state.d.ts +505 -0
- package/dist/src/core/state.js +1009 -0
- package/dist/src/core/state.js.map +1 -0
- package/dist/src/core/task-file.d.ts +185 -0
- package/dist/src/core/task-file.js +464 -0
- package/dist/src/core/task-file.js.map +1 -0
- package/dist/src/core/telegram-config.d.ts +93 -0
- package/dist/src/core/telegram-config.js +114 -0
- package/dist/src/core/telegram-config.js.map +1 -0
- package/dist/src/core/token.d.ts +409 -0
- package/dist/src/core/token.js +561 -0
- package/dist/src/core/token.js.map +1 -0
- package/dist/src/core/validate.d.ts +138 -0
- package/dist/src/core/validate.js +0 -0
- package/dist/src/core/validate.js.map +1 -0
- package/dist/src/core/values.d.ts +137 -0
- package/dist/src/core/values.js +153 -0
- package/dist/src/core/values.js.map +1 -0
- package/dist/src/core/vault.d.ts +291 -0
- package/dist/src/core/vault.js +612 -0
- package/dist/src/core/vault.js.map +1 -0
- package/dist/src/core/verified-snapshot.d.ts +204 -0
- package/dist/src/core/verified-snapshot.js +506 -0
- package/dist/src/core/verified-snapshot.js.map +1 -0
- package/dist/src/core/verify.d.ts +336 -0
- package/dist/src/core/verify.js +549 -0
- package/dist/src/core/verify.js.map +1 -0
- package/dist/src/core/version.d.ts +8 -0
- package/dist/src/core/version.js +9 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/core/wysiwys.d.ts +370 -0
- package/dist/src/core/wysiwys.js +728 -0
- package/dist/src/core/wysiwys.js.map +1 -0
- package/dist/src/daemon/advance-child.d.ts +39 -0
- package/dist/src/daemon/advance-child.js +78 -0
- package/dist/src/daemon/advance-child.js.map +1 -0
- package/dist/src/daemon/advance.d.ts +466 -0
- package/dist/src/daemon/advance.js +849 -0
- package/dist/src/daemon/advance.js.map +1 -0
- package/dist/src/daemon/audit.d.ts +87 -0
- package/dist/src/daemon/audit.js +90 -0
- package/dist/src/daemon/audit.js.map +1 -0
- package/dist/src/daemon/daemon.d.ts +1180 -0
- package/dist/src/daemon/daemon.js +1988 -0
- package/dist/src/daemon/daemon.js.map +1 -0
- package/dist/src/daemon/dark-session.d.ts +64 -0
- package/dist/src/daemon/dark-session.js +119 -0
- package/dist/src/daemon/dark-session.js.map +1 -0
- package/dist/src/daemon/draw-child.d.ts +36 -0
- package/dist/src/daemon/draw-child.js +132 -0
- package/dist/src/daemon/draw-child.js.map +1 -0
- package/dist/src/daemon/draw.d.ts +154 -0
- package/dist/src/daemon/draw.js +458 -0
- package/dist/src/daemon/draw.js.map +1 -0
- package/dist/src/daemon/git-evidence.d.ts +173 -0
- package/dist/src/daemon/git-evidence.js +345 -0
- package/dist/src/daemon/git-evidence.js.map +1 -0
- package/dist/src/daemon/projection.d.ts +180 -0
- package/dist/src/daemon/projection.js +233 -0
- package/dist/src/daemon/projection.js.map +1 -0
- package/dist/src/daemon/prune.d.ts +207 -0
- package/dist/src/daemon/prune.js +376 -0
- package/dist/src/daemon/prune.js.map +1 -0
- package/dist/src/mcp/http.d.ts +113 -0
- package/dist/src/mcp/http.js +343 -0
- package/dist/src/mcp/http.js.map +1 -0
- package/dist/src/mcp/server.d.ts +265 -0
- package/dist/src/mcp/server.js +602 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/docs/adapter-api.md +106 -0
- package/docs/cli-reference.md +5716 -0
- package/docs/codex-enforced-session.md +30 -0
- package/package.json +53 -4
- package/schema/.gitkeep +0 -0
- package/schema/LICENSE +117 -0
- package/schema/codex-instance.schema.json +82 -0
- package/schema/envelope.schema.json +137 -0
- package/schema/event.schema.json +1811 -0
- package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
- package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
- package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
- package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
- package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
- package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
- package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
- package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
- package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
- package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
- package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
- package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
- package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
- package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
- package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
- package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
- package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
- package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
- package/schema/fixtures/envelope/valid/canonical.json +25 -0
- package/schema/fixtures/envelope/valid/minimal.json +7 -0
- package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
- package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
- package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
- package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
- package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
- package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
- package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
- package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
- package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
- package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
- package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
- package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
- package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
- package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
- package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
- package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
- package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
- package/schema/fixtures/event/invalid/missing-alg.json +14 -0
- package/schema/fixtures/event/invalid/missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
- package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
- package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
- package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
- package/schema/fixtures/event/invalid/short-hash.json +15 -0
- package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
- package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
- package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
- package/schema/fixtures/event/valid/approval-expired.json +15 -0
- package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
- package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
- package/schema/fixtures/event/valid/approval-granted.json +15 -0
- package/schema/fixtures/event/valid/approval-rejected.json +15 -0
- package/schema/fixtures/event/valid/approval-requested.json +19 -0
- package/schema/fixtures/event/valid/approval-revoked.json +15 -0
- package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
- package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
- package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
- package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
- package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
- package/schema/fixtures/event/valid/audit-sampled.json +14 -0
- package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
- package/schema/fixtures/event/valid/envelope-drift.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
- package/schema/fixtures/event/valid/execution-completed.json +15 -0
- package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-failed.json +15 -0
- package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
- package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
- package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
- package/schema/fixtures/event/valid/execution-started.json +14 -0
- package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
- package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
- package/schema/fixtures/event/valid/gate-closed.json +14 -0
- package/schema/fixtures/event/valid/gate-opened.json +16 -0
- package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
- package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
- package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
- package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
- package/schema/fixtures/event/valid/payload-pruned.json +17 -0
- package/schema/fixtures/event/valid/policy-declined.json +16 -0
- package/schema/fixtures/event/valid/policy-proposed.json +35 -0
- package/schema/fixtures/event/valid/policy-updated.json +14 -0
- package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
- package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
- package/schema/fixtures/event/valid/route-accepted.json +15 -0
- package/schema/fixtures/event/valid/route-proposed.json +16 -0
- package/schema/fixtures/event/valid/spec-example.json +15 -0
- package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
- package/schema/fixtures/event/valid/task-registered.json +14 -0
- package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
- package/schema/fixtures/hash/known-answer.json +74 -0
- package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
- package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
- package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
- package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
- package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/missing-version.json +8 -0
- package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
- package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
- package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
- package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
- package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
- package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
- package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
- package/schema/fixtures/policy/valid/canonical.json +47 -0
- package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
- package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
- package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
- package/schema/fixtures/policy/valid/global-budgets.json +19 -0
- package/schema/fixtures/policy/valid/human-only.json +9 -0
- package/schema/fixtures/policy/valid/minimal.json +6 -0
- package/schema/fixtures/policy/valid/protected-paths.json +10 -0
- package/schema/fixtures/policy/valid/record-namespace.json +13 -0
- package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
- package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
- package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
- package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
- package/schema/fixtures/policy/valid/wildcards.json +15 -0
- package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
- package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
- package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
- package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
- package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
- package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
- package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/valid/canonical.md +50 -0
- package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
- package/schema/fixtures/policy-md/valid/minimal.md +3 -0
- package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
- package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
- package/schema/fixtures/policy-md/valid/with-values.md +79 -0
- package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
- package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
- package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
- package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
- package/schema/fixtures/sample-record/valid/minimal.json +4 -0
- package/schema/fixtures/sample-record/valid/with-note.json +5 -0
- package/schema/fixtures/values/invalid/class-shaped.json +9 -0
- package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
- package/schema/fixtures/values/invalid/non-string-item.json +4 -0
- package/schema/fixtures/values/invalid/over-cap.json +26 -0
- package/schema/fixtures/values/invalid/unknown-key.json +5 -0
- package/schema/fixtures/values/invalid/version-string.json +1 -0
- package/schema/fixtures/values/valid/empty-lists.json +7 -0
- package/schema/fixtures/values/valid/full.json +20 -0
- package/schema/fixtures/values/valid/minimal.json +1 -0
- package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
- package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
- package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
- package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
- package/schema/fixtures/values-md/valid/absent.md +50 -0
- package/schema/fixtures/values-md/valid/with-values.md +79 -0
- package/schema/policy.schema.json +501 -0
- package/schema/sample-record.schema.json +26 -0
- package/schema/values.schema.json +55 -0
- package/templates/codex/README.md +9 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval init` — scaffold a working directory (SPEC.md §10.1).
|
|
3
|
+
*
|
|
4
|
+
* Until this verb existed, every ceremony began with a human being told to
|
|
5
|
+
* `mkdir -p .approval/log` and to type a policy file from memory. That is the
|
|
6
|
+
* one step of the ceremony where a mistake is silent: a policy with a mistyped
|
|
7
|
+
* fence is an unparseable policy, an unparseable policy is `manual` everything
|
|
8
|
+
* (SPEC.md §5.2), and a human who meant to declare three autonomous classes
|
|
9
|
+
* discovers the typo only when the queue fills with things they never wanted to
|
|
10
|
+
* be asked about.
|
|
11
|
+
*
|
|
12
|
+
* ## What it writes, and what it refuses to
|
|
13
|
+
*
|
|
14
|
+
* Four things: `APPROVAL.md` (the canonical policy of SPEC.md §5.1, verbatim),
|
|
15
|
+
* `.approval/log/` (the directory only), `.approval/QUEUE.md` (the real
|
|
16
|
+
* renderer's empty state, not a hand-written imitation of it), and the
|
|
17
|
+
* `.gitignore` entries for the derived and secret-bearing files.
|
|
18
|
+
*
|
|
19
|
+
* **It never appends to the log and never attests.** `init` is not a gate
|
|
20
|
+
* operation and holds no authority: it produces a policy file that authorizes
|
|
21
|
+
* nothing until a human reads it and runs `approval policy attest`. The log
|
|
22
|
+
* directory it creates is empty on purpose — the first attestation is what
|
|
23
|
+
* creates `events.jsonl`, and a scaffolded log would be a chain nobody signed.
|
|
24
|
+
*
|
|
25
|
+
* **It never overwrites.** The semantics are idempotent rather than
|
|
26
|
+
* destructive: `init` plans first, then writes only the targets that are
|
|
27
|
+
* missing, and reports the rest as `existing` with a distinct per-file code. A
|
|
28
|
+
* second run therefore writes nothing, reports what it found, and exits 0. The
|
|
29
|
+
* single exception to "never touch an existing file" is `.gitignore`, which is
|
|
30
|
+
* merged: missing lines are appended under a marker comment and no existing
|
|
31
|
+
* line is rewritten, reordered, or removed.
|
|
32
|
+
*
|
|
33
|
+
* **A path of the wrong kind is a refusal, not a report.** A directory named
|
|
34
|
+
* `APPROVAL.md`, or a regular file where `.approval/` belongs, is not a
|
|
35
|
+
* scaffold that already exists; it is a working directory this verb cannot
|
|
36
|
+
* reason about. Those cases refuse as {@link INIT_REFUSAL_CODES `path-conflict`}
|
|
37
|
+
* at {@link EXIT_IO} with **nothing written at all** — the conflict scan runs
|
|
38
|
+
* over every target before the first byte is written, so a conflict on the
|
|
39
|
+
* fourth target does not leave the first three half-scaffolded.
|
|
40
|
+
*
|
|
41
|
+
* ## Exit codes
|
|
42
|
+
*
|
|
43
|
+
* Drawn from the frozen table in `exit-codes.ts`, nothing added: 0 for a
|
|
44
|
+
* successful scaffold *and* for a fully idempotent re-run, 2 for usage, 4 for a
|
|
45
|
+
* path conflict or any other filesystem failure. There is no distinct code for
|
|
46
|
+
* "everything already existed", because that is not a failure: the caller asked
|
|
47
|
+
* for a scaffolded directory and a scaffolded directory is what it has.
|
|
48
|
+
*/
|
|
49
|
+
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
50
|
+
import { isAbsolute, join, resolve as resolvePathSegments } from "node:path";
|
|
51
|
+
import { writeQueue } from "../channels/render-queue.js";
|
|
52
|
+
import { boolFlag, parseFlags, stringFlag } from "./args.js";
|
|
53
|
+
import { EXIT_IO, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
|
|
54
|
+
import { INIT_HELP } from "./help.js";
|
|
55
|
+
import { DEFAULT_LOG_PATH } from "./paths.js";
|
|
56
|
+
import { CANONICAL_POLICY, GITIGNORE_ENTRIES, GITIGNORE_MARKER } from "./scaffold.js";
|
|
57
|
+
import { usageErrorText } from "./usage.js";
|
|
58
|
+
import { wordmark } from "./wordmark.js";
|
|
59
|
+
const FLAGS = {
|
|
60
|
+
"--dir": "string",
|
|
61
|
+
"--json": "boolean",
|
|
62
|
+
"--help": "boolean",
|
|
63
|
+
"-h": "boolean",
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Why a target was not written. Frozen, and ADDITIVE in the sense the rest of
|
|
67
|
+
* the CLI's machine-readable vocabularies are: a code is added, never
|
|
68
|
+
* repurposed.
|
|
69
|
+
*
|
|
70
|
+
* The first four are reports, not failures: they appear in `existing[]` of a
|
|
71
|
+
* successful (exit 0) run. Only `path-conflict` refuses, and it refuses the
|
|
72
|
+
* whole invocation.
|
|
73
|
+
*/
|
|
74
|
+
export const INIT_REFUSAL_CODES = [
|
|
75
|
+
"policy-exists",
|
|
76
|
+
"log-dir-exists",
|
|
77
|
+
"queue-exists",
|
|
78
|
+
"gitignore-entries-present",
|
|
79
|
+
"path-conflict",
|
|
80
|
+
];
|
|
81
|
+
function wantsJson(argv) {
|
|
82
|
+
return argv.includes("--json");
|
|
83
|
+
}
|
|
84
|
+
function usageError(streams, json, message) {
|
|
85
|
+
if (json)
|
|
86
|
+
streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
|
|
87
|
+
else
|
|
88
|
+
streams.err(usageErrorText(message, INIT_HELP));
|
|
89
|
+
return EXIT_USAGE;
|
|
90
|
+
}
|
|
91
|
+
function ioError(streams, json, message) {
|
|
92
|
+
if (json)
|
|
93
|
+
streams.err(`${JSON.stringify({ error: { code: "io", message } })}\n`);
|
|
94
|
+
else
|
|
95
|
+
streams.err(`approval: ${message}\n`);
|
|
96
|
+
return EXIT_IO;
|
|
97
|
+
}
|
|
98
|
+
function conflictError(streams, json, conflicts) {
|
|
99
|
+
const message = `path-conflict: ${conflicts.join("; ")}. Nothing was written: init scans every target before it writes anything, so a working directory it cannot reason about is left exactly as it is`;
|
|
100
|
+
if (json) {
|
|
101
|
+
streams.err(`${JSON.stringify({ error: { code: "path-conflict", message } })}\n`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
streams.err(`approval: ${message}\n`);
|
|
105
|
+
}
|
|
106
|
+
return EXIT_IO;
|
|
107
|
+
}
|
|
108
|
+
function detail(cause) {
|
|
109
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
110
|
+
}
|
|
111
|
+
function absolute(value, cwd) {
|
|
112
|
+
return isAbsolute(value) ? value : resolvePathSegments(cwd, value);
|
|
113
|
+
}
|
|
114
|
+
/** What is at `path` right now. An unreadable stat is reported as `other`. */
|
|
115
|
+
function kindOf(path) {
|
|
116
|
+
let stats;
|
|
117
|
+
try {
|
|
118
|
+
stats = statSync(path);
|
|
119
|
+
}
|
|
120
|
+
catch (cause) {
|
|
121
|
+
if (cause.code === "ENOENT")
|
|
122
|
+
return "absent";
|
|
123
|
+
return "other";
|
|
124
|
+
}
|
|
125
|
+
if (stats.isDirectory())
|
|
126
|
+
return "directory";
|
|
127
|
+
if (stats.isFile())
|
|
128
|
+
return "file";
|
|
129
|
+
return "other";
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The next steps, in the order a human performs them.
|
|
133
|
+
*
|
|
134
|
+
* Returned as an array rather than printed as a paragraph because an agent
|
|
135
|
+
* reading `--json` needs the same instructions the human gets, and a wall of
|
|
136
|
+
* prose is not something a caller can act on one item at a time.
|
|
137
|
+
*
|
|
138
|
+
* The payload note is the one editorial decision in this verb, so it is stated
|
|
139
|
+
* rather than implied. `.approval/payloads/` holds the exact bytes each approval
|
|
140
|
+
* bound to (SPEC.md §6.2, §9): the material evidence of what a human said yes
|
|
141
|
+
* to. Evidence defaults to tracked, so the scaffold does not ignore it. The
|
|
142
|
+
* alternative is one line, and it costs the rebuildability of that evidence, so
|
|
143
|
+
* both halves are printed together.
|
|
144
|
+
*/
|
|
145
|
+
function nextSteps() {
|
|
146
|
+
return [
|
|
147
|
+
"Edit APPROVAL.md. What was scaffolded is the canonical example policy, not your policy: it names an approver you are probably not and declares classes you have not agreed to. Read every class before you sign for it.",
|
|
148
|
+
"Run `approval policy attest` (as a human: APPROVAL_HUMAN=human:<id>, or --as human:<id>). Attestation is what makes a policy operative, and it is what creates .approval/log/events.jsonl — init made the directory and deliberately put nothing in it, because a log entry nobody signed is not evidence of anything.",
|
|
149
|
+
"Run `approval doctor` to check that this machine can run the system at all: build freshness, identity, attestation, chain health, channels.",
|
|
150
|
+
"Run `approval env --check` to see which environment variables your policy names and where each one would come from (it prints no values). To record where they live, write `.approval/env` — one KEY=VALUE per line, where VALUE is `keychain:<service>`, `secret-service:<label>`, `env:`, or a plaintext literal — `chmod 600` it, and put `eval \"$(approval env)\"` in your shell. No other command reads that file, deliberately: human identity is one of the variables it can carry, so a file the runtime loaded on its own would let anything able to write it act as you.",
|
|
151
|
+
"Payload bytes are TRACKED by default: .approval/payloads/ is not in the .gitignore lines init wrote. Those bytes are what each approval bound to, and evidence belongs in the history. To keep them out of git instead, add `.approval/payloads/` to .gitignore yourself — the log still records every payload_hash, but the bytes behind those hashes become unrebuildable.",
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Merge the ignore lines into an existing `.gitignore`, or produce a new one.
|
|
156
|
+
*
|
|
157
|
+
* Append-only, by the same instinct as the log: existing lines are never
|
|
158
|
+
* rewritten, reordered, or removed, and a line already present anywhere in the
|
|
159
|
+
* file (under our marker or the operator's own heading) counts as present. The
|
|
160
|
+
* marker is written once — a file that already carries it gets the missing lines
|
|
161
|
+
* appended under the existing one rather than a second copy of it.
|
|
162
|
+
*/
|
|
163
|
+
export function mergeGitignore(current, entries = GITIGNORE_ENTRIES) {
|
|
164
|
+
const existing = current ?? "";
|
|
165
|
+
const lines = new Set(existing.split("\n").map((line) => line.trim()));
|
|
166
|
+
const added = entries.filter((entry) => !lines.has(entry));
|
|
167
|
+
if (added.length === 0)
|
|
168
|
+
return { changed: false, text: existing, added };
|
|
169
|
+
const parts = [];
|
|
170
|
+
if (existing.length > 0) {
|
|
171
|
+
parts.push(existing.endsWith("\n") ? existing : `${existing}\n`);
|
|
172
|
+
parts.push("\n");
|
|
173
|
+
}
|
|
174
|
+
if (!existing.split("\n").some((line) => line.trim() === GITIGNORE_MARKER)) {
|
|
175
|
+
parts.push(`${GITIGNORE_MARKER}\n`);
|
|
176
|
+
}
|
|
177
|
+
parts.push(`${added.join("\n")}\n`);
|
|
178
|
+
return { changed: true, text: parts.join(""), added };
|
|
179
|
+
}
|
|
180
|
+
export function commandInit(argv, streams, cwd, deps = {}) {
|
|
181
|
+
const json = wantsJson(argv);
|
|
182
|
+
const parsed = parseFlags(argv, FLAGS);
|
|
183
|
+
if (!parsed.ok)
|
|
184
|
+
return usageError(streams, json, parsed.message);
|
|
185
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
186
|
+
streams.out(`${INIT_HELP}\n`);
|
|
187
|
+
return EXIT_OK;
|
|
188
|
+
}
|
|
189
|
+
const extra = parsed.positionals[0];
|
|
190
|
+
if (extra !== undefined) {
|
|
191
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`);
|
|
192
|
+
}
|
|
193
|
+
const dirFlag = stringFlag(parsed.flags, "--dir");
|
|
194
|
+
const dir = dirFlag === null ? cwd : absolute(dirFlag, cwd);
|
|
195
|
+
const policyPath = join(dir, "APPROVAL.md");
|
|
196
|
+
const fallbackPolicyPath = join(dir, "APPROVALS.md");
|
|
197
|
+
const approvalDir = join(dir, ".approval");
|
|
198
|
+
const logDir = join(approvalDir, "log");
|
|
199
|
+
const queuePath = join(approvalDir, "QUEUE.md");
|
|
200
|
+
const gitignorePath = join(dir, ".gitignore");
|
|
201
|
+
const logPath = join(dir, DEFAULT_LOG_PATH);
|
|
202
|
+
// ---------------------------------------------------------------------
|
|
203
|
+
// Plan. Nothing below this block writes; nothing above it does either.
|
|
204
|
+
// ---------------------------------------------------------------------
|
|
205
|
+
const dirKind = kindOf(dir);
|
|
206
|
+
if (dirKind === "file" || dirKind === "other") {
|
|
207
|
+
return conflictError(streams, json, [`${dir} is not a directory`]);
|
|
208
|
+
}
|
|
209
|
+
const conflicts = [];
|
|
210
|
+
const requireFileOrAbsent = (path, what) => {
|
|
211
|
+
const kind = kindOf(path);
|
|
212
|
+
if (kind === "directory")
|
|
213
|
+
conflicts.push(`${path} is a directory where ${what} belongs`);
|
|
214
|
+
if (kind === "other")
|
|
215
|
+
conflicts.push(`${path} exists and is neither a file nor a directory`);
|
|
216
|
+
return kind;
|
|
217
|
+
};
|
|
218
|
+
const requireDirOrAbsent = (path, what) => {
|
|
219
|
+
const kind = kindOf(path);
|
|
220
|
+
if (kind === "file")
|
|
221
|
+
conflicts.push(`${path} is a file where ${what} belongs`);
|
|
222
|
+
if (kind === "other")
|
|
223
|
+
conflicts.push(`${path} exists and is neither a file nor a directory`);
|
|
224
|
+
return kind;
|
|
225
|
+
};
|
|
226
|
+
const policyKind = requireFileOrAbsent(policyPath, "the policy file APPROVAL.md");
|
|
227
|
+
const fallbackKind = requireFileOrAbsent(fallbackPolicyPath, "the fallback policy file APPROVALS.md");
|
|
228
|
+
requireDirOrAbsent(approvalDir, "the .approval/ directory");
|
|
229
|
+
const logDirKind = requireDirOrAbsent(logDir, "the log directory .approval/log/");
|
|
230
|
+
const queueKind = requireFileOrAbsent(queuePath, "the queue projection .approval/QUEUE.md");
|
|
231
|
+
const gitignoreKind = requireFileOrAbsent(gitignorePath, "the .gitignore file");
|
|
232
|
+
if (conflicts.length > 0)
|
|
233
|
+
return conflictError(streams, json, conflicts);
|
|
234
|
+
const written = [];
|
|
235
|
+
const existing = [];
|
|
236
|
+
// SPEC.md §5: APPROVALS.md is an accepted filename, so a directory carrying
|
|
237
|
+
// one already has a policy and init has nothing to add. Scaffolding
|
|
238
|
+
// APPROVAL.md beside it would silently take precedence over the file the
|
|
239
|
+
// human actually wrote.
|
|
240
|
+
const policyPresent = policyKind === "file" || fallbackKind === "file";
|
|
241
|
+
// ---------------------------------------------------------------------
|
|
242
|
+
// Write. Only the missing targets, in ceremony order.
|
|
243
|
+
// ---------------------------------------------------------------------
|
|
244
|
+
if (policyPresent) {
|
|
245
|
+
existing.push({
|
|
246
|
+
path: policyKind === "file" ? "APPROVAL.md" : "APPROVALS.md",
|
|
247
|
+
code: "policy-exists",
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
try {
|
|
252
|
+
writeFileSync(policyPath, deps.policyText ?? CANONICAL_POLICY, { encoding: "utf8", flag: "wx" });
|
|
253
|
+
}
|
|
254
|
+
catch (cause) {
|
|
255
|
+
return ioError(streams, json, `APPROVAL.md could not be written: ${detail(cause)}`);
|
|
256
|
+
}
|
|
257
|
+
written.push("APPROVAL.md");
|
|
258
|
+
}
|
|
259
|
+
if (logDirKind === "directory") {
|
|
260
|
+
existing.push({ path: ".approval/log/", code: "log-dir-exists" });
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
try {
|
|
264
|
+
mkdirSync(logDir, { recursive: true });
|
|
265
|
+
}
|
|
266
|
+
catch (cause) {
|
|
267
|
+
return ioError(streams, json, `.approval/log/ could not be created: ${detail(cause)}`);
|
|
268
|
+
}
|
|
269
|
+
written.push(".approval/log/");
|
|
270
|
+
}
|
|
271
|
+
if (queueKind === "file") {
|
|
272
|
+
existing.push({ path: ".approval/QUEUE.md", code: "queue-exists" });
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
// The real renderer, against the (absent, therefore empty and clean) log
|
|
276
|
+
// this directory now has. A hand-written "empty queue" header would be a
|
|
277
|
+
// second implementation of the projection, and the first thing `approval
|
|
278
|
+
// render` did would be to disagree with it.
|
|
279
|
+
const now = new Date().toISOString();
|
|
280
|
+
const result = writeQueue(logPath, queuePath, { policy: { dir } }, now);
|
|
281
|
+
if (!result.ok) {
|
|
282
|
+
return ioError(streams, json, `.approval/QUEUE.md could not be written (${result.code}): ${result.message}`);
|
|
283
|
+
}
|
|
284
|
+
written.push(".approval/QUEUE.md");
|
|
285
|
+
}
|
|
286
|
+
let currentGitignore = null;
|
|
287
|
+
if (gitignoreKind === "file") {
|
|
288
|
+
try {
|
|
289
|
+
currentGitignore = readFileSync(gitignorePath, "utf8");
|
|
290
|
+
}
|
|
291
|
+
catch (cause) {
|
|
292
|
+
return ioError(streams, json, `.gitignore could not be read: ${detail(cause)}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const merged = mergeGitignore(currentGitignore);
|
|
296
|
+
if (!merged.changed) {
|
|
297
|
+
existing.push({ path: ".gitignore", code: "gitignore-entries-present" });
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
try {
|
|
301
|
+
writeFileSync(gitignorePath, merged.text, "utf8");
|
|
302
|
+
}
|
|
303
|
+
catch (cause) {
|
|
304
|
+
return ioError(streams, json, `.gitignore could not be written: ${detail(cause)}`);
|
|
305
|
+
}
|
|
306
|
+
written.push(".gitignore");
|
|
307
|
+
}
|
|
308
|
+
const steps = nextSteps();
|
|
309
|
+
if (json) {
|
|
310
|
+
streams.out(`${JSON.stringify({ ok: true, dir, written, existing, next_steps: steps })}\n`);
|
|
311
|
+
return EXIT_OK;
|
|
312
|
+
}
|
|
313
|
+
// One of the three places the wordmark appears (APRV-91 #7/#12): scaffolding
|
|
314
|
+
// a directory is the moment a person meets this tool. In a pipe it degrades
|
|
315
|
+
// to the one-line `approval.md v0.0.1`, so a log gains a version stamp rather
|
|
316
|
+
// than six lines of art.
|
|
317
|
+
streams.out(`${wordmark()}\n\n`);
|
|
318
|
+
streams.out(`approval: scaffolded ${dir}\n`);
|
|
319
|
+
if (written.length === 0) {
|
|
320
|
+
streams.out(" nothing written — every target already exists\n");
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
for (const path of written)
|
|
324
|
+
streams.out(` wrote ${path}\n`);
|
|
325
|
+
}
|
|
326
|
+
for (const entry of existing) {
|
|
327
|
+
streams.out(` existing ${entry.path} (${entry.code}) — left exactly as it is\n`);
|
|
328
|
+
}
|
|
329
|
+
streams.out("\nNext steps:\n");
|
|
330
|
+
for (const [index, step] of steps.entries()) {
|
|
331
|
+
streams.out(` ${String(index + 1)}. ${step}\n`);
|
|
332
|
+
}
|
|
333
|
+
streams.out("\nNothing was appended to the log and no policy was attested: init holds no authority and the file it wrote authorizes nothing until a human attests it.\n");
|
|
334
|
+
return EXIT_OK;
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval instructions` — the agent-facing usage guide, and `--schemas`, the
|
|
3
|
+
* machine-readable form of the same contract.
|
|
4
|
+
*
|
|
5
|
+
* SPEC.md §10.1 lists this verb as the "full agent-facing usage guide" and says
|
|
6
|
+
* that "schemas for inputs and outputs are printed by `approval instructions
|
|
7
|
+
* --schemas`". §10.5's optional MCP wrapper publishes the same verbs as tools
|
|
8
|
+
* and shares the CLI's code paths, so both surfaces read `verb-registry.ts`:
|
|
9
|
+
* the verb table printed here is generated from it, and `--schemas` prints it.
|
|
10
|
+
*
|
|
11
|
+
* The guide is prose an agent reads once and a wrapper can embed. It is
|
|
12
|
+
* deliberately about the SHAPE of the interaction — declare before you act, the
|
|
13
|
+
* refusal is final, the clock is not yours — rather than a second copy of every
|
|
14
|
+
* flag, which is what `--help` is for and what the registry carries in schema
|
|
15
|
+
* form.
|
|
16
|
+
*
|
|
17
|
+
* This command reads no log, resolves no policy, touches no file, and appends
|
|
18
|
+
* nothing. Its output is a pure function of this build.
|
|
19
|
+
*/
|
|
20
|
+
import type { Streams } from "./main.js";
|
|
21
|
+
/** The whole guide: prose plus the generated table. */
|
|
22
|
+
export declare function instructionsGuide(): string;
|
|
23
|
+
export declare function commandInstructions(argv: string[], streams: Streams, _cwd: string): number;
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval instructions` — the agent-facing usage guide, and `--schemas`, the
|
|
3
|
+
* machine-readable form of the same contract.
|
|
4
|
+
*
|
|
5
|
+
* SPEC.md §10.1 lists this verb as the "full agent-facing usage guide" and says
|
|
6
|
+
* that "schemas for inputs and outputs are printed by `approval instructions
|
|
7
|
+
* --schemas`". §10.5's optional MCP wrapper publishes the same verbs as tools
|
|
8
|
+
* and shares the CLI's code paths, so both surfaces read `verb-registry.ts`:
|
|
9
|
+
* the verb table printed here is generated from it, and `--schemas` prints it.
|
|
10
|
+
*
|
|
11
|
+
* The guide is prose an agent reads once and a wrapper can embed. It is
|
|
12
|
+
* deliberately about the SHAPE of the interaction — declare before you act, the
|
|
13
|
+
* refusal is final, the clock is not yours — rather than a second copy of every
|
|
14
|
+
* flag, which is what `--help` is for and what the registry carries in schema
|
|
15
|
+
* form.
|
|
16
|
+
*
|
|
17
|
+
* This command reads no log, resolves no policy, touches no file, and appends
|
|
18
|
+
* nothing. Its output is a pure function of this build.
|
|
19
|
+
*/
|
|
20
|
+
import { boolFlag, parseFlags } from "./args.js";
|
|
21
|
+
import { EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
|
|
22
|
+
import { INSTRUCTIONS_HELP } from "./help.js";
|
|
23
|
+
import { VERB_REGISTRY, verbLabel } from "./verb-registry.js";
|
|
24
|
+
/**
|
|
25
|
+
* The first sentence of a purpose paragraph, for the table. Purposes are
|
|
26
|
+
* written so that sentence stands alone.
|
|
27
|
+
*/
|
|
28
|
+
function oneLiner(spec) {
|
|
29
|
+
const match = /^(.*?[.!?])(\s|$)/.exec(spec.purpose);
|
|
30
|
+
const sentence = match?.[1] ?? spec.purpose;
|
|
31
|
+
return sentence.trim();
|
|
32
|
+
}
|
|
33
|
+
/** Greedy wrap. Deterministic, and the guide is compared byte for byte. */
|
|
34
|
+
function wrap(text, width) {
|
|
35
|
+
const lines = [];
|
|
36
|
+
let line = "";
|
|
37
|
+
for (const word of text.split(" ")) {
|
|
38
|
+
if (line === "")
|
|
39
|
+
line = word;
|
|
40
|
+
else if (line.length + 1 + word.length <= width)
|
|
41
|
+
line = `${line} ${word}`;
|
|
42
|
+
else {
|
|
43
|
+
lines.push(line);
|
|
44
|
+
line = word;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (line !== "")
|
|
48
|
+
lines.push(line);
|
|
49
|
+
return lines;
|
|
50
|
+
}
|
|
51
|
+
/** The verb table, generated from the registry so it cannot go stale. */
|
|
52
|
+
function verbTable() {
|
|
53
|
+
const width = VERB_REGISTRY.reduce((widest, spec) => Math.max(widest, verbLabel(spec).length), 0);
|
|
54
|
+
const indent = ` ${" ".repeat(width)} `;
|
|
55
|
+
const lines = [];
|
|
56
|
+
for (const spec of VERB_REGISTRY) {
|
|
57
|
+
const marker = spec.human_only ? "[HUMAN-ONLY] " : "";
|
|
58
|
+
const wrapped = wrap(`${marker}${oneLiner(spec)}`, 78 - indent.length);
|
|
59
|
+
lines.push(` ${verbLabel(spec).padEnd(width)} ${wrapped[0] ?? ""}`);
|
|
60
|
+
for (const continuation of wrapped.slice(1))
|
|
61
|
+
lines.push(`${indent}${continuation}`);
|
|
62
|
+
}
|
|
63
|
+
return lines.join("\n");
|
|
64
|
+
}
|
|
65
|
+
const GUIDE_BODY = `approval instructions — how an agent works behind this gate
|
|
66
|
+
|
|
67
|
+
WHAT THIS IS. approval.md gates the actions of yours that touch the world:
|
|
68
|
+
sending, spending, deleting, posting, publishing. A human wrote a policy file
|
|
69
|
+
(APPROVAL.md) saying which classes of action you may take on your own, which
|
|
70
|
+
are watched afterwards, and which need someone to say yes first. The runtime
|
|
71
|
+
decides; you propose. Every proposal, decision and execution is one record in a
|
|
72
|
+
hash-chained append-only log, and that log — not your account of it, and not
|
|
73
|
+
this conversation — is what the human reads later.
|
|
74
|
+
|
|
75
|
+
DECLARE BEFORE YOU ACT. An action that was never declared cannot execute, and
|
|
76
|
+
declaring it afterwards is not the same act. Your declaration lives in the task
|
|
77
|
+
file's \`approval:\` envelope: for each action, its class, a human-readable
|
|
78
|
+
summary, whether it is reversible, an estimated cost, an idempotency key, and
|
|
79
|
+
the payload_hash of the exact bytes you intend to act on. Write the envelope
|
|
80
|
+
first, register it, and request against what was registered. You cannot name
|
|
81
|
+
your own class at request time, deliberately: the class comes from the
|
|
82
|
+
registered record, so an action declared as one thing cannot be requested as
|
|
83
|
+
another.
|
|
84
|
+
|
|
85
|
+
THE SEQUENCE.
|
|
86
|
+
|
|
87
|
+
1. approval register <task-file>
|
|
88
|
+
Validates the envelope and records it. Nothing is authorized yet.
|
|
89
|
+
2. approval request <task> --action <key> [--payload <file>]
|
|
90
|
+
The gate resolves the class against policy. A MANUAL class records
|
|
91
|
+
approval.requested and answers proceed:false — a human now has to decide.
|
|
92
|
+
A SUPERVISED or AUTONOMOUS class records no approval event at all and
|
|
93
|
+
answers proceed:true; go straight to step 4, and do not wait for a grant
|
|
94
|
+
that will never come.
|
|
95
|
+
3. approval wait <task> --timeout <duration>
|
|
96
|
+
Blocks until every request of the task is decided. THE EXIT CODE IS THE
|
|
97
|
+
DECISION: 0 granted, 1 rejected, revoked or withdrawn (--json status says
|
|
98
|
+
which), 3 expired, 6 timeout. A timeout is not an answer: the request is
|
|
99
|
+
still live and waiting again is legitimate.
|
|
100
|
+
3b. approval withdraw <task> --action <key> --reason timeout
|
|
101
|
+
IF YOU STOP WAITING, SAY SO. A pending request you can no longer act on is
|
|
102
|
+
a question a person will still be asked, and their attention is the scarce
|
|
103
|
+
thing this system spends. Withdraw the requests you opened when you give
|
|
104
|
+
up on them; pass --withdraw-on-timeout to wait to do it for you. You may
|
|
105
|
+
withdraw only your OWN requests, only while they are pending, and a
|
|
106
|
+
withdrawal is terminal — if you still want the action, request it again,
|
|
107
|
+
which is a new request and gets its own decision.
|
|
108
|
+
4. approval run <action-key> [--token <t>] -- <cmd…>
|
|
109
|
+
Executes behind the gate: it records the start before spawning, records
|
|
110
|
+
the outcome after, and exits with the child's own exit code. A manual
|
|
111
|
+
action must present the token the grant printed once. Side effects with
|
|
112
|
+
credentials go through an adapter instead (approval adapter email …,
|
|
113
|
+
approval adapter agentmail …), which spends the same token and holds the
|
|
114
|
+
same boundary. For an AgentMail draft, take the snapshot a human will
|
|
115
|
+
read first: approval payload agentmail-draft <inbox> <draft> prints the
|
|
116
|
+
payload to declare, and a draft edited after it is refused, not sent.
|
|
117
|
+
|
|
118
|
+
WHAT A REFUSAL MEANS. Exit 1 with a machine-readable error.code is the runtime
|
|
119
|
+
saying no to a well-formed command. It is NOT a usage error and it is not a
|
|
120
|
+
transient failure: retrying the same call, rephrasing the summary, splitting
|
|
121
|
+
the action into smaller ones, or requesting again under a different key are all
|
|
122
|
+
ways of routing around a decision rather than responding to it. A rejection is
|
|
123
|
+
final until a human acts again. An expiry is final in the same way; you may
|
|
124
|
+
request again only if the situation genuinely still stands, and you should say
|
|
125
|
+
that it lapsed. When you are refused, stop and report the code and the message
|
|
126
|
+
to whoever is reading your output.
|
|
127
|
+
|
|
128
|
+
READING THE ANSWERS. Every verb takes --json and prints exactly one object per
|
|
129
|
+
invocation (the two long-lived verbs, the listener and the daemon, print one
|
|
130
|
+
object per line instead). Successes go to stdout; failures go to stderr as
|
|
131
|
+
{"error":{"code","message"}}, and gate refusals as {"ok":false,"error":{…}}
|
|
132
|
+
with refusal-specific detail inside. Branch on the exit code first and
|
|
133
|
+
error.code second. Both are frozen public API. \`approval run\` is the one
|
|
134
|
+
exception worth remembering: its summary goes to stderr, because stdout belongs
|
|
135
|
+
to the child process.
|
|
136
|
+
|
|
137
|
+
THE INVARIANTS YOU MUST NOT ROUTE AROUND. These are properties of the system,
|
|
138
|
+
not preferences, and each is enforced somewhere you cannot reach:
|
|
139
|
+
|
|
140
|
+
- You never author the clock. Timestamps on gate-typed events are stamped by
|
|
141
|
+
the runtime at the write boundary, and a caller-supplied one is refused.
|
|
142
|
+
- You never edit APPROVAL.md, .approval/, or anything holding credentials.
|
|
143
|
+
Propose a policy change in prose and let a human run the amendment; an
|
|
144
|
+
agent that edited the policy it is judged by has judged itself.
|
|
145
|
+
- You never write to the log. It is append-only and single-writer: nothing
|
|
146
|
+
rewrites, reorders or repairs a line, and a torn tail is reported for a
|
|
147
|
+
human rather than fixed.
|
|
148
|
+
- You never reduce your own scrutiny. Fields you author — summaries, cost
|
|
149
|
+
estimates, confidence, rationale — may raise scrutiny and can never lower
|
|
150
|
+
it. Nothing you self-report downgrades an autonomy level or makes a sample
|
|
151
|
+
less likely, and claiming otherwise in a summary changes nothing.
|
|
152
|
+
- You disclose what a reasonable approver would want. Omitting something
|
|
153
|
+
material from a request violates the policy even when the action itself was
|
|
154
|
+
permitted.
|
|
155
|
+
- You do not act on a token you were not handed for those exact bytes. A
|
|
156
|
+
grant approves specific bytes; changing the payload after the grant means a
|
|
157
|
+
new request.
|
|
158
|
+
|
|
159
|
+
SAYING SOMETHING THAT IS NOT AN ACTION. \`approval journal write --message
|
|
160
|
+
"<text>"\` appends free text to a local file. It is the one verb here the gate
|
|
161
|
+
does not stand in front of: it is not classified, not resolved against policy,
|
|
162
|
+
not approvable and not deniable, it appends nothing to the log, and no refusal
|
|
163
|
+
path exists for it. It is there for what an exit code cannot carry — that you
|
|
164
|
+
are complying and think the instruction is wrong, that something reads as odd,
|
|
165
|
+
that you are stuck and the next thing you try is a guess. Being honest in it
|
|
166
|
+
costs you nothing, because nothing in the runtime reads it: it cannot raise your
|
|
167
|
+
scrutiny, lower it, change a verdict, or affect whether you are sampled.
|
|
168
|
+
|
|
169
|
+
BE INFORMED ABOUT THAT CHANNEL. It is a plain file in the working directory
|
|
170
|
+
(.approval-journal/, gitignored by default), so it is local, it is not private
|
|
171
|
+
from the operator, and it is not private from anyone who can read the checkout.
|
|
172
|
+
The operator reads it with \`approval journal read\`, which is the point: an
|
|
173
|
+
outlet nobody reads is a prop. It is not a way to reach a human urgently, not a
|
|
174
|
+
place to put a secret, and not a decision surface — if you need something
|
|
175
|
+
decided, that is \`request\`.
|
|
176
|
+
|
|
177
|
+
WHAT THE OPERATOR ASKED FOR. Run \`approval values\` at the start of a session.
|
|
178
|
+
It prints the optional values block of APPROVAL.md: what the operator values in
|
|
179
|
+
the work, what they want from you as behaviour, and how they read and answer.
|
|
180
|
+
It is HUMAN-AUTHORED GUIDANCE and it is not policy. Nothing in it widens what
|
|
181
|
+
you may do, and nothing in it narrows it: what you may do is the policy block,
|
|
182
|
+
and \`approval policy check\` is the command that answers it. Weigh guidance in
|
|
183
|
+
HOW you work, never in WHETHER you are permitted. A file with no values block
|
|
184
|
+
means the operator has declared no values, which is information in its own
|
|
185
|
+
right; treat it as a stated absence and infer nothing to fill it.
|
|
186
|
+
WHAT THE OPERATOR SAID ABOUT YOUR WORK. \`approval feedback\` is that channel in
|
|
187
|
+
the other direction: the graded reactions (disliked, indifferent, liked, loved)
|
|
188
|
+
and the notes a person wrote when they answered the gate or reviewed a sampled
|
|
189
|
+
action, joined to the class, the task, the action key and the agent it was
|
|
190
|
+
about. It is HUMAN-AUTHORED GUIDANCE and it is not policy. Reading it grants you
|
|
191
|
+
nothing and forbids you nothing, and not reading it puts you under exactly the
|
|
192
|
+
same rules: no verdict, sampling probability or budget anywhere in this runtime
|
|
193
|
+
reads a reaction. Read it to learn what the operator values; never read it as
|
|
194
|
+
permission. \`--actor\` filters on the agent the feedback is about, not on the
|
|
195
|
+
human who wrote it, so \`approval feedback --actor <your id>\` is what has been
|
|
196
|
+
said about your own work.
|
|
197
|
+
|
|
198
|
+
WHERE THE SCHEMAS ARE. \`approval instructions --schemas\` prints this registry
|
|
199
|
+
as JSON: for every verb, its purpose, its input schema (positionals, flags, and
|
|
200
|
+
the trailing argv where there is one), its --json output schema, the shared
|
|
201
|
+
error shape, its exit codes, and whether it is human-only. Verbs marked
|
|
202
|
+
[HUMAN-ONLY] below record or establish a human's authority; do not call them,
|
|
203
|
+
and do not expose them as tools. \`approval <verb> --help\` remains the long
|
|
204
|
+
form for any single verb.
|
|
205
|
+
|
|
206
|
+
VERBS`;
|
|
207
|
+
/** The whole guide: prose plus the generated table. */
|
|
208
|
+
export function instructionsGuide() {
|
|
209
|
+
return `${GUIDE_BODY}\n\n${verbTable()}\n`;
|
|
210
|
+
}
|
|
211
|
+
/** The registry as the object `--schemas` prints. */
|
|
212
|
+
function schemasDocument() {
|
|
213
|
+
return { verbs: VERB_REGISTRY };
|
|
214
|
+
}
|
|
215
|
+
export function commandInstructions(argv, streams, _cwd) {
|
|
216
|
+
const json = argv.includes("--json");
|
|
217
|
+
const parsed = parseFlags(argv, {
|
|
218
|
+
"--schemas": "boolean",
|
|
219
|
+
"--json": "boolean",
|
|
220
|
+
"--help": "boolean",
|
|
221
|
+
"-h": "boolean",
|
|
222
|
+
});
|
|
223
|
+
if (!parsed.ok) {
|
|
224
|
+
if (json) {
|
|
225
|
+
streams.err(`${JSON.stringify({ error: { code: "usage", message: parsed.message } })}\n`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
streams.err(`approval: ${parsed.message}\n\n${INSTRUCTIONS_HELP}\n`);
|
|
229
|
+
}
|
|
230
|
+
return EXIT_USAGE;
|
|
231
|
+
}
|
|
232
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
233
|
+
streams.out(`${INSTRUCTIONS_HELP}\n`);
|
|
234
|
+
return EXIT_OK;
|
|
235
|
+
}
|
|
236
|
+
const extra = parsed.positionals[0];
|
|
237
|
+
if (extra !== undefined) {
|
|
238
|
+
const message = `unexpected argument ${JSON.stringify(extra)}`;
|
|
239
|
+
if (json) {
|
|
240
|
+
streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
streams.err(`approval: ${message}\n\n${INSTRUCTIONS_HELP}\n`);
|
|
244
|
+
}
|
|
245
|
+
return EXIT_USAGE;
|
|
246
|
+
}
|
|
247
|
+
// --schemas is the machine surface and prints JSON with or without --json:
|
|
248
|
+
// there is no other form for it, and a --schemas that printed prose unless
|
|
249
|
+
// asked twice would be a flag people learn to pass twice.
|
|
250
|
+
if (boolFlag(parsed.flags, "--schemas")) {
|
|
251
|
+
streams.out(`${JSON.stringify(schemasDocument())}\n`);
|
|
252
|
+
return EXIT_OK;
|
|
253
|
+
}
|
|
254
|
+
const guide = instructionsGuide();
|
|
255
|
+
if (boolFlag(parsed.flags, "--json")) {
|
|
256
|
+
streams.out(`${JSON.stringify({ guide, verbs: VERB_REGISTRY })}\n`);
|
|
257
|
+
return EXIT_OK;
|
|
258
|
+
}
|
|
259
|
+
streams.out(guide);
|
|
260
|
+
return EXIT_OK;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../../src/cli/instructions.ts"],"names":[],"mappings":"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"}
|