@entelligentsia/forgecli 0.1.0 → 0.3.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/CHANGELOG.md +138 -0
- package/README.md +177 -38
- package/dist/bin/argv.js +5 -0
- package/dist/bin/argv.js.map +1 -1
- package/dist/bin/forge.js +1 -0
- package/dist/bin/forge.js.map +1 -1
- package/dist/extensions/forgecli/ask-user-tool.d.ts +17 -0
- package/dist/extensions/forgecli/ask-user-tool.js +139 -0
- package/dist/extensions/forgecli/ask-user-tool.js.map +1 -0
- package/dist/extensions/forgecli/forge-commands.d.ts +21 -0
- package/dist/extensions/forgecli/forge-commands.js +141 -0
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-init.d.ts +26 -0
- package/dist/extensions/forgecli/forge-init.js +948 -0
- package/dist/extensions/forgecli/forge-init.js.map +1 -0
- package/dist/extensions/forgecli/health-check.d.ts +18 -0
- package/dist/extensions/forgecli/health-check.js +154 -0
- package/dist/extensions/forgecli/health-check.js.map +1 -0
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +34 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +237 -3
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/index.js +28 -11
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/init-context.d.ts +99 -0
- package/dist/extensions/forgecli/init-context.js +163 -0
- package/dist/extensions/forgecli/init-context.js.map +1 -0
- package/dist/extensions/forgecli/init-progress.d.ts +39 -0
- package/dist/extensions/forgecli/init-progress.js +117 -0
- package/dist/extensions/forgecli/init-progress.js.map +1 -0
- package/dist/extensions/forgecli/refresh-kb-links.d.ts +18 -0
- package/dist/extensions/forgecli/refresh-kb-links.js +228 -0
- package/dist/extensions/forgecli/refresh-kb-links.js.map +1 -0
- package/dist/extensions/forgecli/store-validator.d.ts +13 -0
- package/dist/extensions/forgecli/store-validator.js +35 -0
- package/dist/extensions/forgecli/store-validator.js.map +1 -0
- package/dist/extensions/forgecli/transition-guard.d.ts +20 -0
- package/dist/extensions/forgecli/transition-guard.js +125 -0
- package/dist/extensions/forgecli/transition-guard.js.map +1 -0
- package/dist/forge-payload/.base-pack/commands/approve.md +22 -0
- package/dist/forge-payload/.base-pack/commands/collate.md +22 -0
- package/dist/forge-payload/.base-pack/commands/commit.md +22 -0
- package/dist/forge-payload/.base-pack/commands/enhance.md +37 -0
- package/dist/forge-payload/.base-pack/commands/fix-bug.md +22 -0
- package/dist/forge-payload/.base-pack/commands/implement.md +22 -0
- package/dist/forge-payload/.base-pack/commands/plan.md +22 -0
- package/dist/forge-payload/.base-pack/commands/quiz-agent.md +22 -0
- package/dist/forge-payload/.base-pack/commands/retrospective.md +22 -0
- package/dist/forge-payload/.base-pack/commands/review-code.md +22 -0
- package/dist/forge-payload/.base-pack/commands/review-plan.md +22 -0
- package/dist/forge-payload/.base-pack/commands/run-sprint.md +22 -0
- package/dist/forge-payload/.base-pack/commands/run-task.md +22 -0
- package/dist/forge-payload/.base-pack/commands/sprint-intake.md +22 -0
- package/dist/forge-payload/.base-pack/commands/sprint-plan.md +22 -0
- package/dist/forge-payload/.base-pack/commands/validate.md +22 -0
- package/dist/forge-payload/.claude-plugin/plugin.json +15 -0
- package/dist/forge-payload/.init/discovery/discover-database.md +32 -0
- package/dist/forge-payload/.init/discovery/discover-processes.md +31 -0
- package/dist/forge-payload/.init/discovery/discover-routing.md +31 -0
- package/dist/forge-payload/.init/discovery/discover-stack.md +33 -0
- package/dist/forge-payload/.init/discovery/discover-testing.md +34 -0
- package/dist/forge-payload/.init/generation/generate-kb-doc.md +60 -0
- package/dist/forge-payload/.schemas/bug.schema.json +53 -0
- package/dist/forge-payload/.schemas/collation-state.schema.json +16 -0
- package/dist/forge-payload/.schemas/event-sidecar.schema.json +22 -0
- package/dist/forge-payload/.schemas/event.schema.json +32 -0
- package/dist/forge-payload/.schemas/feature.schema.json +22 -0
- package/dist/forge-payload/.schemas/progress-entry.schema.json +16 -0
- package/dist/forge-payload/.schemas/project-context.schema.json +167 -0
- package/dist/forge-payload/.schemas/project-overlay.schema.json +25 -0
- package/dist/forge-payload/.schemas/sprint.schema.json +27 -0
- package/dist/forge-payload/.schemas/structure-versions.schema.json +57 -0
- package/dist/forge-payload/.schemas/task.schema.json +58 -0
- package/dist/forge-payload/.tools/banners.cjs +435 -0
- package/dist/forge-payload/.tools/build-context-pack.cjs +290 -0
- package/dist/forge-payload/.tools/build-init-context.cjs +322 -0
- package/dist/forge-payload/.tools/build-overlay.cjs +326 -0
- package/dist/forge-payload/.tools/build-persona-pack.cjs +226 -0
- package/dist/forge-payload/.tools/collate.cjs +1041 -0
- package/dist/forge-payload/.tools/generation-manifest.cjs +311 -0
- package/dist/forge-payload/.tools/lib/forge-root.cjs +59 -0
- package/dist/forge-payload/.tools/lib/paths.cjs +29 -0
- package/dist/forge-payload/.tools/lib/pricing.cjs +165 -0
- package/dist/forge-payload/.tools/lib/project-root.cjs +32 -0
- package/dist/forge-payload/.tools/lib/result.js +40 -0
- package/dist/forge-payload/.tools/lib/validate.js +131 -0
- package/dist/forge-payload/.tools/manage-config.cjs +340 -0
- package/dist/forge-payload/.tools/manage-versions.cjs +365 -0
- package/dist/forge-payload/.tools/seed-store.cjs +237 -0
- package/dist/forge-payload/.tools/store-cli.cjs +1123 -0
- package/dist/forge-payload/.tools/store.cjs +315 -0
- package/dist/forge-payload/.tools/substitute-placeholders.cjs +625 -0
- package/dist/forge-payload/.tools/validate-store.cjs +522 -0
- package/package.json +1 -1
- /package/dist/forge-payload/{personas → .base-pack/personas}/architect.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/bug-fixer.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/collator.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/engineer.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/librarian.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/orchestrator.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/product-manager.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/qa-engineer.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/supervisor.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/architect-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/bug-fixer-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/collator-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/engineer-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/generic-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/librarian-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/qa-engineer-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/store-custodian-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/supervisor-skills.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/CODE_REVIEW_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/COST_REPORT_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_REVIEW_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_SUMMARY_TEMPLATE.json +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PROGRESS_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/RETROSPECTIVE_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_MANIFEST_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_REQUIREMENTS_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/TASK_PROMPT_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/context-injection.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/event-emission-schema.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/finalize.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/progress-reporting.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_approve.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_review_sprint_completion.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_intake.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_plan.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/collator_agent.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/commit_task.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/fix_bug.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/implement_plan.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/migrate_structural.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/orchestrate_task.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/plan_task.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/quiz_agent.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_code.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_plan.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/run_sprint.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/sprint_retrospective.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_implementation.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_plan.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/validate_task.md +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,aAAa;AACb,8EAA8E;AAC9E,oCAAoC;AACpC,sEAAsE;AACtE,gFAAgF;AAChF,uFAAuF;AACvF,mFAAmF;AACnF,EAAE;AACF,4EAA4E;AAC5E,wCAAwC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,aAAa;AACb,8EAA8E;AAC9E,oCAAoC;AACpC,sEAAsE;AACtE,gFAAgF;AAChF,uFAAuF;AACvF,mFAAmF;AACnF,EAAE;AACF,4EAA4E;AAC5E,wCAAwC;AAExC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,mDAAmD;AACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9F,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEpD,2EAA2E;AAC3E,uEAAuE;AACvE,SAAS,eAAe;IACvB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgE,CAAC;QAC3F,OAAO;YACN,UAAU,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC9D,mBAAmB,EAAE,OAAO,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;SAClG,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;AACF,CAAC;AAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;AAEvC,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAgB;IACtD,6EAA6E;IAC7E,wEAAwE;IACxE,+CAA+C;IAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,qBAAqB,CAAC;QAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,EAAE,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,YAAY,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAEtC,CAAC;QACF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,EAAE,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;IAED,6EAA6E;IAC7E,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAC1C,MAAM,SAAS,GAAG,WAAW,EAAE,SAAS,IAAI,IAAI,CAAC;IAEjD,4EAA4E;IAC5E,+CAA+C;IAC/C,iEAAiE;IACjE,qEAAqE;IACrE,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAEtB,6EAA6E;IAC7E,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,6BAA6B;QACrD,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAEhB,wCAAwC;QACxC,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;QAC3C,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;YACxG,iBAAiB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAC1C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,+DAA+D,SAAS,CAAC,YAAY,IAAI;gBACxF,0CAA0C,EAC3C,SAAS,CACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,sCAAsC;YACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yDAAyD,EAAE,MAAM,CAAC,CAAC;YACjF,OAAO;QACR,CAAC;QAED,2DAA2D;QAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1E,IAAI,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;QAED,oEAAoE;QACpE,2EAA2E;QAC3E,IAAI,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;YACjE,KAAK,kBAAkB,CAAC;gBACvB,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;gBACjD,iBAAiB,EAAE,YAAY,CAAC,UAAU;gBAC1C,0BAA0B,EAAE,YAAY,CAAC,mBAAmB;aAC5D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACb,4CAA4C;YAC7C,CAAC,CAAC,CAAC;QACJ,CAAC;QAED,wEAAwE;QACxE,sDAAsD;QACtD,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;YACtC,IAAI,CAAC;gBACJ,MAAM,sBAAsB,CAAC;oBAC5B,0BAA0B,EAAE,YAAY,CAAC,mBAAmB;oBAC5D,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;iBACjD,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;oBAClD,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;gBAC/C,CAAC;YACF,CAAC;QACF,CAAC;QAED,kFAAkF;QAClF,uEAAuE;QACvE,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACJ,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;gBACvE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;gBAChC,MAAM,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;gBACtD,IAAI,UAAU;oBAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,EAAE,CAAC;oBACpD,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBAClD,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,IAAI,SAAS,EAAE,CAAC;QACf,2CAA2C;QAC3C,0EAA0E;QAC1E,gFAAgF;QAChF,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAY,CAAC,UAAU,CAAC,CAAC,CAAC;QACxE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/C,8EAA8E;QAC9E,sBAAsB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACtC,+DAA+D;QAC/D,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,4EAA4E;IAC5E,0EAA0E;IAC1E,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IAEpE,6EAA6E;IAC7E,yEAAyE;IACzE,wEAAwE;IACxE,sEAAsE;IACtE,uEAAuE;IACvE,wEAAwE;IACxE,mEAAmE;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IACnF,wBAAwB,CAAC,EAAE,EAAE;QAC5B,iBAAiB,EAAE,WAAW;QAC9B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAClD,CAAC,CAAC;IAEH,4EAA4E;IAC5E,wEAAwE;IACxE,sEAAsE;IACtE,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAC7B,0BAA0B,CAAC,EAAE,EAAE;YAC9B,OAAO,EAAE,QAAQ;YACjB,iBAAiB,EAAE,YAAY,CAAC,UAAU;SAC1C,CAAC,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,qCAAqC,CAAC;QACxD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAEnC,CAAC;QACF,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discover project name from package.json:name, falling back to cwd basename.
|
|
3
|
+
*
|
|
4
|
+
* Tries to read <cwd>/package.json and parse the `name` field. If the file is
|
|
5
|
+
* absent, malformed, or missing the name field, returns `path.basename(cwd)`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function discoverProjectName(cwd: string): string;
|
|
8
|
+
export interface ProjectContextProject {
|
|
9
|
+
name: string;
|
|
10
|
+
prefix: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
stack?: string[];
|
|
13
|
+
commands?: {
|
|
14
|
+
test?: string;
|
|
15
|
+
build?: string;
|
|
16
|
+
deploy?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface ProjectContextArchitecture {
|
|
20
|
+
frameworks?: {
|
|
21
|
+
backend?: string;
|
|
22
|
+
frontend?: string;
|
|
23
|
+
database?: string;
|
|
24
|
+
};
|
|
25
|
+
dataAccess?: string;
|
|
26
|
+
deployment?: string;
|
|
27
|
+
entrypoints?: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface ProjectContextWorkflow {
|
|
30
|
+
testCommand?: string;
|
|
31
|
+
lintCommand?: string;
|
|
32
|
+
buildCommand?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ProjectContextKnowledgeBase {
|
|
35
|
+
path?: string;
|
|
36
|
+
indexFile?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ProjectContext {
|
|
39
|
+
project: ProjectContextProject;
|
|
40
|
+
architecture?: ProjectContextArchitecture;
|
|
41
|
+
workflow?: ProjectContextWorkflow;
|
|
42
|
+
knowledgeBase?: ProjectContextKnowledgeBase;
|
|
43
|
+
}
|
|
44
|
+
/** Minimal discovery results passed from Phase 2 */
|
|
45
|
+
export interface DiscoveryResults {
|
|
46
|
+
projectName?: string;
|
|
47
|
+
prefix?: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
stack?: string[];
|
|
50
|
+
testCommand?: string;
|
|
51
|
+
lintCommand?: string;
|
|
52
|
+
buildCommand?: string;
|
|
53
|
+
backendFramework?: string;
|
|
54
|
+
frontendFramework?: string;
|
|
55
|
+
database?: string;
|
|
56
|
+
deployment?: string;
|
|
57
|
+
dataAccess?: string;
|
|
58
|
+
kbPath?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface ForgeConfig {
|
|
61
|
+
project?: {
|
|
62
|
+
name?: string;
|
|
63
|
+
prefix?: string;
|
|
64
|
+
};
|
|
65
|
+
paths?: {
|
|
66
|
+
engineering?: string;
|
|
67
|
+
forgeRoot?: string;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build a ProjectContext from discovery results and forge config.
|
|
72
|
+
*
|
|
73
|
+
* Merges discoveryResults with config data. Config project.name/prefix take
|
|
74
|
+
* precedence over discovery if both are present (config was set interactively).
|
|
75
|
+
*/
|
|
76
|
+
export declare function buildProjectContext(discoveryResults: DiscoveryResults, config: ForgeConfig): ProjectContext;
|
|
77
|
+
/**
|
|
78
|
+
* Validate a ProjectContext object structurally. Throws with a descriptive
|
|
79
|
+
* error if required fields are missing.
|
|
80
|
+
*/
|
|
81
|
+
export declare function validateProjectContext(ctx: unknown): asserts ctx is ProjectContext;
|
|
82
|
+
/**
|
|
83
|
+
* Write project-context.json to <cwd>/.forge/project-context.json
|
|
84
|
+
*/
|
|
85
|
+
export declare function writeProjectContext(cwd: string, ctx: ProjectContext): void;
|
|
86
|
+
export interface CalibrationBaseline {
|
|
87
|
+
lastCalibrated: string;
|
|
88
|
+
version: string;
|
|
89
|
+
masterIndexHash: string | null;
|
|
90
|
+
sprintsCovered: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Compute a calibration baseline snapshot for /forge:init Phase 2.
|
|
94
|
+
*
|
|
95
|
+
* @param cwd - project working directory
|
|
96
|
+
* @param kbPath - relative path to the knowledge base directory (e.g. "engineering")
|
|
97
|
+
* @param bundledPluginVersion - version string from package.json forge.bundledVersion
|
|
98
|
+
*/
|
|
99
|
+
export declare function computeCalibrationBaseline(cwd: string, kbPath: string, bundledPluginVersion: string): CalibrationBaseline;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// init-context.ts — project-name discovery, project-context.json construction,
|
|
2
|
+
// and calibration baseline computation for /forge:init.
|
|
3
|
+
//
|
|
4
|
+
// Per INIT_PARITY_SPEC.md §9 and PLAN.md Phase C.
|
|
5
|
+
// Iron Law 6: no shell-string interpolation.
|
|
6
|
+
import * as crypto from "node:crypto";
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
// ── Project name discovery ─────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Discover project name from package.json:name, falling back to cwd basename.
|
|
12
|
+
*
|
|
13
|
+
* Tries to read <cwd>/package.json and parse the `name` field. If the file is
|
|
14
|
+
* absent, malformed, or missing the name field, returns `path.basename(cwd)`.
|
|
15
|
+
*/
|
|
16
|
+
export function discoverProjectName(cwd) {
|
|
17
|
+
const pkgPath = path.join(cwd, "package.json");
|
|
18
|
+
try {
|
|
19
|
+
const raw = fs.readFileSync(pkgPath, "utf8");
|
|
20
|
+
const pkg = JSON.parse(raw);
|
|
21
|
+
if (pkg &&
|
|
22
|
+
typeof pkg === "object" &&
|
|
23
|
+
"name" in pkg &&
|
|
24
|
+
typeof pkg.name === "string") {
|
|
25
|
+
const name = pkg.name;
|
|
26
|
+
if (name.trim())
|
|
27
|
+
return name.trim();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ENOENT or JSON parse error — fall through to basename
|
|
32
|
+
}
|
|
33
|
+
return path.basename(cwd);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build a ProjectContext from discovery results and forge config.
|
|
37
|
+
*
|
|
38
|
+
* Merges discoveryResults with config data. Config project.name/prefix take
|
|
39
|
+
* precedence over discovery if both are present (config was set interactively).
|
|
40
|
+
*/
|
|
41
|
+
export function buildProjectContext(discoveryResults, config) {
|
|
42
|
+
const name = config.project?.name ?? discoveryResults.projectName ?? "";
|
|
43
|
+
const prefix = config.project?.prefix ?? discoveryResults.prefix ?? "";
|
|
44
|
+
const ctx = {
|
|
45
|
+
project: {
|
|
46
|
+
name,
|
|
47
|
+
prefix,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
if (discoveryResults.description) {
|
|
51
|
+
ctx.project.description = discoveryResults.description;
|
|
52
|
+
}
|
|
53
|
+
if (discoveryResults.stack && discoveryResults.stack.length > 0) {
|
|
54
|
+
ctx.project.stack = discoveryResults.stack;
|
|
55
|
+
}
|
|
56
|
+
const testCmd = discoveryResults.testCommand ?? "";
|
|
57
|
+
const buildCmd = discoveryResults.buildCommand ?? "";
|
|
58
|
+
const lintCmd = discoveryResults.lintCommand ?? "";
|
|
59
|
+
if (testCmd || buildCmd) {
|
|
60
|
+
ctx.project.commands = {
|
|
61
|
+
...(testCmd ? { test: testCmd } : {}),
|
|
62
|
+
...(buildCmd ? { build: buildCmd } : {}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const hasArch = discoveryResults.backendFramework ??
|
|
66
|
+
discoveryResults.frontendFramework ??
|
|
67
|
+
discoveryResults.database ??
|
|
68
|
+
discoveryResults.deployment ??
|
|
69
|
+
discoveryResults.dataAccess;
|
|
70
|
+
if (hasArch) {
|
|
71
|
+
ctx.architecture = {};
|
|
72
|
+
const frameworks = {};
|
|
73
|
+
if (discoveryResults.backendFramework)
|
|
74
|
+
frameworks.backend = discoveryResults.backendFramework;
|
|
75
|
+
if (discoveryResults.frontendFramework)
|
|
76
|
+
frameworks.frontend = discoveryResults.frontendFramework;
|
|
77
|
+
if (discoveryResults.database)
|
|
78
|
+
frameworks.database = discoveryResults.database;
|
|
79
|
+
if (Object.keys(frameworks).length > 0)
|
|
80
|
+
ctx.architecture.frameworks = frameworks;
|
|
81
|
+
if (discoveryResults.dataAccess)
|
|
82
|
+
ctx.architecture.dataAccess = discoveryResults.dataAccess;
|
|
83
|
+
if (discoveryResults.deployment)
|
|
84
|
+
ctx.architecture.deployment = discoveryResults.deployment;
|
|
85
|
+
}
|
|
86
|
+
const hasWorkflow = testCmd || lintCmd || buildCmd;
|
|
87
|
+
if (hasWorkflow) {
|
|
88
|
+
ctx.workflow = {
|
|
89
|
+
...(testCmd ? { testCommand: testCmd } : {}),
|
|
90
|
+
...(lintCmd ? { lintCommand: lintCmd } : {}),
|
|
91
|
+
...(buildCmd ? { buildCommand: buildCmd } : {}),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const kbPath = discoveryResults.kbPath ?? config.paths?.engineering ?? "engineering";
|
|
95
|
+
ctx.knowledgeBase = {
|
|
96
|
+
path: kbPath,
|
|
97
|
+
indexFile: `${kbPath}/MASTER_INDEX.md`,
|
|
98
|
+
};
|
|
99
|
+
return ctx;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate a ProjectContext object structurally. Throws with a descriptive
|
|
103
|
+
* error if required fields are missing.
|
|
104
|
+
*/
|
|
105
|
+
export function validateProjectContext(ctx) {
|
|
106
|
+
if (!ctx || typeof ctx !== "object") {
|
|
107
|
+
throw new Error("project-context validation failed: not an object");
|
|
108
|
+
}
|
|
109
|
+
const record = ctx;
|
|
110
|
+
if (!record.project || typeof record.project !== "object") {
|
|
111
|
+
throw new Error("project-context validation failed: missing required field 'project'");
|
|
112
|
+
}
|
|
113
|
+
const project = record.project;
|
|
114
|
+
if (typeof project.name !== "string" || !project.name.trim()) {
|
|
115
|
+
throw new Error("project-context validation failed: project.name is missing or empty");
|
|
116
|
+
}
|
|
117
|
+
if (typeof project.prefix !== "string" || !project.prefix.trim()) {
|
|
118
|
+
throw new Error("project-context validation failed: project.prefix is missing or empty");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Write project-context.json to <cwd>/.forge/project-context.json
|
|
123
|
+
*/
|
|
124
|
+
export function writeProjectContext(cwd, ctx) {
|
|
125
|
+
const filePath = path.join(cwd, ".forge", "project-context.json");
|
|
126
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
127
|
+
fs.writeFileSync(filePath, JSON.stringify(ctx, null, 2) + "\n", "utf8");
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Compute a calibration baseline snapshot for /forge:init Phase 2.
|
|
131
|
+
*
|
|
132
|
+
* @param cwd - project working directory
|
|
133
|
+
* @param kbPath - relative path to the knowledge base directory (e.g. "engineering")
|
|
134
|
+
* @param bundledPluginVersion - version string from package.json forge.bundledVersion
|
|
135
|
+
*/
|
|
136
|
+
export function computeCalibrationBaseline(cwd, kbPath, bundledPluginVersion) {
|
|
137
|
+
const baseline = {
|
|
138
|
+
lastCalibrated: new Date().toISOString(),
|
|
139
|
+
version: bundledPluginVersion,
|
|
140
|
+
masterIndexHash: null,
|
|
141
|
+
sprintsCovered: 0,
|
|
142
|
+
};
|
|
143
|
+
// Compute SHA-256 of MASTER_INDEX.md if it exists
|
|
144
|
+
const masterIndexPath = path.join(cwd, kbPath, "MASTER_INDEX.md");
|
|
145
|
+
try {
|
|
146
|
+
const content = fs.readFileSync(masterIndexPath, "utf8");
|
|
147
|
+
baseline.masterIndexHash = crypto.createHash("sha256").update(content, "utf8").digest("hex");
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// File not yet present — leave as null (init just started Phase 2)
|
|
151
|
+
}
|
|
152
|
+
// Count sprint directories
|
|
153
|
+
const sprintsDir = path.join(cwd, kbPath, "sprints");
|
|
154
|
+
try {
|
|
155
|
+
const entries = fs.readdirSync(sprintsDir, { withFileTypes: true });
|
|
156
|
+
baseline.sprintsCovered = entries.filter((e) => e.isDirectory()).length;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Sprints dir not yet created — leave as 0
|
|
160
|
+
}
|
|
161
|
+
return baseline;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=init-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-context.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/init-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Canonical progress record written to .forge/init-progress.json */
|
|
2
|
+
export interface InitProgress {
|
|
3
|
+
lastPhase: 1 | 2 | 3 | 4;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
}
|
|
6
|
+
export type ReadProgressResult = {
|
|
7
|
+
kind: "none";
|
|
8
|
+
} | {
|
|
9
|
+
kind: "stale";
|
|
10
|
+
reason: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: "malformed";
|
|
13
|
+
} | {
|
|
14
|
+
kind: "valid";
|
|
15
|
+
progress: InitProgress;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Read the init-progress checkpoint file.
|
|
19
|
+
*
|
|
20
|
+
* Returns:
|
|
21
|
+
* - `{ kind: "none" }` — file does not exist
|
|
22
|
+
* - `{ kind: "malformed" }` — file exists but JSON parse failed
|
|
23
|
+
* - `{ kind: "stale", reason }` — file is a legacy 12-phase checkpoint
|
|
24
|
+
* - `{ kind: "valid", progress }` — clean 4-phase checkpoint
|
|
25
|
+
*/
|
|
26
|
+
export declare function readInitProgress(cwd: string): ReadProgressResult;
|
|
27
|
+
/**
|
|
28
|
+
* Write a progress checkpoint. Called at the end of each completed phase.
|
|
29
|
+
*
|
|
30
|
+
* @param cwd - project working directory
|
|
31
|
+
* @param lastPhase - completed phase number (1, 2, or 3; 4 is written then deleted)
|
|
32
|
+
* @param timestamp - ISO 8601 timestamp; defaults to now
|
|
33
|
+
*/
|
|
34
|
+
export declare function writeInitProgress(cwd: string, lastPhase: 1 | 2 | 3 | 4, timestamp?: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Delete the init-progress checkpoint. Called at the end of Phase 4
|
|
37
|
+
* to signal successful completion.
|
|
38
|
+
*/
|
|
39
|
+
export declare function deleteInitProgress(cwd: string): void;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// init-progress.ts — read/write/delete .forge/init-progress.json
|
|
2
|
+
//
|
|
3
|
+
// Tracks the last completed phase of /forge:init so the command can resume
|
|
4
|
+
// after an interrupted run. Implements stale-checkpoint detection to handle
|
|
5
|
+
// legacy 12-phase checkpoint files from old forge plugin versions.
|
|
6
|
+
//
|
|
7
|
+
// Per INIT_PARITY_SPEC.md §4 and PLAN.md Phase B.
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
const PROGRESS_FILENAME = ".forge/init-progress.json";
|
|
11
|
+
function progressPath(cwd) {
|
|
12
|
+
return path.join(cwd, PROGRESS_FILENAME);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read the init-progress checkpoint file.
|
|
16
|
+
*
|
|
17
|
+
* Returns:
|
|
18
|
+
* - `{ kind: "none" }` — file does not exist
|
|
19
|
+
* - `{ kind: "malformed" }` — file exists but JSON parse failed
|
|
20
|
+
* - `{ kind: "stale", reason }` — file is a legacy 12-phase checkpoint
|
|
21
|
+
* - `{ kind: "valid", progress }` — clean 4-phase checkpoint
|
|
22
|
+
*/
|
|
23
|
+
export function readInitProgress(cwd) {
|
|
24
|
+
const filePath = progressPath(cwd);
|
|
25
|
+
let raw;
|
|
26
|
+
try {
|
|
27
|
+
raw = fs.readFileSync(filePath, "utf8");
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const e = err;
|
|
31
|
+
if (e.code === "ENOENT")
|
|
32
|
+
return { kind: "none" };
|
|
33
|
+
// Unreadable — treat as missing
|
|
34
|
+
return { kind: "none" };
|
|
35
|
+
}
|
|
36
|
+
let obj;
|
|
37
|
+
try {
|
|
38
|
+
obj = JSON.parse(raw);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { kind: "malformed" };
|
|
42
|
+
}
|
|
43
|
+
if (!obj || typeof obj !== "object") {
|
|
44
|
+
return { kind: "malformed" };
|
|
45
|
+
}
|
|
46
|
+
const record = obj;
|
|
47
|
+
// Stale detection per spec §4:
|
|
48
|
+
// - lastPhase > 4 → old 12-phase run
|
|
49
|
+
// - contains "mode" key → old format
|
|
50
|
+
// - contains "phase-7-substep-map" key → old format
|
|
51
|
+
// - missing "timestamp" → corrupt / incomplete write
|
|
52
|
+
if ("mode" in record) {
|
|
53
|
+
return { kind: "stale", reason: 'contains "mode" field (legacy 12-phase format)' };
|
|
54
|
+
}
|
|
55
|
+
if ("phase-7-substep-map" in record) {
|
|
56
|
+
return { kind: "stale", reason: 'contains "phase-7-substep-map" field (legacy 12-phase format)' };
|
|
57
|
+
}
|
|
58
|
+
if (!("timestamp" in record)) {
|
|
59
|
+
return { kind: "stale", reason: 'missing "timestamp" field' };
|
|
60
|
+
}
|
|
61
|
+
const lastPhase = record.lastPhase;
|
|
62
|
+
if (typeof lastPhase !== "number" || !Number.isInteger(lastPhase)) {
|
|
63
|
+
return { kind: "malformed" };
|
|
64
|
+
}
|
|
65
|
+
if (lastPhase > 4) {
|
|
66
|
+
return { kind: "stale", reason: `lastPhase=${lastPhase} > 4 (legacy 12-phase run)` };
|
|
67
|
+
}
|
|
68
|
+
if (lastPhase < 1) {
|
|
69
|
+
return { kind: "malformed" };
|
|
70
|
+
}
|
|
71
|
+
const timestamp = record.timestamp;
|
|
72
|
+
if (typeof timestamp !== "string") {
|
|
73
|
+
return { kind: "malformed" };
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
kind: "valid",
|
|
77
|
+
progress: {
|
|
78
|
+
lastPhase: lastPhase,
|
|
79
|
+
timestamp,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Write a progress checkpoint. Called at the end of each completed phase.
|
|
85
|
+
*
|
|
86
|
+
* @param cwd - project working directory
|
|
87
|
+
* @param lastPhase - completed phase number (1, 2, or 3; 4 is written then deleted)
|
|
88
|
+
* @param timestamp - ISO 8601 timestamp; defaults to now
|
|
89
|
+
*/
|
|
90
|
+
export function writeInitProgress(cwd, lastPhase, timestamp) {
|
|
91
|
+
const record = {
|
|
92
|
+
lastPhase,
|
|
93
|
+
timestamp: timestamp ?? new Date().toISOString(),
|
|
94
|
+
};
|
|
95
|
+
const filePath = progressPath(cwd);
|
|
96
|
+
// Ensure .forge/ dir exists before writing
|
|
97
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
98
|
+
fs.writeFileSync(filePath, JSON.stringify(record, null, 2) + "\n", "utf8");
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Delete the init-progress checkpoint. Called at the end of Phase 4
|
|
102
|
+
* to signal successful completion.
|
|
103
|
+
*/
|
|
104
|
+
export function deleteInitProgress(cwd) {
|
|
105
|
+
const filePath = progressPath(cwd);
|
|
106
|
+
try {
|
|
107
|
+
fs.unlinkSync(filePath);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
const e = err;
|
|
111
|
+
// ENOENT is fine — file may not exist if phase was aborted before first write
|
|
112
|
+
if (e.code !== "ENOENT") {
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=init-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-progress.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/init-progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface RefreshKbLinksResult {
|
|
2
|
+
filesUpdated: number;
|
|
3
|
+
filesSkipped: number;
|
|
4
|
+
messages: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Run the refresh-kb-links operation on the project at `cwd`.
|
|
8
|
+
*
|
|
9
|
+
* Returns a result record with counts and human-readable messages.
|
|
10
|
+
* Never throws — errors are captured as messages.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runRefreshKbLinks(cwd: string): Promise<RefreshKbLinksResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Get a standalone refresh-kb-links handler suitable for direct invocation
|
|
15
|
+
* from Phase 4 step 4-9. Returns a function that takes cwd and calls
|
|
16
|
+
* runRefreshKbLinks.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getRefreshKbLinksHandler(): (cwd: string) => Promise<RefreshKbLinksResult>;
|