@specforge/cli 0.1.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/README.md +781 -0
- package/bin/specforge +21 -0
- package/dist/channel.d.ts +27 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +22 -0
- package/dist/channel.js.map +1 -0
- package/dist/cli/commands/configure.d.ts +16 -0
- package/dist/cli/commands/configure.d.ts.map +1 -0
- package/dist/cli/commands/configure.js +186 -0
- package/dist/cli/commands/configure.js.map +1 -0
- package/dist/cli/commands/configure.types.d.ts +110 -0
- package/dist/cli/commands/configure.types.d.ts.map +1 -0
- package/dist/cli/commands/configure.types.js +82 -0
- package/dist/cli/commands/configure.types.js.map +1 -0
- package/dist/cli/commands/debug/call.d.ts +14 -0
- package/dist/cli/commands/debug/call.d.ts.map +1 -0
- package/dist/cli/commands/debug/call.js +96 -0
- package/dist/cli/commands/debug/call.js.map +1 -0
- package/dist/cli/commands/debug/index.d.ts +12 -0
- package/dist/cli/commands/debug/index.d.ts.map +1 -0
- package/dist/cli/commands/debug/index.js +14 -0
- package/dist/cli/commands/debug/index.js.map +1 -0
- package/dist/cli/commands/debug/register.d.ts +11 -0
- package/dist/cli/commands/debug/register.d.ts.map +1 -0
- package/dist/cli/commands/debug/register.js +78 -0
- package/dist/cli/commands/debug/register.js.map +1 -0
- package/dist/cli/commands/debug/test.d.ts +13 -0
- package/dist/cli/commands/debug/test.d.ts.map +1 -0
- package/dist/cli/commands/debug/test.js +91 -0
- package/dist/cli/commands/debug/test.js.map +1 -0
- package/dist/cli/commands/debug/tools.d.ts +13 -0
- package/dist/cli/commands/debug/tools.d.ts.map +1 -0
- package/dist/cli/commands/debug/tools.js +86 -0
- package/dist/cli/commands/debug/tools.js.map +1 -0
- package/dist/cli/commands/debug/types.d.ts +119 -0
- package/dist/cli/commands/debug/types.d.ts.map +1 -0
- package/dist/cli/commands/debug/types.js +36 -0
- package/dist/cli/commands/debug/types.js.map +1 -0
- package/dist/cli/commands/debug/whoami.d.ts +13 -0
- package/dist/cli/commands/debug/whoami.d.ts.map +1 -0
- package/dist/cli/commands/debug/whoami.js +131 -0
- package/dist/cli/commands/debug/whoami.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +16 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +413 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/doctor.types.d.ts +180 -0
- package/dist/cli/commands/doctor.types.d.ts.map +1 -0
- package/dist/cli/commands/doctor.types.js +140 -0
- package/dist/cli/commands/doctor.types.js.map +1 -0
- package/dist/cli/commands/feedback.d.ts +27 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -0
- package/dist/cli/commands/feedback.js +262 -0
- package/dist/cli/commands/feedback.js.map +1 -0
- package/dist/cli/commands/feedback.types.d.ts +116 -0
- package/dist/cli/commands/feedback.types.d.ts.map +1 -0
- package/dist/cli/commands/feedback.types.js +65 -0
- package/dist/cli/commands/feedback.types.js.map +1 -0
- package/dist/cli/commands/index.d.ts +15 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +21 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +17 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +773 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/init.types.d.ts +193 -0
- package/dist/cli/commands/init.types.d.ts.map +1 -0
- package/dist/cli/commands/init.types.js +29 -0
- package/dist/cli/commands/init.types.js.map +1 -0
- package/dist/cli/commands/invitations.d.ts +31 -0
- package/dist/cli/commands/invitations.d.ts.map +1 -0
- package/dist/cli/commands/invitations.js +250 -0
- package/dist/cli/commands/invitations.js.map +1 -0
- package/dist/cli/commands/login.d.ts +40 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +139 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/members.d.ts +55 -0
- package/dist/cli/commands/members.d.ts.map +1 -0
- package/dist/cli/commands/members.js +296 -0
- package/dist/cli/commands/members.js.map +1 -0
- package/dist/cli/commands/scaffold/agent-types.d.ts +54 -0
- package/dist/cli/commands/scaffold/agent-types.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/agent-types.js +22 -0
- package/dist/cli/commands/scaffold/agent-types.js.map +1 -0
- package/dist/cli/commands/scaffold/display.d.ts +56 -0
- package/dist/cli/commands/scaffold/display.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/display.js +217 -0
- package/dist/cli/commands/scaffold/display.js.map +1 -0
- package/dist/cli/commands/scaffold/files.d.ts +99 -0
- package/dist/cli/commands/scaffold/files.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/files.js +122 -0
- package/dist/cli/commands/scaffold/files.js.map +1 -0
- package/dist/cli/commands/scaffold/index.d.ts +13 -0
- package/dist/cli/commands/scaffold/index.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/index.js +12 -0
- package/dist/cli/commands/scaffold/index.js.map +1 -0
- package/dist/cli/commands/scaffold/register.d.ts +11 -0
- package/dist/cli/commands/scaffold/register.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/register.js +11 -0
- package/dist/cli/commands/scaffold/register.js.map +1 -0
- package/dist/cli/commands/scaffold/scaffold.d.ts +11 -0
- package/dist/cli/commands/scaffold/scaffold.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/scaffold.js +728 -0
- package/dist/cli/commands/scaffold/scaffold.js.map +1 -0
- package/dist/cli/commands/scaffold/targets.d.ts +60 -0
- package/dist/cli/commands/scaffold/targets.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/targets.js +251 -0
- package/dist/cli/commands/scaffold/targets.js.map +1 -0
- package/dist/cli/commands/scaffold/types.d.ts +170 -0
- package/dist/cli/commands/scaffold/types.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/types.js +12 -0
- package/dist/cli/commands/scaffold/types.js.map +1 -0
- package/dist/cli/commands/scaffold/utils.d.ts +89 -0
- package/dist/cli/commands/scaffold/utils.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/utils.js +401 -0
- package/dist/cli/commands/scaffold/utils.js.map +1 -0
- package/dist/cli/commands/status.d.ts +19 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +124 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/status.types.d.ts +37 -0
- package/dist/cli/commands/status.types.d.ts.map +1 -0
- package/dist/cli/commands/status.types.js +7 -0
- package/dist/cli/commands/status.types.js.map +1 -0
- package/dist/cli/commands/switch.d.ts +18 -0
- package/dist/cli/commands/switch.d.ts.map +1 -0
- package/dist/cli/commands/switch.js +134 -0
- package/dist/cli/commands/switch.js.map +1 -0
- package/dist/cli/commands/switch.types.d.ts +123 -0
- package/dist/cli/commands/switch.types.d.ts.map +1 -0
- package/dist/cli/commands/switch.types.js +46 -0
- package/dist/cli/commands/switch.types.js.map +1 -0
- package/dist/cli/config/agent-teams.types.d.ts +120 -0
- package/dist/cli/config/agent-teams.types.d.ts.map +1 -0
- package/dist/cli/config/agent-teams.types.js +23 -0
- package/dist/cli/config/agent-teams.types.js.map +1 -0
- package/dist/cli/config/index.d.ts +13 -0
- package/dist/cli/config/index.d.ts.map +1 -0
- package/dist/cli/config/index.js +7 -0
- package/dist/cli/config/index.js.map +1 -0
- package/dist/cli/config/loader.d.ts +114 -0
- package/dist/cli/config/loader.d.ts.map +1 -0
- package/dist/cli/config/loader.js +198 -0
- package/dist/cli/config/loader.js.map +1 -0
- package/dist/cli/config/paths.d.ts +107 -0
- package/dist/cli/config/paths.d.ts.map +1 -0
- package/dist/cli/config/paths.js +79 -0
- package/dist/cli/config/paths.js.map +1 -0
- package/dist/cli/config/planning-sessions-registry.d.ts +52 -0
- package/dist/cli/config/planning-sessions-registry.d.ts.map +1 -0
- package/dist/cli/config/planning-sessions-registry.js +46 -0
- package/dist/cli/config/planning-sessions-registry.js.map +1 -0
- package/dist/cli/config/types.d.ts +186 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +27 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/config/validation.d.ts +62 -0
- package/dist/cli/config/validation.d.ts.map +1 -0
- package/dist/cli/config/validation.js +133 -0
- package/dist/cli/config/validation.js.map +1 -0
- package/dist/cli/config/writer.d.ts +153 -0
- package/dist/cli/config/writer.d.ts.map +1 -0
- package/dist/cli/config/writer.js +168 -0
- package/dist/cli/config/writer.js.map +1 -0
- package/dist/cli/index.d.ts +30 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +142 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/middleware/auth-guard.d.ts +107 -0
- package/dist/cli/middleware/auth-guard.d.ts.map +1 -0
- package/dist/cli/middleware/auth-guard.js +97 -0
- package/dist/cli/middleware/auth-guard.js.map +1 -0
- package/dist/cli/middleware/error-handler.d.ts +133 -0
- package/dist/cli/middleware/error-handler.d.ts.map +1 -0
- package/dist/cli/middleware/error-handler.js +139 -0
- package/dist/cli/middleware/error-handler.js.map +1 -0
- package/dist/cli/middleware/index.d.ts +6 -0
- package/dist/cli/middleware/index.d.ts.map +1 -0
- package/dist/cli/middleware/index.js +3 -0
- package/dist/cli/middleware/index.js.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +9 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +160 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts +9 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +343 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +9 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +254 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts +8 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.js +128 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.js.map +1 -0
- package/dist/cli/templates/agents/index.d.ts +23 -0
- package/dist/cli/templates/agents/index.d.ts.map +1 -0
- package/dist/cli/templates/agents/index.js +29 -0
- package/dist/cli/templates/agents/index.js.map +1 -0
- package/dist/cli/templates/commands.d.ts +17 -0
- package/dist/cli/templates/commands.d.ts.map +1 -0
- package/dist/cli/templates/commands.js +78 -0
- package/dist/cli/templates/commands.js.map +1 -0
- package/dist/cli/templates/content/sf-blockers.d.ts +7 -0
- package/dist/cli/templates/content/sf-blockers.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-blockers.js +69 -0
- package/dist/cli/templates/content/sf-blockers.js.map +1 -0
- package/dist/cli/templates/content/sf-commit.d.ts +7 -0
- package/dist/cli/templates/content/sf-commit.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-commit.js +79 -0
- package/dist/cli/templates/content/sf-commit.js.map +1 -0
- package/dist/cli/templates/content/sf-context.d.ts +7 -0
- package/dist/cli/templates/content/sf-context.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-context.js +63 -0
- package/dist/cli/templates/content/sf-context.js.map +1 -0
- package/dist/cli/templates/content/sf-help.d.ts +7 -0
- package/dist/cli/templates/content/sf-help.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-help.js +42 -0
- package/dist/cli/templates/content/sf-help.js.map +1 -0
- package/dist/cli/templates/content/sf-init.d.ts +7 -0
- package/dist/cli/templates/content/sf-init.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-init.js +62 -0
- package/dist/cli/templates/content/sf-init.js.map +1 -0
- package/dist/cli/templates/content/sf-reset.d.ts +7 -0
- package/dist/cli/templates/content/sf-reset.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-reset.js +67 -0
- package/dist/cli/templates/content/sf-reset.js.map +1 -0
- package/dist/cli/templates/content/sf-search.d.ts +7 -0
- package/dist/cli/templates/content/sf-search.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-search.js +63 -0
- package/dist/cli/templates/content/sf-search.js.map +1 -0
- package/dist/cli/templates/content/sf-status.d.ts +7 -0
- package/dist/cli/templates/content/sf-status.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-status.js +62 -0
- package/dist/cli/templates/content/sf-status.js.map +1 -0
- package/dist/cli/templates/index.d.ts +8 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/index.js +17 -0
- package/dist/cli/templates/index.js.map +1 -0
- package/dist/cli/ui/banner.d.ts +38 -0
- package/dist/cli/ui/banner.d.ts.map +1 -0
- package/dist/cli/ui/banner.js +89 -0
- package/dist/cli/ui/banner.js.map +1 -0
- package/dist/cli/ui/colors.d.ts +76 -0
- package/dist/cli/ui/colors.d.ts.map +1 -0
- package/dist/cli/ui/colors.js +67 -0
- package/dist/cli/ui/colors.js.map +1 -0
- package/dist/cli/ui/index.d.ts +7 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/index.js +4 -0
- package/dist/cli/ui/index.js.map +1 -0
- package/dist/cli/ui/output.d.ts +117 -0
- package/dist/cli/ui/output.d.ts.map +1 -0
- package/dist/cli/ui/output.js +83 -0
- package/dist/cli/ui/output.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +120 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +158 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/time.d.ts +54 -0
- package/dist/cli/ui/time.d.ts.map +1 -0
- package/dist/cli/ui/time.js +119 -0
- package/dist/cli/ui/time.js.map +1 -0
- package/dist/client/api-client.d.ts +123 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +105 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/client/cli-client.d.ts +26 -0
- package/dist/client/cli-client.d.ts.map +1 -0
- package/dist/client/cli-client.js +20 -0
- package/dist/client/cli-client.js.map +1 -0
- package/dist/config/index.d.ts +78 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +79 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/format.d.ts +126 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +71 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/index.d.ts +11 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +45 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/monorepo-detector.d.ts +31 -0
- package/dist/lib/monorepo-detector.d.ts.map +1 -0
- package/dist/lib/monorepo-detector.js +188 -0
- package/dist/lib/monorepo-detector.js.map +1 -0
- package/dist/lib/prompt-generator.d.ts +65 -0
- package/dist/lib/prompt-generator.d.ts.map +1 -0
- package/dist/lib/prompt-generator.js +162 -0
- package/dist/lib/prompt-generator.js.map +1 -0
- package/dist/lib/strategy-analyzer.d.ts +59 -0
- package/dist/lib/strategy-analyzer.d.ts.map +1 -0
- package/dist/lib/strategy-analyzer.js +91 -0
- package/dist/lib/strategy-analyzer.js.map +1 -0
- package/dist/lib/workflow-definitions.d.ts +41 -0
- package/dist/lib/workflow-definitions.d.ts.map +1 -0
- package/dist/lib/workflow-definitions.js +497 -0
- package/dist/lib/workflow-definitions.js.map +1 -0
- package/dist/patterns/index.d.ts +9 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +21 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/inheritance.d.ts +193 -0
- package/dist/patterns/inheritance.d.ts.map +1 -0
- package/dist/patterns/inheritance.js +125 -0
- package/dist/patterns/inheritance.js.map +1 -0
- package/dist/server.d.ts +44 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +91 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/core/context-helper.d.ts +50 -0
- package/dist/tools/core/context-helper.d.ts.map +1 -0
- package/dist/tools/core/context-helper.js +49 -0
- package/dist/tools/core/context-helper.js.map +1 -0
- package/dist/tools/core/index.d.ts +2 -0
- package/dist/tools/core/index.d.ts.map +1 -0
- package/dist/tools/core/index.js +2 -0
- package/dist/tools/core/index.js.map +1 -0
- package/dist/tools/index.d.ts +58 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1499 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/transport/__tests__/resolve-endpoint.test.d.ts +6 -0
- package/dist/transport/__tests__/resolve-endpoint.test.d.ts.map +1 -0
- package/dist/transport/index.d.ts +6 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +5 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/interface.d.ts +25 -0
- package/dist/transport/interface.d.ts.map +1 -0
- package/dist/transport/interface.js +1 -0
- package/dist/transport/interface.js.map +1 -0
- package/dist/transport/remote.d.ts +38 -0
- package/dist/transport/remote.d.ts.map +1 -0
- package/dist/transport/remote.js +107 -0
- package/dist/transport/remote.js.map +1 -0
- package/dist/transport/resolve-endpoint.d.ts +58 -0
- package/dist/transport/resolve-endpoint.d.ts.map +1 -0
- package/dist/transport/resolve-endpoint.js +146 -0
- package/dist/transport/resolve-endpoint.js.map +1 -0
- package/dist/types/index.d.ts +212 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation/index.d.ts +86 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +392 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/ticket-validation.d.ts +162 -0
- package/dist/validation/ticket-validation.d.ts.map +1 -0
- package/dist/validation/ticket-validation.js +188 -0
- package/dist/validation/ticket-validation.js.map +1 -0
- package/package.json +69 -0
- package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +165 -0
- package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +348 -0
- package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +259 -0
- package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +132 -0
- package/src/cli/templates/agents/index.ts +47 -0
- package/src/cli/templates/commands.ts +90 -0
- package/src/cli/templates/content/sf-blockers.ts +71 -0
- package/src/cli/templates/content/sf-commit.ts +81 -0
- package/src/cli/templates/content/sf-context.ts +65 -0
- package/src/cli/templates/content/sf-help.ts +44 -0
- package/src/cli/templates/content/sf-init.ts +64 -0
- package/src/cli/templates/content/sf-reset.ts +69 -0
- package/src/cli/templates/content/sf-search.ts +65 -0
- package/src/cli/templates/content/sf-status.ts +64 -0
- package/src/cli/templates/index.ts +16 -0
- package/src/cli/templates/skills/specforge-conventions.md +114 -0
- package/src/cli/templates/skills/specforge-orchestrator.md +409 -0
- package/src/cli/templates/skills/specforge-validator.md +128 -0
- package/src/cli/templates/skills/specforge-worker.md +412 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/commands/scaffold/scaffold.ts"],"sourcesContent":["/**\n * Scaffold Command Implementation\n *\n * Main scaffold command that generates SpecForge commands, skills, and agents for AI CLI tools.\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport type {\n ScaffoldOptions,\n ScaffoldResult,\n ScaffoldTarget,\n CommandTemplate,\n} from './types.js';\nimport type { AgentTemplate } from './agent-types.js';\nimport { COMMAND_CATEGORIES } from './types.js';\nimport { AGENT_CATEGORIES } from './agent-types.js';\nimport {\n TARGETS,\n isValidTarget,\n resolveTargetAlias,\n getSupportedTargets,\n getTargetPath,\n getAgentPath,\n getSkillPath,\n getAgentSupportedTargets,\n} from './targets.js';\nimport {\n scaffoldMultiCli,\n type WriteResult,\n type WriteAction,\n} from './files.js';\nimport { loadGlobalConfig } from '../../config/index.js';\nimport { getCommandTemplates } from '../../templates/commands.js';\nimport { getAgentTemplates } from '../../templates/agents/index.js';\nimport {\n detectInstalledTools,\n generateCommandContent,\n generateAgentContent,\n ensureDirectory,\n writeFile,\n getCommandFilename,\n getAgentFilename,\n compareFiles,\n generateDiff,\n} from './utils.js';\nimport {\n displayCommandList,\n displayAgentList,\n displayScaffoldHeader,\n displayAgentScaffoldHeader,\n displayFileOperation,\n displayScaffoldSummary,\n displayAgentScaffoldSummary,\n displayTargetError,\n displayAgentTargetError,\n displayDiff,\n displayCommandPreview,\n displayAgentPreview,\n} from './display.js';\nimport { colors } from '../../ui/colors.js';\n\n/**\n * Interactive target selection\n */\nasync function selectTarget(mode: 'command' | 'agent' | 'skill' = 'command'): Promise<ScaffoldTarget> {\n const installed = detectInstalledTools();\n const inquirer = await import('inquirer');\n\n // Filter targets based on mode\n const availableTargets = Object.entries(TARGETS).filter(([_, config]) => {\n if (mode === 'agent') return config.supportsAgents;\n if (mode === 'skill') return config.supportsSkills;\n return true; // Commands: show all, but warn if unsupported\n });\n\n const choices = availableTargets.map(([key, config]) => ({\n name: `${config.name}${installed.includes(key as ScaffoldTarget) ? colors.success(' (detected)') : ''}`,\n value: key,\n }));\n\n const { target } = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'target',\n message: mode === 'agent'\n ? 'Select target AI CLI tool (agent support):'\n : mode === 'skill'\n ? 'Select target AI CLI tool (skill support):'\n : 'Select target AI CLI tool:',\n choices,\n },\n ]);\n\n return target as ScaffoldTarget;\n}\n\n/**\n * Interactive preview mode - allows browsing and previewing commands\n */\nasync function interactivePreview(target: ScaffoldTarget): Promise<void> {\n const inquirer = await import('inquirer');\n const templates = getCommandTemplates();\n const config = TARGETS[target];\n\n // Build choices grouped by category\n const choices: Array<{ name: string; value: string | null } | typeof inquirer.default.Separator.prototype> = [];\n\n for (const [category, commandNames] of Object.entries(COMMAND_CATEGORIES)) {\n choices.push(new inquirer.default.Separator(`── ${category} ──`));\n for (const name of commandNames) {\n const template = templates.find(t => t.name === name);\n if (template) {\n choices.push({\n name: `${name.padEnd(25)} ${colors.dim(template.description)}`,\n value: name,\n });\n }\n }\n }\n\n let continuePreview = true;\n while (continuePreview) {\n const { command } = await inquirer.default.prompt([{\n type: 'list',\n name: 'command',\n message: 'Select command to preview (Ctrl+C to exit):',\n choices: [\n ...choices,\n new inquirer.default.Separator(),\n { name: 'Exit', value: null },\n ],\n pageSize: 20,\n }]);\n\n if (!command) {\n continuePreview = false;\n } else {\n const template = templates.find(t => t.name === command);\n if (template) {\n console.clear();\n const content = generateCommandContent(template, config.needsFrontmatter, target);\n displayCommandPreview(template.name, content);\n\n // Wait for user to press Enter to continue\n await inquirer.default.prompt([{\n type: 'input',\n name: 'continue',\n message: 'Press Enter to continue...',\n }]);\n console.clear();\n }\n }\n }\n}\n\n/**\n * Interactive agent preview mode\n */\nasync function interactiveAgentPreview(target: ScaffoldTarget): Promise<void> {\n const inquirer = await import('inquirer');\n const templates = getAgentTemplates();\n const config = TARGETS[target];\n\n // Build choices grouped by category\n const choices: Array<{ name: string; value: string | null } | typeof inquirer.default.Separator.prototype> = [];\n\n for (const [category, agentNames] of Object.entries(AGENT_CATEGORIES)) {\n choices.push(new inquirer.default.Separator(`── ${category} ──`));\n for (const name of agentNames) {\n const template = templates.find(t => t.name === name);\n if (template) {\n choices.push({\n name: `${name.padEnd(25)} ${colors.dim(`[${template.model}]`)} ${colors.dim(template.description)}`,\n value: name,\n });\n }\n }\n }\n\n let continuePreview = true;\n while (continuePreview) {\n const { agent } = await inquirer.default.prompt([{\n type: 'list',\n name: 'agent',\n message: 'Select agent to preview (Ctrl+C to exit):',\n choices: [\n ...choices,\n new inquirer.default.Separator(),\n { name: 'Exit', value: null },\n ],\n pageSize: 20,\n }]);\n\n if (!agent) {\n continuePreview = false;\n } else {\n const template = templates.find(t => t.name === agent);\n if (template) {\n console.clear();\n const content = generateAgentContent(template, config.agentFrontmatter, target);\n displayAgentPreview(template.name, content, template.model);\n\n await inquirer.default.prompt([{\n type: 'input',\n name: 'continue',\n message: 'Press Enter to continue...',\n }]);\n console.clear();\n }\n }\n }\n}\n\n/**\n * Interactive diff mode - allows reviewing and selecting which outdated commands to update\n */\nasync function interactiveDiff(target: ScaffoldTarget): Promise<void> {\n const inquirer = await import('inquirer');\n const templates = getCommandTemplates();\n const config = TARGETS[target];\n const targetPath = getTargetPath(target, false);\n\n // Find outdated commands\n const outdated: Array<{ name: string; template: CommandTemplate; kept: boolean }> = [];\n for (const template of templates) {\n const filename = getCommandFilename(template.name, config.fileExtension);\n const filepath = path.join(targetPath, filename);\n const content = generateCommandContent(template, config.needsFrontmatter, target);\n const comparison = compareFiles(filepath, content);\n if (comparison.status === 'outdated') {\n outdated.push({ name: template.name, template, kept: false });\n }\n }\n\n if (outdated.length === 0) {\n console.log(colors.success('\\nAll commands are up to date!'));\n return;\n }\n\n const buildChoices = () => outdated.map(({ name, template, kept }) => ({\n name: `${kept ? colors.dim('○') : '⚠'} ${name.padEnd(23)} ${kept ? colors.dim('(keeping current)') : colors.dim(template.description)}`,\n value: name,\n }));\n\n let continueDiff = true;\n while (continueDiff) {\n const keptCount = outdated.filter(o => o.kept).length;\n const updateCount = outdated.length - keptCount;\n const choices = buildChoices();\n\n const { command } = await inquirer.default.prompt([{\n type: 'list',\n name: 'command',\n message: `Select command to view diff (${updateCount} to update, ${keptCount} keeping):`,\n choices: [\n ...choices,\n new inquirer.default.Separator(),\n { name: 'Apply changes & Exit', value: 'apply' },\n { name: 'Exit without changes', value: null },\n ],\n pageSize: 15,\n }]);\n\n if (!command) {\n continueDiff = false;\n } else if (command === 'apply') {\n // Update only non-kept commands\n const toUpdate = outdated.filter(o => !o.kept);\n if (toUpdate.length === 0) {\n console.log(colors.dim('\\nNo commands to update (all marked as keep)'));\n } else {\n console.log();\n for (const item of toUpdate) {\n const filename = getCommandFilename(item.name, config.fileExtension);\n const filepath = path.join(targetPath, filename);\n const content = generateCommandContent(item.template, config.needsFrontmatter, target);\n writeFile(filepath, content);\n console.log(colors.success(` ✓ Updated ${filename}`));\n }\n console.log(colors.success(`\\nUpdated ${toUpdate.length} commands`));\n }\n if (keptCount > 0) {\n console.log(colors.dim(`Kept ${keptCount} commands unchanged`));\n }\n continueDiff = false;\n } else {\n console.clear();\n const item = outdated.find(o => o.name === command);\n if (item) {\n const filename = getCommandFilename(item.name, config.fileExtension);\n const filepath = path.join(targetPath, filename);\n const content = generateCommandContent(item.template, config.needsFrontmatter, target);\n const comparison = compareFiles(filepath, content);\n\n console.log(colors.bold(`\\nDiff: ${item.name}`));\n console.log('─'.repeat(50));\n if (comparison.existingContent) {\n displayDiff(generateDiff(comparison.existingContent, content, filename));\n }\n\n // Ask what to do with this command\n const { action } = await inquirer.default.prompt([{\n type: 'list',\n name: 'action',\n message: 'What do you want to do?',\n choices: [\n { name: item.kept ? 'Mark for update' : 'Keep current version (skip update)', value: 'toggle' },\n { name: 'Back to list', value: 'back' },\n ],\n }]);\n\n if (action === 'toggle') {\n item.kept = !item.kept;\n }\n console.clear();\n }\n }\n }\n}\n\n/**\n * Interactive agent diff mode\n */\nasync function interactiveAgentDiff(target: ScaffoldTarget): Promise<void> {\n const inquirer = await import('inquirer');\n const templates = getAgentTemplates();\n const config = TARGETS[target];\n const targetPath = getAgentPath(target, false);\n\n // Find outdated agents\n const outdated: Array<{ name: string; template: AgentTemplate; kept: boolean }> = [];\n for (const template of templates) {\n const filename = getAgentFilename(template.name, target);\n const filepath = path.join(targetPath, filename);\n const content = generateAgentContent(template, config.agentFrontmatter, target);\n const comparison = compareFiles(filepath, content);\n if (comparison.status === 'outdated') {\n outdated.push({ name: template.name, template, kept: false });\n }\n }\n\n if (outdated.length === 0) {\n console.log(colors.success('\\nAll agents are up to date!'));\n return;\n }\n\n const buildChoices = () => outdated.map(({ name, template, kept }) => ({\n name: `${kept ? colors.dim('○') : '⚠'} ${name.padEnd(23)} ${kept ? colors.dim('(keeping current)') : colors.dim(template.description)}`,\n value: name,\n }));\n\n let continueDiff = true;\n while (continueDiff) {\n const keptCount = outdated.filter(o => o.kept).length;\n const updateCount = outdated.length - keptCount;\n const choices = buildChoices();\n\n const { agent } = await inquirer.default.prompt([{\n type: 'list',\n name: 'agent',\n message: `Select agent to view diff (${updateCount} to update, ${keptCount} keeping):`,\n choices: [\n ...choices,\n new inquirer.default.Separator(),\n { name: 'Apply changes & Exit', value: 'apply' },\n { name: 'Exit without changes', value: null },\n ],\n pageSize: 15,\n }]);\n\n if (!agent) {\n continueDiff = false;\n } else if (agent === 'apply') {\n const toUpdate = outdated.filter(o => !o.kept);\n if (toUpdate.length === 0) {\n console.log(colors.dim('\\nNo agents to update (all marked as keep)'));\n } else {\n console.log();\n for (const item of toUpdate) {\n const filename = getAgentFilename(item.name, target);\n const filepath = path.join(targetPath, filename);\n const content = generateAgentContent(item.template, config.agentFrontmatter, target);\n writeFile(filepath, content);\n console.log(colors.success(` ✓ Updated ${filename}`));\n }\n console.log(colors.success(`\\nUpdated ${toUpdate.length} agents`));\n }\n if (keptCount > 0) {\n console.log(colors.dim(`Kept ${keptCount} agents unchanged`));\n }\n continueDiff = false;\n } else {\n console.clear();\n const item = outdated.find(o => o.name === agent);\n if (item) {\n const filename = getAgentFilename(item.name, target);\n const filepath = path.join(targetPath, filename);\n const content = generateAgentContent(item.template, config.agentFrontmatter, target);\n const comparison = compareFiles(filepath, content);\n\n console.log(colors.bold(`\\nDiff: ${item.name}`));\n console.log('─'.repeat(50));\n if (comparison.existingContent) {\n displayDiff(generateDiff(comparison.existingContent, content, filename));\n }\n\n const { action } = await inquirer.default.prompt([{\n type: 'list',\n name: 'action',\n message: 'What do you want to do?',\n choices: [\n { name: item.kept ? 'Mark for update' : 'Keep current version (skip update)', value: 'toggle' },\n { name: 'Back to list', value: 'back' },\n ],\n }]);\n\n if (action === 'toggle') {\n item.kept = !item.kept;\n }\n console.clear();\n }\n }\n }\n}\n\n/**\n * Scaffold commands for a target\n */\nasync function scaffoldCommands(\n target: ScaffoldTarget,\n options: ScaffoldOptions\n): Promise<void> {\n const config = TARGETS[target];\n\n // If target doesn't support commands, warn and redirect to skills\n if (!config.supportsCommands) {\n console.log(colors.warning(`\\n${config.name} does not support slash commands.`));\n console.log(colors.dim('Commands will be generated as skills instead.\\n'));\n await scaffoldSkills(target, options);\n return;\n }\n\n const isProject = options.project === true;\n const targetPath = getTargetPath(target, isProject);\n const templates = getCommandTemplates();\n\n // Display header\n displayScaffoldHeader(target, targetPath, options.dryRun === true);\n\n // Create directory if needed\n if (!options.dryRun) {\n ensureDirectory(targetPath);\n }\n\n // Track results\n const result: ScaffoldResult = {\n created: 0,\n updated: 0,\n skipped: 0,\n outdated: 0,\n targetPath,\n };\n\n // Process each template\n for (const template of templates) {\n const filename = getCommandFilename(template.name, config.commandExtension);\n const filepath = path.join(targetPath, filename);\n\n // Generate content\n const content = generateCommandContent(\n template,\n config.commandFrontmatter,\n target\n );\n\n // Compare with existing file\n const comparison = compareFiles(filepath, content);\n\n // Display operation\n displayFileOperation(filename, comparison.status, options.dryRun === true, options.update === true);\n\n // Show diff if requested and file is outdated\n if (options.diff && comparison.status === 'outdated' && comparison.existingContent) {\n const diff = generateDiff(comparison.existingContent, content, filename);\n displayDiff(diff);\n }\n\n // Handle based on status\n switch (comparison.status) {\n case 'new':\n if (!options.dryRun) {\n writeFile(filepath, content);\n }\n result.created++;\n break;\n\n case 'identical':\n result.skipped++;\n break;\n\n case 'outdated':\n if (options.update) {\n if (!options.dryRun) {\n writeFile(filepath, content);\n }\n result.updated++;\n } else {\n result.outdated++;\n }\n break;\n }\n }\n\n // Display summary\n displayScaffoldSummary(result, target, options.dryRun === true);\n}\n\n/**\n * Scaffold skills for a target\n */\nasync function scaffoldSkills(\n target: ScaffoldTarget,\n options: ScaffoldOptions\n): Promise<void> {\n const config = TARGETS[target];\n\n if (!config.supportsSkills) {\n console.error(colors.error(`\\n${config.name} does not support skills.`));\n return;\n }\n\n const isProject = options.project === true;\n const targetPath = getSkillPath(target, isProject);\n\n console.log(colors.bold(`\\nScaffolding SpecForge skills for ${config.name}`));\n console.log(`Target: ${colors.primary(targetPath)}\\n`);\n\n if (options.dryRun) {\n console.log(colors.warning('DRY RUN - No files will be written\\n'));\n }\n\n // For now, scaffold the conventions skill as a SKILL.md in a named directory\n const skillName = 'specforge-conventions';\n const skillDir = path.join(targetPath, skillName);\n const skillFile = path.join(skillDir, 'SKILL.md');\n\n // Read the template\n const { fileURLToPath } = await import('url');\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const packageRoot = path.resolve(__dirname, '..', '..', '..');\n const templatePath = path.join(packageRoot, 'src', 'cli', 'templates', 'skills', 'specforge-conventions.md');\n\n if (!fs.existsSync(templatePath)) {\n console.log(colors.warning('Skill template not found. Skipping.'));\n return;\n }\n\n const templateContent = fs.readFileSync(templatePath, 'utf-8');\n const comparison = compareFiles(skillFile, templateContent);\n\n displayFileOperation(`${skillName}/SKILL.md`, comparison.status, options.dryRun === true, options.update === true);\n\n if (!options.dryRun) {\n if (comparison.status === 'new' || (comparison.status === 'outdated' && options.update)) {\n ensureDirectory(skillDir);\n writeFile(skillFile, templateContent);\n }\n }\n\n const created = comparison.status === 'new' ? 1 : 0;\n const updated = comparison.status === 'outdated' && options.update ? 1 : 0;\n const skipped = comparison.status === 'identical' ? 1 : 0;\n const outdated = comparison.status === 'outdated' && !options.update ? 1 : 0;\n\n console.log();\n if (created > 0) console.log(colors.success(`✓ Created ${created} skill(s)`));\n if (updated > 0) console.log(colors.secondary(`✓ Updated ${updated} skill(s)`));\n if (skipped > 0) console.log(colors.dim(`○ Skipped ${skipped} up-to-date skill(s)`));\n if (outdated > 0) console.log(colors.warning(`⚠ ${outdated} outdated skill(s) (run with --update to update)`));\n console.log();\n}\n\n/**\n * Scaffold agents for a target\n */\nasync function scaffoldAgents(\n target: ScaffoldTarget,\n options: ScaffoldOptions\n): Promise<void> {\n const config = TARGETS[target];\n\n // Codex doesn't support markdown agents\n if (target === 'codex') {\n console.log(colors.warning('\\nCodex CLI uses TOML agent roles, not markdown agent files.'));\n console.log(colors.dim('Agent scaffolding is not available for Codex. Configure roles in .codex/config.toml instead.\\n'));\n return;\n }\n\n const isProject = options.project === true;\n const targetPath = getAgentPath(target, isProject);\n let templates = getAgentTemplates();\n\n // Filter by category if specified\n if (options.category) {\n const categoryLower = options.category.toLowerCase();\n templates = templates.filter(t => t.category.toLowerCase() === categoryLower);\n if (templates.length === 0) {\n console.error(colors.error(`\\nNo agents found in category \"${options.category}\"`));\n console.error(colors.dim(`Available categories: Orchestration, SpecForge, Research`));\n process.exit(1);\n return;\n }\n }\n\n // Display header\n displayAgentScaffoldHeader(target, targetPath, options.dryRun === true);\n\n // Show warnings for experimental targets\n if (target === 'gemini') {\n console.log(colors.warning('Note: Gemini CLI agents require experimental.enableAgents: true in .gemini/settings.json\\n'));\n }\n\n // Create directory if needed\n if (!options.dryRun) {\n ensureDirectory(targetPath);\n }\n\n // Track results\n const result: ScaffoldResult = {\n created: 0,\n updated: 0,\n skipped: 0,\n outdated: 0,\n targetPath,\n };\n\n // Process each template\n for (const template of templates) {\n const filename = getAgentFilename(template.name, target);\n const filepath = path.join(targetPath, filename);\n\n // Generate content with target-specific formatting\n const content = generateAgentContent(template, config.agentFrontmatter, target);\n\n // Compare with existing file\n const comparison = compareFiles(filepath, content);\n\n // Display operation\n displayFileOperation(filename, comparison.status, options.dryRun === true, options.update === true);\n\n // Show diff if requested and file is outdated\n if (options.diff && comparison.status === 'outdated' && comparison.existingContent) {\n const diff = generateDiff(comparison.existingContent, content, filename);\n displayDiff(diff);\n }\n\n // Handle based on status\n switch (comparison.status) {\n case 'new':\n if (!options.dryRun) {\n writeFile(filepath, content);\n }\n result.created++;\n break;\n\n case 'identical':\n result.skipped++;\n break;\n\n case 'outdated':\n if (options.update) {\n if (!options.dryRun) {\n writeFile(filepath, content);\n }\n result.updated++;\n } else {\n result.outdated++;\n }\n break;\n }\n\n // For Claude Code agents declaring `memory: project`, pre-create the\n // matching agent-memory directory next to .claude/agents/. This avoids\n // a chicken-and-egg moment on the agent's first run where it tries to\n // Write to a path Claude Code hasn't materialized yet. Idempotent —\n // ensureDirectory is a no-op if the folder already exists.\n if (\n target === 'claude' &&\n isProject &&\n template.memory === 'project' &&\n !options.dryRun\n ) {\n const claudeDir = path.dirname(targetPath); // .claude/agents → .claude\n const agentMemoryDir = path.join(claudeDir, 'agent-memory', template.name);\n ensureDirectory(agentMemoryDir);\n }\n }\n\n // Display summary\n displayAgentScaffoldSummary(result, target, options.dryRun === true);\n}\n\n/**\n * Render a WriteResult with the same iconography as displayFileOperation.\n */\nfunction renderWriteResult(w: WriteResult): void {\n const action: WriteAction = w.action;\n switch (action) {\n case 'created':\n console.log(colors.success(` + ${w.relPath} (created)`));\n break;\n case 'overwrote':\n console.log(colors.secondary(` ↻ ${w.relPath} (overwrote)`));\n break;\n case 'skipped':\n console.log(colors.dim(` ○ ${w.relPath} (exists, skip — use --force)`));\n break;\n case 'would-create':\n console.log(colors.success(` + ${w.relPath} (would create)`));\n break;\n case 'would-overwrite':\n console.log(colors.secondary(` ↻ ${w.relPath} (would overwrite)`));\n break;\n case 'would-skip':\n console.log(colors.dim(` ○ ${w.relPath} (exists, skip — use --force)`));\n break;\n }\n}\n\n/**\n * Run the shared multi-CLI writer for the given subset, scoped to a target list.\n */\nfunction runMultiCli(\n label: string,\n subset: { configs: boolean; instructions: boolean; skills: boolean },\n targets: ScaffoldTarget[] | undefined,\n options: ScaffoldOptions,\n): WriteResult[] {\n const apiKey = loadGlobalConfig().apiKey;\n const { detected, writes } = scaffoldMultiCli({\n targets,\n dryRun: options.dryRun === true,\n force: options.force === true,\n apiKey,\n skipConfigs: !subset.configs,\n skipInstructions: !subset.instructions,\n skipSkills: !subset.skills,\n });\n\n console.log(colors.bold(`\\nScaffolding SpecForge ${label}`));\n if (detected.length > 0) {\n console.log(colors.dim(`Detected: ${detected.map(t => TARGETS[t].name).join(', ')}`));\n }\n if (options.dryRun) {\n console.log(colors.warning('\\nDRY RUN — no files will be written'));\n }\n console.log();\n\n for (const w of writes) {\n renderWriteResult(w);\n }\n console.log();\n\n return writes;\n}\n\n/**\n * Scaffold command implementation\n */\nexport async function scaffoldCommand(options: ScaffoldOptions): Promise<void> {\n // Resolve target aliases (vscode → cursor) at the command boundary.\n if (options.target) {\n options.target = resolveTargetAlias(options.target);\n }\n\n const isAgentMode = options.agents === true;\n const isSkillMode = options.skills === true;\n const isCommandMode = options.commands === true;\n const isConfigsMode = options.configs === true;\n const isInstructionsMode = options.instructions === true;\n const anySubset = isAgentMode || isSkillMode || isCommandMode || isConfigsMode || isInstructionsMode;\n const mode = isAgentMode ? 'agent' : isSkillMode ? 'skill' : 'command';\n\n // List mode\n if (options.list) {\n if (isAgentMode) {\n const templates = getAgentTemplates();\n displayAgentList(templates, options.category);\n } else {\n const templates = getCommandTemplates();\n displayCommandList(templates);\n }\n return;\n }\n\n // Specific preview mode (when preview is a string)\n if (typeof options.preview === 'string') {\n if (isAgentMode) {\n const templates = getAgentTemplates();\n const template = templates.find(t => t.name === options.preview);\n\n if (!template) {\n console.error(colors.error(`\\nError: Unknown agent \"${options.preview}\"`));\n console.error(`Run 'specforge scaffold --agents --list' to see available agents`);\n process.exit(1);\n return;\n }\n\n const content = generateAgentContent(template, true);\n displayAgentPreview(template.name, content, template.model);\n } else {\n const templates = getCommandTemplates();\n const template = templates.find(t => t.name === options.preview);\n\n if (!template) {\n console.error(colors.error(`\\nError: Unknown command \"${options.preview}\"`));\n console.error(`Run 'specforge scaffold --list' to see available commands`);\n process.exit(1);\n return;\n }\n\n const content = generateCommandContent(template, true, 'claude');\n displayCommandPreview(template.name, content);\n }\n return;\n }\n\n // Interactive preview mode (when preview is true/boolean)\n if (options.preview === true) {\n let target: ScaffoldTarget;\n if (options.target && isValidTarget(options.target)) {\n target = options.target as ScaffoldTarget;\n } else {\n target = await selectTarget(mode);\n }\n\n // Validate target supports agents if in agent mode\n if (isAgentMode && !TARGETS[target].supportsAgents) {\n displayAgentTargetError(target, getAgentSupportedTargets());\n process.exit(1);\n return;\n }\n\n if (isAgentMode) {\n await interactiveAgentPreview(target);\n } else {\n await interactivePreview(target);\n }\n return;\n }\n\n // Interactive diff mode\n if (options.diff && !options.update) {\n let target: ScaffoldTarget;\n if (options.target && isValidTarget(options.target)) {\n target = options.target as ScaffoldTarget;\n } else {\n target = await selectTarget(mode);\n }\n\n // Validate target supports agents if in agent mode\n if (isAgentMode && !TARGETS[target].supportsAgents) {\n displayAgentTargetError(target, getAgentSupportedTargets());\n process.exit(1);\n return;\n }\n\n if (isAgentMode) {\n await interactiveAgentDiff(target);\n } else {\n await interactiveDiff(target);\n }\n return;\n }\n\n // Resolve target list for subset/default-all runs. `--target` scopes; otherwise\n // detected CLIs are discovered inside scaffoldMultiCli.\n let scopedTargets: ScaffoldTarget[] | undefined;\n if (options.target) {\n if (!isValidTarget(options.target)) {\n displayTargetError(options.target, getSupportedTargets());\n process.exit(1);\n return;\n }\n scopedTargets = [options.target as ScaffoldTarget];\n }\n\n // Subset: --configs only\n if (isConfigsMode && !isInstructionsMode && !isSkillMode && !isCommandMode && !isAgentMode) {\n runMultiCli('MCP configs', { configs: true, instructions: false, skills: false }, scopedTargets, options);\n return;\n }\n\n // Subset: --instructions only\n if (isInstructionsMode && !isConfigsMode && !isSkillMode && !isCommandMode && !isAgentMode) {\n runMultiCli('instruction files', { configs: false, instructions: true, skills: false }, scopedTargets, options);\n return;\n }\n\n // Default (no subset flag): run configs + instructions + skills via shared writer,\n // then run commands + agents per target (skipping targets that don't support them).\n if (!anySubset) {\n const writes = runMultiCli(\n 'integration artifacts',\n { configs: true, instructions: true, skills: true },\n scopedTargets,\n options,\n );\n\n // Figure out which targets to scaffold commands/agents for.\n const targetSet = scopedTargets ?? detectInstalledTools();\n\n for (const t of targetSet) {\n if (TARGETS[t].supportsCommands) {\n await scaffoldCommands(t, options);\n }\n if (TARGETS[t].supportsAgents && t !== 'codex') {\n await scaffoldAgents(t, options);\n }\n }\n\n // Suppress unused-var warning for writes (result already rendered)\n void writes;\n return;\n }\n\n // Determine target\n let target: ScaffoldTarget;\n\n if (options.target) {\n target = options.target as ScaffoldTarget;\n } else {\n // Interactive selection\n target = await selectTarget(mode);\n }\n\n // Validate target supports agents if in agent mode\n // Allow codex through — scaffoldAgents handles the special message\n if (isAgentMode && !TARGETS[target].supportsAgents && target !== 'codex') {\n displayAgentTargetError(target, getAgentSupportedTargets());\n process.exit(1);\n return;\n }\n\n // Scaffold commands, skills, or agents\n if (isAgentMode) {\n await scaffoldAgents(target, options);\n } else if (isSkillMode) {\n await scaffoldSkills(target, options);\n } else {\n await scaffoldCommands(target, options);\n }\n}\n"],"mappings":"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","names":["target"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Target Configurations Module
|
|
3
|
+
*
|
|
4
|
+
* Defines paths and settings for each supported AI CLI tool.
|
|
5
|
+
* Verified against official documentation for each CLI (March 2026).
|
|
6
|
+
*/
|
|
7
|
+
import type { TargetConfig, TargetConfigMap, ScaffoldTarget } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for all supported AI CLI targets
|
|
10
|
+
*/
|
|
11
|
+
export declare const TARGETS: TargetConfigMap;
|
|
12
|
+
/**
|
|
13
|
+
* Get all supported target names
|
|
14
|
+
*/
|
|
15
|
+
export declare function getSupportedTargets(): ScaffoldTarget[];
|
|
16
|
+
/**
|
|
17
|
+
* Get targets that support agents
|
|
18
|
+
*/
|
|
19
|
+
export declare function getAgentSupportedTargets(): ScaffoldTarget[];
|
|
20
|
+
/**
|
|
21
|
+
* Get targets that support skills
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSkillSupportedTargets(): ScaffoldTarget[];
|
|
24
|
+
/**
|
|
25
|
+
* Get targets that support commands
|
|
26
|
+
*/
|
|
27
|
+
export declare function getCommandSupportedTargets(): ScaffoldTarget[];
|
|
28
|
+
/**
|
|
29
|
+
* Resolve an alias to its canonical target name (returns input unchanged if not aliased).
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveTargetAlias(target: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Get target configuration by name (resolves aliases like `vscode` → `cursor`)
|
|
34
|
+
*/
|
|
35
|
+
export declare function getTargetConfig(target: string): TargetConfig | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a target name is valid (canonical or alias)
|
|
38
|
+
*/
|
|
39
|
+
export declare function isValidTarget(target: string): target is ScaffoldTarget;
|
|
40
|
+
/**
|
|
41
|
+
* Get the command installation path for a target
|
|
42
|
+
*/
|
|
43
|
+
export declare function getTargetPath(target: ScaffoldTarget, isProject: boolean): string;
|
|
44
|
+
/**
|
|
45
|
+
* Get the skill installation path for a target
|
|
46
|
+
*/
|
|
47
|
+
export declare function getSkillPath(target: ScaffoldTarget, isProject: boolean): string;
|
|
48
|
+
/**
|
|
49
|
+
* Get the agent installation path for a target
|
|
50
|
+
*/
|
|
51
|
+
export declare function getAgentPath(target: ScaffoldTarget, isProject: boolean): string;
|
|
52
|
+
/**
|
|
53
|
+
* Format target list for error messages
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatTargetList(): string;
|
|
56
|
+
/**
|
|
57
|
+
* Format agent-supporting target list for error messages
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatAgentTargetList(): string;
|
|
60
|
+
//# sourceMappingURL=targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/scaffold/targets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,eAoLrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,EAAE,CAE3D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,EAAE,CAE3D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,cAAc,EAAE,CAE7D;AAYD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAExE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,cAAc,CAEtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAOhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAM/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAM/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import os from "os";
|
|
3
|
+
const TARGETS = {
|
|
4
|
+
claude: {
|
|
5
|
+
name: "Claude Code",
|
|
6
|
+
detectionPath: () => path.join(os.homedir(), ".claude"),
|
|
7
|
+
globalCommandPath: () => path.join(os.homedir(), ".claude", "commands"),
|
|
8
|
+
projectCommandPath: () => path.join(process.cwd(), ".claude", "commands"),
|
|
9
|
+
globalSkillPath: () => path.join(os.homedir(), ".claude", "skills"),
|
|
10
|
+
projectSkillPath: () => path.join(process.cwd(), ".claude", "skills"),
|
|
11
|
+
globalAgentPath: () => path.join(os.homedir(), ".claude", "agents"),
|
|
12
|
+
projectAgentPath: () => path.join(process.cwd(), ".claude", "agents"),
|
|
13
|
+
commandExtension: ".md",
|
|
14
|
+
skillExtension: ".md",
|
|
15
|
+
agentExtension: ".md",
|
|
16
|
+
commandFrontmatter: true,
|
|
17
|
+
skillFrontmatter: true,
|
|
18
|
+
agentFrontmatter: true,
|
|
19
|
+
supportsCommands: true,
|
|
20
|
+
supportsSkills: true,
|
|
21
|
+
supportsAgents: true,
|
|
22
|
+
commandFormat: "markdown",
|
|
23
|
+
argSyntax: "$ARGUMENTS",
|
|
24
|
+
instructionFile: "CLAUDE.md",
|
|
25
|
+
instructionFilePath: "CLAUDE.md",
|
|
26
|
+
mcpConfigPath: ".mcp.json",
|
|
27
|
+
mcpConfigFormat: "claude-json",
|
|
28
|
+
usageHint: "Type /sf- in Claude Code to see available commands",
|
|
29
|
+
agentUsageHint: "SpecForge agents (sfag-*) are now available in Claude Code",
|
|
30
|
+
// Legacy compat
|
|
31
|
+
globalPath: () => path.join(os.homedir(), ".claude", "commands"),
|
|
32
|
+
projectPath: () => path.join(process.cwd(), ".claude", "commands"),
|
|
33
|
+
fileExtension: ".md",
|
|
34
|
+
needsFrontmatter: true
|
|
35
|
+
},
|
|
36
|
+
copilot: {
|
|
37
|
+
name: "GitHub Copilot CLI",
|
|
38
|
+
detectionPath: () => path.join(os.homedir(), ".copilot"),
|
|
39
|
+
globalSkillPath: () => path.join(os.homedir(), ".copilot", "skills"),
|
|
40
|
+
projectSkillPath: () => path.join(process.cwd(), ".github", "skills"),
|
|
41
|
+
globalAgentPath: () => path.join(os.homedir(), ".copilot", "agents"),
|
|
42
|
+
projectAgentPath: () => path.join(process.cwd(), ".github", "agents"),
|
|
43
|
+
commandExtension: ".md",
|
|
44
|
+
skillExtension: ".md",
|
|
45
|
+
agentExtension: ".agent.md",
|
|
46
|
+
commandFrontmatter: false,
|
|
47
|
+
skillFrontmatter: true,
|
|
48
|
+
agentFrontmatter: true,
|
|
49
|
+
supportsCommands: false,
|
|
50
|
+
supportsSkills: true,
|
|
51
|
+
supportsAgents: true,
|
|
52
|
+
commandFormat: null,
|
|
53
|
+
argSyntax: null,
|
|
54
|
+
instructionFile: "copilot-instructions.md",
|
|
55
|
+
instructionFilePath: ".github/copilot-instructions.md",
|
|
56
|
+
mcpConfigPath: ".mcp.json",
|
|
57
|
+
mcpConfigFormat: "claude-json",
|
|
58
|
+
usageHint: "Use @specforge in Copilot CLI to access skills",
|
|
59
|
+
agentUsageHint: "SpecForge agents (sfag-*) are now available in Copilot CLI",
|
|
60
|
+
// Legacy compat
|
|
61
|
+
globalPath: () => path.join(os.homedir(), ".copilot", "skills"),
|
|
62
|
+
projectPath: () => path.join(process.cwd(), ".github", "skills"),
|
|
63
|
+
fileExtension: ".md",
|
|
64
|
+
needsFrontmatter: false
|
|
65
|
+
},
|
|
66
|
+
codex: {
|
|
67
|
+
name: "Codex CLI",
|
|
68
|
+
detectionPath: () => path.join(os.homedir(), ".codex"),
|
|
69
|
+
globalSkillPath: () => path.join(os.homedir(), ".agents", "skills"),
|
|
70
|
+
projectSkillPath: () => path.join(process.cwd(), ".agents", "skills"),
|
|
71
|
+
commandExtension: ".md",
|
|
72
|
+
skillExtension: ".md",
|
|
73
|
+
agentExtension: ".toml",
|
|
74
|
+
commandFrontmatter: false,
|
|
75
|
+
skillFrontmatter: true,
|
|
76
|
+
agentFrontmatter: false,
|
|
77
|
+
supportsCommands: false,
|
|
78
|
+
supportsSkills: true,
|
|
79
|
+
supportsAgents: false,
|
|
80
|
+
commandFormat: null,
|
|
81
|
+
argSyntax: null,
|
|
82
|
+
instructionFile: "AGENTS.md",
|
|
83
|
+
instructionFilePath: "AGENTS.md",
|
|
84
|
+
mcpConfigPath: ".codex/config.toml",
|
|
85
|
+
mcpConfigFormat: "codex-toml",
|
|
86
|
+
usageHint: "SpecForge skills are available in Codex CLI",
|
|
87
|
+
// Legacy compat
|
|
88
|
+
globalPath: () => path.join(os.homedir(), ".agents", "skills"),
|
|
89
|
+
projectPath: () => path.join(process.cwd(), ".agents", "skills"),
|
|
90
|
+
fileExtension: ".md",
|
|
91
|
+
needsFrontmatter: false
|
|
92
|
+
},
|
|
93
|
+
gemini: {
|
|
94
|
+
name: "Gemini CLI",
|
|
95
|
+
detectionPath: () => path.join(os.homedir(), ".gemini"),
|
|
96
|
+
globalCommandPath: () => path.join(os.homedir(), ".gemini", "commands"),
|
|
97
|
+
projectCommandPath: () => path.join(process.cwd(), ".gemini", "commands"),
|
|
98
|
+
globalSkillPath: () => path.join(os.homedir(), ".gemini", "skills"),
|
|
99
|
+
projectSkillPath: () => path.join(process.cwd(), ".gemini", "skills"),
|
|
100
|
+
globalAgentPath: () => path.join(os.homedir(), ".gemini", "agents"),
|
|
101
|
+
projectAgentPath: () => path.join(process.cwd(), ".gemini", "agents"),
|
|
102
|
+
commandExtension: ".toml",
|
|
103
|
+
skillExtension: ".md",
|
|
104
|
+
agentExtension: ".md",
|
|
105
|
+
commandFrontmatter: false,
|
|
106
|
+
skillFrontmatter: true,
|
|
107
|
+
agentFrontmatter: true,
|
|
108
|
+
supportsCommands: true,
|
|
109
|
+
supportsSkills: true,
|
|
110
|
+
supportsAgents: true,
|
|
111
|
+
commandFormat: "toml",
|
|
112
|
+
argSyntax: "{{args}}",
|
|
113
|
+
instructionFile: "GEMINI.md",
|
|
114
|
+
instructionFilePath: "GEMINI.md",
|
|
115
|
+
mcpConfigPath: ".gemini/settings.json",
|
|
116
|
+
mcpConfigFormat: "gemini-json",
|
|
117
|
+
usageHint: "Use /sf- prefix in Gemini CLI",
|
|
118
|
+
agentUsageHint: "SpecForge agents (sfag-*) are now available in Gemini CLI (requires experimental.enableAgents)",
|
|
119
|
+
// Legacy compat
|
|
120
|
+
globalPath: () => path.join(os.homedir(), ".gemini", "commands"),
|
|
121
|
+
projectPath: () => path.join(process.cwd(), ".gemini", "commands"),
|
|
122
|
+
fileExtension: ".toml",
|
|
123
|
+
needsFrontmatter: false
|
|
124
|
+
},
|
|
125
|
+
cursor: {
|
|
126
|
+
name: "Cursor / VS Code",
|
|
127
|
+
detectionPath: () => path.join(os.homedir(), ".cursor"),
|
|
128
|
+
commandExtension: ".md",
|
|
129
|
+
skillExtension: ".md",
|
|
130
|
+
agentExtension: ".md",
|
|
131
|
+
commandFrontmatter: false,
|
|
132
|
+
skillFrontmatter: false,
|
|
133
|
+
agentFrontmatter: false,
|
|
134
|
+
supportsCommands: false,
|
|
135
|
+
supportsSkills: false,
|
|
136
|
+
supportsAgents: false,
|
|
137
|
+
commandFormat: null,
|
|
138
|
+
argSyntax: null,
|
|
139
|
+
instructionFile: null,
|
|
140
|
+
instructionFilePath: null,
|
|
141
|
+
mcpConfigPath: ".mcp.json",
|
|
142
|
+
mcpConfigFormat: "claude-json",
|
|
143
|
+
usageHint: "Restart Cursor / VS Code to activate the SpecForge MCP server",
|
|
144
|
+
// Legacy compat — cursor doesn't scaffold commands/skills/agents but the
|
|
145
|
+
// shape requires these fields for back-compat with existing code paths.
|
|
146
|
+
globalPath: () => path.join(os.homedir(), ".cursor"),
|
|
147
|
+
projectPath: () => process.cwd(),
|
|
148
|
+
fileExtension: ".md",
|
|
149
|
+
needsFrontmatter: false
|
|
150
|
+
},
|
|
151
|
+
opencode: {
|
|
152
|
+
name: "OpenCode",
|
|
153
|
+
detectionPath: () => path.join(os.homedir(), ".config", "opencode"),
|
|
154
|
+
globalCommandPath: () => path.join(os.homedir(), ".config", "opencode", "commands"),
|
|
155
|
+
projectCommandPath: () => path.join(process.cwd(), ".opencode", "commands"),
|
|
156
|
+
globalSkillPath: () => path.join(os.homedir(), ".config", "opencode", "skills"),
|
|
157
|
+
projectSkillPath: () => path.join(process.cwd(), ".opencode", "skills"),
|
|
158
|
+
globalAgentPath: () => path.join(os.homedir(), ".config", "opencode", "agents"),
|
|
159
|
+
projectAgentPath: () => path.join(process.cwd(), ".opencode", "agents"),
|
|
160
|
+
commandExtension: ".md",
|
|
161
|
+
skillExtension: ".md",
|
|
162
|
+
agentExtension: ".md",
|
|
163
|
+
commandFrontmatter: false,
|
|
164
|
+
skillFrontmatter: true,
|
|
165
|
+
agentFrontmatter: true,
|
|
166
|
+
supportsCommands: true,
|
|
167
|
+
supportsSkills: true,
|
|
168
|
+
supportsAgents: true,
|
|
169
|
+
commandFormat: "markdown",
|
|
170
|
+
argSyntax: "$ARGUMENTS",
|
|
171
|
+
instructionFile: "AGENTS.md",
|
|
172
|
+
instructionFilePath: "AGENTS.md",
|
|
173
|
+
mcpConfigPath: "opencode.json",
|
|
174
|
+
mcpConfigFormat: "opencode-json",
|
|
175
|
+
usageHint: "Use /sf- prefix in OpenCode",
|
|
176
|
+
agentUsageHint: "SpecForge agents (sfag-*) are now available in OpenCode",
|
|
177
|
+
// Legacy compat
|
|
178
|
+
globalPath: () => path.join(os.homedir(), ".config", "opencode", "commands"),
|
|
179
|
+
projectPath: () => path.join(process.cwd(), ".opencode", "commands"),
|
|
180
|
+
fileExtension: ".md",
|
|
181
|
+
needsFrontmatter: false
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
function getSupportedTargets() {
|
|
185
|
+
return Object.keys(TARGETS);
|
|
186
|
+
}
|
|
187
|
+
function getAgentSupportedTargets() {
|
|
188
|
+
return getSupportedTargets().filter((t) => TARGETS[t].supportsAgents);
|
|
189
|
+
}
|
|
190
|
+
function getSkillSupportedTargets() {
|
|
191
|
+
return getSupportedTargets().filter((t) => TARGETS[t].supportsSkills);
|
|
192
|
+
}
|
|
193
|
+
function getCommandSupportedTargets() {
|
|
194
|
+
return getSupportedTargets().filter((t) => TARGETS[t].supportsCommands);
|
|
195
|
+
}
|
|
196
|
+
const TARGET_ALIASES = {
|
|
197
|
+
vscode: "cursor",
|
|
198
|
+
"claude-code": "claude"
|
|
199
|
+
};
|
|
200
|
+
function resolveTargetAlias(target) {
|
|
201
|
+
return TARGET_ALIASES[target] ?? target;
|
|
202
|
+
}
|
|
203
|
+
function getTargetConfig(target) {
|
|
204
|
+
return TARGETS[resolveTargetAlias(target)];
|
|
205
|
+
}
|
|
206
|
+
function isValidTarget(target) {
|
|
207
|
+
return resolveTargetAlias(target) in TARGETS;
|
|
208
|
+
}
|
|
209
|
+
function getTargetPath(target, isProject) {
|
|
210
|
+
const config = TARGETS[target];
|
|
211
|
+
if (isProject) {
|
|
212
|
+
return config.projectCommandPath ? config.projectCommandPath() : config.projectPath();
|
|
213
|
+
}
|
|
214
|
+
return config.globalCommandPath ? config.globalCommandPath() : config.globalPath();
|
|
215
|
+
}
|
|
216
|
+
function getSkillPath(target, isProject) {
|
|
217
|
+
const config = TARGETS[target];
|
|
218
|
+
if (!config.supportsSkills) {
|
|
219
|
+
throw new Error(`Target "${target}" does not support skills`);
|
|
220
|
+
}
|
|
221
|
+
return isProject ? config.projectSkillPath() : config.globalSkillPath();
|
|
222
|
+
}
|
|
223
|
+
function getAgentPath(target, isProject) {
|
|
224
|
+
const config = TARGETS[target];
|
|
225
|
+
if (!config.supportsAgents) {
|
|
226
|
+
throw new Error(`Target "${target}" does not support agents`);
|
|
227
|
+
}
|
|
228
|
+
return isProject ? config.projectAgentPath() : config.globalAgentPath();
|
|
229
|
+
}
|
|
230
|
+
function formatTargetList() {
|
|
231
|
+
return getSupportedTargets().join(", ");
|
|
232
|
+
}
|
|
233
|
+
function formatAgentTargetList() {
|
|
234
|
+
return getAgentSupportedTargets().join(", ");
|
|
235
|
+
}
|
|
236
|
+
export {
|
|
237
|
+
TARGETS,
|
|
238
|
+
formatAgentTargetList,
|
|
239
|
+
formatTargetList,
|
|
240
|
+
getAgentPath,
|
|
241
|
+
getAgentSupportedTargets,
|
|
242
|
+
getCommandSupportedTargets,
|
|
243
|
+
getSkillPath,
|
|
244
|
+
getSkillSupportedTargets,
|
|
245
|
+
getSupportedTargets,
|
|
246
|
+
getTargetConfig,
|
|
247
|
+
getTargetPath,
|
|
248
|
+
isValidTarget,
|
|
249
|
+
resolveTargetAlias
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/commands/scaffold/targets.ts"],"sourcesContent":["/**\n * Target Configurations Module\n *\n * Defines paths and settings for each supported AI CLI tool.\n * Verified against official documentation for each CLI (March 2026).\n */\n\nimport path from 'path';\nimport os from 'os';\nimport type { TargetConfig, TargetConfigMap, ScaffoldTarget } from './types.js';\n\n/**\n * Configuration for all supported AI CLI targets\n */\nexport const TARGETS: TargetConfigMap = {\n claude: {\n name: 'Claude Code',\n detectionPath: () => path.join(os.homedir(), '.claude'),\n globalCommandPath: () => path.join(os.homedir(), '.claude', 'commands'),\n projectCommandPath: () => path.join(process.cwd(), '.claude', 'commands'),\n globalSkillPath: () => path.join(os.homedir(), '.claude', 'skills'),\n projectSkillPath: () => path.join(process.cwd(), '.claude', 'skills'),\n globalAgentPath: () => path.join(os.homedir(), '.claude', 'agents'),\n projectAgentPath: () => path.join(process.cwd(), '.claude', 'agents'),\n commandExtension: '.md',\n skillExtension: '.md',\n agentExtension: '.md',\n commandFrontmatter: true,\n skillFrontmatter: true,\n agentFrontmatter: true,\n supportsCommands: true,\n supportsSkills: true,\n supportsAgents: true,\n commandFormat: 'markdown',\n argSyntax: '$ARGUMENTS',\n instructionFile: 'CLAUDE.md',\n instructionFilePath: 'CLAUDE.md',\n mcpConfigPath: '.mcp.json',\n mcpConfigFormat: 'claude-json',\n usageHint: 'Type /sf- in Claude Code to see available commands',\n agentUsageHint: 'SpecForge agents (sfag-*) are now available in Claude Code',\n // Legacy compat\n globalPath: () => path.join(os.homedir(), '.claude', 'commands'),\n projectPath: () => path.join(process.cwd(), '.claude', 'commands'),\n fileExtension: '.md',\n needsFrontmatter: true,\n },\n copilot: {\n name: 'GitHub Copilot CLI',\n detectionPath: () => path.join(os.homedir(), '.copilot'),\n globalSkillPath: () => path.join(os.homedir(), '.copilot', 'skills'),\n projectSkillPath: () => path.join(process.cwd(), '.github', 'skills'),\n globalAgentPath: () => path.join(os.homedir(), '.copilot', 'agents'),\n projectAgentPath: () => path.join(process.cwd(), '.github', 'agents'),\n commandExtension: '.md',\n skillExtension: '.md',\n agentExtension: '.agent.md',\n commandFrontmatter: false,\n skillFrontmatter: true,\n agentFrontmatter: true,\n supportsCommands: false,\n supportsSkills: true,\n supportsAgents: true,\n commandFormat: null,\n argSyntax: null,\n instructionFile: 'copilot-instructions.md',\n instructionFilePath: '.github/copilot-instructions.md',\n mcpConfigPath: '.mcp.json',\n mcpConfigFormat: 'claude-json',\n usageHint: 'Use @specforge in Copilot CLI to access skills',\n agentUsageHint: 'SpecForge agents (sfag-*) are now available in Copilot CLI',\n // Legacy compat\n globalPath: () => path.join(os.homedir(), '.copilot', 'skills'),\n projectPath: () => path.join(process.cwd(), '.github', 'skills'),\n fileExtension: '.md',\n needsFrontmatter: false,\n },\n codex: {\n name: 'Codex CLI',\n detectionPath: () => path.join(os.homedir(), '.codex'),\n globalSkillPath: () => path.join(os.homedir(), '.agents', 'skills'),\n projectSkillPath: () => path.join(process.cwd(), '.agents', 'skills'),\n commandExtension: '.md',\n skillExtension: '.md',\n agentExtension: '.toml',\n commandFrontmatter: false,\n skillFrontmatter: true,\n agentFrontmatter: false,\n supportsCommands: false,\n supportsSkills: true,\n supportsAgents: false,\n commandFormat: null,\n argSyntax: null,\n instructionFile: 'AGENTS.md',\n instructionFilePath: 'AGENTS.md',\n mcpConfigPath: '.codex/config.toml',\n mcpConfigFormat: 'codex-toml',\n usageHint: 'SpecForge skills are available in Codex CLI',\n // Legacy compat\n globalPath: () => path.join(os.homedir(), '.agents', 'skills'),\n projectPath: () => path.join(process.cwd(), '.agents', 'skills'),\n fileExtension: '.md',\n needsFrontmatter: false,\n },\n gemini: {\n name: 'Gemini CLI',\n detectionPath: () => path.join(os.homedir(), '.gemini'),\n globalCommandPath: () => path.join(os.homedir(), '.gemini', 'commands'),\n projectCommandPath: () => path.join(process.cwd(), '.gemini', 'commands'),\n globalSkillPath: () => path.join(os.homedir(), '.gemini', 'skills'),\n projectSkillPath: () => path.join(process.cwd(), '.gemini', 'skills'),\n globalAgentPath: () => path.join(os.homedir(), '.gemini', 'agents'),\n projectAgentPath: () => path.join(process.cwd(), '.gemini', 'agents'),\n commandExtension: '.toml',\n skillExtension: '.md',\n agentExtension: '.md',\n commandFrontmatter: false,\n skillFrontmatter: true,\n agentFrontmatter: true,\n supportsCommands: true,\n supportsSkills: true,\n supportsAgents: true,\n commandFormat: 'toml',\n argSyntax: '{{args}}',\n instructionFile: 'GEMINI.md',\n instructionFilePath: 'GEMINI.md',\n mcpConfigPath: '.gemini/settings.json',\n mcpConfigFormat: 'gemini-json',\n usageHint: 'Use /sf- prefix in Gemini CLI',\n agentUsageHint: 'SpecForge agents (sfag-*) are now available in Gemini CLI (requires experimental.enableAgents)',\n // Legacy compat\n globalPath: () => path.join(os.homedir(), '.gemini', 'commands'),\n projectPath: () => path.join(process.cwd(), '.gemini', 'commands'),\n fileExtension: '.toml',\n needsFrontmatter: false,\n },\n cursor: {\n name: 'Cursor / VS Code',\n detectionPath: () => path.join(os.homedir(), '.cursor'),\n commandExtension: '.md',\n skillExtension: '.md',\n agentExtension: '.md',\n commandFrontmatter: false,\n skillFrontmatter: false,\n agentFrontmatter: false,\n supportsCommands: false,\n supportsSkills: false,\n supportsAgents: false,\n commandFormat: null,\n argSyntax: null,\n instructionFile: null,\n instructionFilePath: null,\n mcpConfigPath: '.mcp.json',\n mcpConfigFormat: 'claude-json',\n usageHint: 'Restart Cursor / VS Code to activate the SpecForge MCP server',\n // Legacy compat — cursor doesn't scaffold commands/skills/agents but the\n // shape requires these fields for back-compat with existing code paths.\n globalPath: () => path.join(os.homedir(), '.cursor'),\n projectPath: () => process.cwd(),\n fileExtension: '.md',\n needsFrontmatter: false,\n },\n opencode: {\n name: 'OpenCode',\n detectionPath: () => path.join(os.homedir(), '.config', 'opencode'),\n globalCommandPath: () => path.join(os.homedir(), '.config', 'opencode', 'commands'),\n projectCommandPath: () => path.join(process.cwd(), '.opencode', 'commands'),\n globalSkillPath: () => path.join(os.homedir(), '.config', 'opencode', 'skills'),\n projectSkillPath: () => path.join(process.cwd(), '.opencode', 'skills'),\n globalAgentPath: () => path.join(os.homedir(), '.config', 'opencode', 'agents'),\n projectAgentPath: () => path.join(process.cwd(), '.opencode', 'agents'),\n commandExtension: '.md',\n skillExtension: '.md',\n agentExtension: '.md',\n commandFrontmatter: false,\n skillFrontmatter: true,\n agentFrontmatter: true,\n supportsCommands: true,\n supportsSkills: true,\n supportsAgents: true,\n commandFormat: 'markdown',\n argSyntax: '$ARGUMENTS',\n instructionFile: 'AGENTS.md',\n instructionFilePath: 'AGENTS.md',\n mcpConfigPath: 'opencode.json',\n mcpConfigFormat: 'opencode-json',\n usageHint: 'Use /sf- prefix in OpenCode',\n agentUsageHint: 'SpecForge agents (sfag-*) are now available in OpenCode',\n // Legacy compat\n globalPath: () => path.join(os.homedir(), '.config', 'opencode', 'commands'),\n projectPath: () => path.join(process.cwd(), '.opencode', 'commands'),\n fileExtension: '.md',\n needsFrontmatter: false,\n },\n};\n\n/**\n * Get all supported target names\n */\nexport function getSupportedTargets(): ScaffoldTarget[] {\n return Object.keys(TARGETS) as ScaffoldTarget[];\n}\n\n/**\n * Get targets that support agents\n */\nexport function getAgentSupportedTargets(): ScaffoldTarget[] {\n return getSupportedTargets().filter(t => TARGETS[t].supportsAgents);\n}\n\n/**\n * Get targets that support skills\n */\nexport function getSkillSupportedTargets(): ScaffoldTarget[] {\n return getSupportedTargets().filter(t => TARGETS[t].supportsSkills);\n}\n\n/**\n * Get targets that support commands\n */\nexport function getCommandSupportedTargets(): ScaffoldTarget[] {\n return getSupportedTargets().filter(t => TARGETS[t].supportsCommands);\n}\n\n/**\n * Aliases for target names that resolve to canonical entries in TARGETS.\n * `vscode` is grouped with `cursor` because both editors read the same `.mcp.json`.\n * `claude-code` is the user-facing spelling documented in webdocs; the canonical key is `claude`.\n */\nconst TARGET_ALIASES: Record<string, ScaffoldTarget> = {\n vscode: 'cursor',\n 'claude-code': 'claude',\n};\n\n/**\n * Resolve an alias to its canonical target name (returns input unchanged if not aliased).\n */\nexport function resolveTargetAlias(target: string): string {\n return TARGET_ALIASES[target] ?? target;\n}\n\n/**\n * Get target configuration by name (resolves aliases like `vscode` → `cursor`)\n */\nexport function getTargetConfig(target: string): TargetConfig | undefined {\n return TARGETS[resolveTargetAlias(target) as ScaffoldTarget];\n}\n\n/**\n * Check if a target name is valid (canonical or alias)\n */\nexport function isValidTarget(target: string): target is ScaffoldTarget {\n return resolveTargetAlias(target) in TARGETS;\n}\n\n/**\n * Get the command installation path for a target\n */\nexport function getTargetPath(target: ScaffoldTarget, isProject: boolean): string {\n const config = TARGETS[target];\n // Use new paths if available, fall back to legacy\n if (isProject) {\n return config.projectCommandPath ? config.projectCommandPath() : config.projectPath();\n }\n return config.globalCommandPath ? config.globalCommandPath() : config.globalPath();\n}\n\n/**\n * Get the skill installation path for a target\n */\nexport function getSkillPath(target: ScaffoldTarget, isProject: boolean): string {\n const config = TARGETS[target];\n if (!config.supportsSkills) {\n throw new Error(`Target \"${target}\" does not support skills`);\n }\n return isProject ? config.projectSkillPath!() : config.globalSkillPath!();\n}\n\n/**\n * Get the agent installation path for a target\n */\nexport function getAgentPath(target: ScaffoldTarget, isProject: boolean): string {\n const config = TARGETS[target];\n if (!config.supportsAgents) {\n throw new Error(`Target \"${target}\" does not support agents`);\n }\n return isProject ? config.projectAgentPath!() : config.globalAgentPath!();\n}\n\n/**\n * Format target list for error messages\n */\nexport function formatTargetList(): string {\n return getSupportedTargets().join(', ');\n}\n\n/**\n * Format agent-supporting target list for error messages\n */\nexport function formatAgentTargetList(): string {\n return getAgentSupportedTargets().join(', ');\n}\n"],"mappings":"AAOA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAMR,MAAM,UAA2B;AAAA,EACtC,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,eAAe,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS;AAAA,IACtD,mBAAmB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,UAAU;AAAA,IACtE,oBAAoB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,UAAU;AAAA,IACxE,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,QAAQ;AAAA,IAClE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IACpE,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,QAAQ;AAAA,IAClE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IACpE,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,gBAAgB;AAAA;AAAA,IAEhB,YAAY,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,UAAU;AAAA,IAC/D,aAAa,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,UAAU;AAAA,IACjE,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,eAAe,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU;AAAA,IACvD,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,QAAQ;AAAA,IACnE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IACpE,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,QAAQ;AAAA,IACnE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IACpE,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,gBAAgB;AAAA;AAAA,IAEhB,YAAY,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,YAAY,QAAQ;AAAA,IAC9D,aAAa,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IAC/D,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ;AAAA,IACrD,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,QAAQ;AAAA,IAClE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IACpE,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA;AAAA,IAEX,YAAY,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,QAAQ;AAAA,IAC7D,aAAa,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IAC/D,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,eAAe,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS;AAAA,IACtD,mBAAmB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,UAAU;AAAA,IACtE,oBAAoB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,UAAU;AAAA,IACxE,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,QAAQ;AAAA,IAClE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IACpE,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,QAAQ;AAAA,IAClE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;AAAA,IACpE,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,gBAAgB;AAAA;AAAA,IAEhB,YAAY,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,UAAU;AAAA,IAC/D,aAAa,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,UAAU;AAAA,IACjE,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,eAAe,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS;AAAA,IACtD,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA;AAAA;AAAA,IAGX,YAAY,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS;AAAA,IACnD,aAAa,MAAM,QAAQ,IAAI;AAAA,IAC/B,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,eAAe,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,UAAU;AAAA,IAClE,mBAAmB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,YAAY,UAAU;AAAA,IAClF,oBAAoB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,UAAU;AAAA,IAC1E,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ;AAAA,IAC9E,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,QAAQ;AAAA,IACtE,iBAAiB,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ;AAAA,IAC9E,kBAAkB,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,QAAQ;AAAA,IACtE,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,gBAAgB;AAAA;AAAA,IAEhB,YAAY,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,YAAY,UAAU;AAAA,IAC3E,aAAa,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,UAAU;AAAA,IACnE,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AACF;AAKO,SAAS,sBAAwC;AACtD,SAAO,OAAO,KAAK,OAAO;AAC5B;AAKO,SAAS,2BAA6C;AAC3D,SAAO,oBAAoB,EAAE,OAAO,OAAK,QAAQ,CAAC,EAAE,cAAc;AACpE;AAKO,SAAS,2BAA6C;AAC3D,SAAO,oBAAoB,EAAE,OAAO,OAAK,QAAQ,CAAC,EAAE,cAAc;AACpE;AAKO,SAAS,6BAA+C;AAC7D,SAAO,oBAAoB,EAAE,OAAO,OAAK,QAAQ,CAAC,EAAE,gBAAgB;AACtE;AAOA,MAAM,iBAAiD;AAAA,EACrD,QAAQ;AAAA,EACR,eAAe;AACjB;AAKO,SAAS,mBAAmB,QAAwB;AACzD,SAAO,eAAe,MAAM,KAAK;AACnC;AAKO,SAAS,gBAAgB,QAA0C;AACxE,SAAO,QAAQ,mBAAmB,MAAM,CAAmB;AAC7D;AAKO,SAAS,cAAc,QAA0C;AACtE,SAAO,mBAAmB,MAAM,KAAK;AACvC;AAKO,SAAS,cAAc,QAAwB,WAA4B;AAChF,QAAM,SAAS,QAAQ,MAAM;AAE7B,MAAI,WAAW;AACb,WAAO,OAAO,qBAAqB,OAAO,mBAAmB,IAAI,OAAO,YAAY;AAAA,EACtF;AACA,SAAO,OAAO,oBAAoB,OAAO,kBAAkB,IAAI,OAAO,WAAW;AACnF;AAKO,SAAS,aAAa,QAAwB,WAA4B;AAC/E,QAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,CAAC,OAAO,gBAAgB;AAC1B,UAAM,IAAI,MAAM,WAAW,MAAM,2BAA2B;AAAA,EAC9D;AACA,SAAO,YAAY,OAAO,iBAAkB,IAAI,OAAO,gBAAiB;AAC1E;AAKO,SAAS,aAAa,QAAwB,WAA4B;AAC/E,QAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,CAAC,OAAO,gBAAgB;AAC1B,UAAM,IAAI,MAAM,WAAW,MAAM,2BAA2B;AAAA,EAC9D;AACA,SAAO,YAAY,OAAO,iBAAkB,IAAI,OAAO,gBAAiB;AAC1E;AAKO,SAAS,mBAA2B;AACzC,SAAO,oBAAoB,EAAE,KAAK,IAAI;AACxC;AAKO,SAAS,wBAAgC;AAC9C,SAAO,yBAAyB,EAAE,KAAK,IAAI;AAC7C;","names":[]}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold Command Types & Interfaces
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the scaffold command that generates AI CLI tool commands.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Options for the scaffold command
|
|
8
|
+
*/
|
|
9
|
+
export interface ScaffoldOptions {
|
|
10
|
+
/** Target AI CLI tool (claude, copilot, codex, gemini, opencode, cursor; alias: vscode) */
|
|
11
|
+
target?: string;
|
|
12
|
+
/** Install to global location (default) */
|
|
13
|
+
global?: boolean;
|
|
14
|
+
/** Install to project .specforge/ */
|
|
15
|
+
project?: boolean;
|
|
16
|
+
/** List available commands */
|
|
17
|
+
list?: boolean;
|
|
18
|
+
/** Update existing commands to latest version */
|
|
19
|
+
update?: boolean;
|
|
20
|
+
/** Force overwrite existing files (configs, instructions) */
|
|
21
|
+
force?: boolean;
|
|
22
|
+
/** Show what would be created without writing */
|
|
23
|
+
dryRun?: boolean;
|
|
24
|
+
/** Preview a specific command content (interactive if no command specified) */
|
|
25
|
+
preview?: string | boolean;
|
|
26
|
+
/** Show diff for outdated commands */
|
|
27
|
+
diff?: boolean;
|
|
28
|
+
/** Scaffold MCP config files (.mcp.json, .codex/config.toml, etc.) */
|
|
29
|
+
configs?: boolean;
|
|
30
|
+
/** Scaffold instruction files (CLAUDE.md, GEMINI.md, AGENTS.md, etc.) */
|
|
31
|
+
instructions?: boolean;
|
|
32
|
+
/** Scaffold AI agents instead of commands */
|
|
33
|
+
agents?: boolean;
|
|
34
|
+
/** Scaffold skills instead of commands */
|
|
35
|
+
skills?: boolean;
|
|
36
|
+
/** Scaffold slash commands (explicit subset selector) */
|
|
37
|
+
commands?: boolean;
|
|
38
|
+
/** Filter agents by category */
|
|
39
|
+
category?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Supported AI CLI targets
|
|
43
|
+
*
|
|
44
|
+
* Note: `vscode` is a string-level alias for `cursor` (resolved at command entry),
|
|
45
|
+
* not a separate target — VS Code with Copilot reads the same `.mcp.json` Cursor reads.
|
|
46
|
+
*/
|
|
47
|
+
export type ScaffoldTarget = 'claude' | 'copilot' | 'codex' | 'gemini' | 'opencode' | 'cursor';
|
|
48
|
+
/**
|
|
49
|
+
* Command format for a target
|
|
50
|
+
*/
|
|
51
|
+
export type CommandFormat = 'markdown' | 'toml' | null;
|
|
52
|
+
/**
|
|
53
|
+
* Configuration for a target AI CLI tool
|
|
54
|
+
*/
|
|
55
|
+
export interface TargetConfig {
|
|
56
|
+
/** Display name of the AI CLI tool */
|
|
57
|
+
name: string;
|
|
58
|
+
/** Detection path — directory checked to determine if CLI is installed */
|
|
59
|
+
detectionPath: () => string;
|
|
60
|
+
/** Function to get global command installation path */
|
|
61
|
+
globalCommandPath?: () => string;
|
|
62
|
+
/** Function to get project command installation path */
|
|
63
|
+
projectCommandPath?: () => string;
|
|
64
|
+
/** Function to get global skill installation path */
|
|
65
|
+
globalSkillPath?: () => string;
|
|
66
|
+
/** Function to get project skill installation path */
|
|
67
|
+
projectSkillPath?: () => string;
|
|
68
|
+
/** Function to get global agent installation path */
|
|
69
|
+
globalAgentPath?: () => string;
|
|
70
|
+
/** Function to get project agent installation path */
|
|
71
|
+
projectAgentPath?: () => string;
|
|
72
|
+
/** File extension for command files */
|
|
73
|
+
commandExtension: string;
|
|
74
|
+
/** File extension for skill files */
|
|
75
|
+
skillExtension: string;
|
|
76
|
+
/** File extension for agent files */
|
|
77
|
+
agentExtension: string;
|
|
78
|
+
/** Whether commands use YAML frontmatter */
|
|
79
|
+
commandFrontmatter: boolean;
|
|
80
|
+
/** Whether skills use YAML frontmatter (agentskills.io) */
|
|
81
|
+
skillFrontmatter: boolean;
|
|
82
|
+
/** Whether agents use YAML frontmatter */
|
|
83
|
+
agentFrontmatter: boolean;
|
|
84
|
+
/** Whether the target supports slash commands */
|
|
85
|
+
supportsCommands: boolean;
|
|
86
|
+
/** Whether the target supports skills */
|
|
87
|
+
supportsSkills: boolean;
|
|
88
|
+
/** Whether the target supports AI agents */
|
|
89
|
+
supportsAgents: boolean;
|
|
90
|
+
/** Command format (markdown, toml, or null if unsupported) */
|
|
91
|
+
commandFormat: CommandFormat;
|
|
92
|
+
/** Argument syntax for commands (e.g., '$ARGUMENTS', '{{args}}') */
|
|
93
|
+
argSyntax: string | null;
|
|
94
|
+
/** Instruction file name for this CLI (e.g., 'CLAUDE.md', 'GEMINI.md'); null = use AGENTS.md fallback */
|
|
95
|
+
instructionFile?: string | null;
|
|
96
|
+
/** Instruction file path (relative, e.g., '.github/copilot-instructions.md'); null = use AGENTS.md fallback */
|
|
97
|
+
instructionFilePath?: string | null;
|
|
98
|
+
/** MCP config file path */
|
|
99
|
+
mcpConfigPath?: string;
|
|
100
|
+
/** MCP config format */
|
|
101
|
+
mcpConfigFormat?: 'claude-json' | 'gemini-json' | 'codex-toml' | 'opencode-json';
|
|
102
|
+
/** Usage hint for after scaffolding */
|
|
103
|
+
usageHint?: string;
|
|
104
|
+
/** Usage hint for agents after scaffolding */
|
|
105
|
+
agentUsageHint?: string;
|
|
106
|
+
/** @deprecated Use globalCommandPath */
|
|
107
|
+
globalPath: () => string;
|
|
108
|
+
/** @deprecated Use projectCommandPath */
|
|
109
|
+
projectPath: () => string;
|
|
110
|
+
/** @deprecated Use commandExtension */
|
|
111
|
+
fileExtension: string;
|
|
112
|
+
/** @deprecated Use commandFrontmatter */
|
|
113
|
+
needsFrontmatter: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Map of all target configurations
|
|
117
|
+
*/
|
|
118
|
+
export type TargetConfigMap = Record<ScaffoldTarget, TargetConfig>;
|
|
119
|
+
/**
|
|
120
|
+
* Command template definition
|
|
121
|
+
*/
|
|
122
|
+
export interface CommandTemplate {
|
|
123
|
+
/** Command name (e.g., 'sf-init') */
|
|
124
|
+
name: string;
|
|
125
|
+
/** Short description for command list */
|
|
126
|
+
description: string;
|
|
127
|
+
/** Argument hint for frontmatter (e.g., '[specification-id]') */
|
|
128
|
+
argumentHint?: string;
|
|
129
|
+
/** Full markdown content of the command */
|
|
130
|
+
content: string;
|
|
131
|
+
/** Command category for grouping */
|
|
132
|
+
category: CommandCategory;
|
|
133
|
+
}
|
|
134
|
+
export type CommandCategory = 'Setup' | 'Status' | 'Review' | 'Utilities';
|
|
135
|
+
/**
|
|
136
|
+
* Scaffolding result statistics
|
|
137
|
+
*/
|
|
138
|
+
export interface ScaffoldResult {
|
|
139
|
+
/** Number of files created */
|
|
140
|
+
created: number;
|
|
141
|
+
/** Number of files updated */
|
|
142
|
+
updated: number;
|
|
143
|
+
/** Number of files skipped (identical) */
|
|
144
|
+
skipped: number;
|
|
145
|
+
/** Number of files outdated (skipped but different) */
|
|
146
|
+
outdated: number;
|
|
147
|
+
/** Target path where files were written */
|
|
148
|
+
targetPath: string;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* File comparison status
|
|
152
|
+
*/
|
|
153
|
+
export type FileStatus = 'new' | 'identical' | 'outdated';
|
|
154
|
+
/**
|
|
155
|
+
* File comparison result
|
|
156
|
+
*/
|
|
157
|
+
export interface FileComparison {
|
|
158
|
+
/** Status of the file */
|
|
159
|
+
status: FileStatus;
|
|
160
|
+
/** Existing content (if file exists) */
|
|
161
|
+
existingContent?: string;
|
|
162
|
+
/** New content to write */
|
|
163
|
+
newContent: string;
|
|
164
|
+
}
|
|
165
|
+
export declare const COMMAND_CATEGORIES: Record<CommandCategory, string[]>;
|
|
166
|
+
/**
|
|
167
|
+
* Version string for generated commands
|
|
168
|
+
*/
|
|
169
|
+
export declare const SCAFFOLD_VERSION = "1.0.0";
|
|
170
|
+
//# sourceMappingURL=types.d.ts.map
|