@polymorphism-tech/morph-spec 2.2.0 → 2.4.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 (251) hide show
  1. package/CLAUDE.md +314 -1673
  2. package/LICENSE +72 -72
  3. package/README.md +515 -516
  4. package/bin/detect-agents.js +225 -225
  5. package/bin/morph-spec.js +358 -173
  6. package/bin/render-template.js +302 -302
  7. package/bin/semantic-detect-agents.js +246 -246
  8. package/bin/task-manager.js +429 -0
  9. package/bin/validate-agents-skills.js +251 -251
  10. package/bin/validate-agents.js +69 -69
  11. package/bin/validate-phase.js +263 -263
  12. package/bin/validate.js +369 -0
  13. package/content/.azure/README.md +293 -293
  14. package/content/.azure/docs/azure-devops-setup.md +454 -454
  15. package/content/.azure/docs/branch-strategy.md +398 -398
  16. package/content/.azure/docs/local-development.md +515 -515
  17. package/content/.azure/pipelines/pipeline-variables.yml +34 -34
  18. package/content/.azure/pipelines/prod-pipeline.yml +319 -319
  19. package/content/.azure/pipelines/staging-pipeline.yml +234 -234
  20. package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
  21. package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  22. package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  23. package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
  24. package/content/.claude/commands/morph-apply.md +221 -158
  25. package/content/.claude/commands/morph-archive.md +79 -79
  26. package/content/.claude/commands/morph-infra.md +209 -209
  27. package/content/.claude/commands/morph-preflight.md +227 -0
  28. package/content/.claude/commands/morph-proposal.md +122 -101
  29. package/content/.claude/commands/morph-status.md +86 -86
  30. package/content/.claude/commands/morph-troubleshoot.md +122 -0
  31. package/content/.claude/settings.local.json +15 -15
  32. package/content/.claude/skills/checklists/code-review.md +226 -0
  33. package/content/.claude/skills/checklists/morph-checklist.md +117 -0
  34. package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
  35. package/content/.claude/skills/infra/bicep-architect.md +126 -419
  36. package/content/.claude/skills/infra/container-specialist.md +131 -437
  37. package/content/.claude/skills/infra/devops-engineer.md +119 -405
  38. package/content/.claude/skills/integrations/asaas-financial.md +130 -333
  39. package/content/.claude/skills/integrations/azure-identity.md +142 -309
  40. package/content/.claude/skills/integrations/clerk-auth.md +108 -290
  41. package/content/.claude/skills/integrations/resend-email.md +119 -0
  42. package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
  43. package/content/.claude/skills/specialists/azure-architect.md +142 -142
  44. package/content/.claude/skills/specialists/code-analyzer.md +235 -0
  45. package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
  46. package/content/.claude/skills/specialists/ef-modeler.md +113 -200
  47. package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
  48. package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
  49. package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
  50. package/content/.claude/skills/specialists/standards-architect.md +156 -78
  51. package/content/.claude/skills/specialists/testing-specialist.md +126 -0
  52. package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
  53. package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
  54. package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
  55. package/content/.claude/skills/workflows/morph-replicate.md +213 -0
  56. package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
  57. package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
  58. package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
  59. package/content/.claude/skills/workflows/phase-tasks.md +164 -0
  60. package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
  61. package/content/.morph/.morphversion +5 -5
  62. package/content/.morph/archive/.gitkeep +25 -25
  63. package/content/.morph/config/agents.json +378 -242
  64. package/content/.morph/config/config.template.json +89 -108
  65. package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  66. package/content/.morph/docs/workflows/design-impl.md +37 -0
  67. package/content/.morph/docs/workflows/fast-track.md +29 -0
  68. package/content/.morph/docs/workflows/full-morph.md +76 -0
  69. package/content/.morph/docs/workflows/standard.md +44 -0
  70. package/content/.morph/docs/workflows/ui-refresh.md +39 -0
  71. package/content/.morph/examples/api-nextjs/README.md +241 -241
  72. package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
  73. package/content/.morph/examples/api-nextjs/spec.md +399 -399
  74. package/content/.morph/examples/api-nextjs/tasks.md +168 -168
  75. package/content/.morph/examples/micro-saas/README.md +125 -125
  76. package/content/.morph/examples/micro-saas/contracts.cs +358 -358
  77. package/content/.morph/examples/micro-saas/decisions.md +246 -246
  78. package/content/.morph/examples/micro-saas/spec.md +236 -236
  79. package/content/.morph/examples/micro-saas/tasks.md +150 -150
  80. package/content/.morph/examples/multi-agent/README.md +309 -309
  81. package/content/.morph/examples/multi-agent/contracts.cs +433 -433
  82. package/content/.morph/examples/multi-agent/spec.md +479 -479
  83. package/content/.morph/examples/multi-agent/tasks.md +185 -185
  84. package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
  85. package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
  86. package/content/.morph/examples/scheduled-reports/spec.md +267 -0
  87. package/content/.morph/examples/state-v3.json +188 -0
  88. package/content/.morph/features/.gitkeep +25 -25
  89. package/content/.morph/hooks/README.md +190 -239
  90. package/content/.morph/hooks/pre-commit-agents.sh +24 -24
  91. package/content/.morph/hooks/pre-commit-all.sh +48 -48
  92. package/content/.morph/hooks/pre-commit-specs.sh +49 -49
  93. package/content/.morph/hooks/pre-commit-tests.sh +60 -60
  94. package/content/.morph/project.md +160 -160
  95. package/content/.morph/schemas/agent.schema.json +296 -296
  96. package/content/.morph/schemas/tasks.schema.json +220 -0
  97. package/content/.morph/specs/.gitkeep +20 -20
  98. package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
  99. package/content/.morph/standards/agent-framework-production.md +410 -0
  100. package/content/.morph/standards/agent-framework-setup.md +413 -453
  101. package/content/.morph/standards/agent-framework-workflows.md +349 -0
  102. package/content/.morph/standards/architecture.md +325 -325
  103. package/content/.morph/standards/azure.md +605 -379
  104. package/content/.morph/standards/coding.md +377 -377
  105. package/content/.morph/standards/dotnet10-migration.md +520 -494
  106. package/content/.morph/standards/fluent-ui-setup.md +590 -590
  107. package/content/.morph/standards/migration-guide.md +514 -514
  108. package/content/.morph/standards/passkeys-auth.md +423 -423
  109. package/content/.morph/standards/vector-search-rag.md +536 -536
  110. package/content/.morph/state.json +17 -17
  111. package/content/.morph/templates/FluentDesignTheme.cs +149 -149
  112. package/content/.morph/templates/MudTheme.cs +281 -281
  113. package/content/.morph/templates/agent.cs +163 -172
  114. package/content/.morph/templates/clarify-questions.md +159 -0
  115. package/content/.morph/templates/component.razor +239 -239
  116. package/content/.morph/templates/contracts/Commands.cs +74 -0
  117. package/content/.morph/templates/contracts/Entities.cs +25 -0
  118. package/content/.morph/templates/contracts/Queries.cs +74 -0
  119. package/content/.morph/templates/contracts/README.md +74 -0
  120. package/content/.morph/templates/contracts.cs +217 -217
  121. package/content/.morph/templates/decisions.md +123 -106
  122. package/content/.morph/templates/design-system.css +226 -226
  123. package/content/.morph/templates/infra/.dockerignore.example +89 -89
  124. package/content/.morph/templates/infra/Dockerfile.example +82 -82
  125. package/content/.morph/templates/infra/README.md +286 -286
  126. package/content/.morph/templates/infra/app-insights.bicep +63 -63
  127. package/content/.morph/templates/infra/app-service.bicep +164 -164
  128. package/content/.morph/templates/infra/container-app-env.bicep +49 -49
  129. package/content/.morph/templates/infra/container-app.bicep +156 -156
  130. package/content/.morph/templates/infra/deploy-checklist.md +426 -0
  131. package/content/.morph/templates/infra/deploy.ps1 +229 -229
  132. package/content/.morph/templates/infra/deploy.sh +208 -208
  133. package/content/.morph/templates/infra/key-vault.bicep +91 -91
  134. package/content/.morph/templates/infra/main.bicep +189 -189
  135. package/content/.morph/templates/infra/parameters.dev.json +29 -29
  136. package/content/.morph/templates/infra/parameters.prod.json +29 -29
  137. package/content/.morph/templates/infra/parameters.staging.json +29 -29
  138. package/content/.morph/templates/infra/sql-database.bicep +103 -103
  139. package/content/.morph/templates/infra/storage.bicep +106 -106
  140. package/content/.morph/templates/integrations/asaas-client.cs +387 -387
  141. package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
  142. package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
  143. package/content/.morph/templates/integrations/clerk-config.cs +258 -258
  144. package/content/.morph/templates/job.cs +171 -171
  145. package/content/.morph/templates/migration.cs +83 -83
  146. package/content/.morph/templates/proposal.md +141 -155
  147. package/content/.morph/templates/recap.md +94 -105
  148. package/content/.morph/templates/repository.cs +141 -141
  149. package/content/.morph/templates/saas/subscription.cs +347 -347
  150. package/content/.morph/templates/saas/tenant.cs +338 -338
  151. package/content/.morph/templates/service.cs +139 -139
  152. package/content/.morph/templates/simulation.md +353 -0
  153. package/content/.morph/templates/spec.md +149 -148
  154. package/content/.morph/templates/sprint-status.yaml +68 -68
  155. package/content/.morph/templates/state.template.json +222 -222
  156. package/content/.morph/templates/story.md +143 -143
  157. package/content/.morph/templates/tasks.md +257 -235
  158. package/content/.morph/templates/test.cs +239 -239
  159. package/content/.morph/templates/ui-components.md +362 -276
  160. package/content/.morph/templates/ui-design-system.md +286 -286
  161. package/content/.morph/templates/ui-flows.md +336 -336
  162. package/content/.morph/templates/ui-mockups.md +133 -133
  163. package/content/.morph/test-infra/example.bicep +59 -59
  164. package/content/CLAUDE.md +150 -442
  165. package/content/README.md +79 -79
  166. package/detectors/config-detector.js +223 -223
  167. package/detectors/conversation-analyzer.js +163 -163
  168. package/detectors/index.js +84 -84
  169. package/detectors/standards-generator.js +275 -275
  170. package/detectors/structure-detector.js +245 -250
  171. package/docs/README.md +144 -149
  172. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  173. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  174. package/docs/api/scripts/collapse.js +38 -38
  175. package/docs/api/scripts/commonNav.js +28 -28
  176. package/docs/api/scripts/linenumber.js +25 -25
  177. package/docs/api/scripts/nav.js +12 -12
  178. package/docs/api/scripts/polyfill.js +3 -3
  179. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  180. package/docs/api/scripts/prettify/lang-css.js +2 -2
  181. package/docs/api/scripts/prettify/prettify.js +28 -28
  182. package/docs/api/scripts/search.js +98 -98
  183. package/docs/api/styles/jsdoc.css +776 -776
  184. package/docs/api/styles/prettify.css +80 -80
  185. package/docs/examples.md +328 -328
  186. package/docs/getting-started.md +301 -302
  187. package/docs/installation.md +361 -361
  188. package/docs/templates.md +418 -418
  189. package/docs/validation-checklist.md +265 -266
  190. package/package.json +80 -80
  191. package/scripts/postinstall.js +132 -132
  192. package/src/commands/advance-phase.js +183 -0
  193. package/src/commands/analyze-blazor-concurrency.js +193 -0
  194. package/src/commands/create-story.js +351 -351
  195. package/src/commands/detect-agents.js +139 -0
  196. package/src/commands/detect.js +104 -104
  197. package/src/commands/doctor.js +356 -280
  198. package/src/commands/generate.js +149 -149
  199. package/src/commands/init.js +258 -245
  200. package/src/commands/lint-fluent.js +352 -0
  201. package/src/commands/rollback-phase.js +185 -0
  202. package/src/commands/session-summary.js +291 -0
  203. package/src/commands/shard-spec.js +224 -224
  204. package/src/commands/sprint-status.js +250 -250
  205. package/src/commands/state.js +333 -333
  206. package/src/commands/sync.js +167 -167
  207. package/src/commands/task.js +78 -0
  208. package/src/commands/troubleshoot.js +222 -0
  209. package/src/commands/update.js +192 -159
  210. package/src/commands/validate-blazor-state.js +210 -0
  211. package/src/commands/validate-blazor.js +156 -0
  212. package/src/commands/validate-css.js +84 -0
  213. package/src/commands/validate-phase.js +221 -0
  214. package/src/lib/blazor-concurrency-analyzer.js +288 -0
  215. package/src/lib/blazor-state-validator.js +291 -0
  216. package/src/lib/blazor-validator.js +374 -0
  217. package/src/lib/complexity-analyzer.js +441 -292
  218. package/src/lib/continuous-validator.js +421 -0
  219. package/src/lib/css-validator.js +352 -0
  220. package/src/lib/decision-constraint-loader.js +109 -0
  221. package/src/lib/design-system-generator.js +298 -298
  222. package/src/lib/learning-system.js +520 -0
  223. package/src/lib/mockup-generator.js +366 -0
  224. package/src/lib/recap-generator.js +205 -0
  225. package/src/lib/state-manager.js +397 -340
  226. package/src/lib/troubleshoot-grep.js +194 -0
  227. package/src/lib/troubleshoot-index.js +144 -0
  228. package/src/lib/ui-detector.js +350 -0
  229. package/src/lib/validation-runner.js +231 -0
  230. package/src/lib/validators/architecture-validator.js +387 -0
  231. package/src/lib/validators/contract-compliance-validator.js +273 -0
  232. package/src/lib/validators/package-validator.js +360 -0
  233. package/src/lib/validators/ui-contrast-validator.js +422 -0
  234. package/src/utils/file-copier.js +179 -139
  235. package/src/utils/logger.js +32 -32
  236. package/src/utils/version-checker.js +175 -175
  237. package/content/.claude/commands/morph-costs.md +0 -206
  238. package/content/.claude/commands/morph-tasks.md +0 -319
  239. package/content/.claude/skills/specialists/cost-guardian.md +0 -110
  240. package/content/.claude/skills/stacks/shopify.md +0 -445
  241. package/content/.morph/config/azure-pricing.json +0 -70
  242. package/content/.morph/config/azure-pricing.schema.json +0 -50
  243. package/content/.morph/hooks/pre-commit-costs.sh +0 -91
  244. package/docs/api/cost-calculator.js.html +0 -513
  245. package/docs/api/design-system-generator.js.html +0 -382
  246. package/docs/api/global.html +0 -5263
  247. package/docs/api/index.html +0 -96
  248. package/docs/api/state-manager.js.html +0 -423
  249. package/src/commands/cost.js +0 -181
  250. package/src/commands/update-pricing.js +0 -206
  251. package/src/lib/cost-calculator.js +0 -429
