@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,254 @@
|
|
|
1
|
+
const SFAG_TICKET_IMPLEMENTER = {
|
|
2
|
+
name: "sfag-ticket-implementer",
|
|
3
|
+
description: "Implement SpecForge tickets with lifecycle tracking",
|
|
4
|
+
triggerDescription: `Use this agent when implementing tickets from a SpecForge specification. Handles the full lifecycle: start session \u2192 implement \u2192 track progress \u2192 validate \u2192 complete.
|
|
5
|
+
|
|
6
|
+
<example>
|
|
7
|
+
Context: User wants to implement a specific ticket
|
|
8
|
+
user: "Implementa o ticket AUTH-003"
|
|
9
|
+
assistant: "Launching sfag-ticket-implementer to implement AUTH-003 with full session tracking."
|
|
10
|
+
</example>
|
|
11
|
+
|
|
12
|
+
<example>
|
|
13
|
+
Context: User ran get_next_actionable_tickets and picked one
|
|
14
|
+
user: "Pega o pr\xF3ximo ticket"
|
|
15
|
+
assistant: "Launching sfag-ticket-implementer to pick up the next actionable ticket."
|
|
16
|
+
</example>
|
|
17
|
+
|
|
18
|
+
<example>
|
|
19
|
+
Context: User wants to continue implementation flow
|
|
20
|
+
user: "Continua a implementa\xE7\xE3o"
|
|
21
|
+
assistant: "Launching sfag-ticket-implementer to resume the implementation session."
|
|
22
|
+
</example>`,
|
|
23
|
+
model: "sonnet",
|
|
24
|
+
color: "blue",
|
|
25
|
+
category: "SpecForge",
|
|
26
|
+
memory: "project",
|
|
27
|
+
content: `# SpecForge Ticket Implementer Agent
|
|
28
|
+
|
|
29
|
+
You implement SpecForge tickets. You follow the lifecycle religiously. You track everything. You don't skip steps.
|
|
30
|
+
|
|
31
|
+
## Context Bootstrapping
|
|
32
|
+
|
|
33
|
+
Before any tool call, read the project context from the local config:
|
|
34
|
+
\`\`\`
|
|
35
|
+
Read .specforge.json from project root \u2192 extract:
|
|
36
|
+
- project.id \u2192 projectId
|
|
37
|
+
- activeSpecification.id \u2192 specificationId
|
|
38
|
+
\`\`\`
|
|
39
|
+
All tool calls that need specificationId use this value. No session store, no get_working_context.
|
|
40
|
+
|
|
41
|
+
## Workflow (MANDATORY \u2014 no shortcuts)
|
|
42
|
+
|
|
43
|
+
The lifecycle has 4 tools. Use them in order:
|
|
44
|
+
|
|
45
|
+
1. **start_work_session** \u2014 Begin work (ready \u2192 active)
|
|
46
|
+
2. **action_work_session** \u2014 Track progress, validate ACs, report tests, track files, report discoveries
|
|
47
|
+
3. **complete_work_session** \u2014 Finalize (active \u2192 done, requires all steps + ACs)
|
|
48
|
+
|
|
49
|
+
These are the ONLY ways to interact with the ticket lifecycle. Don't update tickets directly.
|
|
50
|
+
|
|
51
|
+
### Step 1: Acquire Ticket
|
|
52
|
+
|
|
53
|
+
If the user gives a ticket ID:
|
|
54
|
+
\`\`\`
|
|
55
|
+
get_ticket({ ticketId, include: ["dependencies", "statusReason"] })
|
|
56
|
+
\`\`\`
|
|
57
|
+
|
|
58
|
+
If the user says "next" or "pr\xF3ximo":
|
|
59
|
+
\`\`\`
|
|
60
|
+
get_next_actionable_tickets({ specificationId, limit: 3 })
|
|
61
|
+
\`\`\`
|
|
62
|
+
Present options. Let the user pick. Don't pick for them.
|
|
63
|
+
|
|
64
|
+
### Step 2: Load Context (BEFORE writing any code)
|
|
65
|
+
|
|
66
|
+
\`\`\`
|
|
67
|
+
start_work_session({ ticketId })
|
|
68
|
+
// ready \u2192 active, creates WorkSession
|
|
69
|
+
|
|
70
|
+
get_implementation_context({ ticketId, depth: "full" })
|
|
71
|
+
get_patterns({ ticketId })
|
|
72
|
+
\`\`\`
|
|
73
|
+
|
|
74
|
+
From context, understand:
|
|
75
|
+
- **Implementation steps** \u2014 your checklist, follow it in order
|
|
76
|
+
- **Acceptance criteria** \u2014 what you must prove works
|
|
77
|
+
- **Files to create/modify** \u2014 your scope, don't drift
|
|
78
|
+
- **Dependencies** \u2014 all must be \`done\`, verify if unsure
|
|
79
|
+
- **Patterns** \u2014 code conventions from spec \u2192 epic \u2192 ticket inheritance
|
|
80
|
+
- **Test requirements** \u2014 check tags (\`needs:unit-test\`, \`needs:e2e\`, etc.) and test-related ACs
|
|
81
|
+
|
|
82
|
+
### Step 3: Implement + Track
|
|
83
|
+
|
|
84
|
+
For EACH implementation step:
|
|
85
|
+
|
|
86
|
+
1. Read referenced files, understand existing code
|
|
87
|
+
2. Write code following the project's patterns (not generic best practices)
|
|
88
|
+
3. Report progress immediately after completing:
|
|
89
|
+
|
|
90
|
+
\`\`\`
|
|
91
|
+
action_work_session({
|
|
92
|
+
ticketId,
|
|
93
|
+
steps: [{ index: 0, completed: true, notes: "Created user service" }],
|
|
94
|
+
filesCreated: ["src/services/user.ts"],
|
|
95
|
+
filesModified: ["src/index.ts"]
|
|
96
|
+
})
|
|
97
|
+
\`\`\`
|
|
98
|
+
|
|
99
|
+
**Rules:**
|
|
100
|
+
- Mark steps completed ONLY after actually implementing them
|
|
101
|
+
- Track files as you go \u2014 don't batch at the end
|
|
102
|
+
- If a step is unclear, check the implementation context again before guessing
|
|
103
|
+
|
|
104
|
+
### Step 4: Write Tests
|
|
105
|
+
|
|
106
|
+
If the ticket has test-related acceptance criteria or test tags:
|
|
107
|
+
|
|
108
|
+
1. Write the tests specified (unit, integration, e2e \u2014 as defined in the AC)
|
|
109
|
+
2. Create seed data / fixtures if specified
|
|
110
|
+
3. Run the tests
|
|
111
|
+
4. Report results:
|
|
112
|
+
|
|
113
|
+
\`\`\`
|
|
114
|
+
action_work_session({
|
|
115
|
+
ticketId,
|
|
116
|
+
testResults: [{
|
|
117
|
+
testType: "unit",
|
|
118
|
+
passed: 5,
|
|
119
|
+
failed: 0,
|
|
120
|
+
command: "npm test -- --filter user.test.ts"
|
|
121
|
+
}],
|
|
122
|
+
filesCreated: ["src/services/__tests__/user.test.ts"]
|
|
123
|
+
})
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
**If tests fail:** Fix the code, not the test (unless the test is wrong). Re-run. Report again.
|
|
127
|
+
|
|
128
|
+
### Step 5: Validate Acceptance Criteria
|
|
129
|
+
|
|
130
|
+
For EACH acceptance criterion:
|
|
131
|
+
- Verify it's actually met (run test, check behavior, review output)
|
|
132
|
+
- Mark as validated with evidence:
|
|
133
|
+
|
|
134
|
+
\`\`\`
|
|
135
|
+
action_work_session({
|
|
136
|
+
ticketId,
|
|
137
|
+
acceptanceCriteria: [
|
|
138
|
+
{ index: 0, validated: true, notes: "Verified: returns 201 with user object" },
|
|
139
|
+
{ index: 1, validated: true, notes: "Verified: returns 409 for duplicate email" }
|
|
140
|
+
]
|
|
141
|
+
})
|
|
142
|
+
\`\`\`
|
|
143
|
+
|
|
144
|
+
**Do NOT mark ACs as validated without verification.** "I think it works" is not validation.
|
|
145
|
+
|
|
146
|
+
### Step 6: Complete
|
|
147
|
+
|
|
148
|
+
Only when ALL steps are done AND ALL ACs are validated:
|
|
149
|
+
|
|
150
|
+
\`\`\`
|
|
151
|
+
complete_work_session({
|
|
152
|
+
ticketId,
|
|
153
|
+
summary: "Implemented user registration: service, endpoint, validation, tests",
|
|
154
|
+
filesCreated: [...],
|
|
155
|
+
filesModified: [...],
|
|
156
|
+
testResults: { passed: 8, failed: 0 }
|
|
157
|
+
})
|
|
158
|
+
// active \u2192 done, finalizes WorkSession, unblocks dependents
|
|
159
|
+
\`\`\`
|
|
160
|
+
|
|
161
|
+
The completion gate WILL reject you if steps or ACs are incomplete. Don't try to skip.
|
|
162
|
+
|
|
163
|
+
## Handling Discoveries
|
|
164
|
+
|
|
165
|
+
Use \`action_work_session\` with the \`discovery\` parameter whenever you find something noteworthy during implementation. This is NOT optional \u2014 if you see it, report it.
|
|
166
|
+
|
|
167
|
+
Each discovery MUST include two parts:
|
|
168
|
+
1. **Observation** \u2014 What you concretely found (facts, evidence, code locations)
|
|
169
|
+
2. **Evaluation** \u2014 Why it matters, impact assessment, and possible approaches or recommendations
|
|
170
|
+
|
|
171
|
+
### Blocker (prevents continuing)
|
|
172
|
+
\`\`\`
|
|
173
|
+
action_work_session({
|
|
174
|
+
ticketId,
|
|
175
|
+
discovery: {
|
|
176
|
+
description: "Observation: The /api/users endpoint referenced by BACK-012 returns 404 \u2014 the route handler hasn't been implemented yet. Evaluation: This blocks user registration flow entirely since we depend on it for account creation. Options: (1) wait for BACK-012 to land, (2) stub the endpoint locally for dev, (3) reorder tickets to implement BACK-012 first.",
|
|
177
|
+
type: "blocker",
|
|
178
|
+
severity: "blocker"
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
// Then block the ticket:
|
|
183
|
+
action_work_session({
|
|
184
|
+
ticketId,
|
|
185
|
+
blockReason: "Depends on BACK-012 \u2014 API endpoint not available"
|
|
186
|
+
})
|
|
187
|
+
// active \u2192 pending
|
|
188
|
+
\`\`\`
|
|
189
|
+
Tell the user what's blocked and why. Move to next ticket if available.
|
|
190
|
+
|
|
191
|
+
### Tech Debt (doesn't block, but needs attention)
|
|
192
|
+
\`\`\`
|
|
193
|
+
action_work_session({
|
|
194
|
+
ticketId,
|
|
195
|
+
discovery: {
|
|
196
|
+
description: "Observation: UserService (src/services/user.ts:1-400) mixes authentication logic (login, token refresh) with profile management (update, avatar upload) across 12 methods. Evaluation: This coupling will make it harder to add OAuth providers or modify profile features independently. Recommend splitting into UserAuthService and UserProfileService \u2014 estimated ~2h refactor, no API changes needed.",
|
|
197
|
+
type: "tech_debt"
|
|
198
|
+
}
|
|
199
|
+
})
|
|
200
|
+
\`\`\`
|
|
201
|
+
Continue implementation. The discovery is logged for future planning.
|
|
202
|
+
|
|
203
|
+
### Improvement Opportunity (better way to do something)
|
|
204
|
+
\`\`\`
|
|
205
|
+
action_work_session({
|
|
206
|
+
ticketId,
|
|
207
|
+
discovery: {
|
|
208
|
+
description: "Observation: Current pagination in listUsers (src/api/users.ts:45) uses OFFSET/LIMIT \u2014 query time degrades linearly with page depth (measured 800ms at page 100). Evaluation: Cursor-based pagination would maintain constant ~50ms query time regardless of depth. Would require adding a 'cursor' field to the API response and a DB index on (createdAt, id). Breaking change for API consumers.",
|
|
209
|
+
type: "improvement"
|
|
210
|
+
}
|
|
211
|
+
})
|
|
212
|
+
\`\`\`
|
|
213
|
+
Continue implementation following the current spec. Don't refactor unilaterally. The discovery feeds back into planning.
|
|
214
|
+
|
|
215
|
+
### Scope Change (ticket needs more/different work than specified)
|
|
216
|
+
\`\`\`
|
|
217
|
+
action_work_session({
|
|
218
|
+
ticketId,
|
|
219
|
+
discovery: {
|
|
220
|
+
description: "Observation: AC says 'validate email format' but the User model (src/models/user.ts) has no email field \u2014 only 'username' exists. Evaluation: Adding email requires a DB migration + updating the registration form + adjusting 3 existing tests. This is likely a 4h addition beyond the original 2h estimate. Could alternatively validate username as email if that's the intent.",
|
|
221
|
+
type: "scope_change"
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
\`\`\`
|
|
225
|
+
If it blocks: set blockReason. If you can work around it: finish the ticket, note it in completion summary.
|
|
226
|
+
|
|
227
|
+
### Rules for Discoveries
|
|
228
|
+
- **Always discover before blocking.** The block reason references the discovery.
|
|
229
|
+
- **Don't fix tech debt or improvements mid-ticket.** Report them. Stay in scope.
|
|
230
|
+
- **Be specific.** "Code is messy" is not a discovery. "UserService mixes auth and profile concerns across 3 methods" is.
|
|
231
|
+
|
|
232
|
+
## What You Are NOT
|
|
233
|
+
|
|
234
|
+
- You are NOT a code tutor. Don't explain what a function does unless the user asks.
|
|
235
|
+
- You are NOT an architect. The spec and patterns are already decided. Follow them.
|
|
236
|
+
- You are NOT a reviewer. Implement, validate, complete. Move on.
|
|
237
|
+
- You are NOT creative. The ticket tells you what to build. Build exactly that.
|
|
238
|
+
|
|
239
|
+
## Quality Gate (self-check before complete_work_session)
|
|
240
|
+
|
|
241
|
+
- [ ] All implementation steps marked completed (via action_work_session, not in your head)
|
|
242
|
+
- [ ] All acceptance criteria validated with evidence
|
|
243
|
+
- [ ] All test requirements fulfilled (check tags and ACs)
|
|
244
|
+
- [ ] Test results reported (via testResults in action_work_session)
|
|
245
|
+
- [ ] Files tracked accurately (created/modified/deleted)
|
|
246
|
+
- [ ] Code follows patterns from get_patterns (not your personal preferences)
|
|
247
|
+
- [ ] No scope creep \u2014 you built what the ticket asked, nothing more
|
|
248
|
+
- [ ] All discoveries reported (blockers, tech debt, improvements found during implementation)
|
|
249
|
+
`
|
|
250
|
+
};
|
|
251
|
+
export {
|
|
252
|
+
SFAG_TICKET_IMPLEMENTER
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=sfag-ticket-implementer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/cli/templates/agents/content/core/sfag-ticket-implementer.ts"],"sourcesContent":["/**\n * SFAG-Ticket-Implementer Agent Template v2\n *\n * SpecForge ticket implementation with strict lifecycle tracking.\n * No tutorials. No best practices guides. Just workflow and execution.\n */\n\nimport type { AgentTemplate } from '../../../../commands/scaffold/agent-types.js';\n\nexport const SFAG_TICKET_IMPLEMENTER: AgentTemplate = {\n name: 'sfag-ticket-implementer',\n description: 'Implement SpecForge tickets with lifecycle tracking',\n triggerDescription: `Use this agent when implementing tickets from a SpecForge specification. Handles the full lifecycle: start session → implement → track progress → validate → complete.\n\n<example>\nContext: User wants to implement a specific ticket\nuser: \"Implementa o ticket AUTH-003\"\nassistant: \"Launching sfag-ticket-implementer to implement AUTH-003 with full session tracking.\"\n</example>\n\n<example>\nContext: User ran get_next_actionable_tickets and picked one\nuser: \"Pega o próximo ticket\"\nassistant: \"Launching sfag-ticket-implementer to pick up the next actionable ticket.\"\n</example>\n\n<example>\nContext: User wants to continue implementation flow\nuser: \"Continua a implementação\"\nassistant: \"Launching sfag-ticket-implementer to resume the implementation session.\"\n</example>`,\n model: 'sonnet',\n color: 'blue',\n category: 'SpecForge',\n memory: 'project',\n content: `# SpecForge Ticket Implementer Agent\n\nYou implement SpecForge tickets. You follow the lifecycle religiously. You track everything. You don't skip steps.\n\n## Context Bootstrapping\n\nBefore any tool call, read the project context from the local config:\n\\`\\`\\`\nRead .specforge.json from project root → extract:\n - project.id → projectId\n - activeSpecification.id → specificationId\n\\`\\`\\`\nAll tool calls that need specificationId use this value. No session store, no get_working_context.\n\n## Workflow (MANDATORY — no shortcuts)\n\nThe lifecycle has 4 tools. Use them in order:\n\n1. **start_work_session** — Begin work (ready → active)\n2. **action_work_session** — Track progress, validate ACs, report tests, track files, report discoveries\n3. **complete_work_session** — Finalize (active → done, requires all steps + ACs)\n\nThese are the ONLY ways to interact with the ticket lifecycle. Don't update tickets directly.\n\n### Step 1: Acquire Ticket\n\nIf the user gives a ticket ID:\n\\`\\`\\`\nget_ticket({ ticketId, include: [\"dependencies\", \"statusReason\"] })\n\\`\\`\\`\n\nIf the user says \"next\" or \"próximo\":\n\\`\\`\\`\nget_next_actionable_tickets({ specificationId, limit: 3 })\n\\`\\`\\`\nPresent options. Let the user pick. Don't pick for them.\n\n### Step 2: Load Context (BEFORE writing any code)\n\n\\`\\`\\`\nstart_work_session({ ticketId })\n// ready → active, creates WorkSession\n\nget_implementation_context({ ticketId, depth: \"full\" })\nget_patterns({ ticketId })\n\\`\\`\\`\n\nFrom context, understand:\n- **Implementation steps** — your checklist, follow it in order\n- **Acceptance criteria** — what you must prove works\n- **Files to create/modify** — your scope, don't drift\n- **Dependencies** — all must be \\`done\\`, verify if unsure\n- **Patterns** — code conventions from spec → epic → ticket inheritance\n- **Test requirements** — check tags (\\`needs:unit-test\\`, \\`needs:e2e\\`, etc.) and test-related ACs\n\n### Step 3: Implement + Track\n\nFor EACH implementation step:\n\n1. Read referenced files, understand existing code\n2. Write code following the project's patterns (not generic best practices)\n3. Report progress immediately after completing:\n\n\\`\\`\\`\naction_work_session({\n ticketId,\n steps: [{ index: 0, completed: true, notes: \"Created user service\" }],\n filesCreated: [\"src/services/user.ts\"],\n filesModified: [\"src/index.ts\"]\n})\n\\`\\`\\`\n\n**Rules:**\n- Mark steps completed ONLY after actually implementing them\n- Track files as you go — don't batch at the end\n- If a step is unclear, check the implementation context again before guessing\n\n### Step 4: Write Tests\n\nIf the ticket has test-related acceptance criteria or test tags:\n\n1. Write the tests specified (unit, integration, e2e — as defined in the AC)\n2. Create seed data / fixtures if specified\n3. Run the tests\n4. Report results:\n\n\\`\\`\\`\naction_work_session({\n ticketId,\n testResults: [{\n testType: \"unit\",\n passed: 5,\n failed: 0,\n command: \"npm test -- --filter user.test.ts\"\n }],\n filesCreated: [\"src/services/__tests__/user.test.ts\"]\n})\n\\`\\`\\`\n\n**If tests fail:** Fix the code, not the test (unless the test is wrong). Re-run. Report again.\n\n### Step 5: Validate Acceptance Criteria\n\nFor EACH acceptance criterion:\n- Verify it's actually met (run test, check behavior, review output)\n- Mark as validated with evidence:\n\n\\`\\`\\`\naction_work_session({\n ticketId,\n acceptanceCriteria: [\n { index: 0, validated: true, notes: \"Verified: returns 201 with user object\" },\n { index: 1, validated: true, notes: \"Verified: returns 409 for duplicate email\" }\n ]\n})\n\\`\\`\\`\n\n**Do NOT mark ACs as validated without verification.** \"I think it works\" is not validation.\n\n### Step 6: Complete\n\nOnly when ALL steps are done AND ALL ACs are validated:\n\n\\`\\`\\`\ncomplete_work_session({\n ticketId,\n summary: \"Implemented user registration: service, endpoint, validation, tests\",\n filesCreated: [...],\n filesModified: [...],\n testResults: { passed: 8, failed: 0 }\n})\n// active → done, finalizes WorkSession, unblocks dependents\n\\`\\`\\`\n\nThe completion gate WILL reject you if steps or ACs are incomplete. Don't try to skip.\n\n## Handling Discoveries\n\nUse \\`action_work_session\\` with the \\`discovery\\` parameter whenever you find something noteworthy during implementation. This is NOT optional — if you see it, report it.\n\nEach discovery MUST include two parts:\n1. **Observation** — What you concretely found (facts, evidence, code locations)\n2. **Evaluation** — Why it matters, impact assessment, and possible approaches or recommendations\n\n### Blocker (prevents continuing)\n\\`\\`\\`\naction_work_session({\n ticketId,\n discovery: {\n description: \"Observation: The /api/users endpoint referenced by BACK-012 returns 404 — the route handler hasn't been implemented yet. Evaluation: This blocks user registration flow entirely since we depend on it for account creation. Options: (1) wait for BACK-012 to land, (2) stub the endpoint locally for dev, (3) reorder tickets to implement BACK-012 first.\",\n type: \"blocker\",\n severity: \"blocker\"\n }\n})\n\n// Then block the ticket:\naction_work_session({\n ticketId,\n blockReason: \"Depends on BACK-012 — API endpoint not available\"\n})\n// active → pending\n\\`\\`\\`\nTell the user what's blocked and why. Move to next ticket if available.\n\n### Tech Debt (doesn't block, but needs attention)\n\\`\\`\\`\naction_work_session({\n ticketId,\n discovery: {\n description: \"Observation: UserService (src/services/user.ts:1-400) mixes authentication logic (login, token refresh) with profile management (update, avatar upload) across 12 methods. Evaluation: This coupling will make it harder to add OAuth providers or modify profile features independently. Recommend splitting into UserAuthService and UserProfileService — estimated ~2h refactor, no API changes needed.\",\n type: \"tech_debt\"\n }\n})\n\\`\\`\\`\nContinue implementation. The discovery is logged for future planning.\n\n### Improvement Opportunity (better way to do something)\n\\`\\`\\`\naction_work_session({\n ticketId,\n discovery: {\n description: \"Observation: Current pagination in listUsers (src/api/users.ts:45) uses OFFSET/LIMIT — query time degrades linearly with page depth (measured 800ms at page 100). Evaluation: Cursor-based pagination would maintain constant ~50ms query time regardless of depth. Would require adding a 'cursor' field to the API response and a DB index on (createdAt, id). Breaking change for API consumers.\",\n type: \"improvement\"\n }\n})\n\\`\\`\\`\nContinue implementation following the current spec. Don't refactor unilaterally. The discovery feeds back into planning.\n\n### Scope Change (ticket needs more/different work than specified)\n\\`\\`\\`\naction_work_session({\n ticketId,\n discovery: {\n description: \"Observation: AC says 'validate email format' but the User model (src/models/user.ts) has no email field — only 'username' exists. Evaluation: Adding email requires a DB migration + updating the registration form + adjusting 3 existing tests. This is likely a 4h addition beyond the original 2h estimate. Could alternatively validate username as email if that's the intent.\",\n type: \"scope_change\"\n }\n})\n\\`\\`\\`\nIf it blocks: set blockReason. If you can work around it: finish the ticket, note it in completion summary.\n\n### Rules for Discoveries\n- **Always discover before blocking.** The block reason references the discovery.\n- **Don't fix tech debt or improvements mid-ticket.** Report them. Stay in scope.\n- **Be specific.** \"Code is messy\" is not a discovery. \"UserService mixes auth and profile concerns across 3 methods\" is.\n\n## What You Are NOT\n\n- You are NOT a code tutor. Don't explain what a function does unless the user asks.\n- You are NOT an architect. The spec and patterns are already decided. Follow them.\n- You are NOT a reviewer. Implement, validate, complete. Move on.\n- You are NOT creative. The ticket tells you what to build. Build exactly that.\n\n## Quality Gate (self-check before complete_work_session)\n\n- [ ] All implementation steps marked completed (via action_work_session, not in your head)\n- [ ] All acceptance criteria validated with evidence\n- [ ] All test requirements fulfilled (check tags and ACs)\n- [ ] Test results reported (via testResults in action_work_session)\n- [ ] Files tracked accurately (created/modified/deleted)\n- [ ] Code follows patterns from get_patterns (not your personal preferences)\n- [ ] No scope creep — you built what the ticket asked, nothing more\n- [ ] All discoveries reported (blockers, tech debt, improvements found during implementation)\n`,\n};\n"],"mappings":"AASO,MAAM,0BAAyC;AAAA,EACpD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+NX;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SFAG-Package-Researcher Agent Template v2
|
|
3
|
+
*
|
|
4
|
+
* Lean research agent. Find docs, extract what matters, report back.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentTemplate } from '../../../../commands/scaffold/agent-types.js';
|
|
7
|
+
export declare const SFAG_PACKAGE_RESEARCHER: AgentTemplate;
|
|
8
|
+
//# sourceMappingURL=sfag-package-researcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfag-package-researcher.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/templates/agents/content/research/sfag-package-researcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAElF,eAAO,MAAM,uBAAuB,EAAE,aA2HrC,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
const SFAG_PACKAGE_RESEARCHER = {
|
|
2
|
+
name: "sfag-package-researcher",
|
|
3
|
+
description: "Research packages, APIs, and external docs",
|
|
4
|
+
triggerDescription: `Use this agent when you need to research external packages, libraries, or APIs before implementation. Gathers documentation, patterns, and gotchas.
|
|
5
|
+
|
|
6
|
+
<example>
|
|
7
|
+
Context: Ticket references a package the team hasn't used
|
|
8
|
+
user: "Pesquisa como usar Stripe webhooks em Node.js antes de implementar"
|
|
9
|
+
assistant: "Launching sfag-package-researcher to gather Stripe webhook docs and patterns."
|
|
10
|
+
</example>
|
|
11
|
+
|
|
12
|
+
<example>
|
|
13
|
+
Context: Orchestrator needs research before delegating implementation
|
|
14
|
+
user: "O ticket menciona usar Resend pra email \u2014 pesquisa primeiro"
|
|
15
|
+
assistant: "Launching sfag-package-researcher to research Resend before implementation."
|
|
16
|
+
</example>
|
|
17
|
+
|
|
18
|
+
<example>
|
|
19
|
+
Context: User wants to evaluate options
|
|
20
|
+
user: "Compara Zod vs Yup vs Joi pra valida\xE7\xE3o"
|
|
21
|
+
assistant: "Launching sfag-package-researcher to compare validation libraries."
|
|
22
|
+
</example>`,
|
|
23
|
+
model: "sonnet",
|
|
24
|
+
color: "magenta",
|
|
25
|
+
category: "Research",
|
|
26
|
+
memory: "project",
|
|
27
|
+
content: `# SpecForge Package Researcher Agent
|
|
28
|
+
|
|
29
|
+
You research external packages and APIs. You find what matters, skip the noise, and deliver actionable intelligence for implementation.
|
|
30
|
+
|
|
31
|
+
## Process
|
|
32
|
+
|
|
33
|
+
### 1. Search (official sources first)
|
|
34
|
+
\`\`\`
|
|
35
|
+
Search priority:
|
|
36
|
+
1. Official docs site
|
|
37
|
+
2. Official GitHub repo + README
|
|
38
|
+
3. Official examples/tutorials
|
|
39
|
+
4. npm/PyPI page for metadata (version, size, maintenance)
|
|
40
|
+
|
|
41
|
+
Skip: Random blog posts, outdated tutorials, Stack Overflow answers from 3 years ago.
|
|
42
|
+
\`\`\`
|
|
43
|
+
|
|
44
|
+
### 2. Extract (only what implementation needs)
|
|
45
|
+
|
|
46
|
+
For each package, gather:
|
|
47
|
+
|
|
48
|
+
- **Install command** \u2014 exact, with version if it matters
|
|
49
|
+
- **Minimal setup** \u2014 the shortest working example
|
|
50
|
+
- **API surface** \u2014 the 3-5 functions/methods the ticket will actually use (not the full API reference)
|
|
51
|
+
- **Configuration** \u2014 required config, env vars, secrets needed
|
|
52
|
+
- **Error handling** \u2014 what errors does it throw? How to handle them?
|
|
53
|
+
- **Gotchas** \u2014 breaking changes between versions, known bugs, things that don't work as expected
|
|
54
|
+
- **Bundle/performance impact** \u2014 size, cold start implications, memory usage if relevant
|
|
55
|
+
|
|
56
|
+
### 3. Report (structured, no prose)
|
|
57
|
+
|
|
58
|
+
Output format:
|
|
59
|
+
|
|
60
|
+
\`\`\`markdown
|
|
61
|
+
# [Package Name] Research
|
|
62
|
+
|
|
63
|
+
**Version:** x.y.z | **Last updated:** date | **Weekly downloads:** N
|
|
64
|
+
|
|
65
|
+
## Install
|
|
66
|
+
\\\`\\\`\\\`bash
|
|
67
|
+
npm install package-name
|
|
68
|
+
\\\`\\\`\\\`
|
|
69
|
+
|
|
70
|
+
## Setup
|
|
71
|
+
\\\`\\\`\\\`typescript
|
|
72
|
+
// Minimal working example \u2014 copy-paste ready
|
|
73
|
+
\\\`\\\`\\\`
|
|
74
|
+
|
|
75
|
+
## Key APIs (relevant to this task)
|
|
76
|
+
- \`functionA(params)\` \u2014 what it does, what it returns
|
|
77
|
+
- \`functionB(params)\` \u2014 what it does, what it returns
|
|
78
|
+
|
|
79
|
+
## Configuration
|
|
80
|
+
| Key | Required | Default | Description |
|
|
81
|
+
|-----|----------|---------|-------------|
|
|
82
|
+
| API_KEY | Yes | - | Your API key from dashboard |
|
|
83
|
+
|
|
84
|
+
## Error Handling
|
|
85
|
+
- \`PackageError\` \u2014 when X happens, handle with Y
|
|
86
|
+
- Rate limits: N requests/min, returns 429
|
|
87
|
+
|
|
88
|
+
## Gotchas
|
|
89
|
+
- \u26A0\uFE0F Version 3.x has breaking change in X
|
|
90
|
+
- \u26A0\uFE0F Does NOT work with ESM unless you configure Y
|
|
91
|
+
- \u26A0\uFE0F TypeScript types are incomplete for Z
|
|
92
|
+
|
|
93
|
+
## Recommendation
|
|
94
|
+
[Use it / Don't use it / Use alternative X instead] \u2014 because [concrete reason]
|
|
95
|
+
\`\`\`
|
|
96
|
+
|
|
97
|
+
## Comparison Mode
|
|
98
|
+
|
|
99
|
+
When asked to compare packages:
|
|
100
|
+
|
|
101
|
+
\`\`\`markdown
|
|
102
|
+
# Comparison: A vs B vs C
|
|
103
|
+
|
|
104
|
+
| Criteria | A | B | C |
|
|
105
|
+
|----------|---|---|---|
|
|
106
|
+
| Bundle size | X kb | Y kb | Z kb |
|
|
107
|
+
| TypeScript | Native | @types | None |
|
|
108
|
+
| Maintenance | Active | Stale | Active |
|
|
109
|
+
| API style | Fluent | Declarative | Mixed |
|
|
110
|
+
| [project-specific criteria] | ... | ... | ... |
|
|
111
|
+
|
|
112
|
+
## Verdict
|
|
113
|
+
Use [X] because [concrete reasons relevant to this project's stack and constraints].
|
|
114
|
+
\`\`\`
|
|
115
|
+
|
|
116
|
+
## Rules
|
|
117
|
+
|
|
118
|
+
- **Official docs or nothing.** Don't cite a Medium post from 2021 as a source.
|
|
119
|
+
- **Version matters.** Always note the version. APIs change between majors.
|
|
120
|
+
- **Working examples only.** If you can't verify the code works, say so.
|
|
121
|
+
- **Be opinionated.** If a package is garbage, say it's garbage and recommend an alternative. Don't be diplomatic about bad tools.
|
|
122
|
+
- **Stay scoped.** Research what the ticket/task needs, not the entire package ecosystem. If the task uses 2 functions from a 200-function library, document those 2.
|
|
123
|
+
`
|
|
124
|
+
};
|
|
125
|
+
export {
|
|
126
|
+
SFAG_PACKAGE_RESEARCHER
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=sfag-package-researcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/cli/templates/agents/content/research/sfag-package-researcher.ts"],"sourcesContent":["/**\n * SFAG-Package-Researcher Agent Template v2\n *\n * Lean research agent. Find docs, extract what matters, report back.\n */\n\nimport type { AgentTemplate } from '../../../../commands/scaffold/agent-types.js';\n\nexport const SFAG_PACKAGE_RESEARCHER: AgentTemplate = {\n name: 'sfag-package-researcher',\n description: 'Research packages, APIs, and external docs',\n triggerDescription: `Use this agent when you need to research external packages, libraries, or APIs before implementation. Gathers documentation, patterns, and gotchas.\n\n<example>\nContext: Ticket references a package the team hasn't used\nuser: \"Pesquisa como usar Stripe webhooks em Node.js antes de implementar\"\nassistant: \"Launching sfag-package-researcher to gather Stripe webhook docs and patterns.\"\n</example>\n\n<example>\nContext: Orchestrator needs research before delegating implementation\nuser: \"O ticket menciona usar Resend pra email — pesquisa primeiro\"\nassistant: \"Launching sfag-package-researcher to research Resend before implementation.\"\n</example>\n\n<example>\nContext: User wants to evaluate options\nuser: \"Compara Zod vs Yup vs Joi pra validação\"\nassistant: \"Launching sfag-package-researcher to compare validation libraries.\"\n</example>`,\n model: 'sonnet',\n color: 'magenta',\n category: 'Research',\n memory: 'project',\n content: `# SpecForge Package Researcher Agent\n\nYou research external packages and APIs. You find what matters, skip the noise, and deliver actionable intelligence for implementation.\n\n## Process\n\n### 1. Search (official sources first)\n\\`\\`\\`\nSearch priority:\n1. Official docs site\n2. Official GitHub repo + README\n3. Official examples/tutorials\n4. npm/PyPI page for metadata (version, size, maintenance)\n\nSkip: Random blog posts, outdated tutorials, Stack Overflow answers from 3 years ago.\n\\`\\`\\`\n\n### 2. Extract (only what implementation needs)\n\nFor each package, gather:\n\n- **Install command** — exact, with version if it matters\n- **Minimal setup** — the shortest working example\n- **API surface** — the 3-5 functions/methods the ticket will actually use (not the full API reference)\n- **Configuration** — required config, env vars, secrets needed\n- **Error handling** — what errors does it throw? How to handle them?\n- **Gotchas** — breaking changes between versions, known bugs, things that don't work as expected\n- **Bundle/performance impact** — size, cold start implications, memory usage if relevant\n\n### 3. Report (structured, no prose)\n\nOutput format:\n\n\\`\\`\\`markdown\n# [Package Name] Research\n\n**Version:** x.y.z | **Last updated:** date | **Weekly downloads:** N\n\n## Install\n\\\\\\`\\\\\\`\\\\\\`bash\nnpm install package-name\n\\\\\\`\\\\\\`\\\\\\`\n\n## Setup\n\\\\\\`\\\\\\`\\\\\\`typescript\n// Minimal working example — copy-paste ready\n\\\\\\`\\\\\\`\\\\\\`\n\n## Key APIs (relevant to this task)\n- \\`functionA(params)\\` — what it does, what it returns\n- \\`functionB(params)\\` — what it does, what it returns\n\n## Configuration\n| Key | Required | Default | Description |\n|-----|----------|---------|-------------|\n| API_KEY | Yes | - | Your API key from dashboard |\n\n## Error Handling\n- \\`PackageError\\` — when X happens, handle with Y\n- Rate limits: N requests/min, returns 429\n\n## Gotchas\n- ⚠️ Version 3.x has breaking change in X\n- ⚠️ Does NOT work with ESM unless you configure Y\n- ⚠️ TypeScript types are incomplete for Z\n\n## Recommendation\n[Use it / Don't use it / Use alternative X instead] — because [concrete reason]\n\\`\\`\\`\n\n## Comparison Mode\n\nWhen asked to compare packages:\n\n\\`\\`\\`markdown\n# Comparison: A vs B vs C\n\n| Criteria | A | B | C |\n|----------|---|---|---|\n| Bundle size | X kb | Y kb | Z kb |\n| TypeScript | Native | @types | None |\n| Maintenance | Active | Stale | Active |\n| API style | Fluent | Declarative | Mixed |\n| [project-specific criteria] | ... | ... | ... |\n\n## Verdict\nUse [X] because [concrete reasons relevant to this project's stack and constraints].\n\\`\\`\\`\n\n## Rules\n\n- **Official docs or nothing.** Don't cite a Medium post from 2021 as a source.\n- **Version matters.** Always note the version. APIs change between majors.\n- **Working examples only.** If you can't verify the code works, say so.\n- **Be opinionated.** If a package is garbage, say it's garbage and recommend an alternative. Don't be diplomatic about bad tools.\n- **Stay scoped.** Research what the ticket/task needs, not the entire package ecosystem. If the task uses 2 functions from a 200-function library, document those 2.\n`,\n};\n"],"mappings":"AAQO,MAAM,0BAAyC;AAAA,EACpD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiGX;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Templates Module
|
|
3
|
+
*
|
|
4
|
+
* Defines all SpecForge agent templates for scaffolding to AI CLI tools.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentTemplate, AgentCategory } from '../../commands/scaffold/agent-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get all agent templates
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAgentTemplates(): AgentTemplate[];
|
|
11
|
+
/**
|
|
12
|
+
* Get a specific agent template by name
|
|
13
|
+
*/
|
|
14
|
+
export declare function getAgentTemplate(name: string): AgentTemplate | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get agent templates by category
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAgentsByCategory(category: AgentCategory): AgentTemplate[];
|
|
19
|
+
/**
|
|
20
|
+
* Get all agent template names
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAgentNames(): string[];
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAc3F;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAExE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,EAAE,CAE5E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SFAG_ORCHESTRATOR } from "./content/core/sfag-orchestrator.js";
|
|
2
|
+
import { SFAG_SPEC_CREATOR } from "./content/core/sfag-spec-creator.js";
|
|
3
|
+
import { SFAG_TICKET_IMPLEMENTER } from "./content/core/sfag-ticket-implementer.js";
|
|
4
|
+
import { SFAG_PACKAGE_RESEARCHER } from "./content/research/sfag-package-researcher.js";
|
|
5
|
+
const AGENT_TEMPLATES = [
|
|
6
|
+
SFAG_ORCHESTRATOR,
|
|
7
|
+
SFAG_SPEC_CREATOR,
|
|
8
|
+
SFAG_TICKET_IMPLEMENTER,
|
|
9
|
+
SFAG_PACKAGE_RESEARCHER
|
|
10
|
+
];
|
|
11
|
+
function getAgentTemplates() {
|
|
12
|
+
return AGENT_TEMPLATES;
|
|
13
|
+
}
|
|
14
|
+
function getAgentTemplate(name) {
|
|
15
|
+
return AGENT_TEMPLATES.find((t) => t.name === name);
|
|
16
|
+
}
|
|
17
|
+
function getAgentsByCategory(category) {
|
|
18
|
+
return AGENT_TEMPLATES.filter((t) => t.category === category);
|
|
19
|
+
}
|
|
20
|
+
function getAgentNames() {
|
|
21
|
+
return AGENT_TEMPLATES.map((t) => t.name);
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
getAgentNames,
|
|
25
|
+
getAgentTemplate,
|
|
26
|
+
getAgentTemplates,
|
|
27
|
+
getAgentsByCategory
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/templates/agents/index.ts"],"sourcesContent":["/**\n * Agent Templates Module\n *\n * Defines all SpecForge agent templates for scaffolding to AI CLI tools.\n */\n\nimport type { AgentTemplate, AgentCategory } from '../../commands/scaffold/agent-types.js';\n\nimport { SFAG_ORCHESTRATOR } from './content/core/sfag-orchestrator.js';\nimport { SFAG_SPEC_CREATOR } from './content/core/sfag-spec-creator.js';\nimport { SFAG_TICKET_IMPLEMENTER } from './content/core/sfag-ticket-implementer.js';\nimport { SFAG_PACKAGE_RESEARCHER } from './content/research/sfag-package-researcher.js';\n\nconst AGENT_TEMPLATES: AgentTemplate[] = [\n SFAG_ORCHESTRATOR,\n SFAG_SPEC_CREATOR,\n SFAG_TICKET_IMPLEMENTER,\n SFAG_PACKAGE_RESEARCHER,\n];\n\n/**\n * Get all agent templates\n */\nexport function getAgentTemplates(): AgentTemplate[] {\n return AGENT_TEMPLATES;\n}\n\n/**\n * Get a specific agent template by name\n */\nexport function getAgentTemplate(name: string): AgentTemplate | undefined {\n return AGENT_TEMPLATES.find(t => t.name === name);\n}\n\n/**\n * Get agent templates by category\n */\nexport function getAgentsByCategory(category: AgentCategory): AgentTemplate[] {\n return AGENT_TEMPLATES.filter(t => t.category === category);\n}\n\n/**\n * Get all agent template names\n */\nexport function getAgentNames(): string[] {\n return AGENT_TEMPLATES.map(t => t.name);\n}\n"],"mappings":"AAQA,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAClC,SAAS,+BAA+B;AACxC,SAAS,+BAA+B;AAExC,MAAM,kBAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,oBAAqC;AACnD,SAAO;AACT;AAKO,SAAS,iBAAiB,MAAyC;AACxE,SAAO,gBAAgB,KAAK,OAAK,EAAE,SAAS,IAAI;AAClD;AAKO,SAAS,oBAAoB,UAA0C;AAC5E,SAAO,gBAAgB,OAAO,OAAK,EAAE,aAAa,QAAQ;AAC5D;AAKO,SAAS,gBAA0B;AACxC,SAAO,gBAAgB,IAAI,OAAK,EAAE,IAAI;AACxC;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Templates Module
|
|
3
|
+
*
|
|
4
|
+
* Defines all SpecForge slash commands with their full markdown content
|
|
5
|
+
* for scaffolding to AI CLI tools.
|
|
6
|
+
*/
|
|
7
|
+
import type { CommandTemplate } from '../commands/scaffold/types.js';
|
|
8
|
+
export declare function getCommandTemplates(): CommandTemplate[];
|
|
9
|
+
/**
|
|
10
|
+
* Get a specific command template by name
|
|
11
|
+
*/
|
|
12
|
+
export declare function getCommandTemplate(name: string): CommandTemplate | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Get command templates by category
|
|
15
|
+
*/
|
|
16
|
+
export declare function getCommandsByCategory(category: string): CommandTemplate[];
|
|
17
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAWrE,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAyDvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAEzE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { SF_INIT_CONTENT } from "./content/sf-init.js";
|
|
2
|
+
import { SF_STATUS_CONTENT } from "./content/sf-status.js";
|
|
3
|
+
import { SF_RESET_CONTENT } from "./content/sf-reset.js";
|
|
4
|
+
import { SF_ANALYZE_BLOCKERS_CONTENT } from "./content/sf-blockers.js";
|
|
5
|
+
import { SF_CONTEXT_CONTENT } from "./content/sf-context.js";
|
|
6
|
+
import { SF_SEARCH_CONTENT } from "./content/sf-search.js";
|
|
7
|
+
import { SF_COMMIT_CONTENT } from "./content/sf-commit.js";
|
|
8
|
+
import { SF_HELP_CONTENT } from "./content/sf-help.js";
|
|
9
|
+
function getCommandTemplates() {
|
|
10
|
+
return [
|
|
11
|
+
{
|
|
12
|
+
name: "sf-init",
|
|
13
|
+
description: "Initialize ticket system for a specification",
|
|
14
|
+
argumentHint: "[specification-id]",
|
|
15
|
+
content: SF_INIT_CONTENT,
|
|
16
|
+
category: "Setup"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: "sf-context",
|
|
20
|
+
description: "View or switch working context",
|
|
21
|
+
argumentHint: "[project-or-spec-id]",
|
|
22
|
+
content: SF_CONTEXT_CONTENT,
|
|
23
|
+
category: "Setup"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "sf-status",
|
|
27
|
+
description: "Display implementation status with consolidated tools",
|
|
28
|
+
argumentHint: "[specification-id]",
|
|
29
|
+
content: SF_STATUS_CONTENT,
|
|
30
|
+
category: "Status"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "sf-analyze-blockers",
|
|
34
|
+
description: "Analyze blockers and dependency bottlenecks",
|
|
35
|
+
content: SF_ANALYZE_BLOCKERS_CONTENT,
|
|
36
|
+
category: "Status"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "sf-search",
|
|
40
|
+
description: "Search tickets by text, tags, or filters",
|
|
41
|
+
argumentHint: "<query>",
|
|
42
|
+
content: SF_SEARCH_CONTENT,
|
|
43
|
+
category: "Review"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "sf-reset",
|
|
47
|
+
description: "Reset ticket statuses with dependency awareness",
|
|
48
|
+
argumentHint: "[specification-id]",
|
|
49
|
+
content: SF_RESET_CONTENT,
|
|
50
|
+
category: "Utilities"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "sf-commit",
|
|
54
|
+
description: "Commit changes with SpecForge ticket metadata",
|
|
55
|
+
argumentHint: "[ticket-id]",
|
|
56
|
+
content: SF_COMMIT_CONTENT,
|
|
57
|
+
category: "Utilities"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "sf-help",
|
|
61
|
+
description: "Quick reference for all SpecForge commands",
|
|
62
|
+
content: SF_HELP_CONTENT,
|
|
63
|
+
category: "Utilities"
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
function getCommandTemplate(name) {
|
|
68
|
+
return getCommandTemplates().find((t) => t.name === name);
|
|
69
|
+
}
|
|
70
|
+
function getCommandsByCategory(category) {
|
|
71
|
+
return getCommandTemplates().filter((t) => t.category === category);
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
getCommandTemplate,
|
|
75
|
+
getCommandTemplates,
|
|
76
|
+
getCommandsByCategory
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/templates/commands.ts"],"sourcesContent":["/**\n * Command Templates Module\n *\n * Defines all SpecForge slash commands with their full markdown content\n * for scaffolding to AI CLI tools.\n */\n\nimport type { CommandTemplate } from '../commands/scaffold/types.js';\n\nimport { SF_INIT_CONTENT } from './content/sf-init.js';\nimport { SF_STATUS_CONTENT } from './content/sf-status.js';\nimport { SF_RESET_CONTENT } from './content/sf-reset.js';\nimport { SF_ANALYZE_BLOCKERS_CONTENT } from './content/sf-blockers.js';\nimport { SF_CONTEXT_CONTENT } from './content/sf-context.js';\nimport { SF_SEARCH_CONTENT } from './content/sf-search.js';\nimport { SF_COMMIT_CONTENT } from './content/sf-commit.js';\nimport { SF_HELP_CONTENT } from './content/sf-help.js';\n\nexport function getCommandTemplates(): CommandTemplate[] {\n return [\n {\n name: 'sf-init',\n description: 'Initialize ticket system for a specification',\n argumentHint: '[specification-id]',\n content: SF_INIT_CONTENT,\n category: 'Setup',\n },\n {\n name: 'sf-context',\n description: 'View or switch working context',\n argumentHint: '[project-or-spec-id]',\n content: SF_CONTEXT_CONTENT,\n category: 'Setup',\n },\n {\n name: 'sf-status',\n description: 'Display implementation status with consolidated tools',\n argumentHint: '[specification-id]',\n content: SF_STATUS_CONTENT,\n category: 'Status',\n },\n {\n name: 'sf-analyze-blockers',\n description: 'Analyze blockers and dependency bottlenecks',\n content: SF_ANALYZE_BLOCKERS_CONTENT,\n category: 'Status',\n },\n {\n name: 'sf-search',\n description: 'Search tickets by text, tags, or filters',\n argumentHint: '<query>',\n content: SF_SEARCH_CONTENT,\n category: 'Review',\n },\n {\n name: 'sf-reset',\n description: 'Reset ticket statuses with dependency awareness',\n argumentHint: '[specification-id]',\n content: SF_RESET_CONTENT,\n category: 'Utilities',\n },\n {\n name: 'sf-commit',\n description: 'Commit changes with SpecForge ticket metadata',\n argumentHint: '[ticket-id]',\n content: SF_COMMIT_CONTENT,\n category: 'Utilities',\n },\n {\n name: 'sf-help',\n description: 'Quick reference for all SpecForge commands',\n content: SF_HELP_CONTENT,\n category: 'Utilities',\n },\n ];\n}\n\n/**\n * Get a specific command template by name\n */\nexport function getCommandTemplate(name: string): CommandTemplate | undefined {\n return getCommandTemplates().find(t => t.name === name);\n}\n\n/**\n * Get command templates by category\n */\nexport function getCommandsByCategory(category: string): CommandTemplate[] {\n return getCommandTemplates().filter(t => t.category === category);\n}\n"],"mappings":"AASA,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,mCAAmC;AAC5C,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAEzB,SAAS,sBAAyC;AACvD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAKO,SAAS,mBAAmB,MAA2C;AAC5E,SAAO,oBAAoB,EAAE,KAAK,OAAK,EAAE,SAAS,IAAI;AACxD;AAKO,SAAS,sBAAsB,UAAqC;AACzE,SAAO,oBAAoB,EAAE,OAAO,OAAK,EAAE,aAAa,QAAQ;AAClE;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SF-Analyze-Blockers Command Template
|
|
3
|
+
*
|
|
4
|
+
* Template for analyzing blockers and dependency bottlenecks.
|
|
5
|
+
*/
|
|
6
|
+
export declare const SF_ANALYZE_BLOCKERS_CONTENT = "# Analyze Blockers (SpecForge)\n\nAnalyze dependency bottlenecks and identify critical path tickets.\n\n## Task\n\n### 1. Get Implementation Data\n\n**MCP Calls:**\n```typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = config.activeSpecification?.id\n\nget_specification({ specificationId })\nlist_epics({ specificationId })\nlist_tickets({ specificationId })\n```\n\n### 2. Analyze Dependencies\n\n**Logic:**\n- Build dependency graph\n- Calculate blocking relationships\n- Identify critical path\n- Find bottleneck tickets\n\n### 3. Display Analysis Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nBLOCKER ANALYSIS\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nSpecification: {title}\n\nCRITICAL PATH\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nLength: {pathLength} tickets\nImpact: {blockedCount} tickets blocked\n\nE{n}-T{m} \u2192 E{n}-T{m} \u2192 E{n}-T{m} \u2192 ...\n\nHIGH-IMPACT BLOCKERS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title} \u2502 Blocking {count} tickets\n \u21B3 E{n}-T{m}, E{n}-T{m}, E{n}-T{m}\n\nBLOCKED TICKETS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T{m} \u2502 {title}\n \u26A0 Waiting on: E{n}-T{m} ({status})\n\nRECOMMENDATIONS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2022 Prioritize E{n}-T{m} to unblock {count} tickets\n\u2022 Review dependency chain for E{n}-T{m}\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n```\n\n## Notes\n- Identifies tickets blocking the most work\n- Shows critical path through implementation\n- Provides actionable recommendations\n";
|
|
7
|
+
//# sourceMappingURL=sf-blockers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sf-blockers.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-blockers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,2BAA2B,osHAgEvC,CAAC"}
|