@specforge/mcp 2.0.9 → 2.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 +324 -0
- package/bin/specforge-mcp +19 -1
- package/dist/cli/commands/blocked.d.ts +16 -0
- package/dist/cli/commands/blocked.d.ts.map +1 -0
- package/dist/cli/commands/blocked.js +214 -0
- package/dist/cli/commands/blocked.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 +218 -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 +105 -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 +117 -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 +12 -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 +90 -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 +117 -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 +117 -0
- package/dist/cli/commands/debug/tools.js.map +1 -0
- package/dist/cli/commands/debug/types.d.ts +117 -0
- package/dist/cli/commands/debug/types.d.ts.map +1 -0
- package/dist/cli/commands/debug/types.js +43 -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 +161 -0
- package/dist/cli/commands/debug/whoami.js.map +1 -0
- package/dist/cli/commands/docs/content/api.d.ts +7 -0
- package/dist/cli/commands/docs/content/api.d.ts.map +1 -0
- package/dist/cli/commands/docs/content/api.js +64 -0
- package/dist/cli/commands/docs/content/api.js.map +1 -0
- package/dist/cli/commands/docs/content/concepts.d.ts +7 -0
- package/dist/cli/commands/docs/content/concepts.d.ts.map +1 -0
- package/dist/cli/commands/docs/content/concepts.js +68 -0
- package/dist/cli/commands/docs/content/concepts.js.map +1 -0
- package/dist/cli/commands/docs/content/examples.d.ts +7 -0
- package/dist/cli/commands/docs/content/examples.d.ts.map +1 -0
- package/dist/cli/commands/docs/content/examples.js +84 -0
- package/dist/cli/commands/docs/content/examples.js.map +1 -0
- package/dist/cli/commands/docs/content/index.d.ts +10 -0
- package/dist/cli/commands/docs/content/index.d.ts.map +1 -0
- package/dist/cli/commands/docs/content/index.js +10 -0
- package/dist/cli/commands/docs/content/index.js.map +1 -0
- package/dist/cli/commands/docs/content/workflow.d.ts +7 -0
- package/dist/cli/commands/docs/content/workflow.d.ts.map +1 -0
- package/dist/cli/commands/docs/content/workflow.js +44 -0
- package/dist/cli/commands/docs/content/workflow.js.map +1 -0
- package/dist/cli/commands/docs/content.d.ts +23 -0
- package/dist/cli/commands/docs/content.d.ts.map +1 -0
- package/dist/cli/commands/docs/content.js +38 -0
- package/dist/cli/commands/docs/content.js.map +1 -0
- package/dist/cli/commands/docs/display.d.ts +26 -0
- package/dist/cli/commands/docs/display.d.ts.map +1 -0
- package/dist/cli/commands/docs/display.js +53 -0
- package/dist/cli/commands/docs/display.js.map +1 -0
- package/dist/cli/commands/docs/docs.d.ts +19 -0
- package/dist/cli/commands/docs/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs/docs.js +124 -0
- package/dist/cli/commands/docs/docs.js.map +1 -0
- package/dist/cli/commands/docs/index.d.ts +13 -0
- package/dist/cli/commands/docs/index.d.ts.map +1 -0
- package/dist/cli/commands/docs/index.js +13 -0
- package/dist/cli/commands/docs/index.js.map +1 -0
- package/dist/cli/commands/docs/register.d.ts +23 -0
- package/dist/cli/commands/docs/register.d.ts.map +1 -0
- package/dist/cli/commands/docs/register.js +64 -0
- package/dist/cli/commands/docs/register.js.map +1 -0
- package/dist/cli/commands/docs/tool-docs.d.ts +44 -0
- package/dist/cli/commands/docs/tool-docs.d.ts.map +1 -0
- package/dist/cli/commands/docs/tool-docs.js +182 -0
- package/dist/cli/commands/docs/tool-docs.js.map +1 -0
- package/dist/cli/commands/docs/tool-examples.d.ts +14 -0
- package/dist/cli/commands/docs/tool-examples.d.ts.map +1 -0
- package/dist/cli/commands/docs/tool-examples.js +127 -0
- package/dist/cli/commands/docs/tool-examples.js.map +1 -0
- package/dist/cli/commands/docs/types.d.ts +108 -0
- package/dist/cli/commands/docs/types.d.ts.map +1 -0
- package/dist/cli/commands/docs/types.js +33 -0
- package/dist/cli/commands/docs/types.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 +322 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/doctor.types.d.ts +177 -0
- package/dist/cli/commands/doctor.types.d.ts.map +1 -0
- package/dist/cli/commands/doctor.types.js +172 -0
- package/dist/cli/commands/doctor.types.js.map +1 -0
- package/dist/cli/commands/index.d.ts +18 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +18 -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 +326 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/init.types.d.ts +141 -0
- package/dist/cli/commands/init.types.d.ts.map +1 -0
- package/dist/cli/commands/init.types.js +24 -0
- package/dist/cli/commands/init.types.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 +174 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/next.d.ts +16 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +279 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/next.types.d.ts +191 -0
- package/dist/cli/commands/next.types.d.ts.map +1 -0
- package/dist/cli/commands/next.types.js +129 -0
- package/dist/cli/commands/next.types.js.map +1 -0
- package/dist/cli/commands/projects.d.ts +16 -0
- package/dist/cli/commands/projects.d.ts.map +1 -0
- package/dist/cli/commands/projects.js +149 -0
- package/dist/cli/commands/projects.js.map +1 -0
- package/dist/cli/commands/projects.types.d.ts +81 -0
- package/dist/cli/commands/projects.types.d.ts.map +1 -0
- package/dist/cli/commands/projects.types.js +35 -0
- package/dist/cli/commands/projects.types.js.map +1 -0
- package/dist/cli/commands/review/display.d.ts +33 -0
- package/dist/cli/commands/review/display.d.ts.map +1 -0
- package/dist/cli/commands/review/display.js +159 -0
- package/dist/cli/commands/review/display.js.map +1 -0
- package/dist/cli/commands/review/epic-review.d.ts +13 -0
- package/dist/cli/commands/review/epic-review.d.ts.map +1 -0
- package/dist/cli/commands/review/epic-review.js +69 -0
- package/dist/cli/commands/review/epic-review.js.map +1 -0
- package/dist/cli/commands/review/index.d.ts +13 -0
- package/dist/cli/commands/review/index.d.ts.map +1 -0
- package/dist/cli/commands/review/index.js +17 -0
- package/dist/cli/commands/review/index.js.map +1 -0
- package/dist/cli/commands/review/report.d.ts +31 -0
- package/dist/cli/commands/review/report.d.ts.map +1 -0
- package/dist/cli/commands/review/report.js +146 -0
- package/dist/cli/commands/review/report.js.map +1 -0
- package/dist/cli/commands/review/review.d.ts +17 -0
- package/dist/cli/commands/review/review.d.ts.map +1 -0
- package/dist/cli/commands/review/review.js +129 -0
- package/dist/cli/commands/review/review.js.map +1 -0
- package/dist/cli/commands/review/spec-review.d.ts +13 -0
- package/dist/cli/commands/review/spec-review.d.ts.map +1 -0
- package/dist/cli/commands/review/spec-review.js +65 -0
- package/dist/cli/commands/review/spec-review.js.map +1 -0
- package/dist/cli/commands/review/ticket-review.d.ts +37 -0
- package/dist/cli/commands/review/ticket-review.d.ts.map +1 -0
- package/dist/cli/commands/review/ticket-review.js +194 -0
- package/dist/cli/commands/review/ticket-review.js.map +1 -0
- package/dist/cli/commands/review/types.d.ts +232 -0
- package/dist/cli/commands/review/types.d.ts.map +1 -0
- package/dist/cli/commands/review/types.js +85 -0
- package/dist/cli/commands/review/types.js.map +1 -0
- package/dist/cli/commands/scaffold/display.d.ts +27 -0
- package/dist/cli/commands/scaffold/display.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/display.js +90 -0
- package/dist/cli/commands/scaffold/display.js.map +1 -0
- package/dist/cli/commands/scaffold/index.d.ts +12 -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 +25 -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 +111 -0
- package/dist/cli/commands/scaffold/scaffold.js.map +1 -0
- package/dist/cli/commands/scaffold/targets.d.ts +31 -0
- package/dist/cli/commands/scaffold/targets.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/targets.js +84 -0
- package/dist/cli/commands/scaffold/targets.js.map +1 -0
- package/dist/cli/commands/scaffold/types.d.ts +88 -0
- package/dist/cli/commands/scaffold/types.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/types.js +21 -0
- package/dist/cli/commands/scaffold/types.js.map +1 -0
- package/dist/cli/commands/scaffold/utils.d.ts +31 -0
- package/dist/cli/commands/scaffold/utils.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/utils.js +71 -0
- package/dist/cli/commands/scaffold/utils.js.map +1 -0
- package/dist/cli/commands/session/display.d.ts +40 -0
- package/dist/cli/commands/session/display.d.ts.map +1 -0
- package/dist/cli/commands/session/display.js +114 -0
- package/dist/cli/commands/session/display.js.map +1 -0
- package/dist/cli/commands/session/end.d.ts +12 -0
- package/dist/cli/commands/session/end.d.ts.map +1 -0
- package/dist/cli/commands/session/end.js +165 -0
- package/dist/cli/commands/session/end.js.map +1 -0
- package/dist/cli/commands/session/index.d.ts +13 -0
- package/dist/cli/commands/session/index.d.ts.map +1 -0
- package/dist/cli/commands/session/index.js +13 -0
- package/dist/cli/commands/session/index.js.map +1 -0
- package/dist/cli/commands/session/register.d.ts +12 -0
- package/dist/cli/commands/session/register.d.ts.map +1 -0
- package/dist/cli/commands/session/register.js +87 -0
- package/dist/cli/commands/session/register.js.map +1 -0
- package/dist/cli/commands/session/start.d.ts +12 -0
- package/dist/cli/commands/session/start.d.ts.map +1 -0
- package/dist/cli/commands/session/start.js +189 -0
- package/dist/cli/commands/session/start.js.map +1 -0
- package/dist/cli/commands/session/status.d.ts +12 -0
- package/dist/cli/commands/session/status.d.ts.map +1 -0
- package/dist/cli/commands/session/status.js +93 -0
- package/dist/cli/commands/session/status.js.map +1 -0
- package/dist/cli/commands/session/types.d.ts +179 -0
- package/dist/cli/commands/session/types.d.ts.map +1 -0
- package/dist/cli/commands/session/types.js +8 -0
- package/dist/cli/commands/session/types.js.map +1 -0
- package/dist/cli/commands/session/utils.d.ts +24 -0
- package/dist/cli/commands/session/utils.d.ts.map +1 -0
- package/dist/cli/commands/session/utils.js +72 -0
- package/dist/cli/commands/session/utils.js.map +1 -0
- package/dist/cli/commands/specs.d.ts +16 -0
- package/dist/cli/commands/specs.d.ts.map +1 -0
- package/dist/cli/commands/specs.js +212 -0
- package/dist/cli/commands/specs.js.map +1 -0
- package/dist/cli/commands/specs.types.d.ts +120 -0
- package/dist/cli/commands/specs.types.d.ts.map +1 -0
- package/dist/cli/commands/specs.types.js +75 -0
- package/dist/cli/commands/specs.types.js.map +1 -0
- package/dist/cli/commands/status.d.ts +17 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +271 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/status.types.d.ts +382 -0
- package/dist/cli/commands/status.types.d.ts.map +1 -0
- package/dist/cli/commands/status.types.js +166 -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 +181 -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 +65 -0
- package/dist/cli/commands/switch.types.js.map +1 -0
- package/dist/cli/commands/ticket/command.d.ts +14 -0
- package/dist/cli/commands/ticket/command.d.ts.map +1 -0
- package/dist/cli/commands/ticket/command.js +141 -0
- package/dist/cli/commands/ticket/command.js.map +1 -0
- package/dist/cli/commands/ticket/display.d.ts +56 -0
- package/dist/cli/commands/ticket/display.d.ts.map +1 -0
- package/dist/cli/commands/ticket/display.js +205 -0
- package/dist/cli/commands/ticket/display.js.map +1 -0
- package/dist/cli/commands/ticket/index.d.ts +11 -0
- package/dist/cli/commands/ticket/index.d.ts.map +1 -0
- package/dist/cli/commands/ticket/index.js +11 -0
- package/dist/cli/commands/ticket/index.js.map +1 -0
- package/dist/cli/commands/ticket/register.d.ts +11 -0
- package/dist/cli/commands/ticket/register.d.ts.map +1 -0
- package/dist/cli/commands/ticket/register.js +39 -0
- package/dist/cli/commands/ticket/register.js.map +1 -0
- package/dist/cli/commands/ticket/resolver.d.ts +16 -0
- package/dist/cli/commands/ticket/resolver.d.ts.map +1 -0
- package/dist/cli/commands/ticket/resolver.js +35 -0
- package/dist/cli/commands/ticket/resolver.js.map +1 -0
- package/dist/cli/commands/ticket/types.d.ts +157 -0
- package/dist/cli/commands/ticket/types.d.ts.map +1 -0
- package/dist/cli/commands/ticket/types.js +8 -0
- package/dist/cli/commands/ticket/types.js.map +1 -0
- package/dist/cli/commands/tickets.d.ts +16 -0
- package/dist/cli/commands/tickets.d.ts.map +1 -0
- package/dist/cli/commands/tickets.js +271 -0
- package/dist/cli/commands/tickets.js.map +1 -0
- package/dist/cli/commands/tickets.types.d.ts +202 -0
- package/dist/cli/commands/tickets.types.d.ts.map +1 -0
- package/dist/cli/commands/tickets.types.js +138 -0
- package/dist/cli/commands/tickets.types.js.map +1 -0
- package/dist/cli/config/index.d.ts +11 -0
- package/dist/cli/config/index.d.ts.map +1 -0
- package/dist/cli/config/index.js +11 -0
- package/dist/cli/config/index.js.map +1 -0
- package/dist/cli/config/loader.d.ts +98 -0
- package/dist/cli/config/loader.d.ts.map +1 -0
- package/dist/cli/config/loader.js +237 -0
- package/dist/cli/config/loader.js.map +1 -0
- package/dist/cli/config/paths.d.ts +96 -0
- package/dist/cli/config/paths.d.ts.map +1 -0
- package/dist/cli/config/paths.js +140 -0
- package/dist/cli/config/paths.js.map +1 -0
- package/dist/cli/config/types.d.ts +148 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +34 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/config/writer.d.ts +171 -0
- package/dist/cli/config/writer.d.ts.map +1 -0
- package/dist/cli/config/writer.js +312 -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 +183 -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 +190 -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 +209 -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 +6 -0
- package/dist/cli/middleware/index.js.map +1 -0
- package/dist/cli/templates/commands.d.ts +20 -0
- package/dist/cli/templates/commands.d.ts.map +1 -0
- package/dist/cli/templates/commands.js +174 -0
- package/dist/cli/templates/commands.js.map +1 -0
- package/dist/cli/templates/content/sf-autonomous.d.ts +7 -0
- package/dist/cli/templates/content/sf-autonomous.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-autonomous.js +78 -0
- package/dist/cli/templates/content/sf-autonomous.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 +68 -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 +78 -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 +64 -0
- package/dist/cli/templates/content/sf-context.js.map +1 -0
- package/dist/cli/templates/content/sf-create-epics.d.ts +7 -0
- package/dist/cli/templates/content/sf-create-epics.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-create-epics.js +70 -0
- package/dist/cli/templates/content/sf-create-epics.js.map +1 -0
- package/dist/cli/templates/content/sf-create-spec.d.ts +7 -0
- package/dist/cli/templates/content/sf-create-spec.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-create-spec.js +67 -0
- package/dist/cli/templates/content/sf-create-spec.js.map +1 -0
- package/dist/cli/templates/content/sf-create-tickets.d.ts +7 -0
- package/dist/cli/templates/content/sf-create-tickets.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-create-tickets.js +76 -0
- package/dist/cli/templates/content/sf-create-tickets.js.map +1 -0
- package/dist/cli/templates/content/sf-epic.d.ts +7 -0
- package/dist/cli/templates/content/sf-epic.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-epic.js +69 -0
- package/dist/cli/templates/content/sf-epic.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 +61 -0
- package/dist/cli/templates/content/sf-help.js.map +1 -0
- package/dist/cli/templates/content/sf-import.d.ts +7 -0
- package/dist/cli/templates/content/sf-import.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-import.js +88 -0
- package/dist/cli/templates/content/sf-import.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 +61 -0
- package/dist/cli/templates/content/sf-init.js.map +1 -0
- package/dist/cli/templates/content/sf-next.d.ts +7 -0
- package/dist/cli/templates/content/sf-next.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-next.js +67 -0
- package/dist/cli/templates/content/sf-next.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 +78 -0
- package/dist/cli/templates/content/sf-reset.js.map +1 -0
- package/dist/cli/templates/content/sf-review.d.ts +7 -0
- package/dist/cli/templates/content/sf-review.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-review.js +67 -0
- package/dist/cli/templates/content/sf-review.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 +64 -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 +67 -0
- package/dist/cli/templates/content/sf-status.js.map +1 -0
- package/dist/cli/templates/content/sf-ticket.d.ts +7 -0
- package/dist/cli/templates/content/sf-ticket.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-ticket.js +76 -0
- package/dist/cli/templates/content/sf-ticket.js.map +1 -0
- package/dist/cli/templates/content/sf-validate.d.ts +7 -0
- package/dist/cli/templates/content/sf-validate.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-validate.js +78 -0
- package/dist/cli/templates/content/sf-validate.js.map +1 -0
- package/dist/cli/templates/index.d.ts +7 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/index.js +7 -0
- package/dist/cli/templates/index.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 +81 -0
- package/dist/cli/ui/colors.js.map +1 -0
- package/dist/cli/ui/dashboard.d.ts +54 -0
- package/dist/cli/ui/dashboard.d.ts.map +1 -0
- package/dist/cli/ui/dashboard.js +339 -0
- package/dist/cli/ui/dashboard.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 +7 -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 +172 -0
- package/dist/cli/ui/output.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +105 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +148 -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 +173 -0
- package/dist/cli/ui/time.js.map +1 -0
- package/dist/lib/format.d.ts +4 -4
- package/dist/lib/format.js +5 -5
- package/dist/server.js +8 -8
- package/dist/server.js.map +1 -1
- package/dist/tools/core/session.js +6 -6
- package/dist/tools/core/session.js.map +1 -1
- package/dist/tools/index.js +9 -9
- package/dist/tools/index.js.map +1 -1
- package/dist/validation/index.js +1 -1
- package/dist/validation/index.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Login Command
|
|
3
|
+
*
|
|
4
|
+
* Authenticates users with their SpecForge API key.
|
|
5
|
+
* Supports both interactive (masked input) and non-interactive (--api-key flag) modes.
|
|
6
|
+
*/
|
|
7
|
+
import inquirer from 'inquirer';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import ora from 'ora';
|
|
10
|
+
import { saveGlobalConfig } from '../config/writer.js';
|
|
11
|
+
import { loadGlobalConfig } from '../config/loader.js';
|
|
12
|
+
import { validateApiKeyFormat } from '../middleware/auth-guard.js';
|
|
13
|
+
import { withErrorHandler, NetworkError, ValidationError } from '../middleware/error-handler.js';
|
|
14
|
+
import { printSuccess, printWarning, printHint, printBlank } from '../ui/output.js';
|
|
15
|
+
import { ApiClient } from '../../client/api-client.js';
|
|
16
|
+
import { CONFIG_DEFAULTS } from '../config/types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Prompt user for API key with masked input
|
|
19
|
+
*
|
|
20
|
+
* @returns Promise resolving to the entered API key
|
|
21
|
+
*/
|
|
22
|
+
async function promptForApiKey() {
|
|
23
|
+
const answers = await inquirer.prompt([
|
|
24
|
+
{
|
|
25
|
+
type: 'password',
|
|
26
|
+
name: 'apiKey',
|
|
27
|
+
message: 'Enter your API key:',
|
|
28
|
+
mask: '*',
|
|
29
|
+
validate: (input) => {
|
|
30
|
+
if (!input || input.trim() === '') {
|
|
31
|
+
return 'API key is required';
|
|
32
|
+
}
|
|
33
|
+
const validation = validateApiKeyFormat(input);
|
|
34
|
+
if (!validation.valid) {
|
|
35
|
+
return validation.error || 'Invalid API key format';
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
return answers.apiKey;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validate API key against the backend and retrieve user info
|
|
45
|
+
*
|
|
46
|
+
* @param apiKey - API key to validate
|
|
47
|
+
* @returns Promise resolving to user information
|
|
48
|
+
* @throws NetworkError if connection fails
|
|
49
|
+
* @throws ValidationError if API key is invalid
|
|
50
|
+
*/
|
|
51
|
+
async function validateApiKeyWithBackend(apiKey) {
|
|
52
|
+
const client = new ApiClient({
|
|
53
|
+
apiKey,
|
|
54
|
+
apiUrl: process.env.SPECFORGE_API_URL || CONFIG_DEFAULTS.apiUrl,
|
|
55
|
+
debug: process.env.SPECFORGE_DEBUG === 'true',
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
const result = await client.validateApiKey();
|
|
59
|
+
if (!result.valid) {
|
|
60
|
+
throw new ValidationError(result.message || 'API key validation failed', 'Make sure you copied the complete API key from SpecForge');
|
|
61
|
+
}
|
|
62
|
+
// Get user info - for now we'll use userId as identifier
|
|
63
|
+
// In a real implementation, the API would return user details
|
|
64
|
+
return {
|
|
65
|
+
email: result.userId || 'user',
|
|
66
|
+
userId: result.userId,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
// Handle specific error types
|
|
71
|
+
if (error instanceof ValidationError) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
// Network errors
|
|
76
|
+
if (message.includes('ENOTFOUND') || message.includes('ECONNREFUSED') || message.includes('fetch failed')) {
|
|
77
|
+
throw new NetworkError('Could not connect to SpecForge API', 'Check your internet connection and try again');
|
|
78
|
+
}
|
|
79
|
+
// Authentication errors
|
|
80
|
+
if (message.includes('401') || message.includes('Unauthorized')) {
|
|
81
|
+
throw new ValidationError('Invalid API key', 'Get a valid API key from https://specforge.com.br/settings/api-keys');
|
|
82
|
+
}
|
|
83
|
+
// Rate limiting
|
|
84
|
+
if (message.includes('429') || message.includes('rate limit')) {
|
|
85
|
+
throw new NetworkError('Rate limit exceeded', 'Wait a moment and try again');
|
|
86
|
+
}
|
|
87
|
+
// Unknown errors
|
|
88
|
+
throw new NetworkError(`API error: ${message}`, 'If the problem persists, check https://status.specforge.com');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Login command implementation
|
|
93
|
+
*
|
|
94
|
+
* @param options - Command options
|
|
95
|
+
*/
|
|
96
|
+
export async function loginAction(options) {
|
|
97
|
+
const existingConfig = loadGlobalConfig();
|
|
98
|
+
// Check if already logged in
|
|
99
|
+
if (existingConfig.apiKey && !options.force) {
|
|
100
|
+
printBlank();
|
|
101
|
+
printWarning('You are already authenticated.');
|
|
102
|
+
console.log(`Use ${chalk.cyan('specforge-mcp login --force')} to re-authenticate with a different API key.`);
|
|
103
|
+
printBlank();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Header
|
|
107
|
+
printBlank();
|
|
108
|
+
console.log(chalk.bold('SpecForge Authentication'));
|
|
109
|
+
console.log(chalk.gray('─'.repeat(24)));
|
|
110
|
+
printBlank();
|
|
111
|
+
// Get API key
|
|
112
|
+
let apiKey;
|
|
113
|
+
if (options.apiKey) {
|
|
114
|
+
// Non-interactive mode
|
|
115
|
+
apiKey = options.apiKey;
|
|
116
|
+
// Validate format first
|
|
117
|
+
const formatValidation = validateApiKeyFormat(apiKey);
|
|
118
|
+
if (!formatValidation.valid) {
|
|
119
|
+
throw new ValidationError(formatValidation.error || 'Invalid API key format', 'API key should start with "sf_live_" and be at least 28 characters');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Interactive mode - prompt for API key
|
|
124
|
+
console.log(chalk.gray('Get your API key from: ') + chalk.cyan.underline('https://specforge.com.br/settings/api-keys'));
|
|
125
|
+
printBlank();
|
|
126
|
+
apiKey = await promptForApiKey();
|
|
127
|
+
}
|
|
128
|
+
// Validate against backend
|
|
129
|
+
const spinner = ora({
|
|
130
|
+
text: 'Validating API key...',
|
|
131
|
+
color: 'cyan',
|
|
132
|
+
}).start();
|
|
133
|
+
try {
|
|
134
|
+
const userInfo = await validateApiKeyWithBackend(apiKey);
|
|
135
|
+
spinner.succeed(`Authenticated as ${chalk.cyan(userInfo.email)}`);
|
|
136
|
+
// Save to global config
|
|
137
|
+
saveGlobalConfig({ apiKey });
|
|
138
|
+
printBlank();
|
|
139
|
+
printSuccess('API key saved to ~/.specforge/config.json');
|
|
140
|
+
printBlank();
|
|
141
|
+
// Next steps
|
|
142
|
+
console.log(chalk.bold('Next steps:'));
|
|
143
|
+
printHint('specforge-mcp init', 'initialize SpecForge in your project');
|
|
144
|
+
printHint('specforge-mcp status', 'check your current configuration');
|
|
145
|
+
printBlank();
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
spinner.fail('Authentication failed');
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Register login command with Commander
|
|
154
|
+
*
|
|
155
|
+
* @param program - Commander program instance
|
|
156
|
+
*/
|
|
157
|
+
export function registerLoginCommand(program) {
|
|
158
|
+
program
|
|
159
|
+
.command('login')
|
|
160
|
+
.description('Authenticate with SpecForge API')
|
|
161
|
+
.option('--api-key <key>', 'Provide API key non-interactively (for CI/scripts)')
|
|
162
|
+
.option('-f, --force', 'Overwrite existing authentication')
|
|
163
|
+
.addHelpText('after', `
|
|
164
|
+
Examples:
|
|
165
|
+
$ specforge-mcp login # Interactive login (recommended)
|
|
166
|
+
$ specforge-mcp login --api-key <key> # Non-interactive login
|
|
167
|
+
$ specforge-mcp login --force # Re-authenticate with new key
|
|
168
|
+
|
|
169
|
+
Get your API key:
|
|
170
|
+
https://specforge.com.br/settings/api-keys
|
|
171
|
+
`)
|
|
172
|
+
.action(withErrorHandler(loginAction));
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAwBrD;;;;GAIG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,qBAAqB;YAC9B,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBAClC,OAAO,qBAAqB,CAAC;gBAC/B,CAAC;gBAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,UAAU,CAAC,KAAK,IAAI,wBAAwB,CAAC;gBACtD,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC;SACF;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,yBAAyB,CAAC,MAAc;IACrD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,eAAe,CAAC,MAAM;QAC/D,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;KAC9C,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CACvB,MAAM,CAAC,OAAO,IAAI,2BAA2B,EAC7C,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,8DAA8D;QAC9D,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM;YAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,8BAA8B;QAC9B,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvE,iBAAiB;QACjB,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1G,MAAM,IAAI,YAAY,CACpB,oCAAoC,EACpC,8CAA8C,CAC/C,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,eAAe,CACvB,iBAAiB,EACjB,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,YAAY,CACpB,qBAAqB,EACrB,6BAA6B,CAC9B,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,IAAI,YAAY,CACpB,cAAc,OAAO,EAAE,EACvB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAqB;IACrD,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;IAE1C,6BAA6B;IAC7B,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5C,UAAU,EAAE,CAAC;QACb,YAAY,CAAC,gCAAgC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,+CAA+C,CAChG,CAAC;QACF,UAAU,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,SAAS;IACT,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,UAAU,EAAE,CAAC;IAEb,cAAc;IACd,IAAI,MAAc,CAAC;IAEnB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,uBAAuB;QACvB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAExB,wBAAwB;QACxB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,eAAe,CACvB,gBAAgB,CAAC,KAAK,IAAI,wBAAwB,EAClD,oEAAoE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,wCAAwC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxH,UAAU,EAAE,CAAC;QAEb,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACnC,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,MAAM;KACd,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAEzD,OAAO,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAElE,wBAAwB;QACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7B,UAAU,EAAE,CAAC;QACb,YAAY,CAAC,2CAA2C,CAAC,CAAC;QAC1D,UAAU,EAAE,CAAC;QAEb,aAAa;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,SAAS,CAAC,oBAAoB,EAAE,sCAAsC,CAAC,CAAC;QACxE,SAAS,CAAC,sBAAsB,EAAE,kCAAkC,CAAC,CAAC;QACtE,UAAU,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,iBAAiB,EAAE,oDAAoD,CAAC;SAC/E,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;SAC1D,WAAW,CAAC,OAAO,EAAE;;;;;;;;CAQzB,CAAC;SACG,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next Command
|
|
3
|
+
*
|
|
4
|
+
* Displays the next actionable ticket with full details.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { NextOptions } from './next.types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Next command action handler
|
|
10
|
+
*/
|
|
11
|
+
export declare function nextAction(options: NextOptions): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Register next command with Commander
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerNextCommand(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=next.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,OAAO,EACL,WAAW,EAQZ,MAAM,iBAAiB,CAAC;AAoLzB;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyB1D"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next Command
|
|
3
|
+
*
|
|
4
|
+
* Displays the next actionable ticket with full details.
|
|
5
|
+
*/
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import { resolveConfig } from '../config/index.js';
|
|
8
|
+
import { withErrorHandler, CliError, NetworkError } from '../middleware/error-handler.js';
|
|
9
|
+
import { printBlank } from '../ui/output.js';
|
|
10
|
+
import { colors } from '../ui/colors.js';
|
|
11
|
+
import { ApiClient } from '../../client/api-client.js';
|
|
12
|
+
import { formatTicketId, wrapText, areDependenciesSatisfied, formatDependenciesStatus, TICKET_CARD_WIDTH, } from './next.types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Get chalk color function for priority
|
|
15
|
+
*/
|
|
16
|
+
function getPriorityColorFn(priority) {
|
|
17
|
+
switch (priority) {
|
|
18
|
+
case 'critical':
|
|
19
|
+
return colors.error;
|
|
20
|
+
case 'high':
|
|
21
|
+
return colors.warning;
|
|
22
|
+
case 'medium':
|
|
23
|
+
return colors.primary;
|
|
24
|
+
case 'low':
|
|
25
|
+
return colors.muted;
|
|
26
|
+
default:
|
|
27
|
+
return (s) => s;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get chalk color function for complexity
|
|
32
|
+
*/
|
|
33
|
+
function getComplexityColorFn(complexity) {
|
|
34
|
+
switch (complexity) {
|
|
35
|
+
case 'trivial':
|
|
36
|
+
return colors.muted;
|
|
37
|
+
case 'low':
|
|
38
|
+
return colors.success;
|
|
39
|
+
case 'medium':
|
|
40
|
+
return colors.primary;
|
|
41
|
+
case 'high':
|
|
42
|
+
return colors.warning;
|
|
43
|
+
case 'complex':
|
|
44
|
+
return colors.error;
|
|
45
|
+
default:
|
|
46
|
+
return (s) => s;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Display full ticket card with box drawing
|
|
51
|
+
*/
|
|
52
|
+
function displayTicketCard(ticket) {
|
|
53
|
+
const width = TICKET_CARD_WIDTH;
|
|
54
|
+
const border = '─'.repeat(width);
|
|
55
|
+
const innerWidth = width - 2;
|
|
56
|
+
printBlank();
|
|
57
|
+
// Top border and title
|
|
58
|
+
console.log(`┌${border}┐`);
|
|
59
|
+
const titleLine = `${formatTicketId(ticket.ticketNumber)}: ${ticket.title}`;
|
|
60
|
+
const truncatedTitle = titleLine.length > innerWidth
|
|
61
|
+
? titleLine.slice(0, innerWidth - 3) + '...'
|
|
62
|
+
: titleLine;
|
|
63
|
+
console.log(`│ ${colors.bold(truncatedTitle).padEnd(innerWidth + 10)} │`);
|
|
64
|
+
console.log(`├${border}┤`);
|
|
65
|
+
// Priority and Complexity row
|
|
66
|
+
const priorityColor = getPriorityColorFn(ticket.priority);
|
|
67
|
+
const priorityText = `Priority: ${priorityColor(ticket.priority)}`;
|
|
68
|
+
let complexityText = '';
|
|
69
|
+
if (ticket.complexity) {
|
|
70
|
+
const complexityColor = getComplexityColorFn(ticket.complexity);
|
|
71
|
+
complexityText = `Complexity: ${complexityColor(ticket.complexity)}`;
|
|
72
|
+
}
|
|
73
|
+
const row1Left = priorityText.padEnd(28);
|
|
74
|
+
const row1Right = complexityText;
|
|
75
|
+
console.log(`│ ${row1Left} ${row1Right.padEnd(innerWidth - 29)} │`);
|
|
76
|
+
// Estimated hours and Dependencies row
|
|
77
|
+
let estimatedText = '';
|
|
78
|
+
if (ticket.estimatedHours) {
|
|
79
|
+
estimatedText = `Estimated: ${ticket.estimatedHours}h`;
|
|
80
|
+
}
|
|
81
|
+
const depsStatus = formatDependenciesStatus(ticket.dependencies);
|
|
82
|
+
const depsSatisfied = areDependenciesSatisfied(ticket.dependencies);
|
|
83
|
+
const depsColorFn = depsSatisfied ? colors.success : colors.warning;
|
|
84
|
+
const depsDisplay = depsStatus === 'none'
|
|
85
|
+
? colors.muted(depsStatus)
|
|
86
|
+
: depsColorFn(depsStatus);
|
|
87
|
+
const depsText = `Dependencies: ${depsDisplay}`;
|
|
88
|
+
const row2Left = estimatedText.padEnd(28);
|
|
89
|
+
console.log(`│ ${row2Left} ${depsText.padEnd(innerWidth - 19)} │`);
|
|
90
|
+
// Epic info if available
|
|
91
|
+
if (ticket.epicTitle) {
|
|
92
|
+
console.log(`│ Epic: ${colors.muted(ticket.epicTitle).padEnd(innerWidth + 4)} │`);
|
|
93
|
+
}
|
|
94
|
+
console.log(`├${border}┤`);
|
|
95
|
+
// Description
|
|
96
|
+
if (ticket.description) {
|
|
97
|
+
console.log(`│ ${colors.muted('Description:').padEnd(innerWidth + 10)} │`);
|
|
98
|
+
const descLines = wrapText(ticket.description, innerWidth - 1);
|
|
99
|
+
for (const line of descLines.slice(0, 5)) { // Limit to 5 lines
|
|
100
|
+
console.log(`│ ${line.padEnd(innerWidth)} │`);
|
|
101
|
+
}
|
|
102
|
+
if (descLines.length > 5) {
|
|
103
|
+
console.log(`│ ${colors.muted('...').padEnd(innerWidth)} │`);
|
|
104
|
+
}
|
|
105
|
+
console.log(`├${border}┤`);
|
|
106
|
+
}
|
|
107
|
+
// Acceptance Criteria
|
|
108
|
+
if (ticket.acceptanceCriteria && ticket.acceptanceCriteria.length > 0) {
|
|
109
|
+
console.log(`│ ${colors.muted('Acceptance Criteria:').padEnd(innerWidth + 10)} │`);
|
|
110
|
+
for (const criterion of ticket.acceptanceCriteria.slice(0, 8)) { // Limit to 8 items
|
|
111
|
+
const lines = wrapText(`□ ${criterion}`, innerWidth - 1);
|
|
112
|
+
for (const line of lines) {
|
|
113
|
+
console.log(`│ ${line.padEnd(innerWidth)} │`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (ticket.acceptanceCriteria.length > 8) {
|
|
117
|
+
console.log(`│ ${colors.muted(` ... and ${ticket.acceptanceCriteria.length - 8} more`).padEnd(innerWidth)} │`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Bottom border
|
|
121
|
+
console.log(`└${border}┘`);
|
|
122
|
+
printBlank();
|
|
123
|
+
console.log(colors.muted('Start working? Run: specforge-mcp session start'));
|
|
124
|
+
printBlank();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Display brief format (just ID and title)
|
|
128
|
+
*/
|
|
129
|
+
function displayBrief(ticket) {
|
|
130
|
+
printBlank();
|
|
131
|
+
console.log(`${formatTicketId(ticket.ticketNumber)} - ${ticket.title}`);
|
|
132
|
+
printBlank();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Format ticket as TOON
|
|
136
|
+
*/
|
|
137
|
+
function formatNextAsToon(ticket) {
|
|
138
|
+
const lines = ['@next'];
|
|
139
|
+
lines.push(` ${formatTicketId(ticket.ticketNumber)}`);
|
|
140
|
+
lines.push(` title: ${ticket.title}`);
|
|
141
|
+
lines.push(` priority: ${ticket.priority}`);
|
|
142
|
+
if (ticket.complexity) {
|
|
143
|
+
lines.push(` complexity: ${ticket.complexity}`);
|
|
144
|
+
}
|
|
145
|
+
if (ticket.estimatedHours) {
|
|
146
|
+
lines.push(` estimated: ${ticket.estimatedHours}h`);
|
|
147
|
+
}
|
|
148
|
+
lines.push(` dependencies: ${formatDependenciesStatus(ticket.dependencies)}`);
|
|
149
|
+
if (ticket.description) {
|
|
150
|
+
lines.push(` description: ${ticket.description.slice(0, 100)}${ticket.description.length > 100 ? '...' : ''}`);
|
|
151
|
+
}
|
|
152
|
+
if (ticket.acceptanceCriteria && ticket.acceptanceCriteria.length > 0) {
|
|
153
|
+
lines.push(' acceptanceCriteria:');
|
|
154
|
+
for (const criterion of ticket.acceptanceCriteria) {
|
|
155
|
+
lines.push(` - ${criterion}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Display empty state
|
|
162
|
+
*/
|
|
163
|
+
function displayEmptyState() {
|
|
164
|
+
printBlank();
|
|
165
|
+
console.log(colors.muted('No actionable tickets found.'));
|
|
166
|
+
console.log(colors.muted('All tickets may be completed, blocked, or in progress.'));
|
|
167
|
+
printBlank();
|
|
168
|
+
console.log(colors.muted('Check status with: specforge-mcp tickets'));
|
|
169
|
+
printBlank();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Next command action handler
|
|
173
|
+
*/
|
|
174
|
+
export async function nextAction(options) {
|
|
175
|
+
const config = resolveConfig();
|
|
176
|
+
if (!config.apiKey) {
|
|
177
|
+
throw new CliError('Not authenticated', 1, 'Run `specforge-mcp login` to authenticate first');
|
|
178
|
+
}
|
|
179
|
+
if (!config.specificationId) {
|
|
180
|
+
throw new CliError('No specification configured', 1, "Run 'specforge-mcp init' or 'specforge-mcp switch <spec-id>' to set a specification");
|
|
181
|
+
}
|
|
182
|
+
const spinner = ora({
|
|
183
|
+
text: 'Finding next actionable ticket...',
|
|
184
|
+
color: 'cyan',
|
|
185
|
+
}).start();
|
|
186
|
+
try {
|
|
187
|
+
const client = new ApiClient({
|
|
188
|
+
apiKey: config.apiKey,
|
|
189
|
+
apiUrl: config.apiUrl,
|
|
190
|
+
debug: config.debug,
|
|
191
|
+
});
|
|
192
|
+
// Get next actionable ticket (pending, not blocked, highest priority)
|
|
193
|
+
const listResponse = await client.call('list_tickets', {
|
|
194
|
+
specificationId: config.specificationId,
|
|
195
|
+
status: 'pending',
|
|
196
|
+
limit: 1,
|
|
197
|
+
});
|
|
198
|
+
const tickets = listResponse.tickets || [];
|
|
199
|
+
if (tickets.length === 0) {
|
|
200
|
+
spinner.stop();
|
|
201
|
+
displayEmptyState();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Get full ticket details
|
|
205
|
+
spinner.text = 'Loading ticket details...';
|
|
206
|
+
const ticketId = tickets[0].id;
|
|
207
|
+
const detailResponse = await client.call('get_ticket', {
|
|
208
|
+
ticketId,
|
|
209
|
+
});
|
|
210
|
+
spinner.stop();
|
|
211
|
+
const ticket = {
|
|
212
|
+
id: detailResponse.id,
|
|
213
|
+
ticketNumber: detailResponse.ticketNumber,
|
|
214
|
+
title: detailResponse.title,
|
|
215
|
+
description: detailResponse.description,
|
|
216
|
+
priority: detailResponse.priority,
|
|
217
|
+
complexity: detailResponse.complexity,
|
|
218
|
+
estimatedHours: detailResponse.estimatedHours,
|
|
219
|
+
acceptanceCriteria: detailResponse.acceptanceCriteria,
|
|
220
|
+
epicId: detailResponse.epicId,
|
|
221
|
+
};
|
|
222
|
+
// Output based on format
|
|
223
|
+
if (options.json) {
|
|
224
|
+
console.log(JSON.stringify(ticket, null, 2));
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (options.toon) {
|
|
228
|
+
console.log(formatNextAsToon(ticket));
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (options.brief) {
|
|
232
|
+
displayBrief(ticket);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// Default: full ticket card
|
|
236
|
+
displayTicketCard(ticket);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
spinner.fail('Failed to find next ticket');
|
|
240
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
241
|
+
if (message.includes('404') || message.includes('not found')) {
|
|
242
|
+
throw new CliError('Specification not found', 1, 'The configured specification may have been deleted. Run `specforge-mcp init` to select a new one.');
|
|
243
|
+
}
|
|
244
|
+
if (message.includes('401') || message.includes('Unauthorized')) {
|
|
245
|
+
throw new CliError('Authentication failed', 1, 'Your API key may be invalid. Run `specforge-mcp login` to re-authenticate');
|
|
246
|
+
}
|
|
247
|
+
throw new NetworkError(`Failed to find next ticket: ${message}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Register next command with Commander
|
|
252
|
+
*/
|
|
253
|
+
export function registerNextCommand(program) {
|
|
254
|
+
program
|
|
255
|
+
.command('next')
|
|
256
|
+
.description('Show the next actionable ticket')
|
|
257
|
+
.option('--json', 'Output as JSON')
|
|
258
|
+
.option('--toon', 'Output as TOON format')
|
|
259
|
+
.option('--brief', 'Show only title and ID')
|
|
260
|
+
.addHelpText('after', `
|
|
261
|
+
Examples:
|
|
262
|
+
$ specforge-mcp next # Show full ticket card
|
|
263
|
+
$ specforge-mcp next --brief # Show just ID and title
|
|
264
|
+
$ specforge-mcp next --json # Output as JSON
|
|
265
|
+
|
|
266
|
+
The next command finds the highest priority pending ticket that is not blocked.
|
|
267
|
+
It displays:
|
|
268
|
+
- Ticket number and title
|
|
269
|
+
- Priority and complexity
|
|
270
|
+
- Estimated hours
|
|
271
|
+
- Dependency status
|
|
272
|
+
- Description (truncated)
|
|
273
|
+
- Acceptance criteria
|
|
274
|
+
|
|
275
|
+
After reviewing, start working with: specforge-mcp session start
|
|
276
|
+
`)
|
|
277
|
+
.action(withErrorHandler(nextAction));
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=next.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"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"}
|