@polymorphism-tech/morph-spec 3.0.0 → 3.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.
Files changed (240) hide show
  1. package/CLAUDE.md +68 -400
  2. package/README.md +198 -76
  3. package/bin/detect-agents.js +227 -225
  4. package/bin/morph-spec.js +10 -0
  5. package/bin/render-template.js +303 -302
  6. package/bin/semantic-detect-agents.js +247 -246
  7. package/bin/{task-manager.js → task-manager.cjs} +12 -1
  8. package/bin/validate-agents-skills.js +257 -251
  9. package/bin/validate-agents.js +70 -69
  10. package/bin/validate-phase.js +263 -263
  11. package/docs/getting-started.md +3 -3
  12. package/package.json +3 -4
  13. package/scripts/reorganize-skills.cjs +175 -0
  14. package/scripts/validate-agents-structure.cjs +52 -0
  15. package/scripts/validate-skills.cjs +180 -0
  16. package/src/commands/create-story.js +354 -351
  17. package/src/commands/detect-agents.js +13 -2
  18. package/src/commands/detect.js +104 -104
  19. package/src/commands/state.js +334 -333
  20. package/src/commands/sync.js +167 -167
  21. package/src/commands/task.js +1 -1
  22. package/src/commands/update.js +13 -1
  23. package/src/lib/context-generator.js +7 -4
  24. package/{detectors → src/lib/detectors}/config-detector.js +223 -223
  25. package/{detectors → src/lib/detectors}/conversation-analyzer.js +163 -163
  26. package/{detectors → src/lib/detectors}/index.js +84 -84
  27. package/{detectors → src/lib/detectors}/standards-generator.js +275 -275
  28. package/src/lib/hook-executor.js +2 -1
  29. package/src/lib/stack-resolver.js +148 -0
  30. package/src/lib/standards-context-injector.js +4 -3
  31. package/src/lib/state-manager.js +21 -4
  32. package/src/lib/team-orchestrator.js +2 -1
  33. package/src/lib/troubleshoot-grep.js +13 -3
  34. package/src/lib/validation-runner.js +2 -1
  35. package/src/utils/file-copier.js +3 -1
  36. package/{content → stacks/blazor-azure}/.azure/README.md +293 -293
  37. package/{content → stacks/blazor-azure}/.azure/docs/azure-devops-setup.md +454 -454
  38. package/{content → stacks/blazor-azure}/.azure/docs/branch-strategy.md +398 -398
  39. package/{content → stacks/blazor-azure}/.azure/docs/local-development.md +515 -515
  40. package/{content → stacks/blazor-azure}/.azure/pipelines/pipeline-variables.yml +34 -34
  41. package/{content → stacks/blazor-azure}/.azure/pipelines/prod-pipeline.yml +319 -319
  42. package/{content → stacks/blazor-azure}/.azure/pipelines/staging-pipeline.yml +234 -234
  43. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/build-dotnet.yml +75 -75
  44. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  45. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  46. package/{content → stacks/blazor-azure}/.azure/pipelines/templates/infra-deploy.yml +90 -90
  47. package/{content → stacks/blazor-azure}/.claude/commands/morph-archive.md +79 -79
  48. package/{content → stacks/blazor-azure}/.claude/commands/morph-deploy.md +529 -529
  49. package/{content → stacks/blazor-azure}/.claude/commands/morph-infra.md +209 -209
  50. package/{content → stacks/blazor-azure}/.claude/commands/morph-troubleshoot.md +1 -1
  51. package/{content → stacks/blazor-azure}/.claude/settings.local.json +15 -15
  52. package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-setup.md +1 -1
  53. package/{content/.claude/skills/specialists → stacks/blazor-azure/.claude/skills/level-2-domains/architecture}/prompt-engineer.md +189 -189
  54. package/{content/.claude/skills/specialists → stacks/blazor-azure/.claude/skills/level-2-domains/architecture}/seo-growth-hacker.md +320 -320
  55. package/{content/.claude/skills/infra → stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure}/azure-deploy-specialist.md +699 -699
  56. package/{content → stacks/blazor-azure}/.morph/.morphversion +5 -5
  57. package/{content → stacks/blazor-azure}/.morph/archive/.gitkeep +25 -25
  58. package/{content → stacks/blazor-azure}/.morph/config/agents.json +7 -5
  59. package/{content → stacks/blazor-azure}/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  60. package/{content → stacks/blazor-azure}/.morph/docs/workflows/enforcement-pipeline.md +3 -3
  61. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/README.md +241 -241
  62. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/contracts.ts +307 -307
  63. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/spec.md +399 -399
  64. package/{content → stacks/blazor-azure}/.morph/examples/api-nextjs/tasks.md +168 -168
  65. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/README.md +125 -125
  66. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/contracts.cs +358 -358
  67. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/decisions.md +246 -246
  68. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/spec.md +236 -236
  69. package/{content → stacks/blazor-azure}/.morph/examples/micro-saas/tasks.md +150 -150
  70. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/README.md +309 -309
  71. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/contracts.cs +433 -433
  72. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/spec.md +479 -479
  73. package/{content → stacks/blazor-azure}/.morph/examples/multi-agent/tasks.md +185 -185
  74. package/{content → stacks/blazor-azure}/.morph/examples/state-v3.json +188 -188
  75. package/{content → stacks/blazor-azure}/.morph/features/.gitkeep +25 -25
  76. package/{content → stacks/blazor-azure}/.morph/hooks/README.md +12 -12
  77. package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-all.sh +48 -48
  78. package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-specs.sh +49 -49
  79. package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-tests.sh +60 -60
  80. package/{content → stacks/blazor-azure}/.morph/project.md +160 -160
  81. package/{content → stacks/blazor-azure}/.morph/schemas/agent.schema.json +296 -296
  82. package/{content → stacks/blazor-azure}/.morph/specs/.gitkeep +20 -20
  83. package/{content → stacks/blazor-azure}/.morph/standards/agent-teams-workflow.md +2 -2
  84. package/{content → stacks/blazor-azure}/.morph/standards/coding.md +377 -377
  85. package/{content → stacks/blazor-azure}/.morph/standards/fluent-ui-setup.md +590 -590
  86. package/{content → stacks/blazor-azure}/.morph/standards/migration-guide.md +514 -514
  87. package/{content → stacks/blazor-azure}/.morph/standards/passkeys-auth.md +423 -423
  88. package/{content → stacks/blazor-azure}/.morph/standards/vector-search-rag.md +536 -536
  89. package/{content → stacks/blazor-azure}/.morph/state.json +17 -17
  90. package/{content → stacks/blazor-azure}/.morph/templates/FluentDesignTheme.cs +149 -149
  91. package/{content → stacks/blazor-azure}/.morph/templates/MudTheme.cs +281 -281
  92. package/{content → stacks/blazor-azure}/.morph/templates/component.razor +239 -239
  93. package/{content → stacks/blazor-azure}/.morph/templates/contracts.cs +217 -217
  94. package/{content → stacks/blazor-azure}/.morph/templates/design-system.css +226 -226
  95. package/{content → stacks/blazor-azure}/.morph/templates/infra/.dockerignore.example +89 -89
  96. package/{content → stacks/blazor-azure}/.morph/templates/infra/Dockerfile.example +82 -82
  97. package/{content → stacks/blazor-azure}/.morph/templates/infra/README.md +286 -286
  98. package/{content → stacks/blazor-azure}/.morph/templates/infra/app-insights.bicep +63 -63
  99. package/{content → stacks/blazor-azure}/.morph/templates/infra/app-service.bicep +164 -164
  100. package/{content → stacks/blazor-azure}/.morph/templates/infra/azure-pipelines-deploy.yml +480 -480
  101. package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app-env.bicep +49 -49
  102. package/{content → stacks/blazor-azure}/.morph/templates/infra/container-app.bicep +156 -156
  103. package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.ps1 +229 -229
  104. package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy.sh +208 -208
  105. package/{content → stacks/blazor-azure}/.morph/templates/infra/key-vault.bicep +91 -91
  106. package/{content → stacks/blazor-azure}/.morph/templates/infra/main.bicep +189 -189
  107. package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.dev.json +29 -29
  108. package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.prod.json +29 -29
  109. package/{content → stacks/blazor-azure}/.morph/templates/infra/parameters.staging.json +29 -29
  110. package/{content → stacks/blazor-azure}/.morph/templates/infra/sql-database.bicep +103 -103
  111. package/{content → stacks/blazor-azure}/.morph/templates/infra/storage.bicep +106 -106
  112. package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-client.cs +387 -387
  113. package/{content → stacks/blazor-azure}/.morph/templates/integrations/asaas-webhook.cs +351 -351
  114. package/{content → stacks/blazor-azure}/.morph/templates/integrations/azure-identity-config.cs +288 -288
  115. package/{content → stacks/blazor-azure}/.morph/templates/integrations/clerk-config.cs +258 -258
  116. package/{content → stacks/blazor-azure}/.morph/templates/job.cs +171 -171
  117. package/{content → stacks/blazor-azure}/.morph/templates/migration.cs +83 -83
  118. package/{content → stacks/blazor-azure}/.morph/templates/repository.cs +141 -141
  119. package/{content → stacks/blazor-azure}/.morph/templates/saas/subscription.cs +347 -347
  120. package/{content → stacks/blazor-azure}/.morph/templates/saas/tenant.cs +338 -338
  121. package/{content → stacks/blazor-azure}/.morph/templates/service.cs +139 -139
  122. package/{content → stacks/blazor-azure}/.morph/templates/sprint-status.yaml +68 -68
  123. package/{content → stacks/blazor-azure}/.morph/templates/story.md +143 -143
  124. package/{content → stacks/blazor-azure}/.morph/templates/test.cs +239 -239
  125. package/{content → stacks/blazor-azure}/.morph/templates/ui-design-system.md +286 -286
  126. package/{content → stacks/blazor-azure}/.morph/templates/ui-flows.md +336 -336
  127. package/{content → stacks/blazor-azure}/.morph/templates/ui-mockups.md +133 -133
  128. package/{content → stacks/blazor-azure}/.morph/test-infra/example.bicep +59 -59
  129. package/{content → stacks/blazor-azure}/README.md +79 -79
  130. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +244 -0
  131. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +335 -0
  132. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +189 -0
  133. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +170 -0
  134. package/stacks/nextjs-supabase/.morph/config/agents.json +345 -0
  135. package/stacks/nextjs-supabase/.morph/config/config.template.json +92 -0
  136. package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +169 -0
  137. package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +247 -0
  138. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +697 -0
  139. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +85 -0
  140. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +86 -0
  141. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +498 -0
  142. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +121 -0
  143. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +138 -0
  144. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +162 -0
  145. package/stacks/nextjs-supabase/.morph/project.md +168 -0
  146. package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +191 -0
  147. package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +193 -0
  148. package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +171 -0
  149. package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +164 -0
  150. package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +179 -0
  151. package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +148 -0
  152. package/stacks/nextjs-supabase/.morph/templates/contracts.cs +173 -0
  153. package/stacks/nextjs-supabase/.morph/templates/contracts.ts +168 -0
  154. package/stacks/nextjs-supabase/.morph/templates/decisions.md +115 -0
  155. package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +38 -0
  156. package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +48 -0
  157. package/stacks/nextjs-supabase/.morph/templates/proposal.md +145 -0
  158. package/stacks/nextjs-supabase/.morph/templates/recap.md +134 -0
  159. package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +57 -0
  160. package/stacks/nextjs-supabase/.morph/templates/spec.md +231 -0
  161. package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +100 -0
  162. package/stacks/nextjs-supabase/.morph/templates/tasks.md +257 -0
  163. package/stacks/nextjs-supabase/CLAUDE.md +149 -0
  164. package/stacks/nextjs-supabase/README.md +112 -0
  165. /package/{detectors → src/lib/detectors}/structure-detector.js +0 -0
  166. /package/{content → stacks/blazor-azure}/.claude/commands/morph-apply.md +0 -0
  167. /package/{content → stacks/blazor-azure}/.claude/commands/morph-preflight.md +0 -0
  168. /package/{content → stacks/blazor-azure}/.claude/commands/morph-proposal.md +0 -0
  169. /package/{content → stacks/blazor-azure}/.claude/commands/morph-status.md +0 -0
  170. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/README.md +0 -0
  171. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/code-review.md +0 -0
  172. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/morph-checklist.md +0 -0
  173. /package/{content → stacks/blazor-azure}/.claude/skills/level-0-meta/simulation-checklist.md +0 -0
  174. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/README.md +0 -0
  175. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/morph-replicate.md +0 -0
  176. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-clarify.md +0 -0
  177. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-design.md +0 -0
  178. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-tasks.md +0 -0
  179. /package/{content → stacks/blazor-azure}/.claude/skills/level-1-workflows/phase-uiux.md +0 -0
  180. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/README.md +0 -0
  181. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -0
  182. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -0
  183. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -0
  184. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -0
  185. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -0
  186. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -0
  187. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -0
  188. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -0
  189. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -0
  190. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -0
  191. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -0
  192. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -0
  193. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -0
  194. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -0
  195. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -0
  196. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -0
  197. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -0
  198. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/integrations/resend-email.md +0 -0
  199. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -0
  200. /package/{content → stacks/blazor-azure}/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -0
  201. /package/{content → stacks/blazor-azure}/.claude/skills/level-3-technologies/README.md +0 -0
  202. /package/{content → stacks/blazor-azure}/.claude/skills/level-4-patterns/README.md +0 -0
  203. /package/{content → stacks/blazor-azure}/.morph/config/config.template.json +0 -0
  204. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/design-impl.md +0 -0
  205. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/fast-track.md +0 -0
  206. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/full-morph.md +0 -0
  207. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/standard.md +0 -0
  208. /package/{content → stacks/blazor-azure}/.morph/docs/workflows/ui-refresh.md +0 -0
  209. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/decisions.md +0 -0
  210. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/proposal.md +0 -0
  211. /package/{content → stacks/blazor-azure}/.morph/examples/scheduled-reports/spec.md +0 -0
  212. /package/{content → stacks/blazor-azure}/.morph/hooks/pre-commit-agents.sh +0 -0
  213. /package/{content → stacks/blazor-azure}/.morph/hooks/task-completed.js +0 -0
  214. /package/{content → stacks/blazor-azure}/.morph/hooks/teammate-idle.js +0 -0
  215. /package/{content → stacks/blazor-azure}/.morph/schemas/tasks.schema.json +0 -0
  216. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-blazor-ui.md +0 -0
  217. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-production.md +0 -0
  218. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-setup.md +0 -0
  219. /package/{content → stacks/blazor-azure}/.morph/standards/agent-framework-workflows.md +0 -0
  220. /package/{content → stacks/blazor-azure}/.morph/standards/architecture.md +0 -0
  221. /package/{content → stacks/blazor-azure}/.morph/standards/azure.md +0 -0
  222. /package/{content → stacks/blazor-azure}/.morph/standards/dotnet10-migration.md +0 -0
  223. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT-FEATURE.md +0 -0
  224. /package/{content → stacks/blazor-azure}/.morph/templates/CONTEXT.md +0 -0
  225. /package/{content → stacks/blazor-azure}/.morph/templates/agent.cs +0 -0
  226. /package/{content → stacks/blazor-azure}/.morph/templates/clarify-questions.md +0 -0
  227. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Commands.cs +0 -0
  228. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Entities.cs +0 -0
  229. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/Queries.cs +0 -0
  230. /package/{content → stacks/blazor-azure}/.morph/templates/contracts/README.md +0 -0
  231. /package/{content → stacks/blazor-azure}/.morph/templates/decisions.md +0 -0
  232. /package/{content → stacks/blazor-azure}/.morph/templates/infra/deploy-checklist.md +0 -0
  233. /package/{content → stacks/blazor-azure}/.morph/templates/proposal.md +0 -0
  234. /package/{content → stacks/blazor-azure}/.morph/templates/recap.md +0 -0
  235. /package/{content → stacks/blazor-azure}/.morph/templates/simulation.md +0 -0
  236. /package/{content → stacks/blazor-azure}/.morph/templates/spec.md +0 -0
  237. /package/{content → stacks/blazor-azure}/.morph/templates/state.template.json +0 -0
  238. /package/{content → stacks/blazor-azure}/.morph/templates/tasks.md +0 -0
  239. /package/{content → stacks/blazor-azure}/.morph/templates/ui-components.md +0 -0
  240. /package/{content → stacks/blazor-azure}/CLAUDE.md +0 -0
