@specforge/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +781 -0
- package/bin/specforge +21 -0
- package/dist/channel.d.ts +27 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +22 -0
- package/dist/channel.js.map +1 -0
- package/dist/cli/commands/configure.d.ts +16 -0
- package/dist/cli/commands/configure.d.ts.map +1 -0
- package/dist/cli/commands/configure.js +186 -0
- package/dist/cli/commands/configure.js.map +1 -0
- package/dist/cli/commands/configure.types.d.ts +110 -0
- package/dist/cli/commands/configure.types.d.ts.map +1 -0
- package/dist/cli/commands/configure.types.js +82 -0
- package/dist/cli/commands/configure.types.js.map +1 -0
- package/dist/cli/commands/debug/call.d.ts +14 -0
- package/dist/cli/commands/debug/call.d.ts.map +1 -0
- package/dist/cli/commands/debug/call.js +96 -0
- package/dist/cli/commands/debug/call.js.map +1 -0
- package/dist/cli/commands/debug/index.d.ts +12 -0
- package/dist/cli/commands/debug/index.d.ts.map +1 -0
- package/dist/cli/commands/debug/index.js +14 -0
- package/dist/cli/commands/debug/index.js.map +1 -0
- package/dist/cli/commands/debug/register.d.ts +11 -0
- package/dist/cli/commands/debug/register.d.ts.map +1 -0
- package/dist/cli/commands/debug/register.js +78 -0
- package/dist/cli/commands/debug/register.js.map +1 -0
- package/dist/cli/commands/debug/test.d.ts +13 -0
- package/dist/cli/commands/debug/test.d.ts.map +1 -0
- package/dist/cli/commands/debug/test.js +91 -0
- package/dist/cli/commands/debug/test.js.map +1 -0
- package/dist/cli/commands/debug/tools.d.ts +13 -0
- package/dist/cli/commands/debug/tools.d.ts.map +1 -0
- package/dist/cli/commands/debug/tools.js +86 -0
- package/dist/cli/commands/debug/tools.js.map +1 -0
- package/dist/cli/commands/debug/types.d.ts +119 -0
- package/dist/cli/commands/debug/types.d.ts.map +1 -0
- package/dist/cli/commands/debug/types.js +36 -0
- package/dist/cli/commands/debug/types.js.map +1 -0
- package/dist/cli/commands/debug/whoami.d.ts +13 -0
- package/dist/cli/commands/debug/whoami.d.ts.map +1 -0
- package/dist/cli/commands/debug/whoami.js +131 -0
- package/dist/cli/commands/debug/whoami.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +16 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +413 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/doctor.types.d.ts +180 -0
- package/dist/cli/commands/doctor.types.d.ts.map +1 -0
- package/dist/cli/commands/doctor.types.js +140 -0
- package/dist/cli/commands/doctor.types.js.map +1 -0
- package/dist/cli/commands/feedback.d.ts +27 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -0
- package/dist/cli/commands/feedback.js +262 -0
- package/dist/cli/commands/feedback.js.map +1 -0
- package/dist/cli/commands/feedback.types.d.ts +116 -0
- package/dist/cli/commands/feedback.types.d.ts.map +1 -0
- package/dist/cli/commands/feedback.types.js +65 -0
- package/dist/cli/commands/feedback.types.js.map +1 -0
- package/dist/cli/commands/index.d.ts +15 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +21 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +17 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +773 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/init.types.d.ts +193 -0
- package/dist/cli/commands/init.types.d.ts.map +1 -0
- package/dist/cli/commands/init.types.js +29 -0
- package/dist/cli/commands/init.types.js.map +1 -0
- package/dist/cli/commands/invitations.d.ts +31 -0
- package/dist/cli/commands/invitations.d.ts.map +1 -0
- package/dist/cli/commands/invitations.js +250 -0
- package/dist/cli/commands/invitations.js.map +1 -0
- package/dist/cli/commands/login.d.ts +40 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +139 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/members.d.ts +55 -0
- package/dist/cli/commands/members.d.ts.map +1 -0
- package/dist/cli/commands/members.js +296 -0
- package/dist/cli/commands/members.js.map +1 -0
- package/dist/cli/commands/scaffold/agent-types.d.ts +54 -0
- package/dist/cli/commands/scaffold/agent-types.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/agent-types.js +22 -0
- package/dist/cli/commands/scaffold/agent-types.js.map +1 -0
- package/dist/cli/commands/scaffold/display.d.ts +56 -0
- package/dist/cli/commands/scaffold/display.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/display.js +217 -0
- package/dist/cli/commands/scaffold/display.js.map +1 -0
- package/dist/cli/commands/scaffold/files.d.ts +99 -0
- package/dist/cli/commands/scaffold/files.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/files.js +122 -0
- package/dist/cli/commands/scaffold/files.js.map +1 -0
- package/dist/cli/commands/scaffold/index.d.ts +13 -0
- package/dist/cli/commands/scaffold/index.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/index.js +12 -0
- package/dist/cli/commands/scaffold/index.js.map +1 -0
- package/dist/cli/commands/scaffold/register.d.ts +11 -0
- package/dist/cli/commands/scaffold/register.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/register.js +11 -0
- package/dist/cli/commands/scaffold/register.js.map +1 -0
- package/dist/cli/commands/scaffold/scaffold.d.ts +11 -0
- package/dist/cli/commands/scaffold/scaffold.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/scaffold.js +728 -0
- package/dist/cli/commands/scaffold/scaffold.js.map +1 -0
- package/dist/cli/commands/scaffold/targets.d.ts +60 -0
- package/dist/cli/commands/scaffold/targets.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/targets.js +251 -0
- package/dist/cli/commands/scaffold/targets.js.map +1 -0
- package/dist/cli/commands/scaffold/types.d.ts +170 -0
- package/dist/cli/commands/scaffold/types.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/types.js +12 -0
- package/dist/cli/commands/scaffold/types.js.map +1 -0
- package/dist/cli/commands/scaffold/utils.d.ts +89 -0
- package/dist/cli/commands/scaffold/utils.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/utils.js +401 -0
- package/dist/cli/commands/scaffold/utils.js.map +1 -0
- package/dist/cli/commands/status.d.ts +19 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +124 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/status.types.d.ts +37 -0
- package/dist/cli/commands/status.types.d.ts.map +1 -0
- package/dist/cli/commands/status.types.js +7 -0
- package/dist/cli/commands/status.types.js.map +1 -0
- package/dist/cli/commands/switch.d.ts +18 -0
- package/dist/cli/commands/switch.d.ts.map +1 -0
- package/dist/cli/commands/switch.js +134 -0
- package/dist/cli/commands/switch.js.map +1 -0
- package/dist/cli/commands/switch.types.d.ts +123 -0
- package/dist/cli/commands/switch.types.d.ts.map +1 -0
- package/dist/cli/commands/switch.types.js +46 -0
- package/dist/cli/commands/switch.types.js.map +1 -0
- package/dist/cli/config/agent-teams.types.d.ts +120 -0
- package/dist/cli/config/agent-teams.types.d.ts.map +1 -0
- package/dist/cli/config/agent-teams.types.js +23 -0
- package/dist/cli/config/agent-teams.types.js.map +1 -0
- package/dist/cli/config/index.d.ts +13 -0
- package/dist/cli/config/index.d.ts.map +1 -0
- package/dist/cli/config/index.js +7 -0
- package/dist/cli/config/index.js.map +1 -0
- package/dist/cli/config/loader.d.ts +114 -0
- package/dist/cli/config/loader.d.ts.map +1 -0
- package/dist/cli/config/loader.js +198 -0
- package/dist/cli/config/loader.js.map +1 -0
- package/dist/cli/config/paths.d.ts +107 -0
- package/dist/cli/config/paths.d.ts.map +1 -0
- package/dist/cli/config/paths.js +79 -0
- package/dist/cli/config/paths.js.map +1 -0
- package/dist/cli/config/planning-sessions-registry.d.ts +52 -0
- package/dist/cli/config/planning-sessions-registry.d.ts.map +1 -0
- package/dist/cli/config/planning-sessions-registry.js +46 -0
- package/dist/cli/config/planning-sessions-registry.js.map +1 -0
- package/dist/cli/config/types.d.ts +186 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +27 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/config/validation.d.ts +62 -0
- package/dist/cli/config/validation.d.ts.map +1 -0
- package/dist/cli/config/validation.js +133 -0
- package/dist/cli/config/validation.js.map +1 -0
- package/dist/cli/config/writer.d.ts +153 -0
- package/dist/cli/config/writer.d.ts.map +1 -0
- package/dist/cli/config/writer.js +168 -0
- package/dist/cli/config/writer.js.map +1 -0
- package/dist/cli/index.d.ts +30 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +142 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/middleware/auth-guard.d.ts +107 -0
- package/dist/cli/middleware/auth-guard.d.ts.map +1 -0
- package/dist/cli/middleware/auth-guard.js +97 -0
- package/dist/cli/middleware/auth-guard.js.map +1 -0
- package/dist/cli/middleware/error-handler.d.ts +133 -0
- package/dist/cli/middleware/error-handler.d.ts.map +1 -0
- package/dist/cli/middleware/error-handler.js +139 -0
- package/dist/cli/middleware/error-handler.js.map +1 -0
- package/dist/cli/middleware/index.d.ts +6 -0
- package/dist/cli/middleware/index.d.ts.map +1 -0
- package/dist/cli/middleware/index.js +3 -0
- package/dist/cli/middleware/index.js.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +9 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +160 -0
- package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts +9 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +343 -0
- package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +9 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +254 -0
- package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts +8 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts.map +1 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.js +128 -0
- package/dist/cli/templates/agents/content/research/sfag-package-researcher.js.map +1 -0
- package/dist/cli/templates/agents/index.d.ts +23 -0
- package/dist/cli/templates/agents/index.d.ts.map +1 -0
- package/dist/cli/templates/agents/index.js +29 -0
- package/dist/cli/templates/agents/index.js.map +1 -0
- package/dist/cli/templates/commands.d.ts +17 -0
- package/dist/cli/templates/commands.d.ts.map +1 -0
- package/dist/cli/templates/commands.js +78 -0
- package/dist/cli/templates/commands.js.map +1 -0
- package/dist/cli/templates/content/sf-blockers.d.ts +7 -0
- package/dist/cli/templates/content/sf-blockers.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-blockers.js +69 -0
- package/dist/cli/templates/content/sf-blockers.js.map +1 -0
- package/dist/cli/templates/content/sf-commit.d.ts +7 -0
- package/dist/cli/templates/content/sf-commit.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-commit.js +79 -0
- package/dist/cli/templates/content/sf-commit.js.map +1 -0
- package/dist/cli/templates/content/sf-context.d.ts +7 -0
- package/dist/cli/templates/content/sf-context.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-context.js +63 -0
- package/dist/cli/templates/content/sf-context.js.map +1 -0
- package/dist/cli/templates/content/sf-help.d.ts +7 -0
- package/dist/cli/templates/content/sf-help.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-help.js +42 -0
- package/dist/cli/templates/content/sf-help.js.map +1 -0
- package/dist/cli/templates/content/sf-init.d.ts +7 -0
- package/dist/cli/templates/content/sf-init.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-init.js +62 -0
- package/dist/cli/templates/content/sf-init.js.map +1 -0
- package/dist/cli/templates/content/sf-reset.d.ts +7 -0
- package/dist/cli/templates/content/sf-reset.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-reset.js +67 -0
- package/dist/cli/templates/content/sf-reset.js.map +1 -0
- package/dist/cli/templates/content/sf-search.d.ts +7 -0
- package/dist/cli/templates/content/sf-search.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-search.js +63 -0
- package/dist/cli/templates/content/sf-search.js.map +1 -0
- package/dist/cli/templates/content/sf-status.d.ts +7 -0
- package/dist/cli/templates/content/sf-status.d.ts.map +1 -0
- package/dist/cli/templates/content/sf-status.js +62 -0
- package/dist/cli/templates/content/sf-status.js.map +1 -0
- package/dist/cli/templates/index.d.ts +8 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/index.js +17 -0
- package/dist/cli/templates/index.js.map +1 -0
- package/dist/cli/ui/banner.d.ts +38 -0
- package/dist/cli/ui/banner.d.ts.map +1 -0
- package/dist/cli/ui/banner.js +89 -0
- package/dist/cli/ui/banner.js.map +1 -0
- package/dist/cli/ui/colors.d.ts +76 -0
- package/dist/cli/ui/colors.d.ts.map +1 -0
- package/dist/cli/ui/colors.js +67 -0
- package/dist/cli/ui/colors.js.map +1 -0
- package/dist/cli/ui/index.d.ts +7 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/index.js +4 -0
- package/dist/cli/ui/index.js.map +1 -0
- package/dist/cli/ui/output.d.ts +117 -0
- package/dist/cli/ui/output.d.ts.map +1 -0
- package/dist/cli/ui/output.js +83 -0
- package/dist/cli/ui/output.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +120 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +158 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/time.d.ts +54 -0
- package/dist/cli/ui/time.d.ts.map +1 -0
- package/dist/cli/ui/time.js +119 -0
- package/dist/cli/ui/time.js.map +1 -0
- package/dist/client/api-client.d.ts +123 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +105 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/client/cli-client.d.ts +26 -0
- package/dist/client/cli-client.d.ts.map +1 -0
- package/dist/client/cli-client.js +20 -0
- package/dist/client/cli-client.js.map +1 -0
- package/dist/config/index.d.ts +78 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +79 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/format.d.ts +126 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +71 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/index.d.ts +11 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +45 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/monorepo-detector.d.ts +31 -0
- package/dist/lib/monorepo-detector.d.ts.map +1 -0
- package/dist/lib/monorepo-detector.js +188 -0
- package/dist/lib/monorepo-detector.js.map +1 -0
- package/dist/lib/prompt-generator.d.ts +65 -0
- package/dist/lib/prompt-generator.d.ts.map +1 -0
- package/dist/lib/prompt-generator.js +162 -0
- package/dist/lib/prompt-generator.js.map +1 -0
- package/dist/lib/strategy-analyzer.d.ts +59 -0
- package/dist/lib/strategy-analyzer.d.ts.map +1 -0
- package/dist/lib/strategy-analyzer.js +91 -0
- package/dist/lib/strategy-analyzer.js.map +1 -0
- package/dist/lib/workflow-definitions.d.ts +41 -0
- package/dist/lib/workflow-definitions.d.ts.map +1 -0
- package/dist/lib/workflow-definitions.js +497 -0
- package/dist/lib/workflow-definitions.js.map +1 -0
- package/dist/patterns/index.d.ts +9 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +21 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/inheritance.d.ts +193 -0
- package/dist/patterns/inheritance.d.ts.map +1 -0
- package/dist/patterns/inheritance.js +125 -0
- package/dist/patterns/inheritance.js.map +1 -0
- package/dist/server.d.ts +44 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +91 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/core/context-helper.d.ts +50 -0
- package/dist/tools/core/context-helper.d.ts.map +1 -0
- package/dist/tools/core/context-helper.js +49 -0
- package/dist/tools/core/context-helper.js.map +1 -0
- package/dist/tools/core/index.d.ts +2 -0
- package/dist/tools/core/index.d.ts.map +1 -0
- package/dist/tools/core/index.js +2 -0
- package/dist/tools/core/index.js.map +1 -0
- package/dist/tools/index.d.ts +58 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1499 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/transport/__tests__/resolve-endpoint.test.d.ts +6 -0
- package/dist/transport/__tests__/resolve-endpoint.test.d.ts.map +1 -0
- package/dist/transport/index.d.ts +6 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +5 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/interface.d.ts +25 -0
- package/dist/transport/interface.d.ts.map +1 -0
- package/dist/transport/interface.js +1 -0
- package/dist/transport/interface.js.map +1 -0
- package/dist/transport/remote.d.ts +38 -0
- package/dist/transport/remote.d.ts.map +1 -0
- package/dist/transport/remote.js +107 -0
- package/dist/transport/remote.js.map +1 -0
- package/dist/transport/resolve-endpoint.d.ts +58 -0
- package/dist/transport/resolve-endpoint.d.ts.map +1 -0
- package/dist/transport/resolve-endpoint.js +146 -0
- package/dist/transport/resolve-endpoint.js.map +1 -0
- package/dist/types/index.d.ts +212 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation/index.d.ts +86 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +392 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/ticket-validation.d.ts +162 -0
- package/dist/validation/ticket-validation.d.ts.map +1 -0
- package/dist/validation/ticket-validation.js +188 -0
- package/dist/validation/ticket-validation.js.map +1 -0
- package/package.json +69 -0
- package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +165 -0
- package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +348 -0
- package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +259 -0
- package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +132 -0
- package/src/cli/templates/agents/index.ts +47 -0
- package/src/cli/templates/commands.ts +90 -0
- package/src/cli/templates/content/sf-blockers.ts +71 -0
- package/src/cli/templates/content/sf-commit.ts +81 -0
- package/src/cli/templates/content/sf-context.ts +65 -0
- package/src/cli/templates/content/sf-help.ts +44 -0
- package/src/cli/templates/content/sf-init.ts +64 -0
- package/src/cli/templates/content/sf-reset.ts +69 -0
- package/src/cli/templates/content/sf-search.ts +65 -0
- package/src/cli/templates/content/sf-status.ts +64 -0
- package/src/cli/templates/index.ts +16 -0
- package/src/cli/templates/skills/specforge-conventions.md +114 -0
- package/src/cli/templates/skills/specforge-orchestrator.md +409 -0
- package/src/cli/templates/skills/specforge-validator.md +128 -0
- package/src/cli/templates/skills/specforge-worker.md +412 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const SF_STATUS_CONTENT = `# Implementation Status (SpecForge)
|
|
2
|
+
|
|
3
|
+
Display comprehensive implementation status with consolidated progress view.
|
|
4
|
+
|
|
5
|
+
## Arguments
|
|
6
|
+
- \`$ARGUMENTS\` - Optional: Specification ID to view status for
|
|
7
|
+
|
|
8
|
+
## Task
|
|
9
|
+
|
|
10
|
+
### 1. Get Specification Context
|
|
11
|
+
|
|
12
|
+
**Logic:**
|
|
13
|
+
\`\`\`typescript
|
|
14
|
+
// Read project config
|
|
15
|
+
const config = readFile('.specforge.json')
|
|
16
|
+
const specificationId = $ARGUMENTS || config.activeSpecification?.id
|
|
17
|
+
\`\`\`
|
|
18
|
+
|
|
19
|
+
### 2. Load Implementation Data
|
|
20
|
+
|
|
21
|
+
**MCP Calls:**
|
|
22
|
+
\`\`\`typescript
|
|
23
|
+
get_specification(specificationId)
|
|
24
|
+
list_epics({ specificationId })
|
|
25
|
+
list_tickets({ specificationId })
|
|
26
|
+
\`\`\`
|
|
27
|
+
|
|
28
|
+
### 3. Display Status Overview
|
|
29
|
+
|
|
30
|
+
**Output:**
|
|
31
|
+
\`\`\`
|
|
32
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
33
|
+
IMPLEMENTATION STATUS
|
|
34
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
35
|
+
Specification: {title}
|
|
36
|
+
Progress: {done}/{total} ({percentage}%)
|
|
37
|
+
|
|
38
|
+
EPICS
|
|
39
|
+
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
40
|
+
E{n} \u2502 {title} \u2502 {progress}% \u2502 {status}
|
|
41
|
+
|
|
42
|
+
READY TICKETS
|
|
43
|
+
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
44
|
+
E{n}-T{m} \u2502 {title} \u2502 {priority}
|
|
45
|
+
|
|
46
|
+
BLOCKED TICKETS
|
|
47
|
+
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
48
|
+
E{n}-T{m} \u2502 {title} \u2502 Blocked by: {dependencies}
|
|
49
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
50
|
+
|
|
51
|
+
Next: Run /sf-next to start implementation
|
|
52
|
+
\`\`\`
|
|
53
|
+
|
|
54
|
+
## Notes
|
|
55
|
+
- Shows overall progress and epic breakdown
|
|
56
|
+
- Lists ready and blocked tickets
|
|
57
|
+
- Use /sf-validate for system health check
|
|
58
|
+
`;
|
|
59
|
+
export {
|
|
60
|
+
SF_STATUS_CONTENT
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=sf-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/cli/templates/content/sf-status.ts"],"sourcesContent":["/**\n * SF-Status Command Template\n *\n * Template for displaying implementation status with consolidated tools.\n */\n\nexport const SF_STATUS_CONTENT = `# Implementation Status (SpecForge)\n\nDisplay comprehensive implementation status with consolidated progress view.\n\n## Arguments\n- \\`$ARGUMENTS\\` - Optional: Specification ID to view status for\n\n## Task\n\n### 1. Get Specification Context\n\n**Logic:**\n\\`\\`\\`typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\\`\\`\\`\n\n### 2. Load Implementation Data\n\n**MCP Calls:**\n\\`\\`\\`typescript\nget_specification(specificationId)\nlist_epics({ specificationId })\nlist_tickets({ specificationId })\n\\`\\`\\`\n\n### 3. Display Status Overview\n\n**Output:**\n\\`\\`\\`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nIMPLEMENTATION STATUS\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nSpecification: {title}\nProgress: {done}/{total} ({percentage}%)\n\nEPICS\n─────────────────────────────────────────────────────────────────\nE{n} │ {title} │ {progress}% │ {status}\n\nREADY TICKETS\n─────────────────────────────────────────────────────────────────\nE{n}-T{m} │ {title} │ {priority}\n\nBLOCKED TICKETS\n─────────────────────────────────────────────────────────────────\nE{n}-T{m} │ {title} │ Blocked by: {dependencies}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nNext: Run /sf-next to start implementation\n\\`\\`\\`\n\n## Notes\n- Shows overall progress and epic breakdown\n- Lists ready and blocked tickets\n- Use /sf-validate for system health check\n`;\n"],"mappings":"AAMO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Templates Module
|
|
3
|
+
*
|
|
4
|
+
* Exports all template functions for command and agent scaffolding.
|
|
5
|
+
*/
|
|
6
|
+
export { getCommandTemplates, getCommandTemplate, getCommandsByCategory } from './commands.js';
|
|
7
|
+
export { getAgentTemplates, getAgentTemplate, getAgentsByCategory, getAgentNames, } from './agents/index.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAG/F,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,GACd,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getCommandTemplates, getCommandTemplate, getCommandsByCategory } from "./commands.js";
|
|
2
|
+
import {
|
|
3
|
+
getAgentTemplates,
|
|
4
|
+
getAgentTemplate,
|
|
5
|
+
getAgentsByCategory,
|
|
6
|
+
getAgentNames
|
|
7
|
+
} from "./agents/index.js";
|
|
8
|
+
export {
|
|
9
|
+
getAgentNames,
|
|
10
|
+
getAgentTemplate,
|
|
11
|
+
getAgentTemplates,
|
|
12
|
+
getAgentsByCategory,
|
|
13
|
+
getCommandTemplate,
|
|
14
|
+
getCommandTemplates,
|
|
15
|
+
getCommandsByCategory
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/templates/index.ts"],"sourcesContent":["/**\n * Templates Module\n *\n * Exports all template functions for command and agent scaffolding.\n */\n\n// Command templates\nexport { getCommandTemplates, getCommandTemplate, getCommandsByCategory } from './commands.js';\n\n// Agent templates\nexport {\n getAgentTemplates,\n getAgentTemplate,\n getAgentsByCategory,\n getAgentNames,\n} from './agents/index.js';\n"],"mappings":"AAOA,SAAS,qBAAqB,oBAAoB,6BAA6B;AAG/E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecForge CLI Banner
|
|
3
|
+
* Purple/Violet themed ASCII art matching brand identity
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* import { printBanner } from './banner.js'
|
|
7
|
+
* printBanner('figlet') // startup / --help
|
|
8
|
+
* printBanner('compact') // every command
|
|
9
|
+
*/
|
|
10
|
+
export declare const ANSI_RESET = "\u001B[0m";
|
|
11
|
+
export declare const ANSI_BOLD = "\u001B[1m";
|
|
12
|
+
export declare const ANSI_DIM = "\u001B[2m";
|
|
13
|
+
export declare const BRAND_PALETTE: {
|
|
14
|
+
readonly purpleDark: string;
|
|
15
|
+
readonly purple: string;
|
|
16
|
+
readonly violet: string;
|
|
17
|
+
readonly lilac: string;
|
|
18
|
+
readonly pink: string;
|
|
19
|
+
readonly gray: string;
|
|
20
|
+
readonly darkGray: string;
|
|
21
|
+
readonly white: string;
|
|
22
|
+
readonly g1: string;
|
|
23
|
+
readonly g2: string;
|
|
24
|
+
readonly g3: string;
|
|
25
|
+
readonly g4: string;
|
|
26
|
+
readonly g5: string;
|
|
27
|
+
readonly g6: string;
|
|
28
|
+
readonly g7: string;
|
|
29
|
+
readonly g8: string;
|
|
30
|
+
};
|
|
31
|
+
interface PrintBannerOptions {
|
|
32
|
+
noColor?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function printBanner(variant?: string, options?: PrintBannerOptions): void;
|
|
35
|
+
export declare function getBanner(variant?: string): string;
|
|
36
|
+
export declare function listVariants(): string[];
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/banner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,eAAO,MAAM,UAAU,cAAY,CAAC;AACpC,eAAO,MAAM,SAAS,cAAY,CAAC;AACnC,eAAO,MAAM,QAAQ,cAAY,CAAC;AAKlC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAkBhB,CAAC;AAuDX,UAAU,kBAAkB;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,MAAiB,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAQ9F;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,MAAiB,GAAG,MAAM,CAE5D;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
const fg = (code) => `\x1B[38;5;${code}m`;
|
|
3
|
+
const ANSI_RESET = "\x1B[0m";
|
|
4
|
+
const ANSI_BOLD = "\x1B[1m";
|
|
5
|
+
const ANSI_DIM = "\x1B[2m";
|
|
6
|
+
const RESET = ANSI_RESET;
|
|
7
|
+
const BOLD = ANSI_BOLD;
|
|
8
|
+
const BRAND_PALETTE = {
|
|
9
|
+
purpleDark: fg(54),
|
|
10
|
+
purple: fg(135),
|
|
11
|
+
violet: fg(141),
|
|
12
|
+
lilac: fg(183),
|
|
13
|
+
pink: fg(212),
|
|
14
|
+
gray: fg(245),
|
|
15
|
+
darkGray: fg(240),
|
|
16
|
+
white: fg(255),
|
|
17
|
+
// Gradient stops
|
|
18
|
+
g1: fg(93),
|
|
19
|
+
g2: fg(99),
|
|
20
|
+
g3: fg(105),
|
|
21
|
+
g4: fg(111),
|
|
22
|
+
g5: fg(129),
|
|
23
|
+
g6: fg(135),
|
|
24
|
+
g7: fg(141),
|
|
25
|
+
g8: fg(147)
|
|
26
|
+
};
|
|
27
|
+
const C = BRAND_PALETTE;
|
|
28
|
+
const require2 = createRequire(import.meta.url);
|
|
29
|
+
const VERSION = process.env.SPECFORGE_VERSION || require2("../../../package.json").version || "0.1.0";
|
|
30
|
+
const TAGLINE = "Forge specs into working software";
|
|
31
|
+
const banners = {
|
|
32
|
+
// ─── Emerald v2 outline + </> code symbol + FIGlet ───────
|
|
33
|
+
figlet: () => `
|
|
34
|
+
${C.g1} \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588${RESET}
|
|
35
|
+
${C.g1} \u2588\u2588 \u2588\u2588${RESET}
|
|
36
|
+
${C.g2} \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g1}____${RESET} ${C.g5}_____${RESET}
|
|
37
|
+
${C.g3} \u2588\u2588 \u2588\u2588 \u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g2}/ ___| _ __ ___ ___ ${C.g6}| ___|__ _ __ __ _ ___${RESET}
|
|
38
|
+
${C.g4} \u2588\u2588 \u2588\u2588 \u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g2}\\___ \\| '_ \\ / _ \\/ __|${C.g6}| |_ / _ \\| '__/ _\` |/ _ \\${RESET}
|
|
39
|
+
${C.g5} \u2588\u2588 \u2588\u2588 \u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g3}___) | |_) | __/ (__ ${C.g7}| _| (_) | | | (_| | __/${RESET}
|
|
40
|
+
${C.g6} \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g3}|____/| .__/ \\___|\\___${C.g7} |_| \\___/|_| \\__, |\\___|${RESET}
|
|
41
|
+
${C.g6} \u2588\u2588 \u2588\u2588${RESET} ${C.g4}|_|${RESET} ${C.g8}|___/${RESET}
|
|
42
|
+
${C.g6} \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588${RESET}
|
|
43
|
+
${C.darkGray} ${TAGLINE} v${VERSION}${RESET}
|
|
44
|
+
`,
|
|
45
|
+
// ─── Compact one-liner (for every command) ───────────────
|
|
46
|
+
compact: () => `
|
|
47
|
+
${C.violet}\u2B22${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}
|
|
48
|
+
`,
|
|
49
|
+
// ─── Sleek box ───────────────────────────────────────────
|
|
50
|
+
sleek: () => `
|
|
51
|
+
${C.purpleDark}\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557${RESET}
|
|
52
|
+
${C.purpleDark}\u2551${RESET} ${C.purpleDark}\u2551${RESET}
|
|
53
|
+
${C.purpleDark}\u2551${RESET} ${C.violet}\u2692${RESET} ${BOLD}${C.lilac}S P E C${C.violet}F O R G E${RESET} ${C.darkGray}v${VERSION}${RESET} ${C.purpleDark}\u2551${RESET}
|
|
54
|
+
${C.purpleDark}\u2551${RESET} ${C.darkGray}${TAGLINE}${RESET} ${C.purpleDark}\u2551${RESET}
|
|
55
|
+
${C.purpleDark}\u2551${RESET} ${C.purpleDark}\u2551${RESET}
|
|
56
|
+
${C.purpleDark}\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D${RESET}
|
|
57
|
+
`,
|
|
58
|
+
// ─── Diamond icon + text ─────────────────────────────────
|
|
59
|
+
diamond: () => `
|
|
60
|
+
${C.violet} \u25C6${RESET}
|
|
61
|
+
${C.violet} \u25C7${C.lilac}\u25C6${C.violet}\u25C7${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}
|
|
62
|
+
${C.violet} \u25C6${RESET} ${C.darkGray}${TAGLINE}${RESET}
|
|
63
|
+
`
|
|
64
|
+
};
|
|
65
|
+
function printBanner(variant = "figlet", options = {}) {
|
|
66
|
+
const noColor = options.noColor || process.env.NO_COLOR !== void 0 || !process.stdout.isTTY;
|
|
67
|
+
const bannerFn = banners[variant] || banners.figlet;
|
|
68
|
+
let output = bannerFn();
|
|
69
|
+
if (noColor) {
|
|
70
|
+
output = output.replace(/\x1b\[[0-9;]*m/g, "");
|
|
71
|
+
}
|
|
72
|
+
process.stdout.write(output);
|
|
73
|
+
}
|
|
74
|
+
function getBanner(variant = "figlet") {
|
|
75
|
+
return (banners[variant] || banners.figlet)();
|
|
76
|
+
}
|
|
77
|
+
function listVariants() {
|
|
78
|
+
return Object.keys(banners);
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
ANSI_BOLD,
|
|
82
|
+
ANSI_DIM,
|
|
83
|
+
ANSI_RESET,
|
|
84
|
+
BRAND_PALETTE,
|
|
85
|
+
getBanner,
|
|
86
|
+
listVariants,
|
|
87
|
+
printBanner
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/ui/banner.ts"],"sourcesContent":["/**\n * SpecForge CLI Banner\n * Purple/Violet themed ASCII art matching brand identity\n *\n * Usage:\n * import { printBanner } from './banner.js'\n * printBanner('figlet') // startup / --help\n * printBanner('compact') // every command\n */\n\nimport { createRequire } from 'node:module';\n\n// ─── ANSI 256-color helpers ───────────────────────────────\nconst fg = (code: number): string => `\\x1b[38;5;${code}m`;\nexport const ANSI_RESET = '\\x1b[0m';\nexport const ANSI_BOLD = '\\x1b[1m';\nexport const ANSI_DIM = '\\x1b[2m';\nconst RESET = ANSI_RESET;\nconst BOLD = ANSI_BOLD;\n\n// ─── Brand palette ────────────────────────────────────────\nexport const BRAND_PALETTE = {\n purpleDark: fg(54),\n purple: fg(135),\n violet: fg(141),\n lilac: fg(183),\n pink: fg(212),\n gray: fg(245),\n darkGray: fg(240),\n white: fg(255),\n // Gradient stops\n g1: fg(93),\n g2: fg(99),\n g3: fg(105),\n g4: fg(111),\n g5: fg(129),\n g6: fg(135),\n g7: fg(141),\n g8: fg(147),\n} as const;\n\nconst C = BRAND_PALETTE;\n\n// ─── Version ──────────────────────────────────────────────\nconst require = createRequire(import.meta.url);\nconst VERSION: string = process.env.SPECFORGE_VERSION || require('../../../package.json').version || '0.1.0';\nconst TAGLINE = 'Forge specs into working software';\n\n// ═══════════════════════════════════════════════════════════\n// BANNER VARIANTS\n// ═══════════════════════════════════════════════════════════\n\nconst banners: Record<string, () => string> = {\n // ─── Emerald v2 outline + </> code symbol + FIGlet ───────\n figlet: () => `\n${C.g1} █████████████████${RESET}\n${C.g1} ██ ██${RESET}\n${C.g2} ██ ██ ██ ██${RESET} ${C.g1}____${RESET} ${C.g5}_____${RESET}\n${C.g3} ██ ██ █ ██ ██${RESET} ${C.g2}/ ___| _ __ ___ ___ ${C.g6}| ___|__ _ __ __ _ ___${RESET}\n${C.g4} ██ ██ █ ██ ██${RESET} ${C.g2}\\\\___ \\\\| '_ \\\\ / _ \\\\/ __|${C.g6}| |_ / _ \\\\| '__/ _\\` |/ _ \\\\${RESET}\n${C.g5} ██ ██ █ ██ ██${RESET} ${C.g3}___) | |_) | __/ (__ ${C.g7}| _| (_) | | | (_| | __/${RESET}\n${C.g6} ██ ██ ██ ██${RESET} ${C.g3}|____/| .__/ \\\\___|\\\\___${C.g7} |_| \\\\___/|_| \\\\__, |\\\\___|${RESET}\n${C.g6} ██ ██${RESET} ${C.g4}|_|${RESET} ${C.g8}|___/${RESET}\n${C.g6} █████████████████${RESET}\n${C.darkGray} ${TAGLINE} v${VERSION}${RESET}\n`,\n\n // ─── Compact one-liner (for every command) ───────────────\n compact: () => `\n ${C.violet}⬢${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}\n`,\n\n // ─── Sleek box ───────────────────────────────────────────\n sleek: () => `\n ${C.purpleDark}╔══════════════════════════════════════════╗${RESET}\n ${C.purpleDark}║${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}║${RESET} ${C.violet}⚒${RESET} ${BOLD}${C.lilac}S P E C${C.violet}F O R G E${RESET} ${C.darkGray}v${VERSION}${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}║${RESET} ${C.darkGray}${TAGLINE}${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}║${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}╚══════════════════════════════════════════╝${RESET}\n`,\n\n // ─── Diamond icon + text ─────────────────────────────────\n diamond: () => `\n ${C.violet} ◆${RESET}\n ${C.violet} ◇${C.lilac}◆${C.violet}◇${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}\n ${C.violet} ◆${RESET} ${C.darkGray}${TAGLINE}${RESET}\n`,\n};\n\n// ═══════════════════════════════════════════════════════════\n// PUBLIC API\n// ═══════════════════════════════════════════════════════════\n\ninterface PrintBannerOptions {\n noColor?: boolean;\n}\n\nexport function printBanner(variant: string = 'figlet', options: PrintBannerOptions = {}): void {\n const noColor = options.noColor || process.env.NO_COLOR !== undefined || !process.stdout.isTTY;\n const bannerFn = banners[variant] || banners.figlet;\n let output = bannerFn();\n if (noColor) {\n output = output.replace(/\\x1b\\[[0-9;]*m/g, '');\n }\n process.stdout.write(output);\n}\n\nexport function getBanner(variant: string = 'figlet'): string {\n return (banners[variant] || banners.figlet)();\n}\n\nexport function listVariants(): string[] {\n return Object.keys(banners);\n}\n"],"mappings":"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","names":["require"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Color Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent color theming across the CLI.
|
|
5
|
+
* All colors are defined here to ensure visual consistency.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Brand colors for SpecForge CLI
|
|
9
|
+
*/
|
|
10
|
+
export declare const colors: {
|
|
11
|
+
/** Primary brand color - used for emphasis */
|
|
12
|
+
readonly primary: import("chalk").ChalkInstance;
|
|
13
|
+
/** Secondary color - used for less emphasis */
|
|
14
|
+
readonly secondary: import("chalk").ChalkInstance;
|
|
15
|
+
/** Success messages and indicators */
|
|
16
|
+
readonly success: import("chalk").ChalkInstance;
|
|
17
|
+
/** Warning messages */
|
|
18
|
+
readonly warning: import("chalk").ChalkInstance;
|
|
19
|
+
/** Error messages */
|
|
20
|
+
readonly error: import("chalk").ChalkInstance;
|
|
21
|
+
/** Muted/secondary text */
|
|
22
|
+
readonly muted: import("chalk").ChalkInstance;
|
|
23
|
+
/** Bold text */
|
|
24
|
+
readonly bold: import("chalk").ChalkInstance;
|
|
25
|
+
/** Underlined text (for URLs) */
|
|
26
|
+
readonly link: import("chalk").ChalkInstance;
|
|
27
|
+
/** Code/command styling */
|
|
28
|
+
readonly code: import("chalk").ChalkInstance;
|
|
29
|
+
/** Dimmed text for less important info */
|
|
30
|
+
readonly dim: import("chalk").ChalkInstance;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Semantic color functions for common use cases
|
|
34
|
+
*/
|
|
35
|
+
export declare const style: {
|
|
36
|
+
/** Style a command for display */
|
|
37
|
+
readonly command: (cmd: string) => string;
|
|
38
|
+
/** Style a URL for display */
|
|
39
|
+
readonly url: (url: string) => string;
|
|
40
|
+
/** Style a file path */
|
|
41
|
+
readonly path: (path: string) => string;
|
|
42
|
+
/** Style a key/label */
|
|
43
|
+
readonly label: (label: string) => string;
|
|
44
|
+
/** Style a value */
|
|
45
|
+
readonly value: (value: string) => string;
|
|
46
|
+
/** Style as success */
|
|
47
|
+
readonly ok: (text: string) => string;
|
|
48
|
+
/** Style as error */
|
|
49
|
+
readonly err: (text: string) => string;
|
|
50
|
+
/** Style as warning */
|
|
51
|
+
readonly warn: (text: string) => string;
|
|
52
|
+
/** Style as info */
|
|
53
|
+
readonly info: (text: string) => string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Status icons with colors
|
|
57
|
+
*/
|
|
58
|
+
export declare const icons: {
|
|
59
|
+
readonly success: string;
|
|
60
|
+
readonly error: string;
|
|
61
|
+
readonly warning: string;
|
|
62
|
+
readonly info: string;
|
|
63
|
+
readonly pending: string;
|
|
64
|
+
readonly running: string;
|
|
65
|
+
readonly arrow: string;
|
|
66
|
+
readonly bullet: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Check if terminal supports colors
|
|
70
|
+
*/
|
|
71
|
+
export declare function supportsColor(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Disable colors (for non-TTY or --no-color flag)
|
|
74
|
+
*/
|
|
75
|
+
export declare function disableColors(): void;
|
|
76
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/colors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB,8CAA8C;;IAG9C,+CAA+C;;IAG/C,sCAAsC;;IAGtC,uBAAuB;;IAGvB,qBAAqB;;IAGrB,2BAA2B;;IAG3B,gBAAgB;;IAGhB,iCAAiC;;IAGjC,2BAA2B;;IAG3B,0CAA0C;;CAElC,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,KAAK;IAChB,kCAAkC;4BACnB,MAAM;IAErB,8BAA8B;wBACnB,MAAM;IAEjB,wBAAwB;0BACX,MAAM;IAEnB,wBAAwB;4BACT,MAAM;IAErB,oBAAoB;4BACL,MAAM;IAErB,uBAAuB;wBACZ,MAAM;IAEjB,qBAAqB;yBACT,MAAM;IAElB,uBAAuB;0BACV,MAAM;IAEnB,oBAAoB;0BACP,MAAM;CACX,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;CASR,CAAC;AAEX;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
const colors = {
|
|
3
|
+
/** Primary brand color - used for emphasis */
|
|
4
|
+
primary: chalk.cyan,
|
|
5
|
+
/** Secondary color - used for less emphasis */
|
|
6
|
+
secondary: chalk.blue,
|
|
7
|
+
/** Success messages and indicators */
|
|
8
|
+
success: chalk.green,
|
|
9
|
+
/** Warning messages */
|
|
10
|
+
warning: chalk.yellow,
|
|
11
|
+
/** Error messages */
|
|
12
|
+
error: chalk.red,
|
|
13
|
+
/** Muted/secondary text */
|
|
14
|
+
muted: chalk.gray,
|
|
15
|
+
/** Bold text */
|
|
16
|
+
bold: chalk.bold,
|
|
17
|
+
/** Underlined text (for URLs) */
|
|
18
|
+
link: chalk.underline.cyan,
|
|
19
|
+
/** Code/command styling */
|
|
20
|
+
code: chalk.cyan,
|
|
21
|
+
/** Dimmed text for less important info */
|
|
22
|
+
dim: chalk.dim
|
|
23
|
+
};
|
|
24
|
+
const style = {
|
|
25
|
+
/** Style a command for display */
|
|
26
|
+
command: (cmd) => colors.code(cmd),
|
|
27
|
+
/** Style a URL for display */
|
|
28
|
+
url: (url) => colors.link(url),
|
|
29
|
+
/** Style a file path */
|
|
30
|
+
path: (path) => colors.muted(path),
|
|
31
|
+
/** Style a key/label */
|
|
32
|
+
label: (label) => colors.bold(label),
|
|
33
|
+
/** Style a value */
|
|
34
|
+
value: (value) => colors.primary(value),
|
|
35
|
+
/** Style as success */
|
|
36
|
+
ok: (text) => colors.success(text),
|
|
37
|
+
/** Style as error */
|
|
38
|
+
err: (text) => colors.error(text),
|
|
39
|
+
/** Style as warning */
|
|
40
|
+
warn: (text) => colors.warning(text),
|
|
41
|
+
/** Style as info */
|
|
42
|
+
info: (text) => colors.primary(text)
|
|
43
|
+
};
|
|
44
|
+
const icons = {
|
|
45
|
+
success: colors.success("\u2713"),
|
|
46
|
+
error: colors.error("\u2717"),
|
|
47
|
+
warning: colors.warning("\u26A0"),
|
|
48
|
+
info: colors.primary("\u2139"),
|
|
49
|
+
pending: colors.muted("\u25CB"),
|
|
50
|
+
running: colors.primary("\u25CF"),
|
|
51
|
+
arrow: colors.muted("\u2192"),
|
|
52
|
+
bullet: colors.muted("\u2022")
|
|
53
|
+
};
|
|
54
|
+
function supportsColor() {
|
|
55
|
+
return chalk.level > 0;
|
|
56
|
+
}
|
|
57
|
+
function disableColors() {
|
|
58
|
+
chalk.level = 0;
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
colors,
|
|
62
|
+
disableColors,
|
|
63
|
+
icons,
|
|
64
|
+
style,
|
|
65
|
+
supportsColor
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/ui/colors.ts"],"sourcesContent":["/**\n * Terminal Color Utilities\n *\n * Provides consistent color theming across the CLI.\n * All colors are defined here to ensure visual consistency.\n */\n\nimport chalk from 'chalk';\n\n/**\n * Brand colors for SpecForge CLI\n */\nexport const colors = {\n /** Primary brand color - used for emphasis */\n primary: chalk.cyan,\n\n /** Secondary color - used for less emphasis */\n secondary: chalk.blue,\n\n /** Success messages and indicators */\n success: chalk.green,\n\n /** Warning messages */\n warning: chalk.yellow,\n\n /** Error messages */\n error: chalk.red,\n\n /** Muted/secondary text */\n muted: chalk.gray,\n\n /** Bold text */\n bold: chalk.bold,\n\n /** Underlined text (for URLs) */\n link: chalk.underline.cyan,\n\n /** Code/command styling */\n code: chalk.cyan,\n\n /** Dimmed text for less important info */\n dim: chalk.dim,\n} as const;\n\n/**\n * Semantic color functions for common use cases\n */\nexport const style = {\n /** Style a command for display */\n command: (cmd: string) => colors.code(cmd),\n\n /** Style a URL for display */\n url: (url: string) => colors.link(url),\n\n /** Style a file path */\n path: (path: string) => colors.muted(path),\n\n /** Style a key/label */\n label: (label: string) => colors.bold(label),\n\n /** Style a value */\n value: (value: string) => colors.primary(value),\n\n /** Style as success */\n ok: (text: string) => colors.success(text),\n\n /** Style as error */\n err: (text: string) => colors.error(text),\n\n /** Style as warning */\n warn: (text: string) => colors.warning(text),\n\n /** Style as info */\n info: (text: string) => colors.primary(text),\n} as const;\n\n/**\n * Status icons with colors\n */\nexport const icons = {\n success: colors.success('✓'),\n error: colors.error('✗'),\n warning: colors.warning('⚠'),\n info: colors.primary('ℹ'),\n pending: colors.muted('○'),\n running: colors.primary('●'),\n arrow: colors.muted('→'),\n bullet: colors.muted('•'),\n} as const;\n\n/**\n * Check if terminal supports colors\n */\nexport function supportsColor(): boolean {\n return chalk.level > 0;\n}\n\n/**\n * Disable colors (for non-TTY or --no-color flag)\n */\nexport function disableColors(): void {\n chalk.level = 0;\n}\n"],"mappings":"AAOA,OAAO,WAAW;AAKX,MAAM,SAAS;AAAA;AAAA,EAEpB,SAAS,MAAM;AAAA;AAAA,EAGf,WAAW,MAAM;AAAA;AAAA,EAGjB,SAAS,MAAM;AAAA;AAAA,EAGf,SAAS,MAAM;AAAA;AAAA,EAGf,OAAO,MAAM;AAAA;AAAA,EAGb,OAAO,MAAM;AAAA;AAAA,EAGb,MAAM,MAAM;AAAA;AAAA,EAGZ,MAAM,MAAM,UAAU;AAAA;AAAA,EAGtB,MAAM,MAAM;AAAA;AAAA,EAGZ,KAAK,MAAM;AACb;AAKO,MAAM,QAAQ;AAAA;AAAA,EAEnB,SAAS,CAAC,QAAgB,OAAO,KAAK,GAAG;AAAA;AAAA,EAGzC,KAAK,CAAC,QAAgB,OAAO,KAAK,GAAG;AAAA;AAAA,EAGrC,MAAM,CAAC,SAAiB,OAAO,MAAM,IAAI;AAAA;AAAA,EAGzC,OAAO,CAAC,UAAkB,OAAO,KAAK,KAAK;AAAA;AAAA,EAG3C,OAAO,CAAC,UAAkB,OAAO,QAAQ,KAAK;AAAA;AAAA,EAG9C,IAAI,CAAC,SAAiB,OAAO,QAAQ,IAAI;AAAA;AAAA,EAGzC,KAAK,CAAC,SAAiB,OAAO,MAAM,IAAI;AAAA;AAAA,EAGxC,MAAM,CAAC,SAAiB,OAAO,QAAQ,IAAI;AAAA;AAAA,EAG3C,MAAM,CAAC,SAAiB,OAAO,QAAQ,IAAI;AAC7C;AAKO,MAAM,QAAQ;AAAA,EACnB,SAAS,OAAO,QAAQ,QAAG;AAAA,EAC3B,OAAO,OAAO,MAAM,QAAG;AAAA,EACvB,SAAS,OAAO,QAAQ,QAAG;AAAA,EAC3B,MAAM,OAAO,QAAQ,QAAG;AAAA,EACxB,SAAS,OAAO,MAAM,QAAG;AAAA,EACzB,SAAS,OAAO,QAAQ,QAAG;AAAA,EAC3B,OAAO,OAAO,MAAM,QAAG;AAAA,EACvB,QAAQ,OAAO,MAAM,QAAG;AAC1B;AAKO,SAAS,gBAAyB;AACvC,SAAO,MAAM,QAAQ;AACvB;AAKO,SAAS,gBAAsB;AACpC,QAAM,QAAQ;AAChB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/ui/index.ts"],"sourcesContent":["/**\n * CLI UI Utilities Module\n */\n\nexport * from './colors.js';\nexport * from './output.js';\nexport * from './spinner.js';\n"],"mappings":"AAIA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Formatting Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent output formatting for tables, lists, and structured data.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Print a labeled value
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* printField('Project', 'my-project');
|
|
11
|
+
* // Output: Project: my-project
|
|
12
|
+
*/
|
|
13
|
+
export declare function printField(label: string, value: string | null | undefined): void;
|
|
14
|
+
/**
|
|
15
|
+
* Print a section header
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* printHeader('Configuration');
|
|
19
|
+
* // Output:
|
|
20
|
+
* // Configuration
|
|
21
|
+
* // ─────────────
|
|
22
|
+
*/
|
|
23
|
+
export declare function printHeader(title: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Print a blank line
|
|
26
|
+
*/
|
|
27
|
+
export declare function printBlank(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Print a list of items
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* printList(['Item 1', 'Item 2', 'Item 3']);
|
|
33
|
+
* // Output:
|
|
34
|
+
* // • Item 1
|
|
35
|
+
* // • Item 2
|
|
36
|
+
* // • Item 3
|
|
37
|
+
*/
|
|
38
|
+
export declare function printList(items: string[], bullet?: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Print a success message
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* printSuccess('Configuration saved');
|
|
44
|
+
* // Output: ✓ Configuration saved
|
|
45
|
+
*/
|
|
46
|
+
export declare function printSuccess(message: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Print an error message
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* printError('Failed to connect');
|
|
52
|
+
* // Output: ✗ Failed to connect
|
|
53
|
+
*/
|
|
54
|
+
export declare function printError(message: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Print a warning message
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* printWarning('API key will expire soon');
|
|
60
|
+
* // Output: ⚠ API key will expire soon
|
|
61
|
+
*/
|
|
62
|
+
export declare function printWarning(message: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Print an info message
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* printInfo('Fetching data...');
|
|
68
|
+
* // Output: ℹ Fetching data...
|
|
69
|
+
*/
|
|
70
|
+
export declare function printInfo(message: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Print a key-value table
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* printTable({
|
|
76
|
+
* 'Project': 'my-project',
|
|
77
|
+
* 'Specification': 'v2.0',
|
|
78
|
+
* 'Status': 'active',
|
|
79
|
+
* });
|
|
80
|
+
*/
|
|
81
|
+
export declare function printTable(data: Record<string, string | null | undefined>): void;
|
|
82
|
+
/**
|
|
83
|
+
* Print JSON output (for --format json)
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* printJson({ project: 'my-project', status: 'active' });
|
|
87
|
+
*/
|
|
88
|
+
export declare function printJson(data: unknown): void;
|
|
89
|
+
/**
|
|
90
|
+
* Print a command hint
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* printHint('specforge init', 'Initialize project');
|
|
94
|
+
* // Output: → Run `specforge init` to initialize project
|
|
95
|
+
*/
|
|
96
|
+
export declare function printHint(command: string, description: string): void;
|
|
97
|
+
/**
|
|
98
|
+
* Print a URL with description
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* printLink('https://specforge.com', 'Visit documentation');
|
|
102
|
+
* // Output: → Visit documentation: https://specforge.com
|
|
103
|
+
*/
|
|
104
|
+
export declare function printLink(url: string, description: string): void;
|
|
105
|
+
/**
|
|
106
|
+
* Format bytes to human readable size
|
|
107
|
+
*/
|
|
108
|
+
export declare function formatBytes(bytes: number): string;
|
|
109
|
+
/**
|
|
110
|
+
* Format duration in milliseconds to human readable
|
|
111
|
+
*/
|
|
112
|
+
export declare function formatDuration(ms: number): string;
|
|
113
|
+
/**
|
|
114
|
+
* Truncate string with ellipsis
|
|
115
|
+
*/
|
|
116
|
+
export declare function truncate(str: string, maxLength: number): string;
|
|
117
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAGhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAqB,GAAG,IAAI,CAI9E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAQhF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { colors, style, icons } from "./colors.js";
|
|
2
|
+
function printField(label, value) {
|
|
3
|
+
const displayValue = value ?? colors.muted("(not set)");
|
|
4
|
+
console.log(`${style.label(label)}: ${displayValue}`);
|
|
5
|
+
}
|
|
6
|
+
function printHeader(title) {
|
|
7
|
+
console.log();
|
|
8
|
+
console.log(style.label(title));
|
|
9
|
+
console.log(colors.muted("\u2500".repeat(title.length)));
|
|
10
|
+
}
|
|
11
|
+
function printBlank() {
|
|
12
|
+
console.log();
|
|
13
|
+
}
|
|
14
|
+
function printList(items, bullet = icons.bullet) {
|
|
15
|
+
for (const item of items) {
|
|
16
|
+
console.log(` ${bullet} ${item}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function printSuccess(message) {
|
|
20
|
+
console.log(`${icons.success} ${message}`);
|
|
21
|
+
}
|
|
22
|
+
function printError(message) {
|
|
23
|
+
console.error(`${icons.error} ${style.err(message)}`);
|
|
24
|
+
}
|
|
25
|
+
function printWarning(message) {
|
|
26
|
+
console.error(`${icons.warning} ${style.warn(message)}`);
|
|
27
|
+
}
|
|
28
|
+
function printInfo(message) {
|
|
29
|
+
console.log(`${icons.info} ${message}`);
|
|
30
|
+
}
|
|
31
|
+
function printTable(data) {
|
|
32
|
+
const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length));
|
|
33
|
+
for (const [key, value] of Object.entries(data)) {
|
|
34
|
+
const paddedKey = key.padEnd(maxKeyLength);
|
|
35
|
+
const displayValue = value ?? colors.muted("(not set)");
|
|
36
|
+
console.log(` ${style.label(paddedKey)} ${displayValue}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function printJson(data) {
|
|
40
|
+
console.log(JSON.stringify(data, null, 2));
|
|
41
|
+
}
|
|
42
|
+
function printHint(command, description) {
|
|
43
|
+
console.log(`${icons.arrow} Run ${style.command(command)} to ${description}`);
|
|
44
|
+
}
|
|
45
|
+
function printLink(url, description) {
|
|
46
|
+
console.log(`${icons.arrow} ${description}: ${style.url(url)}`);
|
|
47
|
+
}
|
|
48
|
+
function formatBytes(bytes) {
|
|
49
|
+
if (bytes === 0) return "0 B";
|
|
50
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
51
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
52
|
+
return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${units[i]}`;
|
|
53
|
+
}
|
|
54
|
+
function formatDuration(ms) {
|
|
55
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
56
|
+
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
57
|
+
if (ms < 36e5) return `${Math.floor(ms / 6e4)}m ${Math.floor(ms % 6e4 / 1e3)}s`;
|
|
58
|
+
const hours = Math.floor(ms / 36e5);
|
|
59
|
+
const minutes = Math.floor(ms % 36e5 / 6e4);
|
|
60
|
+
return `${hours}h ${minutes}m`;
|
|
61
|
+
}
|
|
62
|
+
function truncate(str, maxLength) {
|
|
63
|
+
if (str.length <= maxLength) return str;
|
|
64
|
+
return str.slice(0, maxLength - 1) + "\u2026";
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
formatBytes,
|
|
68
|
+
formatDuration,
|
|
69
|
+
printBlank,
|
|
70
|
+
printError,
|
|
71
|
+
printField,
|
|
72
|
+
printHeader,
|
|
73
|
+
printHint,
|
|
74
|
+
printInfo,
|
|
75
|
+
printJson,
|
|
76
|
+
printLink,
|
|
77
|
+
printList,
|
|
78
|
+
printSuccess,
|
|
79
|
+
printTable,
|
|
80
|
+
printWarning,
|
|
81
|
+
truncate
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=output.js.map
|