@specforge/mcp 2.0.10 → 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/index.js +3 -3
- package/dist/tools/index.js.map +1 -1
- package/package.json +9 -2
package/README.md
CHANGED
|
@@ -251,6 +251,330 @@ The SpecForge MCP server provides the following tool categories:
|
|
|
251
251
|
- `get_ticket_commits` - Get commits for a ticket
|
|
252
252
|
- `get_ticket_prs` - Get PRs for a ticket
|
|
253
253
|
|
|
254
|
+
## CLI Commands
|
|
255
|
+
|
|
256
|
+
The SpecForge MCP package includes a CLI for project configuration and management.
|
|
257
|
+
|
|
258
|
+
### Quick Reference
|
|
259
|
+
|
|
260
|
+
| Command | Description |
|
|
261
|
+
|---------|-------------|
|
|
262
|
+
| `login` | Authenticate with your API key |
|
|
263
|
+
| `init` | Initialize SpecForge in a project |
|
|
264
|
+
| `configure` | Configure output preferences |
|
|
265
|
+
| `doctor` | Diagnose configuration issues |
|
|
266
|
+
| `status` | Show specification status |
|
|
267
|
+
| `projects` | List accessible projects |
|
|
268
|
+
| `specs` | List specifications |
|
|
269
|
+
| `switch` | Switch project/specification context |
|
|
270
|
+
| `tickets` | List tickets |
|
|
271
|
+
| `ticket <id>` | Show ticket details |
|
|
272
|
+
| `next` | Get next actionable ticket |
|
|
273
|
+
| `blocked` | List blocked tickets |
|
|
274
|
+
| `session` | Show session status |
|
|
275
|
+
| `session start` | Start implementation session |
|
|
276
|
+
| `session end` | End current session |
|
|
277
|
+
| `call <tool>` | Directly call an MCP tool |
|
|
278
|
+
| `tools` | List available MCP tools |
|
|
279
|
+
| `test` | Test API connection |
|
|
280
|
+
| `whoami` | Show current user/config |
|
|
281
|
+
|
|
282
|
+
### Setup Commands
|
|
283
|
+
|
|
284
|
+
#### login
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
specforge-mcp login [--api-key <key>] [--force]
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Authenticate with the SpecForge API.
|
|
291
|
+
|
|
292
|
+
| Option | Description |
|
|
293
|
+
|--------|-------------|
|
|
294
|
+
| `--api-key <key>` | Provide API key non-interactively (for CI/scripts) |
|
|
295
|
+
| `-f, --force` | Overwrite existing authentication |
|
|
296
|
+
|
|
297
|
+
Examples:
|
|
298
|
+
```bash
|
|
299
|
+
specforge-mcp login # Interactive login
|
|
300
|
+
specforge-mcp login --api-key sf_live_xxx # Non-interactive
|
|
301
|
+
specforge-mcp login --force # Re-authenticate
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### init
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
specforge-mcp init [--project <id>] [--spec <id>] [--format <format>] [--force]
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Initialize SpecForge in the current directory.
|
|
311
|
+
|
|
312
|
+
| Option | Description |
|
|
313
|
+
|--------|-------------|
|
|
314
|
+
| `--project <id>` | Project ID (non-interactive mode) |
|
|
315
|
+
| `--spec <id>` | Specification ID (non-interactive mode) |
|
|
316
|
+
| `--format <format>` | Output format: json or toon |
|
|
317
|
+
| `-f, --force` | Overwrite existing configuration |
|
|
318
|
+
|
|
319
|
+
Creates:
|
|
320
|
+
- `.mcp.json` - Claude Code MCP server configuration
|
|
321
|
+
- `.specforge.json` - Project-specific settings
|
|
322
|
+
|
|
323
|
+
Examples:
|
|
324
|
+
```bash
|
|
325
|
+
specforge-mcp init # Interactive setup
|
|
326
|
+
specforge-mcp init --project proj_abc # Set project
|
|
327
|
+
specforge-mcp init --project proj_abc --spec spec_xyz --format toon
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
#### configure
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
specforge-mcp configure [--format <format>] [--project <id>]
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Configure default preferences.
|
|
337
|
+
|
|
338
|
+
#### doctor
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
specforge-mcp doctor [--json]
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Diagnose configuration and connection issues.
|
|
345
|
+
|
|
346
|
+
| Option | Description |
|
|
347
|
+
|--------|-------------|
|
|
348
|
+
| `--json` | Output as JSON for scripting |
|
|
349
|
+
|
|
350
|
+
Check categories:
|
|
351
|
+
- Configuration - Config files presence
|
|
352
|
+
- Authentication - API key format and validity
|
|
353
|
+
- Connection - API connectivity and response time
|
|
354
|
+
- Project Access - Access to configured project/specification
|
|
355
|
+
|
|
356
|
+
### Navigation Commands
|
|
357
|
+
|
|
358
|
+
#### switch
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
specforge-mcp switch [--project <id>] [--spec <id>]
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
Switch between projects or specifications.
|
|
365
|
+
|
|
366
|
+
#### projects
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
specforge-mcp projects [--json] [--toon]
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
List all accessible projects.
|
|
373
|
+
|
|
374
|
+
#### specs
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
specforge-mcp specs [--project <id>] [--status <status>] [--json]
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
List specifications for the current or specified project.
|
|
381
|
+
|
|
382
|
+
### Query Commands
|
|
383
|
+
|
|
384
|
+
#### status
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
specforge-mcp status [--spec <id>] [--json]
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Show current specification status with progress metrics.
|
|
391
|
+
|
|
392
|
+
#### tickets
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
specforge-mcp tickets [--epic <id>] [--status <status>] [--limit <n>] [--json]
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
List tickets for the current specification.
|
|
399
|
+
|
|
400
|
+
#### ticket
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
specforge-mcp ticket <id> [--json] [--context]
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
Show full details for a specific ticket.
|
|
407
|
+
|
|
408
|
+
| Option | Description |
|
|
409
|
+
|--------|-------------|
|
|
410
|
+
| `--json` | Output as JSON |
|
|
411
|
+
| `--context` | Include implementation context |
|
|
412
|
+
|
|
413
|
+
#### next
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
specforge-mcp next [--spec <id>] [--count <n>] [--json]
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
Get the next actionable tickets (dependencies satisfied).
|
|
420
|
+
|
|
421
|
+
#### blocked
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
specforge-mcp blocked [--spec <id>] [--json]
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
List blocked tickets with blocking reasons.
|
|
428
|
+
|
|
429
|
+
### Session Commands
|
|
430
|
+
|
|
431
|
+
#### session
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
specforge-mcp session [--json]
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
Show current implementation session status.
|
|
438
|
+
|
|
439
|
+
#### session start
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
specforge-mcp session start [specId] [--mode <mode>] [--max-tickets <n>] [--stop-on-failure] [--force]
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
Start a new implementation session.
|
|
446
|
+
|
|
447
|
+
| Option | Description |
|
|
448
|
+
|--------|-------------|
|
|
449
|
+
| `[specId]` | Target specification (uses current if omitted) |
|
|
450
|
+
| `--mode <mode>` | Session mode: single, autonomous, guided |
|
|
451
|
+
| `--max-tickets <n>` | Maximum tickets to process |
|
|
452
|
+
| `--stop-on-failure` | Stop on first failure |
|
|
453
|
+
| `--force` | End existing session and start new |
|
|
454
|
+
|
|
455
|
+
#### session end
|
|
456
|
+
|
|
457
|
+
```bash
|
|
458
|
+
specforge-mcp session end [--status <status>] [--summary <text>]
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
End the current implementation session.
|
|
462
|
+
|
|
463
|
+
| Option | Description |
|
|
464
|
+
|--------|-------------|
|
|
465
|
+
| `--status <status>` | End status: completed or aborted |
|
|
466
|
+
| `--summary <text>` | Custom session summary |
|
|
467
|
+
|
|
468
|
+
### Debug Commands
|
|
469
|
+
|
|
470
|
+
#### call
|
|
471
|
+
|
|
472
|
+
```bash
|
|
473
|
+
specforge-mcp call <tool> [--args <json>] [--format <format>] [--raw]
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
Directly call an MCP tool with JSON arguments.
|
|
477
|
+
|
|
478
|
+
Examples:
|
|
479
|
+
```bash
|
|
480
|
+
specforge-mcp call list_projects
|
|
481
|
+
specforge-mcp call get_ticket --args='{"ticketId":"abc123"}'
|
|
482
|
+
specforge-mcp call list_tickets --format toon
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
#### tools
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
specforge-mcp tools [--category <category>] [--search <query>] [--json]
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
List available MCP tools with optional filtering.
|
|
492
|
+
|
|
493
|
+
#### test
|
|
494
|
+
|
|
495
|
+
```bash
|
|
496
|
+
specforge-mcp test
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
Test API connection and authentication. Shows response time and user info.
|
|
500
|
+
|
|
501
|
+
#### whoami
|
|
502
|
+
|
|
503
|
+
```bash
|
|
504
|
+
specforge-mcp whoami [--json]
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
Show current user information and configuration settings.
|
|
508
|
+
|
|
509
|
+
### Configuration Files
|
|
510
|
+
|
|
511
|
+
| File | Location | Purpose |
|
|
512
|
+
|------|----------|---------|
|
|
513
|
+
| Global config | `~/.specforge/config.json` | API key, default format |
|
|
514
|
+
| Project config | `.specforge.json` | Project/spec IDs, format override |
|
|
515
|
+
| MCP config | `.mcp.json` | Claude Code integration |
|
|
516
|
+
|
|
517
|
+
Configuration priority (highest to lowest):
|
|
518
|
+
1. Environment variables
|
|
519
|
+
2. Project config (`.specforge.json`)
|
|
520
|
+
3. Global config (`~/.specforge/config.json`)
|
|
521
|
+
4. Default values
|
|
522
|
+
|
|
523
|
+
### Environment Variables
|
|
524
|
+
|
|
525
|
+
| Variable | Description |
|
|
526
|
+
|----------|-------------|
|
|
527
|
+
| `SPECFORGE_API_KEY` | API key (overrides config) |
|
|
528
|
+
| `SPECFORGE_API_URL` | API endpoint URL |
|
|
529
|
+
| `SPECFORGE_FORMAT` | Output format (json/toon) |
|
|
530
|
+
| `SPECFORGE_DEBUG` | Enable debug mode (true/false) |
|
|
531
|
+
|
|
532
|
+
### Exit Codes
|
|
533
|
+
|
|
534
|
+
| Code | Name | Description |
|
|
535
|
+
|------|------|-------------|
|
|
536
|
+
| 0 | SUCCESS | Successful execution |
|
|
537
|
+
| 1 | ERROR | General error |
|
|
538
|
+
| 2 | AUTH_ERROR | Authentication failed |
|
|
539
|
+
| 3 | CONFIG_ERROR | Configuration error |
|
|
540
|
+
| 4 | NETWORK_ERROR | Network/API error |
|
|
541
|
+
| 5 | NOT_FOUND | Resource not found |
|
|
542
|
+
| 6 | VALIDATION_ERROR | Input validation error |
|
|
543
|
+
|
|
544
|
+
### Automation & CI/CD
|
|
545
|
+
|
|
546
|
+
Non-interactive usage for scripts:
|
|
547
|
+
|
|
548
|
+
```bash
|
|
549
|
+
# Authenticate via environment or flag
|
|
550
|
+
export SPECFORGE_API_KEY="sf_live_xxx"
|
|
551
|
+
specforge-mcp login --api-key $SPECFORGE_API_KEY
|
|
552
|
+
|
|
553
|
+
# Initialize non-interactively
|
|
554
|
+
specforge-mcp init --project $PROJECT_ID --spec $SPEC_ID --format json --force
|
|
555
|
+
|
|
556
|
+
# Check health (exits 1 on failure)
|
|
557
|
+
specforge-mcp doctor --json
|
|
558
|
+
|
|
559
|
+
# Get tickets as JSON for processing
|
|
560
|
+
specforge-mcp tickets --json | jq '.[]'
|
|
561
|
+
|
|
562
|
+
# Get next actionable ticket ID
|
|
563
|
+
specforge-mcp next --json | jq -r '.tickets[0].id'
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### Global Options
|
|
567
|
+
|
|
568
|
+
These options work with any command:
|
|
569
|
+
|
|
570
|
+
| Option | Description |
|
|
571
|
+
|--------|-------------|
|
|
572
|
+
| `--debug` | Enable debug output |
|
|
573
|
+
| `--no-color` | Disable colored output |
|
|
574
|
+
| `--json` | Output in JSON format |
|
|
575
|
+
| `-v, --version` | Show version |
|
|
576
|
+
| `-h, --help` | Show command help |
|
|
577
|
+
|
|
254
578
|
## Troubleshooting
|
|
255
579
|
|
|
256
580
|
### "SPECFORGE_API_KEY environment variable is required"
|
package/bin/specforge-mcp
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* SpecForge MCP CLI Entry Point
|
|
5
|
+
*
|
|
6
|
+
* All logic is handled by the CLI module.
|
|
7
|
+
* The 'serve' command is set as default in Commander.js for backward compatibility.
|
|
8
|
+
*
|
|
9
|
+
* When called with no arguments: starts MCP server
|
|
10
|
+
* When called with subcommands/flags: runs CLI
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import('../dist/cli/index.js')
|
|
14
|
+
.then(({ runCLI }) => runCLI())
|
|
15
|
+
.catch((error) => {
|
|
16
|
+
console.error('Fatal error:', error.message);
|
|
17
|
+
if (process.env.SPECFORGE_DEBUG === 'true') {
|
|
18
|
+
console.error(error.stack);
|
|
19
|
+
}
|
|
20
|
+
process.exit(1);
|
|
21
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blocked Command
|
|
3
|
+
*
|
|
4
|
+
* Lists all blocked tickets with their blocking dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { BlockedOptions } from './next.types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Blocked command action handler
|
|
10
|
+
*/
|
|
11
|
+
export declare function blockedAction(options: BlockedOptions): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Register blocked command with Commander
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerBlockedCommand(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=blocked.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocked.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/blocked.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,OAAO,EACL,cAAc,EAOf,MAAM,iBAAiB,CAAC;AA6FzB;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4H1E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B7D"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blocked Command
|
|
3
|
+
*
|
|
4
|
+
* Lists all blocked tickets with their blocking dependencies.
|
|
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, printHeader } from '../ui/output.js';
|
|
10
|
+
import { colors } from '../ui/colors.js';
|
|
11
|
+
import { ApiClient } from '../../client/api-client.js';
|
|
12
|
+
import { formatTicketId, truncateText, getTreePrefix, } from './next.types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Get chalk color function for status
|
|
15
|
+
*/
|
|
16
|
+
function getStatusColorFn(status) {
|
|
17
|
+
switch (status) {
|
|
18
|
+
case 'done':
|
|
19
|
+
return colors.success;
|
|
20
|
+
case 'in_progress':
|
|
21
|
+
return colors.primary;
|
|
22
|
+
case 'pending':
|
|
23
|
+
return colors.warning;
|
|
24
|
+
case 'blocked':
|
|
25
|
+
return colors.error;
|
|
26
|
+
default:
|
|
27
|
+
return (s) => s;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Display blocked tickets with tree visualization
|
|
32
|
+
*/
|
|
33
|
+
function displayBlockedTickets(tickets) {
|
|
34
|
+
printBlank();
|
|
35
|
+
printHeader('Blocked Tickets');
|
|
36
|
+
printBlank();
|
|
37
|
+
for (const ticket of tickets) {
|
|
38
|
+
// Ticket header
|
|
39
|
+
console.log(`${colors.error('●')} ${formatTicketId(ticket.ticketNumber)} - ${ticket.title}`);
|
|
40
|
+
// Blockers tree
|
|
41
|
+
for (let i = 0; i < ticket.blockedBy.length; i++) {
|
|
42
|
+
const blocker = ticket.blockedBy[i];
|
|
43
|
+
const isLast = i === ticket.blockedBy.length - 1;
|
|
44
|
+
const prefix = getTreePrefix(isLast);
|
|
45
|
+
const statusColor = getStatusColorFn(blocker.status);
|
|
46
|
+
const blockerTitle = truncateText(blocker.title, 35);
|
|
47
|
+
console.log(`${prefix} Blocked by: ${formatTicketId(blocker.ticketNumber)} ` +
|
|
48
|
+
`(${blockerTitle}) [${statusColor(blocker.status)}]`);
|
|
49
|
+
}
|
|
50
|
+
// Block reason if set
|
|
51
|
+
if (ticket.blockReason) {
|
|
52
|
+
console.log(colors.muted(` Reason: ${ticket.blockReason}`));
|
|
53
|
+
}
|
|
54
|
+
printBlank();
|
|
55
|
+
}
|
|
56
|
+
// Summary
|
|
57
|
+
const blockerCount = tickets.reduce((sum, t) => sum + t.blockedBy.length, 0);
|
|
58
|
+
console.log(colors.muted(`${tickets.length} blocked ticket${tickets.length !== 1 ? 's' : ''} | ${blockerCount} blocker${blockerCount !== 1 ? 's' : ''}`));
|
|
59
|
+
printBlank();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Display empty state (no blocked tickets)
|
|
63
|
+
*/
|
|
64
|
+
function displayEmptyState() {
|
|
65
|
+
printBlank();
|
|
66
|
+
console.log(colors.muted('No blocked tickets.'));
|
|
67
|
+
console.log(colors.success('✓ All tickets are ready to work on!'));
|
|
68
|
+
printBlank();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Format blocked tickets as TOON
|
|
72
|
+
*/
|
|
73
|
+
function formatBlockedAsToon(tickets) {
|
|
74
|
+
const lines = ['@blocked'];
|
|
75
|
+
for (const ticket of tickets) {
|
|
76
|
+
lines.push(` ${formatTicketId(ticket.ticketNumber)}`);
|
|
77
|
+
lines.push(` title: ${ticket.title}`);
|
|
78
|
+
if (ticket.blockedBy.length > 0) {
|
|
79
|
+
lines.push(' blockedBy:');
|
|
80
|
+
for (const blocker of ticket.blockedBy) {
|
|
81
|
+
lines.push(` - ${formatTicketId(blocker.ticketNumber)}: ${blocker.title} [${blocker.status}]`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (ticket.blockReason) {
|
|
85
|
+
lines.push(` reason: ${ticket.blockReason}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return lines.join('\n');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Blocked command action handler
|
|
92
|
+
*/
|
|
93
|
+
export async function blockedAction(options) {
|
|
94
|
+
const config = resolveConfig();
|
|
95
|
+
if (!config.apiKey) {
|
|
96
|
+
throw new CliError('Not authenticated', 1, 'Run `specforge-mcp login` to authenticate first');
|
|
97
|
+
}
|
|
98
|
+
if (!config.specificationId) {
|
|
99
|
+
throw new CliError('No specification configured', 1, "Run 'specforge-mcp init' or 'specforge-mcp switch <spec-id>' to set a specification");
|
|
100
|
+
}
|
|
101
|
+
const spinner = ora({
|
|
102
|
+
text: 'Fetching blocked tickets...',
|
|
103
|
+
color: 'cyan',
|
|
104
|
+
}).start();
|
|
105
|
+
try {
|
|
106
|
+
const client = new ApiClient({
|
|
107
|
+
apiKey: config.apiKey,
|
|
108
|
+
apiUrl: config.apiUrl,
|
|
109
|
+
debug: config.debug,
|
|
110
|
+
});
|
|
111
|
+
// Get blocked tickets
|
|
112
|
+
const listResponse = await client.call('list_tickets', {
|
|
113
|
+
specificationId: config.specificationId,
|
|
114
|
+
status: 'blocked',
|
|
115
|
+
});
|
|
116
|
+
const tickets = listResponse.tickets || [];
|
|
117
|
+
if (tickets.length === 0) {
|
|
118
|
+
spinner.stop();
|
|
119
|
+
displayEmptyState();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Enrich with blocker details
|
|
123
|
+
spinner.text = 'Loading blocker details...';
|
|
124
|
+
const blockedTickets = [];
|
|
125
|
+
for (const ticket of tickets) {
|
|
126
|
+
const blockers = [];
|
|
127
|
+
if (ticket.blockedBy && ticket.blockedBy.length > 0) {
|
|
128
|
+
for (const blockerId of ticket.blockedBy) {
|
|
129
|
+
try {
|
|
130
|
+
const blockerResponse = await client.call('get_ticket', {
|
|
131
|
+
ticketId: blockerId,
|
|
132
|
+
});
|
|
133
|
+
blockers.push({
|
|
134
|
+
id: blockerResponse.id,
|
|
135
|
+
ticketNumber: blockerResponse.ticketNumber,
|
|
136
|
+
title: blockerResponse.title,
|
|
137
|
+
status: blockerResponse.status,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// If we can't fetch blocker details, use placeholder
|
|
142
|
+
blockers.push({
|
|
143
|
+
id: blockerId,
|
|
144
|
+
ticketNumber: 0,
|
|
145
|
+
title: 'Unknown ticket',
|
|
146
|
+
status: 'pending',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
blockedTickets.push({
|
|
152
|
+
id: ticket.id,
|
|
153
|
+
ticketNumber: ticket.ticketNumber,
|
|
154
|
+
title: ticket.title,
|
|
155
|
+
blockedBy: blockers,
|
|
156
|
+
blockReason: ticket.blockReason,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
spinner.stop();
|
|
160
|
+
// Output based on format
|
|
161
|
+
if (options.json) {
|
|
162
|
+
console.log(JSON.stringify({ blockedTickets }, null, 2));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (options.toon) {
|
|
166
|
+
console.log(formatBlockedAsToon(blockedTickets));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Default: tree visualization
|
|
170
|
+
displayBlockedTickets(blockedTickets);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
spinner.fail('Failed to fetch blocked tickets');
|
|
174
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
175
|
+
if (message.includes('404') || message.includes('not found')) {
|
|
176
|
+
throw new CliError('Specification not found', 1, 'The configured specification may have been deleted. Run `specforge-mcp init` to select a new one.');
|
|
177
|
+
}
|
|
178
|
+
if (message.includes('401') || message.includes('Unauthorized')) {
|
|
179
|
+
throw new CliError('Authentication failed', 1, 'Your API key may be invalid. Run `specforge-mcp login` to re-authenticate');
|
|
180
|
+
}
|
|
181
|
+
throw new NetworkError(`Failed to fetch blocked tickets: ${message}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Register blocked command with Commander
|
|
186
|
+
*/
|
|
187
|
+
export function registerBlockedCommand(program) {
|
|
188
|
+
program
|
|
189
|
+
.command('blocked')
|
|
190
|
+
.description('Show blocked tickets and their blockers')
|
|
191
|
+
.option('--json', 'Output as JSON')
|
|
192
|
+
.option('--toon', 'Output as TOON format')
|
|
193
|
+
.addHelpText('after', `
|
|
194
|
+
Examples:
|
|
195
|
+
$ specforge-mcp blocked # Show blocked tickets with tree
|
|
196
|
+
$ specforge-mcp blocked --json # Output as JSON
|
|
197
|
+
|
|
198
|
+
The blocked command shows all tickets that are currently blocked,
|
|
199
|
+
along with the tickets that are blocking them.
|
|
200
|
+
|
|
201
|
+
For each blocked ticket, it displays:
|
|
202
|
+
- Ticket number and title
|
|
203
|
+
- List of blocking tickets with their status
|
|
204
|
+
- Block reason (if manually set)
|
|
205
|
+
|
|
206
|
+
The blocker status helps identify which blockers need attention:
|
|
207
|
+
${colors.success('done')} - Blocker is complete (may need status update)
|
|
208
|
+
${colors.primary('in_progress')} - Blocker is being worked on
|
|
209
|
+
${colors.warning('pending')} - Blocker not yet started
|
|
210
|
+
${colors.error('blocked')} - Blocker is also blocked (chain)
|
|
211
|
+
`)
|
|
212
|
+
.action(withErrorHandler(blockedAction));
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=blocked.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocked.js","sourceRoot":"","sources":["../../../src/cli/commands/blocked.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,OAAO,EAKL,cAAc,EACd,YAAY,EACZ,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAoB;IAC5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB;YACE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,OAAwB;IACrD,UAAU,EAAE,CAAC;IACb,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAC/B,UAAU,EAAE,CAAC;IAEb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAE7F,gBAAgB;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAErD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,gBAAgB,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG;gBAChE,IAAI,YAAY,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CACrD,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,UAAU,EAAE,CAAC;IACf,CAAC;IAED,UAAU;IACV,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,YAAY,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1J,UAAU,EAAE,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACnE,UAAU,EAAE,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAwB;IACnD,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,WAAW,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB;IACzD,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,EACnB,CAAC,EACD,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAChB,6BAA6B,EAC7B,CAAC,EACD,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,EAAE,6BAA6B;QACnC,KAAK,EAAE,MAAM;KACd,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAyB,cAAc,EAAE;YAC7E,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;QAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,iBAAiB,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,IAAI,GAAG,4BAA4B,CAAC;QAC5C,MAAM,cAAc,GAAoB,EAAE,CAAC;QAE3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAoB,EAAE,CAAC;YAErC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACzC,IAAI,CAAC;wBACH,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,IAAI,CAAuB,YAAY,EAAE;4BAC5E,QAAQ,EAAE,SAAS;yBACpB,CAAC,CAAC;wBACH,QAAQ,CAAC,IAAI,CAAC;4BACZ,EAAE,EAAE,eAAe,CAAC,EAAE;4BACtB,YAAY,EAAE,eAAe,CAAC,YAAY;4BAC1C,KAAK,EAAE,eAAe,CAAC,KAAK;4BAC5B,MAAM,EAAE,eAAe,CAAC,MAAM;yBAC/B,CAAC,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACP,qDAAqD;wBACrD,QAAQ,CAAC,IAAI,CAAC;4BACZ,EAAE,EAAE,SAAS;4BACb,YAAY,EAAE,CAAC;4BACf,KAAK,EAAE,gBAAgB;4BACvB,MAAM,EAAE,SAAS;yBAClB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,cAAc,CAAC,IAAI,CAAC;gBAClB,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAG,MAAc,CAAC,WAAW;aACzC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,yBAAyB;QACzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAExC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAEzE,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,QAAQ,CAChB,yBAAyB,EACzB,CAAC,EACD,mGAAmG,CACpG,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,QAAQ,CAChB,uBAAuB,EACvB,CAAC,EACD,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,YAAY,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;IActB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IACtB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;CAC1B,CAAC;SACG,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configure Command
|
|
3
|
+
*
|
|
4
|
+
* View and modify configuration values for global and project settings.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { ConfigureOptions } from './configure.types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Configure command action handler
|
|
10
|
+
*/
|
|
11
|
+
export declare function configureAction(key: string | undefined, value: string | undefined, options: ConfigureOptions): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Register configure command with Commander
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerConfigureCommand(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=configure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/configure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,OAAO,EACL,gBAAgB,EAMjB,MAAM,sBAAsB,CAAC;AA+K9B;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2B/D"}
|