@warpgogol/forge 5.2.3 → 5.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/AGENTS.md +34 -2
- package/README.md +1 -1
- package/README.uk.md +8 -8
- package/bin/cli.ts +1 -0
- package/dist/bin/cli.js +1 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/os/adr/adr.module.d.ts.map +1 -1
- package/dist/os/adr/adr.module.js +8 -3
- package/dist/os/adr/adr.module.js.map +1 -1
- package/dist/os/adr/frontmatter-io.js +5 -5
- package/dist/os/adr/frontmatter-io.js.map +1 -1
- package/dist/os/adr/handlers/archive.d.ts.map +1 -1
- package/dist/os/adr/handlers/archive.js +10 -4
- package/dist/os/adr/handlers/archive.js.map +1 -1
- package/dist/os/adr/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/adr/handlers/implement-stamp.js +10 -9
- package/dist/os/adr/handlers/implement-stamp.js.map +1 -1
- package/dist/os/adr/handlers/list-create.js +5 -5
- package/dist/os/adr/handlers/list-create.js.map +1 -1
- package/dist/os/adr/handlers/validate.js +1 -1
- package/dist/os/adr/handlers/validate.js.map +1 -1
- package/dist/os/audit/audit.module.js +3 -3
- package/dist/os/audit/audit.module.js.map +1 -1
- package/dist/os/audit/frontmatter-io.js +5 -5
- package/dist/os/audit/frontmatter-io.js.map +1 -1
- package/dist/os/audit/handlers/archive.d.ts.map +1 -1
- package/dist/os/audit/handlers/archive.js +10 -4
- package/dist/os/audit/handlers/archive.js.map +1 -1
- package/dist/os/compass/compass.module.d.ts.map +1 -1
- package/dist/os/compass/compass.module.js +17 -1
- package/dist/os/compass/compass.module.js.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.js +12 -5
- package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-change-summary-handler.js +3 -2
- package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-inventory-handler.js +6 -4
- package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-inventory.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-inventory.js +10 -8
- package/dist/os/compass/handlers/compass-inventory.js.map +1 -1
- package/dist/os/compass/handlers/compass-migrate-handler.js +1 -1
- package/dist/os/compass/handlers/compass-migrate-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-migrate.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-migrate.js +6 -3
- package/dist/os/compass/handlers/compass-migrate.js.map +1 -1
- package/dist/os/compass/handlers/git-revision.d.ts.map +1 -1
- package/dist/os/compass/handlers/git-revision.js +9 -6
- package/dist/os/compass/handlers/git-revision.js.map +1 -1
- package/dist/os/compass/handlers/resolve-scan-root.js +1 -1
- package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -1
- package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
- package/dist/os/compass/handlers/summary-record.js +8 -4
- package/dist/os/compass/handlers/summary-record.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +57 -4
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/assets-helpers.d.ts.map +1 -1
- package/dist/os/core/handlers/assets-helpers.js +6 -3
- package/dist/os/core/handlers/assets-helpers.js.map +1 -1
- package/dist/os/core/handlers/build.js +1 -1
- package/dist/os/core/handlers/build.js.map +1 -1
- package/dist/os/core/handlers/determinism-check.d.ts.map +1 -1
- package/dist/os/core/handlers/determinism-check.js +10 -6
- package/dist/os/core/handlers/determinism-check.js.map +1 -1
- package/dist/os/core/handlers/dev.js +1 -1
- package/dist/os/core/handlers/dev.js.map +1 -1
- package/dist/os/core/handlers/file-size-lint.d.ts.map +1 -1
- package/dist/os/core/handlers/file-size-lint.js +11 -7
- package/dist/os/core/handlers/file-size-lint.js.map +1 -1
- package/dist/os/core/handlers/forge-autonomy-validate.d.ts.map +1 -1
- package/dist/os/core/handlers/forge-autonomy-validate.js +9 -5
- package/dist/os/core/handlers/forge-autonomy-validate.js.map +1 -1
- package/dist/os/core/handlers/knowledge-compact.js +1 -1
- package/dist/os/core/handlers/knowledge-compact.js.map +1 -1
- package/dist/os/core/handlers/package-health.js +1 -1
- package/dist/os/core/handlers/package-health.js.map +1 -1
- package/dist/os/core/handlers/pinned-check.js +2 -2
- package/dist/os/core/handlers/pinned-check.js.map +1 -1
- package/dist/os/core/handlers/pinned-init.d.ts.map +1 -1
- package/dist/os/core/handlers/pinned-init.js +9 -8
- package/dist/os/core/handlers/pinned-init.js.map +1 -1
- package/dist/os/core/handlers/pinned-validate.js +3 -3
- package/dist/os/core/handlers/pinned-validate.js.map +1 -1
- package/dist/os/core/handlers/profile-resolve.js +1 -1
- package/dist/os/core/handlers/profile-resolve.js.map +1 -1
- package/dist/os/core/handlers/public-surface.js +1 -1
- package/dist/os/core/handlers/public-surface.js.map +1 -1
- package/dist/os/core/handlers/release-prepare.d.ts.map +1 -1
- package/dist/os/core/handlers/release-prepare.js +10 -6
- package/dist/os/core/handlers/release-prepare.js.map +1 -1
- package/dist/os/core/handlers/release-publish.js +6 -6
- package/dist/os/core/handlers/release-publish.js.map +1 -1
- package/dist/os/core/handlers/validate.js +1 -1
- package/dist/os/core/handlers/validate.js.map +1 -1
- package/dist/os/exploration/exploration.module.d.ts.map +1 -1
- package/dist/os/exploration/exploration.module.js +1 -0
- package/dist/os/exploration/exploration.module.js.map +1 -1
- package/dist/os/exploration/frontmatter-io.js +4 -4
- package/dist/os/exploration/frontmatter-io.js.map +1 -1
- package/dist/os/exploration/handlers/archive.js +3 -3
- package/dist/os/exploration/handlers/archive.js.map +1 -1
- package/dist/os/mission/handlers/archive.d.ts.map +1 -1
- package/dist/os/mission/handlers/archive.js +22 -19
- package/dist/os/mission/handlers/archive.js.map +1 -1
- package/dist/os/mission/mission.module.js +3 -3
- package/dist/os/mission/mission.module.js.map +1 -1
- package/dist/os/naming/naming-convention.d.ts.map +1 -1
- package/dist/os/naming/naming-convention.js +7 -3
- package/dist/os/naming/naming-convention.js.map +1 -1
- package/dist/os/naming/naming.module.d.ts.map +1 -1
- package/dist/os/naming/naming.module.js +4 -3
- package/dist/os/naming/naming.module.js.map +1 -1
- package/dist/os/notes/notes.module.d.ts.map +1 -1
- package/dist/os/notes/notes.module.js +6 -3
- package/dist/os/notes/notes.module.js.map +1 -1
- package/dist/os/plan/frontmatter-io.js +5 -5
- package/dist/os/plan/frontmatter-io.js.map +1 -1
- package/dist/os/plan/handlers/archive.d.ts.map +1 -1
- package/dist/os/plan/handlers/archive.js +10 -4
- package/dist/os/plan/handlers/archive.js.map +1 -1
- package/dist/os/plan/plan.module.js +3 -3
- package/dist/os/plan/plan.module.js.map +1 -1
- package/dist/os/plugin/plugin.module.d.ts.map +1 -1
- package/dist/os/plugin/plugin.module.js +6 -3
- package/dist/os/plugin/plugin.module.js.map +1 -1
- package/dist/os/program/discovery.js +2 -2
- package/dist/os/program/discovery.js.map +1 -1
- package/dist/os/program/handlers/complete.js +1 -1
- package/dist/os/program/handlers/complete.js.map +1 -1
- package/dist/os/program/handlers/lease.js +1 -1
- package/dist/os/program/handlers/lease.js.map +1 -1
- package/dist/os/program/handlers/seal.js +1 -1
- package/dist/os/program/handlers/seal.js.map +1 -1
- package/dist/os/program/lease.js +1 -1
- package/dist/os/program/lease.js.map +1 -1
- package/dist/os/program/program.module.d.ts.map +1 -1
- package/dist/os/program/program.module.js +9 -3
- package/dist/os/program/program.module.js.map +1 -1
- package/dist/os/queue/index.js +1 -1
- package/dist/os/queue/manifest.d.ts.map +1 -1
- package/dist/os/queue/manifest.js +4 -8
- package/dist/os/queue/manifest.js.map +1 -1
- package/dist/os/rfc/acceptance.d.ts.map +1 -1
- package/dist/os/rfc/acceptance.js +10 -6
- package/dist/os/rfc/acceptance.js.map +1 -1
- package/dist/os/rfc/decision-log.d.ts.map +1 -1
- package/dist/os/rfc/decision-log.js +4 -3
- package/dist/os/rfc/decision-log.js.map +1 -1
- package/dist/os/rfc/dna-trace.d.ts.map +1 -1
- package/dist/os/rfc/dna-trace.js +7 -2
- package/dist/os/rfc/dna-trace.js.map +1 -1
- package/dist/os/rfc/frontmatter-io.js +5 -5
- package/dist/os/rfc/frontmatter-io.js.map +1 -1
- package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
- package/dist/os/rfc/handlers/archive.js +11 -5
- package/dist/os/rfc/handlers/archive.js.map +1 -1
- package/dist/os/rfc/handlers/check.d.ts.map +1 -1
- package/dist/os/rfc/handlers/check.js +6 -3
- package/dist/os/rfc/handlers/check.js.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.js +11 -10
- package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
- package/dist/os/rfc/handlers/index-graph.js +3 -3
- package/dist/os/rfc/handlers/index-graph.js.map +1 -1
- package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
- package/dist/os/rfc/handlers/lifecycle.js +6 -2
- package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
- package/dist/os/rfc/handlers/list-create.d.ts.map +1 -1
- package/dist/os/rfc/handlers/list-create.js +7 -6
- package/dist/os/rfc/handlers/list-create.js.map +1 -1
- package/dist/os/rfc/handlers/shared.js +3 -3
- package/dist/os/rfc/handlers/shared.js.map +1 -1
- package/dist/os/rfc/handlers/supersede-propose.d.ts.map +1 -1
- package/dist/os/rfc/handlers/supersede-propose.js +7 -3
- package/dist/os/rfc/handlers/supersede-propose.js.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate-rules.js +8 -5
- package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
- package/dist/os/rfc/rfc.module.d.ts.map +1 -1
- package/dist/os/rfc/rfc.module.js +44 -4
- package/dist/os/rfc/rfc.module.js.map +1 -1
- package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
- package/dist/os/rfc/verification-evidence.js +9 -5
- package/dist/os/rfc/verification-evidence.js.map +1 -1
- package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
- package/dist/os/rfc/verification-refresh.js +4 -3
- package/dist/os/rfc/verification-refresh.js.map +1 -1
- package/dist/os/session/frontmatter-io.js +12 -12
- package/dist/os/session/frontmatter-io.js.map +1 -1
- package/dist/os/session/handlers/archive.d.ts.map +1 -1
- package/dist/os/session/handlers/archive.js +10 -4
- package/dist/os/session/handlers/archive.js.map +1 -1
- package/dist/os/session/handlers/metrics-aggregate.d.ts.map +1 -1
- package/dist/os/session/handlers/metrics-aggregate.js +9 -5
- package/dist/os/session/handlers/metrics-aggregate.js.map +1 -1
- package/dist/os/session/handlers/metrics-rfc.d.ts.map +1 -1
- package/dist/os/session/handlers/metrics-rfc.js +11 -8
- package/dist/os/session/handlers/metrics-rfc.js.map +1 -1
- package/dist/os/session/handlers/metrics-session.d.ts.map +1 -1
- package/dist/os/session/handlers/metrics-session.js +6 -3
- package/dist/os/session/handlers/metrics-session.js.map +1 -1
- package/dist/os/session/handlers/save.d.ts.map +1 -1
- package/dist/os/session/handlers/save.js +14 -8
- package/dist/os/session/handlers/save.js.map +1 -1
- package/dist/os/session/session.module.d.ts.map +1 -1
- package/dist/os/session/session.module.js +6 -0
- package/dist/os/session/session.module.js.map +1 -1
- package/dist/os/spec/live-spec-list.js +4 -4
- package/dist/os/spec/live-spec-list.js.map +1 -1
- package/dist/os/spec/live-spec-merge.js +5 -5
- package/dist/os/spec/live-spec-merge.js.map +1 -1
- package/dist/os/spec/live-spec-show.js +3 -3
- package/dist/os/spec/live-spec-show.js.map +1 -1
- package/dist/os/spec/live-spec-validate.js +4 -4
- package/dist/os/spec/live-spec-validate.js.map +1 -1
- package/dist/os/spec/spec-materialize.js +9 -9
- package/dist/os/spec/spec-materialize.js.map +1 -1
- package/dist/os/spec/spec-status.js +9 -9
- package/dist/os/spec/spec-status.js.map +1 -1
- package/dist/os/spec/spec-validate.js +7 -7
- package/dist/os/spec/spec-validate.js.map +1 -1
- package/dist/os/spec/spec.module.d.ts.map +1 -1
- package/dist/os/spec/spec.module.js +8 -0
- package/dist/os/spec/spec.module.js.map +1 -1
- package/dist/os/werkstatt/handlers/lock.js +16 -16
- package/dist/os/werkstatt/handlers/lock.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +3 -3
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +3 -2
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.js +6 -2
- package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
- package/dist/os/workflow/handlers.d.ts.map +1 -1
- package/dist/os/workflow/handlers.js +8 -5
- package/dist/os/workflow/handlers.js.map +1 -1
- package/dist/os/workflow/workflow.module.d.ts.map +1 -1
- package/dist/os/workflow/workflow.module.js +6 -3
- package/dist/os/workflow/workflow.module.js.map +1 -1
- package/dist/src/compass/contract-registry.js +1 -1
- package/dist/src/compass/contract-registry.js.map +1 -1
- package/dist/src/config/forge-config.d.ts +10 -1
- package/dist/src/config/forge-config.d.ts.map +1 -1
- package/dist/src/config/forge-config.js +8 -1
- package/dist/src/config/forge-config.js.map +1 -1
- package/dist/src/knowledge/budgets.js +1 -1
- package/dist/src/knowledge/budgets.js.map +1 -1
- package/dist/src/knowledge/compact.js +1 -1
- package/dist/src/knowledge/compact.js.map +1 -1
- package/dist/src/knowledge/parse.js +1 -1
- package/dist/src/knowledge/parse.js.map +1 -1
- package/dist/src/knowledge/sync.d.ts.map +1 -1
- package/dist/src/knowledge/sync.js +3 -5
- package/dist/src/knowledge/sync.js.map +1 -1
- package/dist/src/migration-adapters/git-utils.js +2 -2
- package/dist/src/migration-adapters/git-utils.js.map +1 -1
- package/dist/src/migration-adapters/ignored-files.js +2 -2
- package/dist/src/migration-adapters/ignored-files.js.map +1 -1
- package/dist/src/migration-adapters/node-typescript-pnpm/index.js +1 -1
- package/dist/src/migration-adapters/node-typescript-pnpm/index.js.map +1 -1
- package/dist/src/migration-adapters/phaser-pnpm/index.js +1 -1
- package/dist/src/migration-adapters/phaser-pnpm/index.js.map +1 -1
- package/dist/src/onboarding/agents-generate.d.ts +2 -0
- package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
- package/dist/src/onboarding/agents-generate.js +73 -48
- package/dist/src/onboarding/agents-generate.js.map +1 -1
- package/dist/src/onboarding/create.d.ts.map +1 -1
- package/dist/src/onboarding/create.js +10 -10
- package/dist/src/onboarding/create.js.map +1 -1
- package/dist/src/onboarding/doctor.d.ts +6 -0
- package/dist/src/onboarding/doctor.d.ts.map +1 -1
- package/dist/src/onboarding/doctor.js +179 -61
- package/dist/src/onboarding/doctor.js.map +1 -1
- package/dist/src/onboarding/init.d.ts.map +1 -1
- package/dist/src/onboarding/init.js +30 -1
- package/dist/src/onboarding/init.js.map +1 -1
- package/dist/src/onboarding/invariant-engine.js +1 -1
- package/dist/src/onboarding/invariant-engine.js.map +1 -1
- package/dist/src/onboarding/memory-compact.d.ts +22 -0
- package/dist/src/onboarding/memory-compact.d.ts.map +1 -0
- package/dist/src/onboarding/memory-compact.js +148 -0
- package/dist/src/onboarding/memory-compact.js.map +1 -0
- package/dist/src/onboarding/memory-scaffold.d.ts +1 -0
- package/dist/src/onboarding/memory-scaffold.d.ts.map +1 -1
- package/dist/src/onboarding/memory-scaffold.js +2 -2
- package/dist/src/onboarding/memory-scaffold.js.map +1 -1
- package/dist/src/onboarding/nested-agents-generate.d.ts +4 -1
- package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -1
- package/dist/src/onboarding/nested-agents-generate.js +35 -6
- package/dist/src/onboarding/nested-agents-generate.js.map +1 -1
- package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -1
- package/dist/src/onboarding/nested-agents-templates.js +8 -12
- package/dist/src/onboarding/nested-agents-templates.js.map +1 -1
- package/dist/src/onboarding/npm-token-check.js +2 -2
- package/dist/src/onboarding/npm-token-check.js.map +1 -1
- package/dist/src/onboarding/prettierignore.d.ts +29 -0
- package/dist/src/onboarding/prettierignore.d.ts.map +1 -0
- package/dist/src/onboarding/prettierignore.js +231 -0
- package/dist/src/onboarding/prettierignore.js.map +1 -0
- package/dist/src/onboarding/profile-validate.d.ts.map +1 -1
- package/dist/src/onboarding/profile-validate.js +5 -4
- package/dist/src/onboarding/profile-validate.js.map +1 -1
- package/dist/src/onboarding/scaffold-project.d.ts.map +1 -1
- package/dist/src/onboarding/scaffold-project.js +35 -27
- package/dist/src/onboarding/scaffold-project.js.map +1 -1
- package/dist/src/onboarding/scaffold.js +1 -1
- package/dist/src/onboarding/scaffold.js.map +1 -1
- package/dist/src/onboarding/skill-markers.d.ts +27 -0
- package/dist/src/onboarding/skill-markers.d.ts.map +1 -0
- package/dist/src/onboarding/skill-markers.js +131 -0
- package/dist/src/onboarding/skill-markers.js.map +1 -0
- package/dist/src/onboarding/upgrade.d.ts +10 -0
- package/dist/src/onboarding/upgrade.d.ts.map +1 -1
- package/dist/src/onboarding/upgrade.js +215 -74
- package/dist/src/onboarding/upgrade.js.map +1 -1
- package/dist/src/onboarding/workspace-discovery.d.ts +1 -1
- package/dist/src/onboarding/workspace-discovery.d.ts.map +1 -1
- package/dist/src/onboarding/workspace-discovery.js +15 -3
- package/dist/src/onboarding/workspace-discovery.js.map +1 -1
- package/dist/src/pipeline-status.d.ts +6 -5
- package/dist/src/pipeline-status.d.ts.map +1 -1
- package/dist/src/pipeline-status.js +24 -19
- package/dist/src/pipeline-status.js.map +1 -1
- package/dist/src/profiles/stack-profile.js +1 -1
- package/dist/src/profiles/stack-profile.js.map +1 -1
- package/dist/src/registry.d.ts +1 -1
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +3 -3
- package/dist/src/registry.js.map +1 -1
- package/dist/src/skill-schema.d.ts +1 -1
- package/dist/src/skill-schema.d.ts.map +1 -1
- package/dist/src/skill-schema.js +4 -1
- package/dist/src/skill-schema.js.map +1 -1
- package/dist/src/types.d.ts +116 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/editable-region.d.ts +46 -0
- package/dist/src/utils/editable-region.d.ts.map +1 -0
- package/dist/src/utils/editable-region.js +125 -0
- package/dist/src/utils/editable-region.js.map +1 -0
- package/dist/src/utils/fs-idempotent.d.ts +2 -1
- package/dist/src/utils/fs-idempotent.d.ts.map +1 -1
- package/dist/src/utils/fs-idempotent.js +11 -7
- package/dist/src/utils/fs-idempotent.js.map +1 -1
- package/dist/src/utils/generated-marker.d.ts +17 -0
- package/dist/src/utils/generated-marker.d.ts.map +1 -1
- package/dist/src/utils/generated-marker.js +29 -1
- package/dist/src/utils/generated-marker.js.map +1 -1
- package/dist/src/utils/index.d.ts +3 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +3 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/io.d.ts +9 -0
- package/dist/src/utils/io.d.ts.map +1 -0
- package/dist/src/utils/io.js +130 -0
- package/dist/src/utils/io.js.map +1 -0
- package/dist/src/utils/markdown-table.d.ts +21 -0
- package/dist/src/utils/markdown-table.d.ts.map +1 -0
- package/dist/src/utils/markdown-table.js +116 -0
- package/dist/src/utils/markdown-table.js.map +1 -0
- package/dist/src/utils/sync-fs.d.ts +5 -0
- package/dist/src/utils/sync-fs.d.ts.map +1 -0
- package/dist/src/utils/sync-fs.js +26 -0
- package/dist/src/utils/sync-fs.js.map +1 -0
- package/dist/src/validators/note-frontmatter-validate.js +1 -1
- package/dist/src/validators/note-frontmatter-validate.js.map +1 -1
- package/dist/src/validators/note-link-validate.js +1 -1
- package/dist/src/validators/note-link-validate.js.map +1 -1
- package/dist/src/validators/note-orphan-detect.js +1 -1
- package/dist/src/validators/note-orphan-detect.js.map +1 -1
- package/dist/src/validators/port-validate.js +1 -1
- package/dist/src/validators/port-validate.js.map +1 -1
- package/dist/src/validators/skill-validate.d.ts.map +1 -1
- package/dist/src/validators/skill-validate.js +34 -13
- package/dist/src/validators/skill-validate.js.map +1 -1
- package/docs/reference/forge-yaml.md +12 -0
- package/os/adr/adr.module.ts +136 -132
- package/os/adr/frontmatter-io.ts +5 -5
- package/os/adr/handlers/archive.ts +8 -4
- package/os/adr/handlers/implement-stamp.ts +14 -9
- package/os/adr/handlers/list-create.ts +5 -5
- package/os/adr/handlers/validate.ts +1 -1
- package/os/audit/audit.module.ts +33 -34
- package/os/audit/frontmatter-io.ts +5 -5
- package/os/audit/handlers/archive.ts +8 -4
- package/os/compass/compass.module.ts +17 -1
- package/os/compass/handlers/compass-audit-handler.ts +13 -5
- package/os/compass/handlers/compass-change-summary-handler.ts +4 -2
- package/os/compass/handlers/compass-inventory-handler.ts +7 -4
- package/os/compass/handlers/compass-inventory.ts +11 -8
- package/os/compass/handlers/compass-migrate-handler.ts +1 -1
- package/os/compass/handlers/compass-migrate.ts +7 -3
- package/os/compass/handlers/git-revision.ts +11 -6
- package/os/compass/handlers/resolve-scan-root.ts +1 -1
- package/os/compass/handlers/summary-record.ts +10 -4
- package/os/compass/handlers/tests/compass-audit-plan.test.ts +2 -1
- package/os/core/core.module.ts +58 -4
- package/os/core/handlers/assets-helpers.ts +7 -3
- package/os/core/handlers/build.ts +1 -1
- package/os/core/handlers/determinism-check.ts +12 -6
- package/os/core/handlers/dev.ts +1 -1
- package/os/core/handlers/file-size-lint.ts +16 -9
- package/os/core/handlers/forge-autonomy-validate.ts +10 -5
- package/os/core/handlers/knowledge-compact.ts +1 -1
- package/os/core/handlers/package-health.ts +1 -1
- package/os/core/handlers/pinned-check.ts +2 -2
- package/os/core/handlers/pinned-init.ts +9 -8
- package/os/core/handlers/pinned-validate.ts +3 -3
- package/os/core/handlers/profile-resolve.ts +1 -1
- package/os/core/handlers/public-surface.ts +1 -1
- package/os/core/handlers/release-prepare.ts +11 -6
- package/os/core/handlers/release-publish.ts +6 -6
- package/os/core/handlers/validate.ts +1 -1
- package/os/exploration/exploration.module.ts +1 -0
- package/os/exploration/frontmatter-io.ts +4 -4
- package/os/exploration/handlers/archive.ts +3 -3
- package/os/mission/handlers/archive.ts +27 -19
- package/os/mission/mission.module.ts +38 -39
- package/os/naming/naming-convention.ts +9 -3
- package/os/naming/naming.module.ts +25 -25
- package/os/notes/notes.module.ts +87 -85
- package/os/plan/frontmatter-io.ts +5 -5
- package/os/plan/handlers/archive.ts +8 -4
- package/os/plan/plan.module.ts +33 -34
- package/os/plugin/plugin.module.ts +8 -6
- package/os/program/discovery.ts +2 -2
- package/os/program/handlers/complete.ts +1 -1
- package/os/program/handlers/lease.ts +1 -1
- package/os/program/handlers/seal.ts +1 -1
- package/os/program/lease.ts +1 -1
- package/os/program/program.module.ts +198 -193
- package/os/queue/index.ts +1 -1
- package/os/queue/manifest.ts +10 -9
- package/os/queue/queue-validate.test.ts +6 -15
- package/os/rfc/acceptance.ts +12 -6
- package/os/rfc/decision-log.ts +4 -3
- package/os/rfc/dna-trace.ts +8 -2
- package/os/rfc/frontmatter-io.ts +5 -5
- package/os/rfc/handlers/archive.ts +9 -5
- package/os/rfc/handlers/check.ts +5 -3
- package/os/rfc/handlers/implement-stamp.ts +15 -10
- package/os/rfc/handlers/index-graph.ts +3 -3
- package/os/rfc/handlers/lifecycle.ts +7 -2
- package/os/rfc/handlers/list-create.ts +7 -6
- package/os/rfc/handlers/shared.ts +3 -3
- package/os/rfc/handlers/supersede-propose.ts +8 -3
- package/os/rfc/handlers/validate-rules-rfc1006.test.ts +18 -6
- package/os/rfc/handlers/validate-rules.ts +10 -5
- package/os/rfc/rfc-create-concurrent.test.ts +11 -3
- package/os/rfc/rfc.module.ts +413 -374
- package/os/rfc/verification-evidence.ts +11 -5
- package/os/rfc/verification-refresh.ts +4 -3
- package/os/session/frontmatter-io.ts +14 -14
- package/os/session/handlers/archive.ts +8 -4
- package/os/session/handlers/metrics-aggregate.ts +34 -13
- package/os/session/handlers/metrics-rfc.ts +13 -8
- package/os/session/handlers/metrics-session.ts +7 -3
- package/os/session/handlers/save.ts +12 -8
- package/os/session/session.module.ts +6 -0
- package/os/spec/live-spec-list.ts +4 -4
- package/os/spec/live-spec-merge.ts +5 -5
- package/os/spec/live-spec-show.ts +3 -3
- package/os/spec/live-spec-validate.ts +4 -4
- package/os/spec/spec-materialize.ts +9 -9
- package/os/spec/spec-status.ts +9 -9
- package/os/spec/spec-validate.ts +7 -7
- package/os/spec/spec.module.ts +8 -0
- package/os/werkstatt/handlers/lock.ts +16 -16
- package/os/werkstatt/handlers/werkstatt-lock-recover.ts +3 -3
- package/os/werkstatt/handlers/werkstatt-operation-validate.ts +4 -2
- package/os/werkstatt/werkstatt.module.ts +8 -5
- package/os/workflow/handlers.ts +7 -5
- package/os/workflow/workflow.module.ts +45 -44
- package/package.json +1 -1
- package/profiles/forge-shell.yaml +3 -0
- package/profiles/godot-game.yaml +3 -0
- package/profiles/phaser-game.yaml +3 -0
- package/profiles/site-workshop.yaml +567 -564
- package/skills/fo/fo-add-tests/SKILL.md +2 -2
- package/skills/fo/fo-architecture/SKILL.md +2 -2
- package/skills/fo/fo-compass-annotate/SKILL.md +2 -2
- package/skills/fo/fo-design-summit/SKILL.md +2 -2
- package/skills/fo/fo-doc-audit/SKILL.md +2 -2
- package/skills/fo/fo-explore/SKILL.md +2 -2
- package/skills/fo/fo-extract-dna/SKILL.md +2 -2
- package/skills/fo/fo-fix/SKILL.md +2 -2
- package/skills/fo/fo-handoff/SKILL.md +2 -2
- package/skills/fo/fo-harvest/SKILL.md +2 -2
- package/skills/fo/fo-idea/SKILL.md +2 -2
- package/skills/fo/fo-idea-audit/SKILL.md +2 -2
- package/skills/fo/fo-idea-create-adr/SKILL.md +3 -3
- package/skills/fo/fo-idea-create-rfc/SKILL.md +3 -3
- package/skills/fo/fo-idea-enhance/SKILL.md +2 -2
- package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +2 -2
- package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +1 -1
- package/skills/fo/fo-idea-implement/SKILL.md +2 -2
- package/skills/fo/fo-idea-plan/SKILL.md +2 -2
- package/skills/fo/fo-idea-status/SKILL.md +2 -2
- package/skills/fo/fo-knowledge-distill/SKILL.md +2 -2
- package/skills/fo/fo-memory-sync/SKILL.md +2 -2
- package/skills/fo/fo-qa/SKILL.md +2 -2
- package/skills/fo/fo-review/SKILL.md +2 -2
- package/skills/fo/fo-session-retro/SKILL.md +2 -2
- package/skills/fo/fo-session-save/SKILL.md +2 -2
- package/skills/fo/fo-spec-ingest/SKILL.md +2 -2
- package/skills/fo/fo-step-commit/SKILL.md +1 -1
- package/skills/fo/fo-triage/SKILL.md +2 -2
- package/skills/meta/forge-bootstrap/SKILL.md +1 -1
- package/skills/meta/port-to-forge/SKILL.md +1 -1
- package/skills/meta/skill-create/SKILL.md +1 -1
- package/skills/shared/grilling/SKILL.md +1 -1
- package/skills/shared/grilling/learned-principles.archive.md +17 -0
- package/skills/shared/grilling/learned-principles.md +0 -1
- package/skills/shared/knowledge/learned-principles.md +6 -0
- package/skills/shared/my-preferences/SKILL.md +1 -1
- package/skills/shared/windows-ai-tooling/SKILL.md +1 -1
- package/skills/shared/writing-great-skills/SKILL.md +1 -1
- package/src/compass/contract-registry.ts +1 -1
- package/src/config/forge-config.ts +12 -1
- package/src/knowledge/__tests__/sync.test.ts +2 -7
- package/src/knowledge/budgets.ts +1 -1
- package/src/knowledge/compact.ts +1 -1
- package/src/knowledge/parse.ts +1 -1
- package/src/knowledge/sync.ts +3 -5
- package/src/migration-adapters/git-utils.ts +2 -2
- package/src/migration-adapters/ignored-files.ts +2 -2
- package/src/migration-adapters/node-typescript-pnpm/index.ts +1 -1
- package/src/migration-adapters/phaser-pnpm/index.ts +1 -1
- package/src/onboarding/agents-generate.ts +91 -50
- package/src/onboarding/create.ts +10 -10
- package/src/onboarding/doctor.ts +199 -59
- package/src/onboarding/init.ts +38 -1
- package/src/onboarding/invariant-engine.ts +1 -1
- package/src/onboarding/memory-compact.ts +189 -0
- package/src/onboarding/memory-scaffold.ts +2 -2
- package/src/onboarding/nested-agents-generate.ts +50 -5
- package/src/onboarding/nested-agents-templates.ts +19 -13
- package/src/onboarding/npm-token-check.ts +2 -2
- package/src/onboarding/prettierignore.ts +263 -0
- package/src/onboarding/profile-validate.ts +5 -4
- package/src/onboarding/scaffold-project.ts +38 -27
- package/src/onboarding/scaffold.ts +1 -1
- package/src/onboarding/skill-markers.ts +162 -0
- package/src/onboarding/templates/behavioral-layer-core.md +2 -4
- package/src/onboarding/upgrade.ts +285 -89
- package/src/onboarding/workspace-discovery.ts +16 -2
- package/src/pipeline-status.test.ts +1 -4
- package/src/pipeline-status.ts +30 -13
- package/src/profiles/stack-profile.ts +1 -1
- package/src/registry.ts +4 -4
- package/src/skill-schema.ts +4 -1
- package/src/tests/acceptance-probe-kinds.test.ts +5 -15
- package/src/tests/agents-generate.test.ts +32 -7
- package/src/tests/contract-registry.test.ts +12 -6
- package/src/tests/doctor-dist-freshness.test.ts +110 -0
- package/src/tests/doctor-fix.test.ts +142 -0
- package/src/tests/doctor-nested-agents.test.ts +160 -0
- package/src/tests/editable-generated-region.test.ts +231 -0
- package/src/tests/file-size-lint.test.ts +8 -12
- package/src/tests/fixtures/agents-generate-business-before.txt +54 -54
- package/src/tests/markdown-table.test.ts +107 -0
- package/src/tests/memory-compact.test.ts +143 -0
- package/src/tests/prettierignore-manage.test.ts +134 -0
- package/src/tests/skill-agents-sync.test.ts +168 -0
- package/src/tests/skill-sync-marker.test.ts +134 -0
- package/src/tests/skill-validate.test.ts +12 -5
- package/src/tests/upgrade.test.ts +87 -41
- package/src/tests/workspace-discovery.test.ts +28 -0
- package/src/types.ts +123 -0
- package/src/utils/editable-region.ts +156 -0
- package/src/utils/fs-idempotent.ts +12 -6
- package/src/utils/generated-marker.ts +36 -2
- package/src/utils/index.ts +17 -0
- package/src/utils/io.ts +143 -0
- package/src/utils/markdown-table.ts +121 -0
- package/src/utils/sync-fs.ts +43 -0
- package/src/validators/note-frontmatter-validate.ts +1 -1
- package/src/validators/note-link-validate.ts +1 -1
- package/src/validators/note-orphan-detect.ts +1 -1
- package/src/validators/port-validate.ts +1 -1
- package/src/validators/skill-validate.ts +38 -13
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<MODULE_CONTRACT>
|
|
3
3
|
<purpose>forge.agents.generate — regenerates AGENTS.md deterministically from forge.yaml + skill registry. Carries the standard generated-file marker.</purpose>
|
|
4
4
|
<non-goals>
|
|
5
|
-
<item>Do not overwrite a hand-written AGENTS.md (no generated marker) —
|
|
5
|
+
<item>Do not overwrite a hand-written AGENTS.md (no generated marker) — skip with warning, continue nested (RFC-1150).</item>
|
|
6
6
|
<item>Do not read or modify forge.yaml — only read it via loadForgeConfig.</item>
|
|
7
7
|
</non-goals>
|
|
8
8
|
</MODULE_CONTRACT>
|
|
@@ -20,13 +20,14 @@ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PU
|
|
|
20
20
|
</CHANGE_SUMMARY>
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
-
import fs from "
|
|
23
|
+
import * as fs from "../utils/sync-fs.ts";
|
|
24
|
+
import { resolveIo } from "../utils/io.ts";
|
|
24
25
|
import path from "node:path";
|
|
25
26
|
import { parse as parseYaml } from "yaml";
|
|
26
27
|
import { loadForgeConfig, resolveBinding, resolveForgePackageRoot, resolveForgeRoot } from "../config/forge-config.ts";
|
|
27
28
|
import { resolveAllTerminology } from "../profiles/terminology-utils.ts";
|
|
28
29
|
import { FORGE_SKILLS } from "../registry.ts";
|
|
29
|
-
import { buildGeneratedHeader, hasGeneratedMarker, writeFileIfChanged } from "../utils/index.ts";
|
|
30
|
+
import { alignMarkdownTable, buildGeneratedHeader, hasEditableGeneratedMarker, hasGeneratedMarker, mergeEditableGenerated, writeFileIfChanged } from "../utils/index.ts";
|
|
30
31
|
import { generateNestedAgentsMd } from "./nested-agents-generate.ts";
|
|
31
32
|
import { listStackProfiles } from "../profiles/stack-profile.ts";
|
|
32
33
|
import type { StackProfile } from "../profiles/stack-profile.ts";
|
|
@@ -140,9 +141,11 @@ function readRegister(workspaceRoot: string): BehavioralRegister {
|
|
|
140
141
|
return "business";
|
|
141
142
|
}
|
|
142
143
|
|
|
143
|
-
function
|
|
144
|
+
function extractTriggerPhrases(
|
|
145
|
+
workspaceRoot: string,
|
|
146
|
+
): Array<{ name: string; triggerPhrases: string[] }> {
|
|
144
147
|
const forgeRoot = path.join(workspaceRoot, "packages", "forge");
|
|
145
|
-
const result: Array<{ name: string;
|
|
148
|
+
const result: Array<{ name: string; triggerPhrases: string[] }> = [];
|
|
146
149
|
for (const skill of FORGE_SKILLS) {
|
|
147
150
|
if (skill.category !== "fo") continue;
|
|
148
151
|
const skillPath = path.join(forgeRoot, skill.path);
|
|
@@ -151,10 +154,12 @@ function extractTriggers(workspaceRoot: string): Array<{ name: string; triggers:
|
|
|
151
154
|
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
152
155
|
if (!fmMatch) continue;
|
|
153
156
|
const fm = parseYaml(fmMatch[1]) as Record<string, unknown>;
|
|
154
|
-
if (Array.isArray(fm["
|
|
157
|
+
if (Array.isArray(fm["triggerPhrases"])) {
|
|
155
158
|
result.push({
|
|
156
159
|
name: skill.name,
|
|
157
|
-
|
|
160
|
+
triggerPhrases: (fm["triggerPhrases"] as unknown[]).filter(
|
|
161
|
+
(v): v is string => typeof v === "string",
|
|
162
|
+
),
|
|
158
163
|
});
|
|
159
164
|
}
|
|
160
165
|
} catch {
|
|
@@ -164,21 +169,28 @@ function extractTriggers(workspaceRoot: string): Array<{ name: string; triggers:
|
|
|
164
169
|
return result;
|
|
165
170
|
}
|
|
166
171
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
172
|
+
// RFC-1154: emits the full aligned table (header + separator + rows) since
|
|
173
|
+
// column widths depend on substituted trigger rows — the template carries only
|
|
174
|
+
// the {{triggersTable}} placeholder, no static header lines.
|
|
175
|
+
function generateTriggersTable(
|
|
176
|
+
triggerPhrases: Array<{ name: string; triggerPhrases: string[] }>,
|
|
177
|
+
): string {
|
|
178
|
+
const rows: string[][] = [];
|
|
179
|
+
for (const { name, triggerPhrases: skillTriggers } of triggerPhrases) {
|
|
170
180
|
if (skillTriggers.length === 0) continue;
|
|
171
181
|
const display = skillTriggers.map((t) => `"${t}"`).join(", ");
|
|
172
|
-
rows.push(
|
|
182
|
+
rows.push([display, `\`${name}\``]);
|
|
173
183
|
}
|
|
174
|
-
|
|
184
|
+
// Always emit the header + separator — even with zero trigger rows the
|
|
185
|
+
// section documents the routing contract (matches pre-RFC-1154 behavior).
|
|
186
|
+
return alignMarkdownTable(["Operator says something like", "Skill"], rows) + "\n";
|
|
175
187
|
}
|
|
176
188
|
|
|
177
189
|
function generateBehavioralLayer(
|
|
178
190
|
workspaceRoot: string,
|
|
179
191
|
register: BehavioralRegister,
|
|
180
192
|
): string {
|
|
181
|
-
const
|
|
193
|
+
const triggerPhrases = extractTriggerPhrases(workspaceRoot);
|
|
182
194
|
|
|
183
195
|
let template: string;
|
|
184
196
|
try {
|
|
@@ -187,7 +199,7 @@ function generateBehavioralLayer(
|
|
|
187
199
|
return "";
|
|
188
200
|
}
|
|
189
201
|
|
|
190
|
-
const triggersTable = generateTriggersTable(
|
|
202
|
+
const triggersTable = generateTriggersTable(triggerPhrases);
|
|
191
203
|
|
|
192
204
|
let extendedLayer = "";
|
|
193
205
|
if (register === "creative") {
|
|
@@ -215,6 +227,9 @@ interface AgentsGenerateResult {
|
|
|
215
227
|
errors: string[];
|
|
216
228
|
renderedFiles?: { [relPath: string]: string };
|
|
217
229
|
details?: Array<{ path: string; domain?: string; register?: string; workspaceType?: string }>;
|
|
230
|
+
// RFC-1150: set when the root AGENTS.md was skipped (hand-written, no marker)
|
|
231
|
+
rootSkipped?: boolean;
|
|
232
|
+
rootSkipReason?: string;
|
|
218
233
|
}
|
|
219
234
|
|
|
220
235
|
export async function runAgentsGenerate(
|
|
@@ -222,6 +237,7 @@ export async function runAgentsGenerate(
|
|
|
222
237
|
context: ForgeRuntimeContext,
|
|
223
238
|
): Promise<ForgeCommandResult<AgentsGenerateResult>> {
|
|
224
239
|
const { workspaceRoot, logger, outputFormat, dryRun } = context;
|
|
240
|
+
const fio = resolveIo(context.io);
|
|
225
241
|
|
|
226
242
|
let config;
|
|
227
243
|
try {
|
|
@@ -247,26 +263,18 @@ export async function runAgentsGenerate(
|
|
|
247
263
|
|
|
248
264
|
const agentsMdPath = path.join(workspaceRoot, "AGENTS.md");
|
|
249
265
|
|
|
250
|
-
// Edit guard:
|
|
251
|
-
|
|
252
|
-
|
|
266
|
+
// Edit guard: never overwrite a hand-written AGENTS.md — skip the root file
|
|
267
|
+
// with a warning and continue to nested generation (RFC-1150, non-fatal).
|
|
268
|
+
let rootSkipped = false;
|
|
269
|
+
if (!dryRun && (await fio.exists(agentsMdPath))) {
|
|
270
|
+
const existing = await fio.readFile(agentsMdPath);
|
|
253
271
|
if (!hasGeneratedMarker(existing)) {
|
|
254
|
-
|
|
272
|
+
rootSkipped = true;
|
|
255
273
|
if (outputFormat === "pretty") {
|
|
256
|
-
logger.
|
|
274
|
+
logger.warn(
|
|
275
|
+
"AGENTS.md exists without a generated marker — skipping root file (hand-written). Nested AGENTS.md generation continues.",
|
|
276
|
+
);
|
|
257
277
|
}
|
|
258
|
-
return {
|
|
259
|
-
data: {
|
|
260
|
-
command: "forge.agents.generate",
|
|
261
|
-
status: "fail",
|
|
262
|
-
configPath: "forge.yaml",
|
|
263
|
-
generated: [],
|
|
264
|
-
skipped: [],
|
|
265
|
-
errors: [msg],
|
|
266
|
-
},
|
|
267
|
-
exitCode: 1,
|
|
268
|
-
summary: `forge.agents.generate: failed — hand-written AGENTS.md`,
|
|
269
|
-
};
|
|
270
278
|
}
|
|
271
279
|
}
|
|
272
280
|
|
|
@@ -284,14 +292,15 @@ export async function runAgentsGenerate(
|
|
|
284
292
|
// Build dynamic sections (skills table, capabilities, behavioral layer)
|
|
285
293
|
const dynamicLines: string[] = [];
|
|
286
294
|
|
|
287
|
-
// Skills table
|
|
295
|
+
// Skills table (RFC-1154: emitted prettier-normal via alignMarkdownTable)
|
|
288
296
|
dynamicLines.push("## Skills");
|
|
289
297
|
dynamicLines.push("");
|
|
290
|
-
dynamicLines.push(
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
298
|
+
dynamicLines.push(
|
|
299
|
+
alignMarkdownTable(
|
|
300
|
+
["Name", "Category", "Invocation", "Concerns"],
|
|
301
|
+
FORGE_SKILLS.map((skill) => [skill.name, skill.category, skill.invocation, skill.concerns]),
|
|
302
|
+
),
|
|
303
|
+
);
|
|
295
304
|
dynamicLines.push("");
|
|
296
305
|
|
|
297
306
|
// Capabilities section (RFC-0393)
|
|
@@ -300,8 +309,6 @@ export async function runAgentsGenerate(
|
|
|
300
309
|
dynamicLines.push("");
|
|
301
310
|
dynamicLines.push("Bindings resolved from `forge.yaml`:");
|
|
302
311
|
dynamicLines.push("");
|
|
303
|
-
dynamicLines.push("| Key | Status | Value |");
|
|
304
|
-
dynamicLines.push("| --- | --- | --- |");
|
|
305
312
|
|
|
306
313
|
const bindingKeys = [
|
|
307
314
|
"commands.validateRfc",
|
|
@@ -317,21 +324,23 @@ export async function runAgentsGenerate(
|
|
|
317
324
|
"paths.sessionsDir",
|
|
318
325
|
];
|
|
319
326
|
|
|
320
|
-
|
|
327
|
+
const capabilityRows: string[][] = bindingKeys.map((key) => {
|
|
321
328
|
const value = resolveBinding(config, key);
|
|
322
329
|
const status = value === null ? "absent" : "resolved";
|
|
323
330
|
const display = value === null ? "—" : typeof value === "string" ? `\`${value}\`` : String(value);
|
|
324
|
-
|
|
325
|
-
}
|
|
331
|
+
return [key, status, display];
|
|
332
|
+
});
|
|
326
333
|
|
|
327
334
|
// compassDocs array
|
|
328
335
|
const compassDocs = resolveBinding(config, "paths.compassDocs");
|
|
329
336
|
if (Array.isArray(compassDocs) && compassDocs.length > 0) {
|
|
330
|
-
|
|
337
|
+
capabilityRows.push(["paths.compassDocs", "resolved", compassDocs.map((d) => `\`${d}\``).join(", ")]);
|
|
331
338
|
} else {
|
|
332
|
-
|
|
339
|
+
capabilityRows.push(["paths.compassDocs", "absent", "—"]);
|
|
333
340
|
}
|
|
334
341
|
|
|
342
|
+
dynamicLines.push(alignMarkdownTable(["Key", "Status", "Value"], capabilityRows));
|
|
343
|
+
|
|
335
344
|
// terminology
|
|
336
345
|
if (config.bindings.terminology && Object.keys(config.bindings.terminology).length > 0) {
|
|
337
346
|
dynamicLines.push("");
|
|
@@ -371,7 +380,7 @@ export async function runAgentsGenerate(
|
|
|
371
380
|
const resolvedTerminology = resolveAllTerminology(config, profile);
|
|
372
381
|
content = substituteTemplate(content, resolvedTerminology);
|
|
373
382
|
|
|
374
|
-
const generated: string[] = [
|
|
383
|
+
const generated: string[] = [];
|
|
375
384
|
const skipped: string[] = [];
|
|
376
385
|
const renderedFiles: { [relPath: string]: string } = {};
|
|
377
386
|
const details: Array<{ path: string; domain?: string; register?: string; workspaceType?: string }> = [];
|
|
@@ -383,10 +392,41 @@ export async function runAgentsGenerate(
|
|
|
383
392
|
|
|
384
393
|
if (dryRun) {
|
|
385
394
|
renderedFiles["AGENTS.md"] = content;
|
|
395
|
+
generated.push("AGENTS.md");
|
|
396
|
+
} else if (rootSkipped) {
|
|
397
|
+
skipped.push("AGENTS.md (hand-written)");
|
|
386
398
|
} else {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
399
|
+
// RFC-1153: merge instead of overwrite — preserve the custom tail below
|
|
400
|
+
// the forge:custom boundary; fail-closed skip when no boundary resolves.
|
|
401
|
+
let existing: string | null = null;
|
|
402
|
+
if (await fio.exists(agentsMdPath)) {
|
|
403
|
+
try {
|
|
404
|
+
existing = await fio.readFile(agentsMdPath);
|
|
405
|
+
} catch {
|
|
406
|
+
// Unreadable — treat as absent; merge will emit a fresh file.
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
let merged = mergeEditableGenerated(content, existing, "AGENTS.md");
|
|
410
|
+
if (merged === null) {
|
|
411
|
+
if (existing !== null && !hasEditableGeneratedMarker(existing)) {
|
|
412
|
+
// RFC-0081/RFC-1153: restrictive-marker file is fully generator-owned —
|
|
413
|
+
// upgrade it to the editable boundary contract (fresh render + marker).
|
|
414
|
+
merged = mergeEditableGenerated(content, null, "AGENTS.md");
|
|
415
|
+
} else {
|
|
416
|
+
skipped.push("AGENTS.md (unmapped-customization)");
|
|
417
|
+
if (outputFormat === "pretty") {
|
|
418
|
+
logger.warn(
|
|
419
|
+
"AGENTS.md has custom content but no resolvable boundary — skipping root file (unmapped-customization). Add <!-- forge:custom --> to set the boundary.",
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
if (merged !== null) {
|
|
425
|
+
await writeFileIfChanged(agentsMdPath, merged, fio);
|
|
426
|
+
generated.push("AGENTS.md");
|
|
427
|
+
if (outputFormat === "pretty") {
|
|
428
|
+
logger.success(`Generated ${path.relative(workspaceRoot, agentsMdPath)}`);
|
|
429
|
+
}
|
|
390
430
|
}
|
|
391
431
|
}
|
|
392
432
|
|
|
@@ -411,7 +451,7 @@ export async function runAgentsGenerate(
|
|
|
411
451
|
// forge root not resolvable — fallback to hardcoded detection
|
|
412
452
|
}
|
|
413
453
|
}
|
|
414
|
-
const nestedResult = await generateNestedAgentsMd(workspaceRoot, config, dryRun, workspaceTypes);
|
|
454
|
+
const nestedResult = await generateNestedAgentsMd(workspaceRoot, config, dryRun, workspaceTypes, fio);
|
|
415
455
|
generated.push(...nestedResult.generated);
|
|
416
456
|
skipped.push(...nestedResult.skipped);
|
|
417
457
|
Object.assign(renderedFiles, nestedResult.renderedFiles);
|
|
@@ -443,11 +483,12 @@ export async function runAgentsGenerate(
|
|
|
443
483
|
skipped,
|
|
444
484
|
errors: [],
|
|
445
485
|
details,
|
|
486
|
+
...(rootSkipped ? { rootSkipped: true, rootSkipReason: "hand-written" } : {}),
|
|
446
487
|
...(dryRun ? { renderedFiles } : {}),
|
|
447
488
|
},
|
|
448
489
|
exitCode: 0,
|
|
449
490
|
summary: dryRun
|
|
450
491
|
? `forge.agents.generate: [dry-run] would generate ${generated.length} file(s), skip ${skipped.length}`
|
|
451
|
-
: `forge.agents.generate: OK — ${generated.length} file(s) generated, ${skipped.length} skipped`,
|
|
492
|
+
: `forge.agents.generate: OK — ${generated.length} file(s) generated, ${skipped.length} skipped${rootSkipped ? " (root AGENTS.md hand-written — skipped)" : ""}`,
|
|
452
493
|
};
|
|
453
494
|
}
|
package/src/onboarding/create.ts
CHANGED
|
@@ -22,9 +22,8 @@ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PU
|
|
|
22
22
|
</CHANGE_SUMMARY>
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import fs from "node:fs";
|
|
26
25
|
import path from "node:path";
|
|
27
|
-
import {
|
|
26
|
+
import { resolveIo } from "../utils/io.ts";
|
|
28
27
|
import { stringify as stringifyYaml } from "yaml";
|
|
29
28
|
import { runScaffoldProject } from "./scaffold-project.ts";
|
|
30
29
|
import { runInit, type InitResult, type InitDomainFields } from "./init.ts";
|
|
@@ -127,6 +126,7 @@ export async function runCreate(
|
|
|
127
126
|
context: ForgeRuntimeContext,
|
|
128
127
|
): Promise<ForgeCommandResult<CreateCommandResult>> {
|
|
129
128
|
const { logger, outputFormat } = context;
|
|
129
|
+
const fio = resolveIo(context.io);
|
|
130
130
|
const inPlace = input.flags["in-place"] as boolean | undefined;
|
|
131
131
|
const nameOverride = input.flags["name"] as string | undefined;
|
|
132
132
|
const profile = input.flags["profile"] as string | undefined;
|
|
@@ -217,7 +217,7 @@ export async function runCreate(
|
|
|
217
217
|
// If any other files or directories exist, refuse to scaffold.
|
|
218
218
|
let dirEntries: string[];
|
|
219
219
|
try {
|
|
220
|
-
dirEntries =
|
|
220
|
+
dirEntries = (await fio.readdir(targetDir)).map((e) => e.name);
|
|
221
221
|
} catch {
|
|
222
222
|
dirEntries = [];
|
|
223
223
|
}
|
|
@@ -240,13 +240,13 @@ export async function runCreate(
|
|
|
240
240
|
// This is a hard guard — forge.create programmatically ensures main branch,
|
|
241
241
|
// so greenfield projects don't depend on the agent running git init correctly.
|
|
242
242
|
const gitDir = path.join(targetDir, ".git");
|
|
243
|
-
if (!
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
if (!(await fio.exists(gitDir))) {
|
|
244
|
+
const gitInit = await fio.exec("git", ["init", "--initial-branch=main"], { cwd: targetDir });
|
|
245
|
+
if (gitInit.exitCode === 0) {
|
|
246
246
|
if (outputFormat === "pretty") {
|
|
247
247
|
logger.info("Initialized git repository with main branch");
|
|
248
248
|
}
|
|
249
|
-
}
|
|
249
|
+
} else {
|
|
250
250
|
if (outputFormat === "pretty") {
|
|
251
251
|
logger.warn("Failed to initialize git repository — run 'git init --initial-branch=main' manually");
|
|
252
252
|
}
|
|
@@ -344,7 +344,7 @@ export async function runCreate(
|
|
|
344
344
|
// 11. Post-process forge.yaml if --package-manager differs from default
|
|
345
345
|
if (packageManager !== "pnpm") {
|
|
346
346
|
const forgeYamlPath = path.join(targetDir, "forge.yaml");
|
|
347
|
-
if (
|
|
347
|
+
if (await fio.exists(forgeYamlPath)) {
|
|
348
348
|
try {
|
|
349
349
|
const config = loadForgeConfig(targetDir);
|
|
350
350
|
const pm = resolvePackageManager(packageManager);
|
|
@@ -354,7 +354,7 @@ export async function runCreate(
|
|
|
354
354
|
}
|
|
355
355
|
// RFC-1118: serializeForgeConfig writes the declared profile id verbatim —
|
|
356
356
|
// never the resolved StackProfile object, never drops an unresolvable id.
|
|
357
|
-
|
|
357
|
+
await fio.writeFile(forgeYamlPath, stringifyYaml(serializeForgeConfig(config)));
|
|
358
358
|
} catch {
|
|
359
359
|
// Post-processing is best-effort — init already wrote a valid config
|
|
360
360
|
}
|
|
@@ -417,7 +417,7 @@ If you already have a project elsewhere and want to move it into Forge, tell the
|
|
|
417
417
|
|
|
418
418
|
The system will guide you through the process — it detects your project type, migrates the code (including \`.env\` and git-ignored files), optionally transfers git history, and verifies the build.
|
|
419
419
|
`;
|
|
420
|
-
|
|
420
|
+
await fio.writeFile(nextStepsPath, nextStepsContent);
|
|
421
421
|
|
|
422
422
|
// 14. Collect filesCreated
|
|
423
423
|
const filesCreated = [
|