@@ -1,246 +1,247 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * MORPH-SPEC Semantic Agent Detection (LLM-based)
5
- *
6
- * Uses LLM analysis to detect which agents should be activated based on user request.
7
- * More accurate than keyword matching - understands context and implicit needs.
8
- *
9
- * Usage:
10
- * export ANTHROPIC_API_KEY=sk-...
11
- * node bin/semantic-detect-agents.js "user request here"
12
- *
13
- * Falls back to keyword-based detection if API key not available.
14
- */
15
-
16
- import fs from 'fs';
17
- import path from 'path';
18
- import { fileURLToPath } from 'url';
19
- import { execSync } from 'child_process';
20
-
21
- const __filename = fileURLToPath(import.meta.url);
22
- const __dirname = path.dirname(__filename);
23
-
24
- // ANSI colors
25
- const colors = {
26
- green: '\x1b[32m',
27
- red: '\x1b[31m',
28
- yellow: '\x1b[33m',
29
- cyan: '\x1b[36m',
30
- gray: '\x1b[90m',
31
- reset: '\x1b[0m'
32
- };
33
-
34
- /**
35
- * Call Anthropic Claude API for semantic analysis
36
- */
37
- async function callClaudeAPI(userRequest, agentDescriptions) {
38
- const apiKey = process.env.ANTHROPIC_API_KEY;
39
-
40
- if (!apiKey) {
41
- return null; // Will fall back to keyword detection
42
- }
43
-
44
- const prompt = `You are an expert at analyzing software development requests and determining which specialist agents are needed.
45
-
46
- Given this user request:
47
- "${userRequest}"
48
-
49
- And these available specialist agents:
50
- ${agentDescriptions}
51
-
52
- Analyze the request and determine which specialist agents should be activated. Consider:
53
- - Explicit mentions (e.g., "create a dashboard" UI/UX Designer)
54
- - Implicit needs (e.g., "show data to users" → UI/UX Designer)
55
- - Technical requirements (e.g., "scheduled tasks" → Hangfire Orchestrator)
56
- - Architecture patterns (e.g., "RAG pipeline" → AI System Architect)
57
-
58
- Respond with ONLY a JSON array of agent IDs, like:
59
- ["uiux-designer", "hangfire-orchestrator"]
60
-
61
- If no specialists are needed, respond with: []
62
- Do not include core agents (they are always active).`;
63
-
64
- try {
65
- const response = await fetch('https://api.anthropic.com/v1/messages', {
66
- method: 'POST',
67
- headers: {
68
- 'Content-Type': 'application/json',
69
- 'x-api-key': apiKey,
70
- 'anthropic-version': '2023-06-01'
71
- },
72
- body: JSON.stringify({
73
- model: 'claude-3-haiku-20240307',
74
- max_tokens: 200,
75
- messages: [{
76
- role: 'user',
77
- content: prompt
78
- }]
79
- })
80
- });
81
-
82
- if (!response.ok) {
83
- const error = await response.text();
84
- console.error(`${colors.yellow}⚠ Claude API error: ${error}${colors.reset}`);
85
- return null;
86
- }
87
-
88
- const data = await response.json();
89
- const content = data.content[0].text.trim();
90
-
91
- // Parse JSON response
92
- const agentIds = JSON.parse(content);
93
- return agentIds;
94
- } catch (error) {
95
- console.error(`${colors.yellow} Claude API failed: ${error.message}${colors.reset}`);
96
- return null;
97
- }
98
- }
99
-
100
- /**
101
- * Fallback: keyword-based detection (existing behavior)
102
- */
103
- function keywordBasedDetection(userRequest) {
104
- console.log(`${colors.yellow}ℹ Using keyword-based detection (fallback)${colors.reset}`);
105
-
106
- try {
107
- const result = execSync(`node bin/detect-agents.js "${userRequest}" --json`, {
108
- encoding: 'utf-8',
109
- cwd: process.cwd()
110
- });
111
-
112
- const parsed = JSON.parse(result);
113
- return parsed.specialists || [];
114
- } catch (error) {
115
- console.error(`${colors.red} Fallback detection failed: ${error.message}${colors.reset}`);
116
- return [];
117
- }
118
- }
119
-
120
- /**
121
- * Load agent descriptions for LLM context
122
- */
123
- function loadAgentDescriptions() {
124
- const agentsPath = path.join(process.cwd(), 'content/.morph/config/agents.json');
125
-
126
- if (!fs.existsSync(agentsPath)) {
127
- throw new Error('agents.json not found');
128
- }
129
-
130
- const agents = JSON.parse(fs.readFileSync(agentsPath, 'utf-8'));
131
- const specialists = agents.agents.specialists || [];
132
-
133
- return specialists.map(agent =>
134
- `- ${agent.id}: ${agent.description}`
135
- ).join('\n');
136
- }
137
-
138
- /**
139
- * Print detection results
140
- */
141
- function printResults(agentIds, method, userRequest) {
142
- console.log(`\n${colors.cyan}╔════════════════════════════════════════════════╗${colors.reset}`);
143
- console.log(`${colors.cyan}║ MORPH-SPEC SEMANTIC AGENT DETECTION ║${colors.reset}`);
144
- console.log(`${colors.cyan}╚════════════════════════════════════════════════╝${colors.reset}\n`);
145
-
146
- console.log(`${colors.gray}Request:${colors.reset} "${userRequest}"`);
147
- console.log(`${colors.gray}Method:${colors.reset} ${method}`);
148
- console.log(`${colors.gray}Agents Detected:${colors.reset} ${agentIds.length}`);
149
-
150
- if (agentIds.length > 0) {
151
- console.log('');
152
- agentIds.forEach(id => {
153
- console.log(` ${colors.green}✓${colors.reset} ${id}`);
154
- });
155
- } else {
156
- console.log(`\n ${colors.gray}(No specialist agents needed)${colors.reset}`);
157
- }
158
-
159
- console.log('');
160
- }
161
-
162
- /**
163
- * Print help
164
- */
165
- function printHelp() {
166
- console.log(`
167
- ${colors.cyan}MORPH-SPEC Semantic Agent Detection${colors.reset}
168
-
169
- Uses LLM analysis to detect which agents should be activated.
170
- More accurate than keyword matching - understands context.
171
-
172
- ${colors.green}Setup:${colors.reset}
173
- export ANTHROPIC_API_KEY=sk-ant-...
174
-
175
- ${colors.green}Usage:${colors.reset}
176
- node bin/semantic-detect-agents.js "user request here"
177
-
178
- ${colors.green}Examples:${colors.reset}
179
- # Detects UI/UX Designer (implicit need)
180
- node bin/semantic-detect-agents.js "sistema que mostra dados ao usuário"
181
-
182
- # Detects Hangfire Orchestrator
183
- node bin/semantic-detect-agents.js "processar arquivos todo dia às 3h"
184
-
185
- # Detects AI System Architect
186
- node bin/semantic-detect-agents.js "pipeline de RAG com chunking"
187
-
188
- ${colors.green}Fallback:${colors.reset}
189
- If ANTHROPIC_API_KEY is not set, falls back to keyword-based detection.
190
-
191
- ${colors.green}Benefits:${colors.reset}
192
- ✓ Understands context ("show data to users" → UI)
193
- Works in any language (not just keywords)
194
- Eliminates false positives/negatives
195
- Detects implicit needs
196
-
197
- ${colors.green}Output:${colors.reset}
198
- Prints detected agent IDs, one per line, for use in scripts.
199
- `);
200
- }
201
-
202
- /**
203
- * Main function
204
- */
205
- async function main() {
206
- const args = process.argv.slice(2);
207
-
208
- if (args.includes('--help') || args.includes('-h') || args.length === 0) {
209
- printHelp();
210
- process.exit(args.length === 0 ? 1 : 0);
211
- }
212
-
213
- const userRequest = args.join(' ');
214
- const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
215
-
216
- let agentIds;
217
- let method;
218
-
219
- if (hasApiKey) {
220
- method = `${colors.green}LLM-based (Claude Haiku)${colors.reset}`;
221
- const agentDescriptions = loadAgentDescriptions();
222
- agentIds = await callClaudeAPI(userRequest, agentDescriptions);
223
-
224
- if (!agentIds) {
225
- // API failed, fall back
226
- method = `${colors.yellow}Keyword-based (API fallback)${colors.reset}`;
227
- agentIds = keywordBasedDetection(userRequest);
228
- }
229
- } else {
230
- method = `${colors.yellow}Keyword-based (no API key)${colors.reset}`;
231
- agentIds = keywordBasedDetection(userRequest);
232
- }
233
-
234
- printResults(agentIds, method, userRequest);
235
-
236
- // Output for scripting (one ID per line)
237
- if (args.includes('--quiet') || args.includes('-q')) {
238
- console.clear();
239
- agentIds.forEach(id => console.log(id));
240
- }
241
- }
242
-
243
- main().catch(error => {
244
- console.error(`${colors.red}✗ Error: ${error.message}${colors.reset}`);
245
- process.exit(1);
246
- });
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * MORPH-SPEC Semantic Agent Detection (LLM-based)
5
+ *
6
+ * Uses LLM analysis to detect which agents should be activated based on user request.
7
+ * More accurate than keyword matching - understands context and implicit needs.
8
+ *
9
+ * Usage:
10
+ * export ANTHROPIC_API_KEY=sk-...
11
+ * node bin/semantic-detect-agents.js "user request here"
12
+ *
13
+ * Falls back to keyword-based detection if API key not available.
14
+ */
15
+
16
+ import fs from 'fs';
17
+ import path from 'path';
18
+ import { fileURLToPath } from 'url';
19
+ import { execSync } from 'child_process';
20
+ import { resolveAgentsConfigPath } from '../src/lib/stack-resolver.js';
21
+
22
+ const __filename = fileURLToPath(import.meta.url);
23
+ const __dirname = path.dirname(__filename);
24
+
25
+ // ANSI colors
26
+ const colors = {
27
+ green: '\x1b[32m',
28
+ red: '\x1b[31m',
29
+ yellow: '\x1b[33m',
30
+ cyan: '\x1b[36m',
31
+ gray: '\x1b[90m',
32
+ reset: '\x1b[0m'
33
+ };
34
+
35
+ /**
36
+ * Call Anthropic Claude API for semantic analysis
37
+ */
38
+ async function callClaudeAPI(userRequest, agentDescriptions) {
39
+ const apiKey = process.env.ANTHROPIC_API_KEY;
40
+
41
+ if (!apiKey) {
42
+ return null; // Will fall back to keyword detection
43
+ }
44
+
45
+ const prompt = `You are an expert at analyzing software development requests and determining which specialist agents are needed.
46
+
47
+ Given this user request:
48
+ "${userRequest}"
49
+
50
+ And these available specialist agents:
51
+ ${agentDescriptions}
52
+
53
+ Analyze the request and determine which specialist agents should be activated. Consider:
54
+ - Explicit mentions (e.g., "create a dashboard" → UI/UX Designer)
55
+ - Implicit needs (e.g., "show data to users" → UI/UX Designer)
56
+ - Technical requirements (e.g., "scheduled tasks" → Hangfire Orchestrator)
57
+ - Architecture patterns (e.g., "RAG pipeline" → AI System Architect)
58
+
59
+ Respond with ONLY a JSON array of agent IDs, like:
60
+ ["uiux-designer", "hangfire-orchestrator"]
61
+
62
+ If no specialists are needed, respond with: []
63
+ Do not include core agents (they are always active).`;
64
+
65
+ try {
66
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
67
+ method: 'POST',
68
+ headers: {
69
+ 'Content-Type': 'application/json',
70
+ 'x-api-key': apiKey,
71
+ 'anthropic-version': '2023-06-01'
72
+ },
73
+ body: JSON.stringify({
74
+ model: 'claude-3-haiku-20240307',
75
+ max_tokens: 200,
76
+ messages: [{
77
+ role: 'user',
78
+ content: prompt
79
+ }]
80
+ })
81
+ });
82
+
83
+ if (!response.ok) {
84
+ const error = await response.text();
85
+ console.error(`${colors.yellow}⚠ Claude API error: ${error}${colors.reset}`);
86
+ return null;
87
+ }
88
+
89
+ const data = await response.json();
90
+ const content = data.content[0].text.trim();
91
+
92
+ // Parse JSON response
93
+ const agentIds = JSON.parse(content);
94
+ return agentIds;
95
+ } catch (error) {
96
+ console.error(`${colors.yellow}⚠ Claude API failed: ${error.message}${colors.reset}`);
97
+ return null;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Fallback: keyword-based detection (existing behavior)
103
+ */
104
+ function keywordBasedDetection(userRequest) {
105
+ console.log(`${colors.yellow}ℹ Using keyword-based detection (fallback)${colors.reset}`);
106
+
107
+ try {
108
+ const result = execSync(`node bin/detect-agents.js "${userRequest}" --json`, {
109
+ encoding: 'utf-8',
110
+ cwd: process.cwd()
111
+ });
112
+
113
+ const parsed = JSON.parse(result);
114
+ return parsed.specialists || [];
115
+ } catch (error) {
116
+ console.error(`${colors.red}✗ Fallback detection failed: ${error.message}${colors.reset}`);
117
+ return [];
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Load agent descriptions for LLM context
123
+ */
124
+ function loadAgentDescriptions() {
125
+ const agentsPath = resolveAgentsConfigPath(process.cwd());
126
+
127
+ if (!fs.existsSync(agentsPath)) {
128
+ throw new Error('agents.json not found');
129
+ }
130
+
131
+ const agents = JSON.parse(fs.readFileSync(agentsPath, 'utf-8'));
132
+ const specialists = agents.agents.specialists || [];
133
+
134
+ return specialists.map(agent =>
135
+ `- ${agent.id}: ${agent.description}`
136
+ ).join('\n');
137
+ }
138
+
139
+ /**
140
+ * Print detection results
141
+ */
142
+ function printResults(agentIds, method, userRequest) {
143
+ console.log(`\n${colors.cyan}╔════════════════════════════════════════════════╗${colors.reset}`);
144
+ console.log(`${colors.cyan}║ MORPH-SPEC SEMANTIC AGENT DETECTION ║${colors.reset}`);
145
+ console.log(`${colors.cyan}╚════════════════════════════════════════════════╝${colors.reset}\n`);
146
+
147
+ console.log(`${colors.gray}Request:${colors.reset} "${userRequest}"`);
148
+ console.log(`${colors.gray}Method:${colors.reset} ${method}`);
149
+ console.log(`${colors.gray}Agents Detected:${colors.reset} ${agentIds.length}`);
150
+
151
+ if (agentIds.length > 0) {
152
+ console.log('');
153
+ agentIds.forEach(id => {
154
+ console.log(` ${colors.green}✓${colors.reset} ${id}`);
155
+ });
156
+ } else {
157
+ console.log(`\n ${colors.gray}(No specialist agents needed)${colors.reset}`);
158
+ }
159
+
160
+ console.log('');
161
+ }
162
+
163
+ /**
164
+ * Print help
165
+ */
166
+ function printHelp() {
167
+ console.log(`
168
+ ${colors.cyan}MORPH-SPEC Semantic Agent Detection${colors.reset}
169
+
170
+ Uses LLM analysis to detect which agents should be activated.
171
+ More accurate than keyword matching - understands context.
172
+
173
+ ${colors.green}Setup:${colors.reset}
174
+ export ANTHROPIC_API_KEY=sk-ant-...
175
+
176
+ ${colors.green}Usage:${colors.reset}
177
+ node bin/semantic-detect-agents.js "user request here"
178
+
179
+ ${colors.green}Examples:${colors.reset}
180
+ # Detects UI/UX Designer (implicit need)
181
+ node bin/semantic-detect-agents.js "sistema que mostra dados ao usuário"
182
+
183
+ # Detects Hangfire Orchestrator
184
+ node bin/semantic-detect-agents.js "processar arquivos todo dia às 3h"
185
+
186
+ # Detects AI System Architect
187
+ node bin/semantic-detect-agents.js "pipeline de RAG com chunking"
188
+
189
+ ${colors.green}Fallback:${colors.reset}
190
+ If ANTHROPIC_API_KEY is not set, falls back to keyword-based detection.
191
+
192
+ ${colors.green}Benefits:${colors.reset}
193
+ Understands context ("show data to users" → UI)
194
+ Works in any language (not just keywords)
195
+ Eliminates false positives/negatives
196
+ ✓ Detects implicit needs
197
+
198
+ ${colors.green}Output:${colors.reset}
199
+ Prints detected agent IDs, one per line, for use in scripts.
200
+ `);
201
+ }
202
+
203
+ /**
204
+ * Main function
205
+ */
206
+ async function main() {
207
+ const args = process.argv.slice(2);
208
+
209
+ if (args.includes('--help') || args.includes('-h') || args.length === 0) {
210
+ printHelp();
211
+ process.exit(args.length === 0 ? 1 : 0);
212
+ }
213
+
214
+ const userRequest = args.join(' ');
215
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
216
+
217
+ let agentIds;
218
+ let method;
219
+
220
+ if (hasApiKey) {
221
+ method = `${colors.green}LLM-based (Claude Haiku)${colors.reset}`;
222
+ const agentDescriptions = loadAgentDescriptions();
223
+ agentIds = await callClaudeAPI(userRequest, agentDescriptions);
224
+
225
+ if (!agentIds) {
226
+ // API failed, fall back
227
+ method = `${colors.yellow}Keyword-based (API fallback)${colors.reset}`;
228
+ agentIds = keywordBasedDetection(userRequest);
229
+ }
230
+ } else {
231
+ method = `${colors.yellow}Keyword-based (no API key)${colors.reset}`;
232
+ agentIds = keywordBasedDetection(userRequest);
233
+ }
234
+
235
+ printResults(agentIds, method, userRequest);
236
+
237
+ // Output for scripting (one ID per line)
238
+ if (args.includes('--quiet') || args.includes('-q')) {
239
+ console.clear();
240
+ agentIds.forEach(id => console.log(id));
241
+ }
242
+ }
243
+
244
+ main().catch(error => {
245
+ console.error(`${colors.red}✗ Error: ${error.message}${colors.reset}`);
246
+ process.exit(1);
247
+ });
@@ -9,7 +9,18 @@
9
9
 
10
10
  const fs = require('fs').promises;
11
11
  const path = require('path');
12
- const chalk = require('chalk');
12
+
13
+ // Simple ANSI color helpers (chalk v5 is ESM-only, can't require in CJS)
14
+ const chalk = {
15
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
16
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
17
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
18
+ blue: (s) => `\x1b[34m${s}\x1b[0m`,
19
+ magenta: (s) => `\x1b[35m${s}\x1b[0m`,
20
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
21
+ gray: (s) => `\x1b[90m${s}\x1b[0m`,
22
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
23
+ };
13
24
 
14
25
  class TaskManager {
15
26
  constructor(statePath = '.morph/state.json') {