@@ -1,96 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
-
5
- <meta charset="utf-8">
6
- <title>Home - MORPH-SPEC API Documentation</title>
7
-
8
- <meta name="description" content="API documentation for MORPH-SPEC Framework libraries" />
9
-
10
- <meta name="keywords" content="morph-spec, api, documentation, blazor, dotnet, framework" />
11
- <meta name="keyword" content="morph-spec, api, documentation, blazor, dotnet, framework" />
12
-
13
-
14
-
15
- <script src="scripts/prettify/prettify.js"></script>
16
- <script src="scripts/prettify/lang-css.js"></script>
17
- <!--[if lt IE 9]>
18
- <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
19
- <![endif]-->
20
- <link type="text/css" rel="stylesheet" href="styles/prettify.css">
21
- <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
22
- <script src="scripts/nav.js" defer></script>
23
-
24
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
- </head>
26
- <body>
27
-
28
- <input type="checkbox" id="nav-trigger" class="nav-trigger" />
29
- <label for="nav-trigger" class="navicon-button x">
30
- <div class="navicon"></div>
31
- </label>
32
-
33
- <label for="nav-trigger" class="overlay"></label>
34
-
35
- <nav >
36
-
37
- <input type="text" id="nav-search" placeholder="Search" />
38
-
39
-
40
- <h2><a href="index.html">Home</a></h2><h2><a href="https://github.com/lucasPolymorphism/morph-spec-framework" target="_blank" class="menu-item" id="repository" >GitHub</a></h2><h2><a href="https://www.npmjs.com/package/@polymorphism-tech/morph-spec" target="_blank" class="menu-item" id="npm" >npm</a></h2><h3>Global</h3><ul><li><a href="global.html#AZURE_PRICING">AZURE_PRICING</a></li><li><a href="global.html#addAgent">addAgent</a></li><li><a href="global.html#addCheckpoint">addCheckpoint</a></li><li><a href="global.html#calculateBicepCost">calculateBicepCost</a></li><li><a href="global.html#calculateResourceCost">calculateResourceCost</a></li><li><a href="global.html#calculateTotalCosts">calculateTotalCosts</a></li><li><a href="global.html#ensureFeature">ensureFeature</a></li><li><a href="global.html#generateCSS">generateCSS</a></li><li><a href="global.html#generateDesignSystem">generateDesignSystem</a></li><li><a href="global.html#generateFluentTheme">generateFluentTheme</a></li><li><a href="global.html#generateMudTheme">generateMudTheme</a></li><li><a href="global.html#getFeature">getFeature</a></li><li><a href="global.html#getStatePath">getStatePath</a></li><li><a href="global.html#getSummary">getSummary</a></li><li><a href="global.html#initState">initState</a></li><li><a href="global.html#listFeatures">listFeatures</a></li><li><a href="global.html#loadAzurePricing">loadAzurePricing</a></li><li><a href="global.html#loadCostConfig">loadCostConfig</a></li><li><a href="global.html#loadState">loadState</a></li><li><a href="global.html#markOutput">markOutput</a></li><li><a href="global.html#parseBicepFile">parseBicepFile</a></li><li><a href="global.html#parseBicepFiles">parseBicepFiles</a></li><li><a href="global.html#parseColors">parseColors</a></li><li><a href="global.html#parseDesignSystem">parseDesignSystem</a></li><li><a href="global.html#parseSpacing">parseSpacing</a></li><li><a href="global.html#parseTypography">parseTypography</a></li><li><a href="global.html#removeAgent">removeAgent</a></li><li><a href="global.html#saveState">saveState</a></li><li><a href="global.html#stateExists">stateExists</a></li><li><a href="global.html#updateFeature">updateFeature</a></li><li><a href="global.html#updateFeatureMultiple">updateFeatureMultiple</a></li></ul>
41
-
42
- </nav>
43
-
44
- <div id="main">
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
- <section class="package">
55
- <h3> </h3>
56
- </section>
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
- </div>
78
-
79
- <br class="clear">
80
-
81
- <footer>
82
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
83
- </footer>
84
-
85
- <script>prettyPrint();</script>
86
- <script src="scripts/polyfill.js"></script>
87
- <script src="scripts/linenumber.js"></script>
88
-
89
- <script src="scripts/search.js" defer></script>
90
-
91
-
92
- <script src="scripts/collapse.js" defer></script>
93
-
94
-
95
- </body>
96
- </html>
@@ -1,423 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
-
5
- <meta charset="utf-8">
6
- <title>state-manager.js - MORPH-SPEC API Documentation</title>
7
-
8
- <meta name="description" content="API documentation for MORPH-SPEC Framework libraries" />
9
-
10
- <meta name="keywords" content="morph-spec, api, documentation, blazor, dotnet, framework" />
11
- <meta name="keyword" content="morph-spec, api, documentation, blazor, dotnet, framework" />
12
-
13
-
14
-
15
- <script src="scripts/prettify/prettify.js"></script>
16
- <script src="scripts/prettify/lang-css.js"></script>
17
- <!--[if lt IE 9]>
18
- <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
19
- <![endif]-->
20
- <link type="text/css" rel="stylesheet" href="styles/prettify.css">
21
- <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
22
- <script src="scripts/nav.js" defer></script>
23
-
24
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
- </head>
26
- <body>
27
-
28
- <input type="checkbox" id="nav-trigger" class="nav-trigger" />
29
- <label for="nav-trigger" class="navicon-button x">
30
- <div class="navicon"></div>
31
- </label>
32
-
33
- <label for="nav-trigger" class="overlay"></label>
34
-
35
- <nav >
36
-
37
- <input type="text" id="nav-search" placeholder="Search" />
38
-
39
-
40
- <h2><a href="index.html">Home</a></h2><h2><a href="https://github.com/lucasPolymorphism/morph-spec-framework" target="_blank" class="menu-item" id="repository" >GitHub</a></h2><h2><a href="https://www.npmjs.com/package/@polymorphism-tech/morph-spec" target="_blank" class="menu-item" id="npm" >npm</a></h2><h3>Global</h3><ul><li><a href="global.html#AZURE_PRICING">AZURE_PRICING</a></li><li><a href="global.html#addAgent">addAgent</a></li><li><a href="global.html#addCheckpoint">addCheckpoint</a></li><li><a href="global.html#calculateBicepCost">calculateBicepCost</a></li><li><a href="global.html#calculateResourceCost">calculateResourceCost</a></li><li><a href="global.html#calculateTotalCosts">calculateTotalCosts</a></li><li><a href="global.html#ensureFeature">ensureFeature</a></li><li><a href="global.html#generateCSS">generateCSS</a></li><li><a href="global.html#generateDesignSystem">generateDesignSystem</a></li><li><a href="global.html#generateFluentTheme">generateFluentTheme</a></li><li><a href="global.html#generateMudTheme">generateMudTheme</a></li><li><a href="global.html#getFeature">getFeature</a></li><li><a href="global.html#getStatePath">getStatePath</a></li><li><a href="global.html#getSummary">getSummary</a></li><li><a href="global.html#initState">initState</a></li><li><a href="global.html#listFeatures">listFeatures</a></li><li><a href="global.html#loadAzurePricing">loadAzurePricing</a></li><li><a href="global.html#loadCostConfig">loadCostConfig</a></li><li><a href="global.html#loadState">loadState</a></li><li><a href="global.html#markOutput">markOutput</a></li><li><a href="global.html#parseBicepFile">parseBicepFile</a></li><li><a href="global.html#parseBicepFiles">parseBicepFiles</a></li><li><a href="global.html#parseColors">parseColors</a></li><li><a href="global.html#parseDesignSystem">parseDesignSystem</a></li><li><a href="global.html#parseSpacing">parseSpacing</a></li><li><a href="global.html#parseTypography">parseTypography</a></li><li><a href="global.html#removeAgent">removeAgent</a></li><li><a href="global.html#saveState">saveState</a></li><li><a href="global.html#stateExists">stateExists</a></li><li><a href="global.html#updateFeature">updateFeature</a></li><li><a href="global.html#updateFeatureMultiple">updateFeatureMultiple</a></li></ul>
41
-
42
- </nav>
43
-
44
- <div id="main">
45
-
46
- <h1 class="page-title">state-manager.js</h1>
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
- <section>
55
- <article>
56
- <pre class="prettyprint source linenums"><code>/**
57
- * MORPH-SPEC State Manager Library
58
- *
59
- * Manages state.json for tracking features, progress, agents, and checkpoints.
60
- * Used both by CLI commands and internal automation.
61
- */
62
-
63
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
64
- import { join, dirname } from 'path';
65
-
66
- const STATE_FILE_NAME = '.morph/state.json';
67
-
68
- // ============================================================================
69
- // Core Functions
70
- // ============================================================================
71
-
72
- /**
73
- * Get the state file path (looks in current working directory)
74
- */
75
- export function getStatePath() {
76
- return join(process.cwd(), STATE_FILE_NAME);
77
- }
78
-
79
- /**
80
- * Check if state file exists
81
- */
82
- export function stateExists() {
83
- return existsSync(getStatePath());
84
- }
85
-
86
- /**
87
- * Load state from disk
88
- * @param {boolean} throwOnError - If false, returns null instead of throwing
89
- * @returns {Object|null} State object or null
90
- */
91
- export function loadState(throwOnError = true) {
92
- const statePath = getStatePath();
93
-
94
- if (!existsSync(statePath)) {
95
- if (throwOnError) {
96
- throw new Error(`State file not found: ${statePath}\nRun 'morph-spec state init' first.`);
97
- }
98
- return null;
99
- }
100
-
101
- try {
102
- const content = readFileSync(statePath, 'utf8');
103
- return JSON.parse(content);
104
- } catch (err) {
105
- if (throwOnError) {
106
- throw new Error(`Failed to parse state.json: ${err.message}`);
107
- }
108
- return null;
109
- }
110
- }
111
-
112
- /**
113
- * Save state to disk
114
- * @param {Object} state - State object to save
115
- */
116
- export function saveState(state) {
117
- state.metadata = state.metadata || {};
118
- state.metadata.lastUpdated = new Date().toISOString();
119
-
120
- const statePath = getStatePath();
121
- const stateDir = dirname(statePath);
122
-
123
- // Ensure .morph directory exists
124
- if (!existsSync(stateDir)) {
125
- mkdirSync(stateDir, { recursive: true });
126
- }
127
-
128
- writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf8');
129
- }
130
-
131
- /**
132
- * Initialize new state file
133
- * @param {Object} options - Options
134
- * @param {boolean} options.force - Overwrite existing file
135
- * @param {string} options.projectName - Project name
136
- * @param {string} options.projectType - Project type (e.g., 'blazor-server')
137
- * @returns {Object} Initial state
138
- */
139
- export function initState(options = {}) {
140
- const { force = false, projectName = '{PROJECT_NAME}', projectType = 'blazor-server' } = options;
141
-
142
- if (stateExists() &amp;&amp; !force) {
143
- throw new Error('State file already exists. Use force=true to overwrite.');
144
- }
145
-
146
- const initialState = {
147
- version: "2.1.1",
148
- project: {
149
- name: projectName,
150
- type: projectType,
151
- createdAt: new Date().toISOString(),
152
- updatedAt: new Date().toISOString()
153
- },
154
- features: {},
155
- metadata: {
156
- totalFeatures: 0,
157
- completedFeatures: 0,
158
- totalCostEstimated: 0,
159
- totalTimeSpent: 0,
160
- lastUpdated: new Date().toISOString()
161
- }
162
- };
163
-
164
- saveState(initialState);
165
- return initialState;
166
- }
167
-
168
- // ============================================================================
169
- // Feature Operations
170
- // ============================================================================
171
-
172
- /**
173
- * Get feature from state
174
- * @param {string} featureName - Feature name
175
- * @returns {Object|null} Feature object or null
176
- */
177
- export function getFeature(featureName) {
178
- const state = loadState();
179
- return state.features[featureName] || null;
180
- }
181
-
182
- /**
183
- * Create or get feature with default structure
184
- * @param {string} featureName - Feature name
185
- * @returns {Object} Feature object
186
- */
187
- function ensureFeature(featureName) {
188
- const state = loadState();
189
-
190
- if (!state.features[featureName]) {
191
- state.features[featureName] = {
192
- status: "draft",
193
- phase: "proposal",
194
- createdAt: new Date().toISOString(),
195
- updatedAt: new Date().toISOString(),
196
- activeAgents: [],
197
- outputs: {
198
- proposal: { created: false, path: `.morph/project/outputs/${featureName}/proposal.md` },
199
- spec: { created: false, path: `.morph/project/outputs/${featureName}/spec.md` },
200
- contracts: { created: false, path: `.morph/project/outputs/${featureName}/contracts.cs` },
201
- tasks: { created: false, path: `.morph/project/outputs/${featureName}/tasks.json` },
202
- uiDesignSystem: { created: false, path: `.morph/project/outputs/${featureName}/ui-design-system.md` },
203
- uiMockups: { created: false, path: `.morph/project/outputs/${featureName}/ui-mockups.md` },
204
- uiComponents: { created: false, path: `.morph/project/outputs/${featureName}/ui-components.md` },
205
- uiFlows: { created: false, path: `.morph/project/outputs/${featureName}/ui-flows.md` },
206
- decisions: { created: false, path: `.morph/project/outputs/${featureName}/decisions.md` },
207
- recap: { created: false, path: `.morph/project/outputs/${featureName}/recap.md` }
208
- },
209
- tasks: {
210
- total: 0,
211
- completed: 0,
212
- inProgress: 0,
213
- pending: 0
214
- },
215
- checkpoints: [],
216
- costs: {
217
- estimated: 0,
218
- approved: false,
219
- approvedBy: null,
220
- approvedAt: null
221
- }
222
- };
223
-
224
- state.metadata.totalFeatures++;
225
- saveState(state);
226
- }
227
-
228
- return state.features[featureName];
229
- }
230
-
231
- /**
232
- * Update feature property (supports nested keys like "tasks.completed")
233
- * @param {string} featureName - Feature name
234
- * @param {string} key - Property key (supports dot notation)
235
- * @param {any} value - Value to set
236
- */
237
- export function updateFeature(featureName, key, value) {
238
- ensureFeature(featureName);
239
- const state = loadState(); // Load AFTER ensuring feature exists
240
-
241
- const keys = key.split('.');
242
- let target = state.features[featureName];
243
-
244
- for (let i = 0; i &lt; keys.length - 1; i++) {
245
- if (!target[keys[i]]) {
246
- target[keys[i]] = {};
247
- }
248
- target = target[keys[i]];
249
- }
250
-
251
- const finalKey = keys[keys.length - 1];
252
- target[finalKey] = value;
253
- state.features[featureName].updatedAt = new Date().toISOString();
254
-
255
- saveState(state);
256
- }
257
-
258
- /**
259
- * Update multiple feature properties at once
260
- * @param {string} featureName - Feature name
261
- * @param {Object} updates - Object with key-value pairs to update
262
- */
263
- export function updateFeatureMultiple(featureName, updates) {
264
- ensureFeature(featureName);
265
- const state = loadState(); // Load AFTER ensuring feature exists
266
-
267
- for (const [key, value] of Object.entries(updates)) {
268
- const keys = key.split('.');
269
- let target = state.features[featureName];
270
-
271
- for (let i = 0; i &lt; keys.length - 1; i++) {
272
- if (!target[keys[i]]) {
273
- target[keys[i]] = {};
274
- }
275
- target = target[keys[i]];
276
- }
277
-
278
- const finalKey = keys[keys.length - 1];
279
- target[finalKey] = value;
280
- }
281
-
282
- state.features[featureName].updatedAt = new Date().toISOString();
283
- saveState(state);
284
- }
285
-
286
- /**
287
- * Add checkpoint to feature
288
- * @param {string} featureName - Feature name
289
- * @param {string} note - Checkpoint note
290
- * @returns {Object} Checkpoint object
291
- */
292
- export function addCheckpoint(featureName, note) {
293
- ensureFeature(featureName);
294
- const state = loadState();
295
- const feature = state.features[featureName];
296
-
297
- const checkpoint = {
298
- timestamp: new Date().toISOString(),
299
- phase: feature.phase,
300
- completedTasks: feature.tasks.completed,
301
- note: note
302
- };
303
-
304
- feature.checkpoints.push(checkpoint);
305
- feature.updatedAt = new Date().toISOString();
306
-
307
- saveState(state);
308
- return checkpoint;
309
- }
310
-
311
- /**
312
- * Add agent to feature
313
- * @param {string} featureName - Feature name
314
- * @param {string} agentId - Agent ID
315
- * @returns {boolean} True if added, false if already exists
316
- */
317
- export function addAgent(featureName, agentId) {
318
- ensureFeature(featureName);
319
- const state = loadState(); // Load AFTER ensuring feature exists
320
-
321
- if (!state.features[featureName].activeAgents.includes(agentId)) {
322
- state.features[featureName].activeAgents.push(agentId);
323
- state.features[featureName].updatedAt = new Date().toISOString();
324
- saveState(state);
325
- return true;
326
- }
327
-
328
- return false;
329
- }
330
-
331
- /**
332
- * Remove agent from feature
333
- * @param {string} featureName - Feature name
334
- * @param {string} agentId - Agent ID
335
- * @returns {boolean} True if removed, false if not found
336
- */
337
- export function removeAgent(featureName, agentId) {
338
- const state = loadState();
339
-
340
- if (!state.features[featureName]) {
341
- throw new Error(`Feature '${featureName}' not found.`);
342
- }
343
-
344
- const index = state.features[featureName].activeAgents.indexOf(agentId);
345
- if (index > -1) {
346
- state.features[featureName].activeAgents.splice(index, 1);
347
- state.features[featureName].updatedAt = new Date().toISOString();
348
- saveState(state);
349
- return true;
350
- }
351
-
352
- return false;
353
- }
354
-
355
- /**
356
- * Mark output as created
357
- * @param {string} featureName - Feature name
358
- * @param {string} outputType - Output type (proposal, spec, contracts, etc.)
359
- */
360
- export function markOutput(featureName, outputType) {
361
- ensureFeature(featureName);
362
- const state = loadState();
363
-
364
- if (!state.features[featureName].outputs[outputType]) {
365
- throw new Error(`Output type '${outputType}' not valid. Valid types: proposal, spec, contracts, tasks, uiDesignSystem, uiMockups, uiComponents, uiFlows, decisions, recap`);
366
- }
367
-
368
- state.features[featureName].outputs[outputType].created = true;
369
- state.features[featureName].updatedAt = new Date().toISOString();
370
-
371
- saveState(state);
372
- }
373
-
374
- /**
375
- * List all features
376
- * @returns {Array} Array of [featureName, featureObject] tuples
377
- */
378
- export function listFeatures() {
379
- const state = loadState();
380
- return Object.entries(state.features);
381
- }
382
-
383
- /**
384
- * Get project summary
385
- * @returns {Object} Summary with metadata
386
- */
387
- export function getSummary() {
388
- const state = loadState();
389
- return {
390
- project: state.project,
391
- metadata: state.metadata,
392
- featuresCount: Object.keys(state.features).length
393
- };
394
- }
395
- </code></pre>
396
- </article>
397
- </section>
398
-
399
-
400
-
401
-
402
-
403
-
404
- </div>
405
-
406
- <br class="clear">
407
-
408
- <footer>
409
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
410
- </footer>
411
-
412
- <script>prettyPrint();</script>
413
- <script src="scripts/polyfill.js"></script>
414
- <script src="scripts/linenumber.js"></script>
415
-
416
- <script src="scripts/search.js" defer></script>
417
-
418
-
419
- <script src="scripts/collapse.js" defer></script>
420
-
421
-
422
- </body>
423
- </html>