@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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy Auto-Detection Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Pure function that determines the optimal Agent Teams strategy
|
|
5
|
+
* based on a specification's structure: epic count, ticket distribution,
|
|
6
|
+
* and cross-epic dependency density.
|
|
7
|
+
*
|
|
8
|
+
* Decision matrix (from design doc):
|
|
9
|
+
* - 1 epic, ≤3 tickets → single-session
|
|
10
|
+
* - 1 epic, >3 tickets → spec-as-team
|
|
11
|
+
* - N epics, 0 cross-deps → epic-as-team
|
|
12
|
+
* - N epics, >50% cross-deps → spec-as-team
|
|
13
|
+
* - N epics, moderate cross-deps → epic-as-team with merged pairs
|
|
14
|
+
*/
|
|
15
|
+
/** Tickets with cross-epic deps / total tickets. Above this → spec-as-team. */
|
|
16
|
+
export declare const CROSS_DEP_THRESHOLD = 0.5;
|
|
17
|
+
/** Max tickets for a single-session recommendation (single epic only). */
|
|
18
|
+
export declare const SINGLE_SESSION_MAX_TICKETS = 3;
|
|
19
|
+
export interface SpecSummary {
|
|
20
|
+
id: string;
|
|
21
|
+
title: string;
|
|
22
|
+
epicCount: number;
|
|
23
|
+
}
|
|
24
|
+
export interface EpicSummary {
|
|
25
|
+
id: string;
|
|
26
|
+
title: string;
|
|
27
|
+
ticketCount: number;
|
|
28
|
+
}
|
|
29
|
+
export interface TicketSummary {
|
|
30
|
+
id: string;
|
|
31
|
+
epicId: string;
|
|
32
|
+
dependencies: string[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A dependency edge between two tickets in different epics.
|
|
36
|
+
*/
|
|
37
|
+
export interface DependencyEdge {
|
|
38
|
+
fromEpicId: string;
|
|
39
|
+
toEpicId: string;
|
|
40
|
+
fromTicketId: string;
|
|
41
|
+
toTicketId: string;
|
|
42
|
+
}
|
|
43
|
+
export type Strategy = 'single-session' | 'spec-as-team' | 'epic-as-team';
|
|
44
|
+
export interface StrategyRecommendation {
|
|
45
|
+
strategy: Strategy;
|
|
46
|
+
reasoning: string;
|
|
47
|
+
/** Epic ID groups that should be merged into a single team (for moderate cross-deps). */
|
|
48
|
+
mergedEpics?: string[][];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Analyze a specification's structure and recommend an Agent Teams strategy.
|
|
52
|
+
*
|
|
53
|
+
* This is a **pure function** — no side effects, no API calls.
|
|
54
|
+
* All data must be pre-fetched and passed in.
|
|
55
|
+
*
|
|
56
|
+
* @throws {Error} If the specification has no epics or no tickets.
|
|
57
|
+
*/
|
|
58
|
+
export declare function analyzeStrategy(spec: SpecSummary, epics: EpicSummary[], ticketsByEpic: Map<string, TicketSummary[]>, dependencyEdges: DependencyEdge[]): StrategyRecommendation;
|
|
59
|
+
//# sourceMappingURL=strategy-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-analyzer.d.ts","sourceRoot":"","sources":["../../src/lib/strategy-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,0EAA0E;AAC1E,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAM5C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,cAAc,GAAG,cAAc,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAC1B;AAMD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,WAAW,EAAE,EACpB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,EAC3C,eAAe,EAAE,cAAc,EAAE,GAChC,sBAAsB,CA+DxB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const CROSS_DEP_THRESHOLD = 0.5;
|
|
2
|
+
const SINGLE_SESSION_MAX_TICKETS = 3;
|
|
3
|
+
function analyzeStrategy(spec, epics, ticketsByEpic, dependencyEdges) {
|
|
4
|
+
const totalTickets = epics.reduce((sum, e) => sum + e.ticketCount, 0);
|
|
5
|
+
if (epics.length === 0 || totalTickets === 0) {
|
|
6
|
+
throw new Error("Cannot analyze empty specification");
|
|
7
|
+
}
|
|
8
|
+
if (epics.length === 1) {
|
|
9
|
+
const epic = epics[0];
|
|
10
|
+
if (epic.ticketCount <= SINGLE_SESSION_MAX_TICKETS) {
|
|
11
|
+
return {
|
|
12
|
+
strategy: "single-session",
|
|
13
|
+
reasoning: `Small specification with ${epic.ticketCount} ticket${epic.ticketCount === 1 ? "" : "s"} in single epic`
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
strategy: "spec-as-team",
|
|
18
|
+
reasoning: `Single epic with ${epic.ticketCount} tickets benefits from parallel workers`
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const crossDepTicketIds = /* @__PURE__ */ new Set();
|
|
22
|
+
for (const edge of dependencyEdges) {
|
|
23
|
+
crossDepTicketIds.add(edge.fromTicketId);
|
|
24
|
+
crossDepTicketIds.add(edge.toTicketId);
|
|
25
|
+
}
|
|
26
|
+
const crossDepRatio = totalTickets > 0 ? crossDepTicketIds.size / totalTickets : 0;
|
|
27
|
+
if (dependencyEdges.length === 0) {
|
|
28
|
+
return {
|
|
29
|
+
strategy: "epic-as-team",
|
|
30
|
+
reasoning: `Multiple independent epics (${epics.length}) can be parallelized as separate teams`
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (crossDepRatio > CROSS_DEP_THRESHOLD) {
|
|
34
|
+
const pct2 = Math.round(crossDepRatio * 100);
|
|
35
|
+
return {
|
|
36
|
+
strategy: "spec-as-team",
|
|
37
|
+
reasoning: `Heavy cross-epic dependencies (${pct2}%) require unified team coordination`
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const mergedEpics = buildMergedEpicGroups(epics, dependencyEdges);
|
|
41
|
+
const pct = Math.round(crossDepRatio * 100);
|
|
42
|
+
return {
|
|
43
|
+
strategy: "epic-as-team",
|
|
44
|
+
reasoning: `Multiple epics with moderate cross-dependencies (${pct}%); tightly coupled epics merged into ${mergedEpics.length} group${mergedEpics.length === 1 ? "" : "s"}`,
|
|
45
|
+
mergedEpics
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function buildMergedEpicGroups(epics, edges) {
|
|
49
|
+
const parent = /* @__PURE__ */ new Map();
|
|
50
|
+
function find(x) {
|
|
51
|
+
let root = x;
|
|
52
|
+
while (parent.get(root) !== root) {
|
|
53
|
+
root = parent.get(root);
|
|
54
|
+
}
|
|
55
|
+
let current = x;
|
|
56
|
+
while (current !== root) {
|
|
57
|
+
const next = parent.get(current);
|
|
58
|
+
parent.set(current, root);
|
|
59
|
+
current = next;
|
|
60
|
+
}
|
|
61
|
+
return root;
|
|
62
|
+
}
|
|
63
|
+
function union(a, b) {
|
|
64
|
+
const ra = find(a);
|
|
65
|
+
const rb = find(b);
|
|
66
|
+
if (ra !== rb) {
|
|
67
|
+
parent.set(ra, rb);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for (const epic of epics) {
|
|
71
|
+
parent.set(epic.id, epic.id);
|
|
72
|
+
}
|
|
73
|
+
for (const edge of edges) {
|
|
74
|
+
union(edge.fromEpicId, edge.toEpicId);
|
|
75
|
+
}
|
|
76
|
+
const groups = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const epic of epics) {
|
|
78
|
+
const root = find(epic.id);
|
|
79
|
+
if (!groups.has(root)) {
|
|
80
|
+
groups.set(root, []);
|
|
81
|
+
}
|
|
82
|
+
groups.get(root).push(epic.id);
|
|
83
|
+
}
|
|
84
|
+
return Array.from(groups.values()).filter((g) => g.length > 1);
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
CROSS_DEP_THRESHOLD,
|
|
88
|
+
SINGLE_SESSION_MAX_TICKETS,
|
|
89
|
+
analyzeStrategy
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=strategy-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/strategy-analyzer.ts"],"sourcesContent":["/**\n * Strategy Auto-Detection Analyzer\n *\n * Pure function that determines the optimal Agent Teams strategy\n * based on a specification's structure: epic count, ticket distribution,\n * and cross-epic dependency density.\n *\n * Decision matrix (from design doc):\n * - 1 epic, ≤3 tickets → single-session\n * - 1 epic, >3 tickets → spec-as-team\n * - N epics, 0 cross-deps → epic-as-team\n * - N epics, >50% cross-deps → spec-as-team\n * - N epics, moderate cross-deps → epic-as-team with merged pairs\n */\n\n// ---------------------------------------------------------------------------\n// Tuning constants\n// ---------------------------------------------------------------------------\n\n/** Tickets with cross-epic deps / total tickets. Above this → spec-as-team. */\nexport const CROSS_DEP_THRESHOLD = 0.5;\n\n/** Max tickets for a single-session recommendation (single epic only). */\nexport const SINGLE_SESSION_MAX_TICKETS = 3;\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface SpecSummary {\n id: string;\n title: string;\n epicCount: number;\n}\n\nexport interface EpicSummary {\n id: string;\n title: string;\n ticketCount: number;\n}\n\nexport interface TicketSummary {\n id: string;\n epicId: string;\n dependencies: string[]; // ticket IDs this ticket depends on\n}\n\n/**\n * A dependency edge between two tickets in different epics.\n */\nexport interface DependencyEdge {\n fromEpicId: string;\n toEpicId: string;\n fromTicketId: string;\n toTicketId: string;\n}\n\n// ---------------------------------------------------------------------------\n// Output types\n// ---------------------------------------------------------------------------\n\nexport type Strategy = 'single-session' | 'spec-as-team' | 'epic-as-team';\n\nexport interface StrategyRecommendation {\n strategy: Strategy;\n reasoning: string;\n /** Epic ID groups that should be merged into a single team (for moderate cross-deps). */\n mergedEpics?: string[][];\n}\n\n// ---------------------------------------------------------------------------\n// Core analyzer\n// ---------------------------------------------------------------------------\n\n/**\n * Analyze a specification's structure and recommend an Agent Teams strategy.\n *\n * This is a **pure function** — no side effects, no API calls.\n * All data must be pre-fetched and passed in.\n *\n * @throws {Error} If the specification has no epics or no tickets.\n */\nexport function analyzeStrategy(\n spec: SpecSummary,\n epics: EpicSummary[],\n ticketsByEpic: Map<string, TicketSummary[]>,\n dependencyEdges: DependencyEdge[],\n): StrategyRecommendation {\n // --- Guard: empty specification ---\n const totalTickets = epics.reduce((sum, e) => sum + e.ticketCount, 0);\n\n if (epics.length === 0 || totalTickets === 0) {\n throw new Error('Cannot analyze empty specification');\n }\n\n // --- Single epic path ---\n if (epics.length === 1) {\n const epic = epics[0];\n\n if (epic.ticketCount <= SINGLE_SESSION_MAX_TICKETS) {\n return {\n strategy: 'single-session',\n reasoning: `Small specification with ${epic.ticketCount} ticket${epic.ticketCount === 1 ? '' : 's'} in single epic`,\n };\n }\n\n return {\n strategy: 'spec-as-team',\n reasoning: `Single epic with ${epic.ticketCount} tickets benefits from parallel workers`,\n };\n }\n\n // --- Multiple epics path ---\n\n // Count tickets that have at least one dependency on a ticket in another epic.\n const crossDepTicketIds = new Set<string>();\n\n for (const edge of dependencyEdges) {\n crossDepTicketIds.add(edge.fromTicketId);\n crossDepTicketIds.add(edge.toTicketId);\n }\n\n const crossDepRatio = totalTickets > 0 ? crossDepTicketIds.size / totalTickets : 0;\n\n // No cross-epic dependencies → each epic can run independently.\n if (dependencyEdges.length === 0) {\n return {\n strategy: 'epic-as-team',\n reasoning: `Multiple independent epics (${epics.length}) can be parallelized as separate teams`,\n };\n }\n\n // Heavy cross-epic dependencies → single unified team.\n if (crossDepRatio > CROSS_DEP_THRESHOLD) {\n const pct = Math.round(crossDepRatio * 100);\n return {\n strategy: 'spec-as-team',\n reasoning: `Heavy cross-epic dependencies (${pct}%) require unified team coordination`,\n };\n }\n\n // Moderate cross-epic dependencies → epic-as-team with merged pairs.\n const mergedEpics = buildMergedEpicGroups(epics, dependencyEdges);\n const pct = Math.round(crossDepRatio * 100);\n\n return {\n strategy: 'epic-as-team',\n reasoning: `Multiple epics with moderate cross-dependencies (${pct}%); tightly coupled epics merged into ${mergedEpics.length} group${mergedEpics.length === 1 ? '' : 's'}`,\n mergedEpics,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build groups of epics that should be merged into a single team\n * because they share bidirectional (or dense) dependency edges.\n *\n * Uses a simple union-find to cluster epics connected by dependency edges.\n */\nfunction buildMergedEpicGroups(\n epics: EpicSummary[],\n edges: DependencyEdge[],\n): string[][] {\n // Union-Find (disjoint set)\n const parent = new Map<string, string>();\n\n function find(x: string): string {\n let root = x;\n while (parent.get(root) !== root) {\n root = parent.get(root)!;\n }\n // Path compression\n let current = x;\n while (current !== root) {\n const next = parent.get(current)!;\n parent.set(current, root);\n current = next;\n }\n return root;\n }\n\n function union(a: string, b: string): void {\n const ra = find(a);\n const rb = find(b);\n if (ra !== rb) {\n parent.set(ra, rb);\n }\n }\n\n // Initialize each epic as its own set.\n for (const epic of epics) {\n parent.set(epic.id, epic.id);\n }\n\n // Merge epics that share dependency edges.\n for (const edge of edges) {\n union(edge.fromEpicId, edge.toEpicId);\n }\n\n // Collect groups (only groups with >1 epic are meaningful merges).\n const groups = new Map<string, string[]>();\n for (const epic of epics) {\n const root = find(epic.id);\n if (!groups.has(root)) {\n groups.set(root, []);\n }\n groups.get(root)!.push(epic.id);\n }\n\n return Array.from(groups.values()).filter(g => g.length > 1);\n}\n"],"mappings":"AAoBO,MAAM,sBAAsB;AAG5B,MAAM,6BAA6B;AA2DnC,SAAS,gBACd,MACA,OACA,eACA,iBACwB;AAExB,QAAM,eAAe,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC;AAEpE,MAAI,MAAM,WAAW,KAAK,iBAAiB,GAAG;AAC5C,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAGA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,OAAO,MAAM,CAAC;AAEpB,QAAI,KAAK,eAAe,4BAA4B;AAClD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,WAAW,4BAA4B,KAAK,WAAW,UAAU,KAAK,gBAAgB,IAAI,KAAK,GAAG;AAAA,MACpG;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,WAAW,oBAAoB,KAAK,WAAW;AAAA,IACjD;AAAA,EACF;AAKA,QAAM,oBAAoB,oBAAI,IAAY;AAE1C,aAAW,QAAQ,iBAAiB;AAClC,sBAAkB,IAAI,KAAK,YAAY;AACvC,sBAAkB,IAAI,KAAK,UAAU;AAAA,EACvC;AAEA,QAAM,gBAAgB,eAAe,IAAI,kBAAkB,OAAO,eAAe;AAGjF,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,WAAW,+BAA+B,MAAM,MAAM;AAAA,IACxD;AAAA,EACF;AAGA,MAAI,gBAAgB,qBAAqB;AACvC,UAAMA,OAAM,KAAK,MAAM,gBAAgB,GAAG;AAC1C,WAAO;AAAA,MACL,UAAU;AAAA,MACV,WAAW,kCAAkCA,IAAG;AAAA,IAClD;AAAA,EACF;AAGA,QAAM,cAAc,sBAAsB,OAAO,eAAe;AAChE,QAAM,MAAM,KAAK,MAAM,gBAAgB,GAAG;AAE1C,SAAO;AAAA,IACL,UAAU;AAAA,IACV,WAAW,oDAAoD,GAAG,yCAAyC,YAAY,MAAM,SAAS,YAAY,WAAW,IAAI,KAAK,GAAG;AAAA,IACzK;AAAA,EACF;AACF;AAYA,SAAS,sBACP,OACA,OACY;AAEZ,QAAM,SAAS,oBAAI,IAAoB;AAEvC,WAAS,KAAK,GAAmB;AAC/B,QAAI,OAAO;AACX,WAAO,OAAO,IAAI,IAAI,MAAM,MAAM;AAChC,aAAO,OAAO,IAAI,IAAI;AAAA,IACxB;AAEA,QAAI,UAAU;AACd,WAAO,YAAY,MAAM;AACvB,YAAM,OAAO,OAAO,IAAI,OAAO;AAC/B,aAAO,IAAI,SAAS,IAAI;AACxB,gBAAU;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AAEA,WAAS,MAAM,GAAW,GAAiB;AACzC,UAAM,KAAK,KAAK,CAAC;AACjB,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,OAAO,IAAI;AACb,aAAO,IAAI,IAAI,EAAE;AAAA,IACnB;AAAA,EACF;AAGA,aAAW,QAAQ,OAAO;AACxB,WAAO,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,EAC7B;AAGA,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,YAAY,KAAK,QAAQ;AAAA,EACtC;AAGA,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,KAAK,KAAK,EAAE;AACzB,QAAI,CAAC,OAAO,IAAI,IAAI,GAAG;AACrB,aAAO,IAAI,MAAM,CAAC,CAAC;AAAA,IACrB;AACA,WAAO,IAAI,IAAI,EAAG,KAAK,KAAK,EAAE;AAAA,EAChC;AAEA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAC7D;","names":["pct"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Definitions
|
|
3
|
+
*
|
|
4
|
+
* Contains the workflow definitions as data structures for guiding AI agents
|
|
5
|
+
* through SpecForge workflows.
|
|
6
|
+
*/
|
|
7
|
+
export interface WorkflowStep {
|
|
8
|
+
step: number;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
tools: string[];
|
|
12
|
+
tips: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface WorkflowDefinition {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
philosophy: string[];
|
|
18
|
+
steps: WorkflowStep[];
|
|
19
|
+
antiPatterns: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface ReviewChecklistItem {
|
|
22
|
+
name: string;
|
|
23
|
+
description: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ReviewWorkflowDefinition extends WorkflowDefinition {
|
|
26
|
+
checklist: ReviewChecklistItem[];
|
|
27
|
+
}
|
|
28
|
+
export interface FinalizeWorkflowDefinition extends WorkflowDefinition {
|
|
29
|
+
prerequisites: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare const CREATION_WORKFLOW: WorkflowDefinition;
|
|
32
|
+
export declare const IMPLEMENTATION_WORKFLOW: WorkflowDefinition;
|
|
33
|
+
export declare const REVIEW_WORKFLOW: ReviewWorkflowDefinition;
|
|
34
|
+
export declare const FINALIZE_WORKFLOW: FinalizeWorkflowDefinition;
|
|
35
|
+
/**
|
|
36
|
+
* Get a workflow definition by type
|
|
37
|
+
*/
|
|
38
|
+
export declare function getWorkflowDefinition(workflowType: string): WorkflowDefinition | ReviewWorkflowDefinition | FinalizeWorkflowDefinition | null;
|
|
39
|
+
export declare const WORKFLOW_TYPES: readonly ["creation", "implementation", "review", "finalize"];
|
|
40
|
+
export type WorkflowType = (typeof WORKFLOW_TYPES)[number];
|
|
41
|
+
//# sourceMappingURL=workflow-definitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-definitions.d.ts","sourceRoot":"","sources":["../../src/lib/workflow-definitions.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,iBAAiB,EAAE,kBA+G/B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,kBAgKrC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,wBAmG7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,0BAmG/B,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,GACnB,kBAAkB,GAAG,wBAAwB,GAAG,0BAA0B,GAAG,IAAI,CAanF;AAED,eAAO,MAAM,cAAc,+DAAgE,CAAC;AAC5F,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC"}
|