@entelligentsia/forgecli 0.20.3 → 1.0.2
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/CHANGELOG.md +40 -0
- package/README.md +31 -33
- package/dist/CHANGELOG-forge-plugin.md +118 -0
- package/dist/CHANGELOG-pi.md +24 -1
- package/dist/bin/forgecli.d.ts +2 -0
- package/dist/bin/forgecli.js +6 -0
- package/dist/bin/forgecli.js.map +1 -0
- package/dist/extensions/forgecli/add-pipeline.js +1 -1
- package/dist/extensions/forgecli/add-pipeline.js.map +1 -1
- package/dist/extensions/forgecli/add-task.js +1 -1
- package/dist/extensions/forgecli/add-task.js.map +1 -1
- package/dist/extensions/forgecli/approve.js +17 -2
- package/dist/extensions/forgecli/approve.js.map +1 -1
- package/dist/extensions/forgecli/calibrate.js +11 -8
- package/dist/extensions/forgecli/calibrate.js.map +1 -1
- package/dist/extensions/forgecli/collate.js +1 -1
- package/dist/extensions/forgecli/collate.js.map +1 -1
- package/dist/extensions/forgecli/commit.js +17 -2
- package/dist/extensions/forgecli/commit.js.map +1 -1
- package/dist/extensions/forgecli/enhance.js +1 -1
- package/dist/extensions/forgecli/enhance.js.map +1 -1
- package/dist/extensions/forgecli/fix-bug.d.ts +1 -1
- package/dist/extensions/forgecli/fix-bug.js +14 -6
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.d.ts +6 -8
- package/dist/extensions/forgecli/forge-artifact-tool.js +80 -195
- package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
- package/dist/extensions/forgecli/forge-commands.js +57 -18
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js +6 -7
- package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/run-phases.d.ts +4 -0
- package/dist/extensions/forgecli/forge-init/run-phases.js +304 -0
- package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -0
- package/dist/extensions/forgecli/forge-init/verifiers.d.ts +14 -5
- package/dist/extensions/forgecli/forge-init/verifiers.js +79 -62
- package/dist/extensions/forgecli/forge-init/verifiers.js.map +1 -1
- package/dist/extensions/forgecli/forge-init.js +131 -76
- package/dist/extensions/forgecli/forge-init.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +9 -0
- package/dist/extensions/forgecli/forge-subagent.js +11 -6
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-tools.d.ts +28 -4
- package/dist/extensions/forgecli/forge-tools.js +122 -73
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/health-check.js +3 -3
- package/dist/extensions/forgecli/health-check.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +1 -1
- package/dist/extensions/forgecli/hooks/check-update.d.ts +8 -0
- package/dist/extensions/forgecli/hooks/check-update.js +29 -1
- package/dist/extensions/forgecli/hooks/check-update.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-init-hook.js +6 -6
- package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js +6 -6
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/triage-error.js +1 -0
- package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -1
- package/dist/extensions/forgecli/implement.js +20 -2
- package/dist/extensions/forgecli/implement.js.map +1 -1
- package/dist/extensions/forgecli/index.js +39 -32
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/lib/pipeline-guard.d.ts +41 -0
- package/dist/extensions/forgecli/lib/pipeline-guard.js +100 -0
- package/dist/extensions/forgecli/lib/pipeline-guard.js.map +1 -0
- package/dist/extensions/forgecli/loaders/persona-skill-loader.js +2 -2
- package/dist/extensions/forgecli/loaders/persona-skill-loader.js.map +1 -1
- package/dist/extensions/forgecli/migrate.d.ts +3 -0
- package/dist/extensions/forgecli/migrate.js +4 -2
- package/dist/extensions/forgecli/migrate.js.map +1 -1
- package/dist/extensions/forgecli/plan.js +21 -2
- package/dist/extensions/forgecli/plan.js.map +1 -1
- package/dist/extensions/forgecli/quiz-agent.js +7 -7
- package/dist/extensions/forgecli/quiz-agent.js.map +1 -1
- package/dist/extensions/forgecli/regenerate.js +49 -18
- package/dist/extensions/forgecli/regenerate.js.map +1 -1
- package/dist/extensions/forgecli/remove-command.js +1 -1
- package/dist/extensions/forgecli/remove-command.js.map +1 -1
- package/dist/extensions/forgecli/report-bug.js +1 -1
- package/dist/extensions/forgecli/report-bug.js.map +1 -1
- package/dist/extensions/forgecli/retrospective.js +9 -9
- package/dist/extensions/forgecli/retrospective.js.map +1 -1
- package/dist/extensions/forgecli/review-code.d.ts +13 -0
- package/dist/extensions/forgecli/review-code.js +62 -3
- package/dist/extensions/forgecli/review-code.js.map +1 -1
- package/dist/extensions/forgecli/review-plan.d.ts +13 -0
- package/dist/extensions/forgecli/review-plan.js +65 -3
- package/dist/extensions/forgecli/review-plan.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +2 -1
- package/dist/extensions/forgecli/run-task.js +48 -4
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/skill-curator-subagent.d.ts +2 -1
- package/dist/extensions/forgecli/skill-curator-subagent.js +2 -1
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -1
- package/dist/extensions/forgecli/sprint-intake.js +6 -6
- package/dist/extensions/forgecli/sprint-intake.js.map +1 -1
- package/dist/extensions/forgecli/sprint-plan.js +9 -9
- package/dist/extensions/forgecli/sprint-plan.js.map +1 -1
- package/dist/extensions/forgecli/status-command.js +1 -1
- package/dist/extensions/forgecli/status-command.js.map +1 -1
- package/dist/extensions/forgecli/store-query.js +11 -11
- package/dist/extensions/forgecli/store-query.js.map +1 -1
- package/dist/extensions/forgecli/store-repair.js +7 -7
- package/dist/extensions/forgecli/store-repair.js.map +1 -1
- package/dist/extensions/forgecli/validate.js +17 -2
- package/dist/extensions/forgecli/validate.js.map +1 -1
- package/dist/forge-payload/.base-pack/commands/check-agent.md +22 -0
- package/dist/forge-payload/.base-pack/commands/new-sprint.md +22 -0
- package/dist/forge-payload/.base-pack/commands/plan-sprint.md +22 -0
- package/dist/forge-payload/.base-pack/commands/quiz-agent.md +2 -18
- package/dist/forge-payload/.base-pack/commands/retro.md +22 -0
- package/dist/forge-payload/.base-pack/commands/retrospective.md +2 -18
- package/dist/forge-payload/.base-pack/commands/sprint-intake.md +2 -18
- package/dist/forge-payload/.base-pack/commands/sprint-plan.md +2 -18
- package/dist/forge-payload/.base-pack/workflows/_fragments/friction-emit.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/_fragments/generation-instructions.md +4 -4
- package/dist/forge-payload/.base-pack/workflows/_fragments/iron-laws.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/architect_approve.md +13 -1
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +12 -1
- package/dist/forge-payload/.base-pack/workflows/enhance.md +40 -10
- package/dist/forge-payload/.base-pack/workflows/fix_bug.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +14 -2
- package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +20 -4
- package/dist/forge-payload/.base-pack/workflows/plan_task.md +14 -2
- package/dist/forge-payload/.base-pack/workflows/review_code.md +37 -7
- package/dist/forge-payload/.base-pack/workflows/review_plan.md +36 -6
- package/dist/forge-payload/.base-pack/workflows/run_sprint.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/validate_task.md +37 -7
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/config.schema.json +0 -5
- package/dist/forge-payload/.schemas/enum-catalog.json +9 -13
- package/dist/forge-payload/.schemas/migrations.json +65 -0
- package/dist/forge-payload/agents/tomoshibi.md +150 -6
- package/dist/forge-payload/commands/add-pipeline.md +1 -1
- package/dist/forge-payload/commands/add-task.md +1 -1
- package/dist/forge-payload/commands/calibrate.md +4 -350
- package/dist/forge-payload/commands/check-agent.md +38 -0
- package/dist/forge-payload/commands/config.md +3 -113
- package/dist/forge-payload/commands/enhance.md +5 -32
- package/dist/forge-payload/commands/health.md +155 -13
- package/dist/forge-payload/commands/init.md +25 -31
- package/dist/forge-payload/commands/migrate.md +6 -154
- package/dist/forge-payload/commands/quiz-agent.md +2 -34
- package/dist/forge-payload/commands/rebuild.md +664 -0
- package/dist/forge-payload/commands/regenerate.md +2 -774
- package/dist/forge-payload/commands/remove.md +10 -13
- package/dist/forge-payload/commands/repair.md +187 -0
- package/dist/forge-payload/commands/search.md +73 -0
- package/dist/forge-payload/commands/status.md +105 -0
- package/dist/forge-payload/commands/store-query.md +2 -69
- package/dist/forge-payload/commands/store-repair.md +2 -183
- package/dist/forge-payload/commands/update-tools.md +4 -50
- package/dist/forge-payload/commands/update.md +64 -58
- package/dist/forge-payload/hooks/check-update.cjs +1 -1
- package/dist/forge-payload/hooks/post-init.cjs +2 -2
- package/dist/forge-payload/hooks/post-sprint.cjs +2 -2
- package/dist/forge-payload/hooks/triage-error.cjs +11 -10
- package/dist/forge-payload/init/phases/phase-1-collect.md +138 -0
- package/dist/forge-payload/init/phases/phase-2-discover.md +127 -0
- package/dist/forge-payload/init/phases/phase-3-materialize.md +113 -0
- package/dist/forge-payload/init/phases/phase-4-register.md +159 -0
- package/dist/forge-payload/integrity.json +21 -24
- package/dist/forge-payload/meta/fragments/tool-discipline.md +22 -0
- package/dist/forge-payload/meta/templates/meta-retro.md +28 -0
- package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +2 -2
- package/dist/forge-payload/meta/workflows/_fragments/generation-instructions.md +4 -4
- package/dist/forge-payload/meta/workflows/_fragments/iron-laws.md +1 -1
- package/dist/forge-payload/meta/workflows/meta-approve.md +13 -1
- package/dist/forge-payload/meta/workflows/meta-check-agent.md +138 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +12 -1
- package/dist/forge-payload/meta/workflows/meta-enhance.md +39 -9
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +1 -1
- package/dist/forge-payload/meta/workflows/meta-implement.md +13 -1
- package/dist/forge-payload/meta/workflows/meta-migrate.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-new-sprint.md +84 -0
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +20 -4
- package/dist/forge-payload/meta/workflows/meta-plan-sprint.md +152 -0
- package/dist/forge-payload/meta/workflows/meta-plan-task.md +13 -1
- package/dist/forge-payload/meta/workflows/meta-retro.md +73 -0
- package/dist/forge-payload/meta/workflows/meta-review-implementation.md +37 -7
- package/dist/forge-payload/meta/workflows/meta-review-plan.md +36 -6
- package/dist/forge-payload/meta/workflows/meta-validate.md +37 -7
- package/dist/forge-payload/schemas/config.schema.json +0 -5
- package/dist/forge-payload/schemas/enum-catalog.json +9 -13
- package/dist/forge-payload/schemas/structure-manifest.json +6 -8
- package/dist/forge-payload/tools/artifact.cjs +295 -0
- package/dist/forge-payload/tools/banners.cjs +3 -4
- package/dist/forge-payload/tools/build-context-pack.cjs +1 -1
- package/dist/forge-payload/tools/check-structure.cjs +8 -3
- package/dist/forge-payload/tools/store-cli.cjs +67 -7
- package/dist/forge-payload/tools/substitute-placeholders.cjs +1 -1
- package/dist/forge-payload/tools/verify-apply.cjs +75 -0
- package/dist/forge-payload/tools/verify-phase.cjs +259 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +0 -17
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +21 -38
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +5 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +5 -2
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +24 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.js +2 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.d.ts +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.js +52 -22
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js +16 -4
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js +45 -50
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js +43 -81
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.js +27 -12
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js +2 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +5 -5
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.d.ts +2 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.js +37 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +9 -8
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +20 -35
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +3 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js +64 -7
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +15 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.d.ts +3 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.js +14 -8
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.d.ts +30 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.js +124 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.js.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.d.ts +2 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.js +31 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.js.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.d.ts +7 -27
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.js +75 -115
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +6 -0
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +12 -14
- package/node_modules/@earendil-works/pi-coding-agent/package.json +5 -5
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts +3 -0
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js +53 -0
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +4 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +2 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +13 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/pi-tui/package.json +2 -2
- package/package.json +6 -6
- package/dist/extensions/forgecli/forge-init/phase-descriptors.d.ts +0 -72
- package/dist/extensions/forgecli/forge-init/phase-descriptors.js +0 -359
- package/dist/extensions/forgecli/forge-init/phase-descriptors.js.map +0 -1
- package/dist/extensions/forgecli/forge-init/prompts.d.ts +0 -10
- package/dist/extensions/forgecli/forge-init/prompts.js +0 -91
- package/dist/extensions/forgecli/forge-init/prompts.js.map +0 -1
- package/dist/extensions/forgecli/lib/store-error-remediation.d.ts +0 -65
- package/dist/extensions/forgecli/lib/store-error-remediation.js +0 -298
- package/dist/extensions/forgecli/lib/store-error-remediation.js.map +0 -1
- package/dist/forge-payload/hooks/check-update.js +0 -378
- package/dist/forge-payload/hooks/forge-permissions.js +0 -164
- package/dist/forge-payload/hooks/triage-error.js +0 -77
- package/dist/forge-payload/hooks/validate-write.js +0 -250
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Forge write-boundary hook — runs PreToolUse on Write / Edit / MultiEdit.
|
|
3
|
-
//
|
|
4
|
-
// Purpose: enforce Forge schemas at the filesystem boundary so agents remain
|
|
5
|
-
// free to bypass deterministic tools (store-cli), as long as any write they
|
|
6
|
-
// do against Forge-owned paths honors the schema contract.
|
|
7
|
-
//
|
|
8
|
-
// Protocol (Claude Code PreToolUse hook):
|
|
9
|
-
// - stdin: JSON envelope { tool_name, tool_input, ... }
|
|
10
|
-
// - exit 0: allow the tool call
|
|
11
|
-
// - exit 2 with stderr payload: block the tool call and surface the message
|
|
12
|
-
//
|
|
13
|
-
// Fail-open philosophy: any internal error (unreadable schema, parse bug,
|
|
14
|
-
// unexpected tool input shape) exits 0 with a stderr warning. A broken
|
|
15
|
-
// validator must never block legitimate work — validate-store.cjs remains
|
|
16
|
-
// as a post-hoc auditor.
|
|
17
|
-
|
|
18
|
-
'use strict';
|
|
19
|
-
|
|
20
|
-
process.on('uncaughtException', (err) => {
|
|
21
|
-
try { process.stderr.write(`forge validate-write: internal error (fail-open): ${err.message}\n`); } catch (_) {}
|
|
22
|
-
process.exit(0);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const fs = require('fs');
|
|
26
|
-
const path = require('path');
|
|
27
|
-
|
|
28
|
-
const { matchRegistry } = require('./lib/write-registry.js');
|
|
29
|
-
|
|
30
|
-
// Schema resolution — delegates to lib/schema-loader.cjs which implements the
|
|
31
|
-
// same 4-path search chain (project → in-tree → plugin-installed → bundled)
|
|
32
|
-
// that store-cli.cjs uses. This ensures the hook sees the exact same schemas
|
|
33
|
-
// as tool writes do, and gains the bundled .schemas/ lookup that the previous
|
|
34
|
-
// inline loadSchema() was missing.
|
|
35
|
-
const PLUGIN_ROOT = process.env.CLAUDE_PLUGIN_ROOT || path.join(__dirname, '..');
|
|
36
|
-
|
|
37
|
-
function resolveValidator() {
|
|
38
|
-
// store-cli's shared validator lives at forge/tools/lib/validate.js. Require
|
|
39
|
-
// it relative to the plugin root so the hook works from both dev tree and
|
|
40
|
-
// installed plugin cache.
|
|
41
|
-
const candidates = [
|
|
42
|
-
path.join(PLUGIN_ROOT, 'tools', 'lib', 'validate.js'),
|
|
43
|
-
path.join(__dirname, '..', 'tools', 'lib', 'validate.js'),
|
|
44
|
-
];
|
|
45
|
-
for (const c of candidates) {
|
|
46
|
-
if (fs.existsSync(c)) return require(c);
|
|
47
|
-
}
|
|
48
|
-
throw new Error(`validate.js not found (looked in: ${candidates.join(', ')})`);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function resolveSchemaLoader() {
|
|
52
|
-
// schema-loader.cjs lives at forge/tools/lib/schema-loader.cjs. Resolve it
|
|
53
|
-
// relative to the plugin root so the hook works from both dev tree and
|
|
54
|
-
// installed plugin cache.
|
|
55
|
-
const candidates = [
|
|
56
|
-
path.join(PLUGIN_ROOT, 'tools', 'lib', 'schema-loader.cjs'),
|
|
57
|
-
path.join(__dirname, '..', 'tools', 'lib', 'schema-loader.cjs'),
|
|
58
|
-
];
|
|
59
|
-
for (const c of candidates) {
|
|
60
|
-
if (fs.existsSync(c)) return require(c);
|
|
61
|
-
}
|
|
62
|
-
throw new Error(`schema-loader.cjs not found (looked in: ${candidates.join(', ')})`);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function loadSchema(filename) {
|
|
66
|
-
// filename is e.g. "task.schema.json"; the schema-loader key is "task".
|
|
67
|
-
const typeKey = filename.replace(/\.schema\.json$/, '');
|
|
68
|
-
const { loadSchemas } = resolveSchemaLoader();
|
|
69
|
-
const schemas = loadSchemas();
|
|
70
|
-
const schema = schemas[typeKey];
|
|
71
|
-
if (!schema) {
|
|
72
|
-
throw new Error(`schema not found: ${filename}`);
|
|
73
|
-
}
|
|
74
|
-
return schema;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function readStdinSync() {
|
|
78
|
-
try {
|
|
79
|
-
return fs.readFileSync(0, 'utf8');
|
|
80
|
-
} catch (_) {
|
|
81
|
-
return '';
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Apply Edit semantics: replace old_string with new_string in contents.
|
|
86
|
-
// If replace_all is true, replace every occurrence; otherwise replace the
|
|
87
|
-
// first (and only) occurrence. Errors if old_string is absent or ambiguous
|
|
88
|
-
// when replace_all is false — mirrors the Edit tool contract.
|
|
89
|
-
function applyEdit(contents, oldStr, newStr, replaceAll) {
|
|
90
|
-
if (oldStr === '' && contents === '') return newStr; // new-file Edit
|
|
91
|
-
if (oldStr === '') throw new Error('Edit: old_string is empty');
|
|
92
|
-
if (replaceAll) return contents.split(oldStr).join(newStr);
|
|
93
|
-
const idx = contents.indexOf(oldStr);
|
|
94
|
-
if (idx === -1) throw new Error('Edit: old_string not found in file');
|
|
95
|
-
const next = contents.indexOf(oldStr, idx + oldStr.length);
|
|
96
|
-
if (next !== -1) throw new Error('Edit: old_string is ambiguous (appears more than once)');
|
|
97
|
-
return contents.slice(0, idx) + newStr + contents.slice(idx + oldStr.length);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function computePostEditContents(toolName, toolInput) {
|
|
101
|
-
const filePath = toolInput.file_path;
|
|
102
|
-
if (toolName === 'Write') {
|
|
103
|
-
return { filePath, contents: toolInput.content != null ? String(toolInput.content) : '' };
|
|
104
|
-
}
|
|
105
|
-
const prior = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';
|
|
106
|
-
if (toolName === 'Edit') {
|
|
107
|
-
return {
|
|
108
|
-
filePath,
|
|
109
|
-
contents: applyEdit(prior, toolInput.old_string || '', toolInput.new_string || '', !!toolInput.replace_all),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
// MultiEdit
|
|
113
|
-
let cur = prior;
|
|
114
|
-
const edits = Array.isArray(toolInput.edits) ? toolInput.edits : [];
|
|
115
|
-
for (const e of edits) {
|
|
116
|
-
cur = applyEdit(cur, e.old_string || '', e.new_string || '', !!e.replace_all);
|
|
117
|
-
}
|
|
118
|
-
return { filePath, contents: cur, prior };
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function parseProgressLine(line) {
|
|
122
|
-
// timestamp|agentName|bannerKey|status|detail
|
|
123
|
-
const parts = line.split('|');
|
|
124
|
-
if (parts.length < 4) return null;
|
|
125
|
-
return {
|
|
126
|
-
timestamp: parts[0],
|
|
127
|
-
agentName: parts[1],
|
|
128
|
-
bannerKey: parts[2],
|
|
129
|
-
status: parts[3],
|
|
130
|
-
detail: parts.slice(4).join('|'),
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function validateProgressAppend(prior, proposed, validator, schema) {
|
|
135
|
-
// Only validate lines that are NEW — anything already on disk is grandfathered.
|
|
136
|
-
if (!proposed.startsWith(prior)) {
|
|
137
|
-
// Wholesale rewrite, not an append. Validate every non-empty line.
|
|
138
|
-
const lines = proposed.split('\n').filter(l => l.length > 0);
|
|
139
|
-
return lines.flatMap((l, i) => annotateLine(validator, schema, l, i));
|
|
140
|
-
}
|
|
141
|
-
const suffix = proposed.slice(prior.length);
|
|
142
|
-
const newLines = suffix.split('\n').filter(l => l.length > 0);
|
|
143
|
-
return newLines.flatMap((l, i) => annotateLine(validator, schema, l, i));
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function annotateLine(validator, schema, line, idx) {
|
|
147
|
-
const rec = parseProgressLine(line);
|
|
148
|
-
if (!rec) return [`line ${idx + 1}: malformed (expected 4+ pipe-delimited fields)`];
|
|
149
|
-
const errors = validator.validateRecord(rec, schema);
|
|
150
|
-
return errors.map(e => `line ${idx + 1}: ${e}`);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function writeBypassAudit(filePath, reason) {
|
|
154
|
-
try {
|
|
155
|
-
const m = /\/\.forge\/store\/events\/([^/]+)\//.exec(filePath) || /\.forge\/store\/events\/([^/]+)\//.exec(filePath);
|
|
156
|
-
const bucket = m ? m[1] : 'unknown';
|
|
157
|
-
const logPath = path.join(process.cwd(), '.forge', 'store', 'events', bucket, 'progress.log');
|
|
158
|
-
if (!fs.existsSync(path.dirname(logPath))) return;
|
|
159
|
-
const ts = new Date().toISOString();
|
|
160
|
-
const line = `${ts}|forge-hook|write-boundary|progress|${reason}\n`;
|
|
161
|
-
fs.appendFileSync(logPath, line, 'utf8');
|
|
162
|
-
} catch (_) { /* audit best-effort */ }
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function block(message) {
|
|
166
|
-
process.stderr.write(message + '\n');
|
|
167
|
-
process.exit(2);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function main() {
|
|
171
|
-
const raw = readStdinSync();
|
|
172
|
-
if (!raw) process.exit(0);
|
|
173
|
-
|
|
174
|
-
let envelope;
|
|
175
|
-
try { envelope = JSON.parse(raw); } catch (_) { process.exit(0); }
|
|
176
|
-
|
|
177
|
-
const toolName = envelope.tool_name;
|
|
178
|
-
if (!['Write', 'Edit', 'MultiEdit'].includes(toolName)) process.exit(0);
|
|
179
|
-
|
|
180
|
-
const toolInput = envelope.tool_input || {};
|
|
181
|
-
const filePath = toolInput.file_path;
|
|
182
|
-
if (!filePath || typeof filePath !== 'string') process.exit(0);
|
|
183
|
-
|
|
184
|
-
const entry = matchRegistry(filePath);
|
|
185
|
-
if (!entry) process.exit(0);
|
|
186
|
-
|
|
187
|
-
if (process.env.FORGE_SKIP_WRITE_VALIDATION === '1') {
|
|
188
|
-
writeBypassAudit(filePath, `FORGE_SKIP_WRITE_VALIDATION=1 bypass on ${toolName} ${path.relative(process.cwd(), filePath)}`);
|
|
189
|
-
process.exit(0);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
let validator, schema, post;
|
|
193
|
-
try {
|
|
194
|
-
validator = resolveValidator();
|
|
195
|
-
schema = loadSchema(entry.schema);
|
|
196
|
-
post = computePostEditContents(toolName, toolInput);
|
|
197
|
-
} catch (err) {
|
|
198
|
-
process.stderr.write(`forge validate-write: setup error (fail-open): ${err.message}\n`);
|
|
199
|
-
process.exit(0);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const relPath = path.relative(process.cwd(), post.filePath);
|
|
203
|
-
|
|
204
|
-
if (entry.format === 'line-pipe-delimited') {
|
|
205
|
-
const prior = post.prior != null ? post.prior : (fs.existsSync(post.filePath) ? fs.readFileSync(post.filePath, 'utf8') : '');
|
|
206
|
-
const errs = validateProgressAppend(prior, post.contents, validator, schema);
|
|
207
|
-
if (errs.length > 0) {
|
|
208
|
-
block(
|
|
209
|
-
'❌ Forge schema violation — write blocked\n' +
|
|
210
|
-
`Path: ${relPath}\n` +
|
|
211
|
-
`Kind: ${entry.kind}\n` +
|
|
212
|
-
`Violations:\n - ${errs.join('\n - ')}\n` +
|
|
213
|
-
`Hint: progress.log lines must be "timestamp|agentName|bannerKey|status|detail"; see forge/schemas/${entry.schema}.\n` +
|
|
214
|
-
'To bypass for one turn (emergency repair): FORGE_SKIP_WRITE_VALIDATION=1.'
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
process.exit(0);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// JSON payloads
|
|
221
|
-
let parsed;
|
|
222
|
-
try {
|
|
223
|
-
parsed = JSON.parse(post.contents);
|
|
224
|
-
} catch (err) {
|
|
225
|
-
block(
|
|
226
|
-
'❌ Forge schema violation — write blocked\n' +
|
|
227
|
-
`Path: ${relPath}\n` +
|
|
228
|
-
`Kind: ${entry.kind}\n` +
|
|
229
|
-
`Violation: Invalid JSON: ${err.message}\n` +
|
|
230
|
-
`Hint: see forge/schemas/${entry.schema} for the expected shape.\n` +
|
|
231
|
-
'To bypass for one turn (emergency repair): FORGE_SKIP_WRITE_VALIDATION=1.'
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const errs = validator.validateRecord(parsed, schema);
|
|
236
|
-
if (errs.length > 0) {
|
|
237
|
-
block(
|
|
238
|
-
'❌ Forge schema violation — write blocked\n' +
|
|
239
|
-
`Path: ${relPath}\n` +
|
|
240
|
-
`Kind: ${entry.kind}\n` +
|
|
241
|
-
`Violations:\n - ${errs.join('\n - ')}\n` +
|
|
242
|
-
`Hint: see forge/schemas/${entry.schema} for the full shape.\n` +
|
|
243
|
-
'To bypass for one turn (emergency repair): FORGE_SKIP_WRITE_VALIDATION=1.'
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
process.exit(0);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
main();
|