@planu/cli 1.10.0 → 1.12.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 (323) hide show
  1. package/dist/config/license-plans.json +32 -2
  2. package/dist/engine/api-compat/compatibility-checker.d.ts +4 -0
  3. package/dist/engine/api-compat/compatibility-checker.d.ts.map +1 -0
  4. package/dist/engine/api-compat/compatibility-checker.js +118 -0
  5. package/dist/engine/api-compat/compatibility-checker.js.map +1 -0
  6. package/dist/engine/checkpoint/checkpoint-manager.d.ts +22 -0
  7. package/dist/engine/checkpoint/checkpoint-manager.d.ts.map +1 -0
  8. package/dist/engine/checkpoint/checkpoint-manager.js +76 -0
  9. package/dist/engine/checkpoint/checkpoint-manager.js.map +1 -0
  10. package/dist/engine/checkpoint/policy-engine.d.ts +10 -0
  11. package/dist/engine/checkpoint/policy-engine.d.ts.map +1 -0
  12. package/dist/engine/checkpoint/policy-engine.js +87 -0
  13. package/dist/engine/checkpoint/policy-engine.js.map +1 -0
  14. package/dist/engine/compliance/auto-remediator.d.ts +9 -0
  15. package/dist/engine/compliance/auto-remediator.d.ts.map +1 -0
  16. package/dist/engine/compliance/auto-remediator.js +118 -0
  17. package/dist/engine/compliance/auto-remediator.js.map +1 -0
  18. package/dist/engine/compliance/evidence-builder.d.ts +19 -0
  19. package/dist/engine/compliance/evidence-builder.d.ts.map +1 -0
  20. package/dist/engine/compliance/evidence-builder.js +36 -0
  21. package/dist/engine/compliance/evidence-builder.js.map +1 -0
  22. package/dist/engine/compliance/framework-catalog.d.ts +15 -0
  23. package/dist/engine/compliance/framework-catalog.d.ts.map +1 -0
  24. package/dist/engine/compliance/framework-catalog.js +134 -0
  25. package/dist/engine/compliance/framework-catalog.js.map +1 -0
  26. package/dist/engine/compliance/gap-analyzer.d.ts +11 -0
  27. package/dist/engine/compliance/gap-analyzer.d.ts.map +1 -0
  28. package/dist/engine/compliance/gap-analyzer.js +39 -0
  29. package/dist/engine/compliance/gap-analyzer.js.map +1 -0
  30. package/dist/engine/context-profile/profile-catalog.d.ts +5 -0
  31. package/dist/engine/context-profile/profile-catalog.d.ts.map +1 -0
  32. package/dist/engine/context-profile/profile-catalog.js +145 -0
  33. package/dist/engine/context-profile/profile-catalog.js.map +1 -0
  34. package/dist/engine/critical-path/path-analyzer.d.ts +3 -0
  35. package/dist/engine/critical-path/path-analyzer.d.ts.map +1 -0
  36. package/dist/engine/critical-path/path-analyzer.js +145 -0
  37. package/dist/engine/critical-path/path-analyzer.js.map +1 -0
  38. package/dist/engine/distribution/cost-estimator.d.ts +8 -0
  39. package/dist/engine/distribution/cost-estimator.d.ts.map +1 -0
  40. package/dist/engine/distribution/cost-estimator.js +113 -0
  41. package/dist/engine/distribution/cost-estimator.js.map +1 -0
  42. package/dist/engine/distribution/diagram-generator.d.ts +12 -0
  43. package/dist/engine/distribution/diagram-generator.d.ts.map +1 -0
  44. package/dist/engine/distribution/diagram-generator.js +59 -0
  45. package/dist/engine/distribution/diagram-generator.js.map +1 -0
  46. package/dist/engine/distribution/readiness-analyzer.d.ts +4 -0
  47. package/dist/engine/distribution/readiness-analyzer.d.ts.map +1 -0
  48. package/dist/engine/distribution/readiness-analyzer.js +61 -0
  49. package/dist/engine/distribution/readiness-analyzer.js.map +1 -0
  50. package/dist/engine/distribution/runbook-generator.d.ts +7 -0
  51. package/dist/engine/distribution/runbook-generator.d.ts.map +1 -0
  52. package/dist/engine/distribution/runbook-generator.js +42 -0
  53. package/dist/engine/distribution/runbook-generator.js.map +1 -0
  54. package/dist/engine/drift/violation-resolver.d.ts +9 -0
  55. package/dist/engine/drift/violation-resolver.d.ts.map +1 -0
  56. package/dist/engine/drift/violation-resolver.js +128 -0
  57. package/dist/engine/drift/violation-resolver.js.map +1 -0
  58. package/dist/engine/ears/criterion-scorer.d.ts +7 -0
  59. package/dist/engine/ears/criterion-scorer.d.ts.map +1 -0
  60. package/dist/engine/ears/criterion-scorer.js +87 -0
  61. package/dist/engine/ears/criterion-scorer.js.map +1 -0
  62. package/dist/engine/ears/pattern-matcher.d.ts +5 -0
  63. package/dist/engine/ears/pattern-matcher.d.ts.map +1 -0
  64. package/dist/engine/ears/pattern-matcher.js +48 -0
  65. package/dist/engine/ears/pattern-matcher.js.map +1 -0
  66. package/dist/engine/ears/rewriter.d.ts +7 -0
  67. package/dist/engine/ears/rewriter.d.ts.map +1 -0
  68. package/dist/engine/ears/rewriter.js +45 -0
  69. package/dist/engine/ears/rewriter.js.map +1 -0
  70. package/dist/engine/ears/spec-linter.d.ts +7 -0
  71. package/dist/engine/ears/spec-linter.d.ts.map +1 -0
  72. package/dist/engine/ears/spec-linter.js +127 -0
  73. package/dist/engine/ears/spec-linter.js.map +1 -0
  74. package/dist/engine/health/auto-fixer.d.ts +7 -0
  75. package/dist/engine/health/auto-fixer.d.ts.map +1 -0
  76. package/dist/engine/health/auto-fixer.js +130 -0
  77. package/dist/engine/health/auto-fixer.js.map +1 -0
  78. package/dist/engine/mcp-catalog/catalog-advisor.d.ts +3 -0
  79. package/dist/engine/mcp-catalog/catalog-advisor.d.ts.map +1 -0
  80. package/dist/engine/mcp-catalog/catalog-advisor.js +180 -0
  81. package/dist/engine/mcp-catalog/catalog-advisor.js.map +1 -0
  82. package/dist/engine/mcp-hub/adapter-registry.d.ts +23 -0
  83. package/dist/engine/mcp-hub/adapter-registry.d.ts.map +1 -0
  84. package/dist/engine/mcp-hub/adapter-registry.js +19 -0
  85. package/dist/engine/mcp-hub/adapter-registry.js.map +1 -0
  86. package/dist/engine/mcp-hub/adapters/github-adapter.d.ts +4 -0
  87. package/dist/engine/mcp-hub/adapters/github-adapter.d.ts.map +1 -0
  88. package/dist/engine/mcp-hub/adapters/github-adapter.js +44 -0
  89. package/dist/engine/mcp-hub/adapters/github-adapter.js.map +1 -0
  90. package/dist/engine/mcp-hub/adapters/supabase-adapter.d.ts +4 -0
  91. package/dist/engine/mcp-hub/adapters/supabase-adapter.d.ts.map +1 -0
  92. package/dist/engine/mcp-hub/adapters/supabase-adapter.js +41 -0
  93. package/dist/engine/mcp-hub/adapters/supabase-adapter.js.map +1 -0
  94. package/dist/engine/mcp-hub/event-router.d.ts +19 -0
  95. package/dist/engine/mcp-hub/event-router.d.ts.map +1 -0
  96. package/dist/engine/mcp-hub/event-router.js +47 -0
  97. package/dist/engine/mcp-hub/event-router.js.map +1 -0
  98. package/dist/engine/productivity/calibration-engine.d.ts +17 -0
  99. package/dist/engine/productivity/calibration-engine.d.ts.map +1 -0
  100. package/dist/engine/productivity/calibration-engine.js +49 -0
  101. package/dist/engine/productivity/calibration-engine.js.map +1 -0
  102. package/dist/engine/productivity/time-tracker.d.ts +6 -0
  103. package/dist/engine/productivity/time-tracker.d.ts.map +1 -0
  104. package/dist/engine/productivity/time-tracker.js +28 -0
  105. package/dist/engine/productivity/time-tracker.js.map +1 -0
  106. package/dist/engine/productivity/vibe-tax-calculator.d.ts +14 -0
  107. package/dist/engine/productivity/vibe-tax-calculator.d.ts.map +1 -0
  108. package/dist/engine/productivity/vibe-tax-calculator.js +63 -0
  109. package/dist/engine/productivity/vibe-tax-calculator.js.map +1 -0
  110. package/dist/engine/quality-gates/gate-catalog.d.ts +6 -0
  111. package/dist/engine/quality-gates/gate-catalog.d.ts.map +1 -0
  112. package/dist/engine/quality-gates/gate-catalog.js +351 -0
  113. package/dist/engine/quality-gates/gate-catalog.js.map +1 -0
  114. package/dist/engine/quality-gates/gate-evaluator.d.ts +3 -0
  115. package/dist/engine/quality-gates/gate-evaluator.d.ts.map +1 -0
  116. package/dist/engine/quality-gates/gate-evaluator.js +25 -0
  117. package/dist/engine/quality-gates/gate-evaluator.js.map +1 -0
  118. package/dist/engine/quality-gates/gate-injector.d.ts +20 -0
  119. package/dist/engine/quality-gates/gate-injector.d.ts.map +1 -0
  120. package/dist/engine/quality-gates/gate-injector.js +75 -0
  121. package/dist/engine/quality-gates/gate-injector.js.map +1 -0
  122. package/dist/engine/similar-problems/similarity-finder.d.ts +3 -0
  123. package/dist/engine/similar-problems/similarity-finder.d.ts.map +1 -0
  124. package/dist/engine/similar-problems/similarity-finder.js +144 -0
  125. package/dist/engine/similar-problems/similarity-finder.js.map +1 -0
  126. package/dist/engine/sync/asana-puller.d.ts +9 -0
  127. package/dist/engine/sync/asana-puller.d.ts.map +1 -0
  128. package/dist/engine/sync/asana-puller.js +91 -0
  129. package/dist/engine/sync/asana-puller.js.map +1 -0
  130. package/dist/engine/sync/conflict-resolver.d.ts +17 -0
  131. package/dist/engine/sync/conflict-resolver.d.ts.map +1 -0
  132. package/dist/engine/sync/conflict-resolver.js +58 -0
  133. package/dist/engine/sync/conflict-resolver.js.map +1 -0
  134. package/dist/engine/sync/monday-puller.d.ts +9 -0
  135. package/dist/engine/sync/monday-puller.d.ts.map +1 -0
  136. package/dist/engine/sync/monday-puller.js +110 -0
  137. package/dist/engine/sync/monday-puller.js.map +1 -0
  138. package/dist/engine/sync/notion-puller.d.ts +15 -0
  139. package/dist/engine/sync/notion-puller.d.ts.map +1 -0
  140. package/dist/engine/sync/notion-puller.js +101 -0
  141. package/dist/engine/sync/notion-puller.js.map +1 -0
  142. package/dist/engine/verifier/code-scanner.d.ts +8 -0
  143. package/dist/engine/verifier/code-scanner.d.ts.map +1 -0
  144. package/dist/engine/verifier/code-scanner.js +73 -0
  145. package/dist/engine/verifier/code-scanner.js.map +1 -0
  146. package/dist/engine/verifier/compliance-scorer.d.ts +17 -0
  147. package/dist/engine/verifier/compliance-scorer.d.ts.map +1 -0
  148. package/dist/engine/verifier/compliance-scorer.js +131 -0
  149. package/dist/engine/verifier/compliance-scorer.js.map +1 -0
  150. package/dist/engine/verifier/criterion-matcher.d.ts +15 -0
  151. package/dist/engine/verifier/criterion-matcher.d.ts.map +1 -0
  152. package/dist/engine/verifier/criterion-matcher.js +210 -0
  153. package/dist/engine/verifier/criterion-matcher.js.map +1 -0
  154. package/dist/index.js +24 -0
  155. package/dist/index.js.map +1 -1
  156. package/dist/storage/compliance-audit-store.d.ts +12 -0
  157. package/dist/storage/compliance-audit-store.d.ts.map +1 -0
  158. package/dist/storage/compliance-audit-store.js +40 -0
  159. package/dist/storage/compliance-audit-store.js.map +1 -0
  160. package/dist/storage/compliance-score-store.d.ts +16 -0
  161. package/dist/storage/compliance-score-store.d.ts.map +1 -0
  162. package/dist/storage/compliance-score-store.js +30 -0
  163. package/dist/storage/compliance-score-store.js.map +1 -0
  164. package/dist/storage/context-profile-store.d.ts +14 -0
  165. package/dist/storage/context-profile-store.d.ts.map +1 -0
  166. package/dist/storage/context-profile-store.js +34 -0
  167. package/dist/storage/context-profile-store.js.map +1 -0
  168. package/dist/storage/mcp-hub-store.d.ts +9 -0
  169. package/dist/storage/mcp-hub-store.d.ts.map +1 -0
  170. package/dist/storage/mcp-hub-store.js +28 -0
  171. package/dist/storage/mcp-hub-store.js.map +1 -0
  172. package/dist/storage/time-tracking-store.d.ts +6 -0
  173. package/dist/storage/time-tracking-store.d.ts.map +1 -0
  174. package/dist/storage/time-tracking-store.js +34 -0
  175. package/dist/storage/time-tracking-store.js.map +1 -0
  176. package/dist/storage/workflow-checkpoint-store.d.ts +16 -0
  177. package/dist/storage/workflow-checkpoint-store.d.ts.map +1 -0
  178. package/dist/storage/workflow-checkpoint-store.js +71 -0
  179. package/dist/storage/workflow-checkpoint-store.js.map +1 -0
  180. package/dist/tools/checkpoint/approve-checkpoint-handler.d.ts +3 -0
  181. package/dist/tools/checkpoint/approve-checkpoint-handler.d.ts.map +1 -0
  182. package/dist/tools/checkpoint/approve-checkpoint-handler.js +32 -0
  183. package/dist/tools/checkpoint/approve-checkpoint-handler.js.map +1 -0
  184. package/dist/tools/checkpoint/configure-policy-handler.d.ts +3 -0
  185. package/dist/tools/checkpoint/configure-policy-handler.d.ts.map +1 -0
  186. package/dist/tools/checkpoint/configure-policy-handler.js +60 -0
  187. package/dist/tools/checkpoint/configure-policy-handler.js.map +1 -0
  188. package/dist/tools/checkpoint/list-checkpoints-handler.d.ts +3 -0
  189. package/dist/tools/checkpoint/list-checkpoints-handler.d.ts.map +1 -0
  190. package/dist/tools/checkpoint/list-checkpoints-handler.js +25 -0
  191. package/dist/tools/checkpoint/list-checkpoints-handler.js.map +1 -0
  192. package/dist/tools/checkpoint/reject-checkpoint-handler.d.ts +3 -0
  193. package/dist/tools/checkpoint/reject-checkpoint-handler.d.ts.map +1 -0
  194. package/dist/tools/checkpoint/reject-checkpoint-handler.js +32 -0
  195. package/dist/tools/checkpoint/reject-checkpoint-handler.js.map +1 -0
  196. package/dist/tools/checkpoint/require-checkpoint-handler.d.ts +3 -0
  197. package/dist/tools/checkpoint/require-checkpoint-handler.d.ts.map +1 -0
  198. package/dist/tools/checkpoint/require-checkpoint-handler.js +44 -0
  199. package/dist/tools/checkpoint/require-checkpoint-handler.js.map +1 -0
  200. package/dist/tools/compliance-gap-handler.d.ts +5 -0
  201. package/dist/tools/compliance-gap-handler.d.ts.map +1 -0
  202. package/dist/tools/compliance-gap-handler.js +64 -0
  203. package/dist/tools/compliance-gap-handler.js.map +1 -0
  204. package/dist/tools/distribution-readiness-handler.d.ts +3 -0
  205. package/dist/tools/distribution-readiness-handler.d.ts.map +1 -0
  206. package/dist/tools/distribution-readiness-handler.js +24 -0
  207. package/dist/tools/distribution-readiness-handler.js.map +1 -0
  208. package/dist/tools/generate-cost-estimate-handler.d.ts +3 -0
  209. package/dist/tools/generate-cost-estimate-handler.d.ts.map +1 -0
  210. package/dist/tools/generate-cost-estimate-handler.js +29 -0
  211. package/dist/tools/generate-cost-estimate-handler.js.map +1 -0
  212. package/dist/tools/generate-deployment-diagram-handler.d.ts +3 -0
  213. package/dist/tools/generate-deployment-diagram-handler.d.ts.map +1 -0
  214. package/dist/tools/generate-deployment-diagram-handler.js +26 -0
  215. package/dist/tools/generate-deployment-diagram-handler.js.map +1 -0
  216. package/dist/tools/generate-runbook-handler.d.ts +3 -0
  217. package/dist/tools/generate-runbook-handler.d.ts.map +1 -0
  218. package/dist/tools/generate-runbook-handler.js +18 -0
  219. package/dist/tools/generate-runbook-handler.js.map +1 -0
  220. package/dist/tools/inject-quality-gates-handler.d.ts +7 -0
  221. package/dist/tools/inject-quality-gates-handler.d.ts.map +1 -0
  222. package/dist/tools/inject-quality-gates-handler.js +59 -0
  223. package/dist/tools/inject-quality-gates-handler.js.map +1 -0
  224. package/dist/tools/mcp-hub-handler.d.ts +7 -0
  225. package/dist/tools/mcp-hub-handler.d.ts.map +1 -0
  226. package/dist/tools/mcp-hub-handler.js +73 -0
  227. package/dist/tools/mcp-hub-handler.js.map +1 -0
  228. package/dist/tools/productivity-report-handler.d.ts +4 -0
  229. package/dist/tools/productivity-report-handler.d.ts.map +1 -0
  230. package/dist/tools/productivity-report-handler.js +98 -0
  231. package/dist/tools/productivity-report-handler.js.map +1 -0
  232. package/dist/tools/pull-sync-handler.d.ts +25 -0
  233. package/dist/tools/pull-sync-handler.d.ts.map +1 -0
  234. package/dist/tools/pull-sync-handler.js +161 -0
  235. package/dist/tools/pull-sync-handler.js.map +1 -0
  236. package/dist/tools/register-auto-remediation.d.ts +3 -0
  237. package/dist/tools/register-auto-remediation.d.ts.map +1 -0
  238. package/dist/tools/register-auto-remediation.js +174 -0
  239. package/dist/tools/register-auto-remediation.js.map +1 -0
  240. package/dist/tools/register-checkpoints.d.ts +3 -0
  241. package/dist/tools/register-checkpoints.d.ts.map +1 -0
  242. package/dist/tools/register-checkpoints.js +134 -0
  243. package/dist/tools/register-checkpoints.js.map +1 -0
  244. package/dist/tools/register-context-profile.d.ts +3 -0
  245. package/dist/tools/register-context-profile.d.ts.map +1 -0
  246. package/dist/tools/register-context-profile.js +106 -0
  247. package/dist/tools/register-context-profile.js.map +1 -0
  248. package/dist/tools/register-distribution.d.ts +3 -0
  249. package/dist/tools/register-distribution.d.ts.map +1 -0
  250. package/dist/tools/register-distribution.js +103 -0
  251. package/dist/tools/register-distribution.js.map +1 -0
  252. package/dist/tools/register-ears.d.ts +3 -0
  253. package/dist/tools/register-ears.d.ts.map +1 -0
  254. package/dist/tools/register-ears.js +148 -0
  255. package/dist/tools/register-ears.js.map +1 -0
  256. package/dist/tools/register-enterprise-compliance.d.ts +3 -0
  257. package/dist/tools/register-enterprise-compliance.d.ts.map +1 -0
  258. package/dist/tools/register-enterprise-compliance.js +30 -0
  259. package/dist/tools/register-enterprise-compliance.js.map +1 -0
  260. package/dist/tools/register-mcp-hub.d.ts +3 -0
  261. package/dist/tools/register-mcp-hub.d.ts.map +1 -0
  262. package/dist/tools/register-mcp-hub.js +47 -0
  263. package/dist/tools/register-mcp-hub.js.map +1 -0
  264. package/dist/tools/register-productivity.d.ts +3 -0
  265. package/dist/tools/register-productivity.d.ts.map +1 -0
  266. package/dist/tools/register-productivity.js +25 -0
  267. package/dist/tools/register-productivity.js.map +1 -0
  268. package/dist/tools/register-pull-sync.d.ts +3 -0
  269. package/dist/tools/register-pull-sync.d.ts.map +1 -0
  270. package/dist/tools/register-pull-sync.js +71 -0
  271. package/dist/tools/register-pull-sync.js.map +1 -0
  272. package/dist/tools/register-quality-gates.d.ts +3 -0
  273. package/dist/tools/register-quality-gates.d.ts.map +1 -0
  274. package/dist/tools/register-quality-gates.js +47 -0
  275. package/dist/tools/register-quality-gates.js.map +1 -0
  276. package/dist/tools/register-spec405-tools.d.ts +7 -0
  277. package/dist/tools/register-spec405-tools.d.ts.map +1 -0
  278. package/dist/tools/register-spec405-tools.js +194 -0
  279. package/dist/tools/register-spec405-tools.js.map +1 -0
  280. package/dist/tools/register-verifier.d.ts +3 -0
  281. package/dist/tools/register-verifier.d.ts.map +1 -0
  282. package/dist/tools/register-verifier.js +141 -0
  283. package/dist/tools/register-verifier.js.map +1 -0
  284. package/dist/types/analysis.d.ts +128 -0
  285. package/dist/types/analysis.d.ts.map +1 -1
  286. package/dist/types/context-profile.d.ts +22 -0
  287. package/dist/types/context-profile.d.ts.map +1 -0
  288. package/dist/types/context-profile.js +2 -0
  289. package/dist/types/context-profile.js.map +1 -0
  290. package/dist/types/docs.d.ts +43 -0
  291. package/dist/types/docs.d.ts.map +1 -1
  292. package/dist/types/ears.d.ts +34 -0
  293. package/dist/types/ears.d.ts.map +1 -0
  294. package/dist/types/ears.js +3 -0
  295. package/dist/types/ears.js.map +1 -0
  296. package/dist/types/env.d.ts +23 -0
  297. package/dist/types/env.d.ts.map +1 -1
  298. package/dist/types/estimation.d.ts +30 -0
  299. package/dist/types/estimation.d.ts.map +1 -1
  300. package/dist/types/health.d.ts +40 -0
  301. package/dist/types/health.d.ts.map +1 -0
  302. package/dist/types/health.js +3 -0
  303. package/dist/types/health.js.map +1 -0
  304. package/dist/types/index.d.ts +4 -0
  305. package/dist/types/index.d.ts.map +1 -1
  306. package/dist/types/index.js +4 -0
  307. package/dist/types/index.js.map +1 -1
  308. package/dist/types/notion-asana-monday.d.ts +38 -0
  309. package/dist/types/notion-asana-monday.d.ts.map +1 -1
  310. package/dist/types/orchestration/index.d.ts +1 -0
  311. package/dist/types/orchestration/index.d.ts.map +1 -1
  312. package/dist/types/orchestration/mcp-hub.d.ts +29 -0
  313. package/dist/types/orchestration/mcp-hub.d.ts.map +1 -0
  314. package/dist/types/orchestration/mcp-hub.js +3 -0
  315. package/dist/types/orchestration/mcp-hub.js.map +1 -0
  316. package/dist/types/orchestration.d.ts +1 -1
  317. package/dist/types/orchestration.d.ts.map +1 -1
  318. package/dist/types/workflow-checkpoint.d.ts +66 -0
  319. package/dist/types/workflow-checkpoint.d.ts.map +1 -0
  320. package/dist/types/workflow-checkpoint.js +4 -0
  321. package/dist/types/workflow-checkpoint.js.map +1 -0
  322. package/package.json +1 -1
  323. package/src/config/license-plans.json +32 -2
@@ -0,0 +1,113 @@
1
+ // Monthly cost table (approximate 2026 prices)
2
+ const COST_TABLE = {
3
+ aws: {
4
+ compute: { tier: 'ECS Fargate (0.5 vCPU, 1GB)', monthlyUsd: 15, notes: '~720 hours/month' },
5
+ database: {
6
+ tier: 'RDS PostgreSQL t3.micro',
7
+ monthlyUsd: 25,
8
+ notes: 'Single-AZ, 20GB storage',
9
+ },
10
+ cache: { tier: 'ElastiCache t3.micro', monthlyUsd: 18, notes: 'Single node' },
11
+ cdn: { tier: 'CloudFront', monthlyUsd: 5, notes: '10GB transfer included' },
12
+ storage: { tier: 'S3 Standard', monthlyUsd: 3, notes: '100GB storage' },
13
+ monitoring: { tier: 'CloudWatch', monthlyUsd: 10, notes: 'Basic metrics + logs' },
14
+ },
15
+ gcp: {
16
+ compute: { tier: 'Cloud Run (min 1 instance)', monthlyUsd: 12, notes: '1 vCPU, 512MB' },
17
+ database: { tier: 'Cloud SQL PostgreSQL', monthlyUsd: 30, notes: 'db-f1-micro, 10GB' },
18
+ cache: { tier: 'Memorystore Redis', monthlyUsd: 20, notes: '1GB basic tier' },
19
+ cdn: { tier: 'Cloud CDN', monthlyUsd: 4, notes: '10GB egress included' },
20
+ storage: { tier: 'Cloud Storage', monthlyUsd: 2, notes: '100GB standard' },
21
+ monitoring: { tier: 'Cloud Monitoring', monthlyUsd: 8, notes: 'Basic ops suite' },
22
+ },
23
+ railway: {
24
+ compute: { tier: 'Railway Hobby', monthlyUsd: 5, notes: 'Included in hobby plan' },
25
+ database: { tier: 'Railway PostgreSQL', monthlyUsd: 5, notes: '1GB included' },
26
+ cache: { tier: 'Railway Redis', monthlyUsd: 5, notes: 'Shared instance' },
27
+ cdn: { tier: 'N/A', monthlyUsd: 0, notes: 'Not offered' },
28
+ storage: { tier: 'Volume', monthlyUsd: 2, notes: '1GB volume' },
29
+ monitoring: { tier: 'Built-in metrics', monthlyUsd: 0, notes: 'Included' },
30
+ },
31
+ vercel: {
32
+ compute: {
33
+ tier: 'Vercel Pro Functions',
34
+ monthlyUsd: 20,
35
+ notes: 'Fluid compute, included in Pro',
36
+ },
37
+ database: {
38
+ tier: 'Vercel Marketplace DB',
39
+ monthlyUsd: 15,
40
+ notes: 'Neon/PlanetScale starter',
41
+ },
42
+ cache: { tier: 'Vercel KV (Upstash)', monthlyUsd: 5, notes: '100MB included' },
43
+ cdn: { tier: 'Vercel Edge Network', monthlyUsd: 0, notes: 'Included in Pro' },
44
+ storage: { tier: 'Vercel Blob', monthlyUsd: 5, notes: '5GB included' },
45
+ monitoring: { tier: 'Vercel Analytics', monthlyUsd: 10, notes: 'Web Analytics Pro' },
46
+ },
47
+ fly: {
48
+ compute: { tier: 'Fly.io shared-cpu-1x', monthlyUsd: 3, notes: '256MB RAM' },
49
+ database: { tier: 'Fly Postgres', monthlyUsd: 5, notes: 'Single node' },
50
+ cache: { tier: 'Fly Redis (Upstash)', monthlyUsd: 5, notes: '10K commands/day free' },
51
+ cdn: { tier: 'N/A', monthlyUsd: 0, notes: 'Not offered' },
52
+ storage: { tier: 'Fly Volumes', monthlyUsd: 2, notes: '1GB volume' },
53
+ monitoring: { tier: 'Fly Metrics', monthlyUsd: 0, notes: 'Included' },
54
+ },
55
+ generic: {
56
+ compute: { tier: 'VPS equivalent', monthlyUsd: 10, notes: 'Generic estimate' },
57
+ database: { tier: 'Managed DB', monthlyUsd: 20, notes: 'Generic estimate' },
58
+ cache: { tier: 'Redis managed', monthlyUsd: 15, notes: 'Generic estimate' },
59
+ cdn: { tier: 'CDN basic', monthlyUsd: 5, notes: 'Generic estimate' },
60
+ storage: { tier: 'Object storage', monthlyUsd: 3, notes: 'Generic estimate' },
61
+ monitoring: { tier: 'Monitoring basic', monthlyUsd: 8, notes: 'Generic estimate' },
62
+ },
63
+ };
64
+ export function estimateCost(provider, resources) {
65
+ const table = COST_TABLE[provider];
66
+ const resourceCosts = resources
67
+ .map((r) => {
68
+ const entry = table[r];
69
+ if (!entry) {
70
+ return null;
71
+ }
72
+ return {
73
+ resource: r,
74
+ provider,
75
+ tier: entry.tier,
76
+ monthlyUsd: entry.monthlyUsd,
77
+ notes: entry.notes,
78
+ };
79
+ })
80
+ .filter((r) => r !== null);
81
+ const total = resourceCosts.reduce((sum, r) => sum + r.monthlyUsd, 0);
82
+ const breakdown = resourceCosts
83
+ .map((r) => ` ${r.resource}: $${r.monthlyUsd}/mo (${r.tier})`)
84
+ .join('\n');
85
+ return {
86
+ provider,
87
+ resources: resourceCosts,
88
+ totalMonthlyUsd: total,
89
+ totalYearlyUsd: total * 12,
90
+ breakdown: `Provider: ${provider}\n${breakdown}\n Total: $${total}/month ($${total * 12}/year)`,
91
+ };
92
+ }
93
+ export function detectProvider(stack, framework) {
94
+ const s = (stack ?? '').toLowerCase();
95
+ const f = (framework ?? '').toLowerCase();
96
+ if (s.includes('vercel') || f.includes('next') || f.includes('vercel')) {
97
+ return 'vercel';
98
+ }
99
+ if (s.includes('railway')) {
100
+ return 'railway';
101
+ }
102
+ if (s.includes('fly')) {
103
+ return 'fly';
104
+ }
105
+ if (s.includes('gcp') || s.includes('google')) {
106
+ return 'gcp';
107
+ }
108
+ if (s.includes('aws') || s.includes('amazon')) {
109
+ return 'aws';
110
+ }
111
+ return 'generic';
112
+ }
113
+ //# sourceMappingURL=cost-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-estimator.js","sourceRoot":"","sources":["../../../src/engine/distribution/cost-estimator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface DiagramSpec {
2
+ services: {
3
+ name: string;
4
+ type: string;
5
+ }[];
6
+ databases: string[];
7
+ caches: string[];
8
+ external: string[];
9
+ }
10
+ export declare function generateC4Diagram(input: DiagramSpec): string;
11
+ export declare function specTodiagramInput(specTitles: string[], stack?: string): DiagramSpec;
12
+ //# sourceMappingURL=diagram-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/distribution/diagram-generator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAoC5D;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CA4BpF"}
@@ -0,0 +1,59 @@
1
+ export function generateC4Diagram(input) {
2
+ const lines = ['```mermaid', 'graph TB'];
3
+ if (input.services.length > 0) {
4
+ lines.push(' subgraph Services');
5
+ for (const s of input.services) {
6
+ lines.push(` ${s.name.replace(/\s+/g, '_')}["${s.name}\n[${s.type}]"]`);
7
+ }
8
+ lines.push(' end');
9
+ }
10
+ if (input.databases.length > 0) {
11
+ lines.push(' subgraph Data');
12
+ for (const db of input.databases) {
13
+ lines.push(` ${db.replace(/\s+/g, '_')}[("${db}")]`);
14
+ }
15
+ lines.push(' end');
16
+ }
17
+ if (input.caches.length > 0) {
18
+ for (const cache of input.caches) {
19
+ lines.push(` ${cache.replace(/\s+/g, '_')}(("${cache}"))`);
20
+ }
21
+ }
22
+ if (input.external.length > 0) {
23
+ lines.push(' subgraph External');
24
+ for (const ext of input.external) {
25
+ lines.push(` ${ext.replace(/\s+/g, '_')}["${ext}"]:::external`);
26
+ }
27
+ lines.push(' end');
28
+ }
29
+ lines.push(' classDef external fill:#f9f,stroke:#333,stroke-dasharray: 5 5');
30
+ lines.push('```');
31
+ return lines.join('\n');
32
+ }
33
+ export function specTodiagramInput(specTitles, stack) {
34
+ const services = [{ name: 'API Server', type: 'Service' }];
35
+ const databases = [];
36
+ const caches = [];
37
+ const external = [];
38
+ const allText = specTitles.join(' ').toLowerCase();
39
+ if (allText.includes('postgres') || allText.includes('database') || allText.includes('sql')) {
40
+ databases.push('PostgreSQL');
41
+ }
42
+ if (allText.includes('redis') || allText.includes('cache')) {
43
+ caches.push('Redis Cache');
44
+ }
45
+ if (allText.includes('auth') || allText.includes('oauth')) {
46
+ external.push('Auth Provider');
47
+ }
48
+ if (allText.includes('email') || allText.includes('notification')) {
49
+ external.push('Email Service');
50
+ }
51
+ if (allText.includes('payment') || allText.includes('billing') || allText.includes('stripe')) {
52
+ external.push('Payment Gateway');
53
+ }
54
+ if ((stack ?? '').toLowerCase().includes('next') || allText.includes('frontend')) {
55
+ services.push({ name: 'Frontend', type: 'Web App' });
56
+ }
57
+ return { services, databases, caches, external };
58
+ }
59
+ //# sourceMappingURL=diagram-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram-generator.js","sourceRoot":"","sources":["../../../src/engine/distribution/diagram-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DistributionReadiness } from '../../types/index.js';
2
+ export type DistributionReadinessResult = DistributionReadiness;
3
+ export declare function analyzeDistributionReadiness(specTitles: string[]): DistributionReadinessResult;
4
+ //# sourceMappingURL=readiness-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/distribution/readiness-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlE,MAAM,MAAM,2BAA2B,GAAG,qBAAqB,CAAC;AA6ChE,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,2BAA2B,CAqB9F"}
@@ -0,0 +1,61 @@
1
+ const CRITICAL_SPEC_PATTERNS = [
2
+ {
3
+ key: 'auth',
4
+ patterns: ['auth', 'login', 'jwt', 'oauth', 'session', 'token'],
5
+ label: 'Authentication',
6
+ },
7
+ {
8
+ key: 'error',
9
+ patterns: ['error handling', 'error boundary', 'exception'],
10
+ label: 'Error Handling',
11
+ },
12
+ {
13
+ key: 'rate-limit',
14
+ patterns: ['rate limit', 'throttle', 'quota'],
15
+ label: 'Rate Limiting',
16
+ },
17
+ {
18
+ key: 'monitoring',
19
+ patterns: ['monitoring', 'observability', 'logging', 'metrics', 'otel'],
20
+ label: 'Observability/Monitoring',
21
+ },
22
+ {
23
+ key: 'backup',
24
+ patterns: ['backup', 'restore', 'disaster recovery', 'data retention'],
25
+ label: 'Backup & Recovery',
26
+ },
27
+ {
28
+ key: 'cost',
29
+ patterns: ['cost', 'budget', 'billing', 'spending'],
30
+ label: 'Cost Management',
31
+ },
32
+ {
33
+ key: 'security',
34
+ patterns: ['security', 'vulnerability', 'penetration', 'audit'],
35
+ label: 'Security Audit',
36
+ },
37
+ {
38
+ key: 'ci',
39
+ patterns: ['ci', 'cd', 'pipeline', 'deploy', 'release'],
40
+ label: 'CI/CD Pipeline',
41
+ },
42
+ ];
43
+ export function analyzeDistributionReadiness(specTitles) {
44
+ const titlesLower = specTitles.map((t) => t.toLowerCase());
45
+ const present = [];
46
+ const missing = [];
47
+ for (const critical of CRITICAL_SPEC_PATTERNS) {
48
+ const found = critical.patterns.some((p) => titlesLower.some((t) => t.includes(p)));
49
+ if (found) {
50
+ present.push(critical.label);
51
+ }
52
+ else {
53
+ missing.push(critical.label);
54
+ }
55
+ }
56
+ const score = Math.round((present.length / CRITICAL_SPEC_PATTERNS.length) * 100);
57
+ const level = score >= 80 ? 'ready' : score >= 50 ? 'partial' : 'not-ready';
58
+ const recommendations = missing.map((m) => `Create a spec for: ${m}`);
59
+ return { score, level, present, missing, recommendations };
60
+ }
61
+ //# sourceMappingURL=readiness-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness-analyzer.js","sourceRoot":"","sources":["../../../src/engine/distribution/readiness-analyzer.ts"],"names":[],"mappings":"AAMA,MAAM,sBAAsB,GAAG;IAC7B;QACE,GAAG,EAAE,MAAM;QACX,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;QAC/D,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,CAAC;QAC3D,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC;QAC7C,KAAK,EAAE,eAAe;KACvB;IACD;QACE,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;QACvE,KAAK,EAAE,0BAA0B;KAClC;IACD;QACE,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;QACtE,KAAK,EAAE,mBAAmB;KAC3B;IACD;QACE,GAAG,EAAE,MAAM;QACX,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;QACnD,KAAK,EAAE,iBAAiB;KACzB;IACD;QACE,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,CAAC,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC;QAC/D,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC;QACvD,KAAK,EAAE,gBAAgB;KACxB;CACF,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,UAAoB;IAC/D,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IACjF,MAAM,KAAK,GACT,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;IAEhE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAEtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface RunbookInput {
2
+ projectName: string;
3
+ provider: string;
4
+ services: string[];
5
+ }
6
+ export declare function generateRunbook(input: RunbookInput): string;
7
+ //# sourceMappingURL=runbook-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runbook-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/distribution/runbook-generator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAwC3D"}
@@ -0,0 +1,42 @@
1
+ export function generateRunbook(input) {
2
+ const { projectName, provider, services } = input;
3
+ const date = new Date().toISOString().split('T')[0];
4
+ return `# Operational Runbook — ${projectName}
5
+ Generated: ${date} | Provider: ${provider}
6
+
7
+ ## 1. Pre-Deployment Checklist
8
+ - [ ] All tests passing in CI
9
+ - [ ] Environment variables configured in ${provider} dashboard
10
+ - [ ] Database migrations reviewed and tested on staging
11
+ - [ ] Rollback plan documented (see section 3)
12
+ - [ ] On-call engineer notified
13
+
14
+ ## 2. Deployment Steps
15
+ ${services.map((s, i) => `${i + 1}. Deploy ${s} to ${provider}`).join('\n')}
16
+ ${services.length + 1}. Run health check endpoints
17
+ ${services.length + 2}. Verify monitoring dashboards show green
18
+
19
+ ## 3. Rollback Procedure
20
+ 1. Identify the last stable deployment tag
21
+ 2. Trigger rollback in ${provider} dashboard → select previous deployment
22
+ 3. Verify rollback successful via health check
23
+ 4. Notify team in incident channel
24
+
25
+ ## 4. Health Checks
26
+ ${services.map((s) => `- GET /${s.toLowerCase().replace(/\s+/g, '-')}/health → 200 OK`).join('\n')}
27
+
28
+ ## 5. Alerting Thresholds
29
+ | Metric | Warning | Critical |
30
+ |--------|---------|----------|
31
+ | Error rate | >1% | >5% |
32
+ | P99 latency | >500ms | >2000ms |
33
+ | CPU usage | >70% | >90% |
34
+ | Memory | >80% | >95% |
35
+
36
+ ## 6. Incident Response
37
+ - P1 (production down): Page on-call immediately, start incident bridge
38
+ - P2 (degraded): Notify team, investigate within 30 minutes
39
+ - P3 (minor): Track in issue tracker, fix in next sprint
40
+ `;
41
+ }
42
+ //# sourceMappingURL=runbook-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runbook-generator.js","sourceRoot":"","sources":["../../../src/engine/distribution/runbook-generator.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,eAAe,CAAC,KAAmB;IACjD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,2BAA2B,WAAW;aAClC,IAAI,gBAAgB,QAAQ;;;;4CAIG,QAAQ;;;;;;EAMlD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EACzE,QAAQ,CAAC,MAAM,GAAG,CAAC;EACnB,QAAQ,CAAC,MAAM,GAAG,CAAC;;;;yBAII,QAAQ;;;;;EAK/B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;CAcjG,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DriftResolutionResult } from '../../types/health.js';
2
+ /**
3
+ * Resolves drift violations semi-automatically by inspecting cached drift
4
+ * entries and taking action based on the spec's current status.
5
+ *
6
+ * When dryRun=true, returns the planned resolutions without writing any files.
7
+ */
8
+ export declare function resolveDriftViolations(projectPath: string, projectId: string, dryRun?: boolean): Promise<DriftResolutionResult>;
9
+ //# sourceMappingURL=violation-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"violation-resolver.d.ts","sourceRoot":"","sources":["../../../src/engine/drift/violation-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAiB,MAAM,uBAAuB,CAAC;AAwFlF;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,UAAQ,GACb,OAAO,CAAC,qBAAqB,CAAC,CA+DhC"}
@@ -0,0 +1,128 @@
1
+ // engine/drift/violation-resolver.ts — Semi-automatic drift violation resolution (SPEC-408)
2
+ import { mkdir, writeFile, access } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { specStore } from '../../storage/index.js';
5
+ import { DriftCacheStore } from '../../storage/drift-cache-store.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Helpers
8
+ // ---------------------------------------------------------------------------
9
+ async function specDirExists(specDir) {
10
+ try {
11
+ await access(specDir);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ async function createFollowUpSpec(projectPath, parentSpecId, reason, dryRun) {
19
+ const timestamp = Date.now();
20
+ const specId = `SPEC-followup-${parentSpecId.toLowerCase()}-${timestamp}`;
21
+ if (!dryRun) {
22
+ const specDir = join(projectPath, 'planu', 'specs', specId);
23
+ await mkdir(specDir, { recursive: true });
24
+ const now = new Date().toISOString();
25
+ const specContent = [
26
+ '---',
27
+ `id: ${specId}`,
28
+ `title: "Follow-up: ${parentSpecId} drift resolution"`,
29
+ `status: draft`,
30
+ `tags: [drift, follow-up, auto-generated]`,
31
+ `createdAt: ${now}`,
32
+ '---',
33
+ '',
34
+ `# Follow-up for ${parentSpecId}`,
35
+ '',
36
+ reason,
37
+ '',
38
+ '## Acceptance Criteria',
39
+ '',
40
+ `- [ ] Review all criteria from ${parentSpecId} against current implementation`,
41
+ '- [ ] Update spec or implementation to re-align',
42
+ '- [ ] Run detect_drift to confirm score returns to 0',
43
+ '',
44
+ ].join('\n');
45
+ await writeFile(join(specDir, 'spec.md'), specContent, 'utf-8');
46
+ await writeFile(join(specDir, 'progress.md'), `# ${specId} — Progress\n\nstatus: draft\n`, 'utf-8');
47
+ }
48
+ return specId;
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Violation handlers per status
52
+ // ---------------------------------------------------------------------------
53
+ function buildDoneButDivergedResolution(specId) {
54
+ return {
55
+ specId,
56
+ action: 'follow-up-spec-queued',
57
+ description: 'Spec is done but code has diverged — follow-up spec created to track delta',
58
+ };
59
+ }
60
+ function buildInProgressAheadResolution(specId) {
61
+ return {
62
+ specId,
63
+ action: 'spec-note-added',
64
+ description: 'Spec is in-progress and code is ahead — criteria note added to flag untracked work',
65
+ };
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // Public API
69
+ // ---------------------------------------------------------------------------
70
+ /**
71
+ * Resolves drift violations semi-automatically by inspecting cached drift
72
+ * entries and taking action based on the spec's current status.
73
+ *
74
+ * When dryRun=true, returns the planned resolutions without writing any files.
75
+ */
76
+ export async function resolveDriftViolations(projectPath, projectId, dryRun = false) {
77
+ const cacheStore = new DriftCacheStore(projectId);
78
+ const cacheData = await cacheStore.load();
79
+ const cachedEntries = Object.values(cacheData.entries);
80
+ const specs = await specStore.listSpecs(projectId);
81
+ const specMap = new Map(specs.map((s) => [s.id, s]));
82
+ const resolved = [];
83
+ const followUpSpecsCreated = [];
84
+ const manualReview = [];
85
+ for (const entry of cachedEntries) {
86
+ const spec = specMap.get(entry.specId);
87
+ if (!spec) {
88
+ manualReview.push(`${entry.specId}: spec no longer exists — remove orphaned drift cache`);
89
+ continue;
90
+ }
91
+ if (spec.status === 'done') {
92
+ // Code diverged from a completed spec — create follow-up
93
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
94
+ const reason = `Drift detected (score: ${entry.driftScore.toFixed(2)}) in files: ${(entry.driftedFiles ?? []).join(', ') || 'unknown'}`;
95
+ const followUpId = await createFollowUpSpec(projectPath, spec.id, reason, dryRun);
96
+ followUpSpecsCreated.push(followUpId);
97
+ resolved.push(buildDoneButDivergedResolution(spec.id));
98
+ }
99
+ else if (spec.status === 'implementing') {
100
+ // In-progress spec with code ahead — annotate but don't block
101
+ resolved.push(buildInProgressAheadResolution(spec.id));
102
+ }
103
+ else if (spec.status === 'draft') {
104
+ // Draft spec but code already exists — flag for human review
105
+ manualReview.push(`${spec.id}: spec is in draft status but drift detected — review if implementation started`);
106
+ }
107
+ else {
108
+ manualReview.push(`${spec.id}: drift detected (status: ${spec.status}) — manual review needed`);
109
+ }
110
+ }
111
+ if (cachedEntries.length === 0) {
112
+ // Check all implementing/done specs without cached drift entries
113
+ const activeSpecs = specs.filter((s) => s.status === 'implementing' || s.status === 'done' || s.status === 'draft');
114
+ for (const spec of activeSpecs) {
115
+ const specDir = join(projectPath, 'planu', 'specs', spec.id);
116
+ const hasProgress = await specDirExists(join(specDir, 'progress.md'));
117
+ if (!hasProgress && spec.status === 'draft') {
118
+ manualReview.push(`${spec.id}: draft spec with no progress tracking — run auto_fix_health`);
119
+ }
120
+ }
121
+ }
122
+ return {
123
+ resolved,
124
+ followUpSpecsCreated,
125
+ manualReview,
126
+ };
127
+ }
128
+ //# sourceMappingURL=violation-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"violation-resolver.js","sourceRoot":"","sources":["../../../src/engine/drift/violation-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CriterionQuality } from '../../types/ears.js';
2
+ /**
3
+ * Score a single acceptance criterion using EARS and testability heuristics.
4
+ */
5
+ export declare function scoreCriterion(text: string): CriterionQuality;
6
+ export declare function gradeSpec(avgScore: number): 'A' | 'B' | 'C' | 'D' | 'F';
7
+ //# sourceMappingURL=criterion-scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criterion-scorer.d.ts","sourceRoot":"","sources":["../../../src/engine/ears/criterion-scorer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA8B5D;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAyD7D;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAcvE"}
@@ -0,0 +1,87 @@
1
+ // engine/ears/criterion-scorer.ts — EARS criterion scoring (SPEC-410)
2
+ import { detectEarsPattern, detectVaguenessFlags, isEarsCompliant } from './pattern-matcher.js';
3
+ import { generateRewrites } from './rewriter.js';
4
+ // Patterns that indicate a measurable numeric threshold
5
+ const NUMERIC_VALUE_REGEX = /\d+\s*(?:ms|milliseconds?|seconds?|minutes?|hours?|items?|%|percent|kb|mb|gb|px|requests?|users?|calls?|retries?)/i;
6
+ // Patterns for specific API routes/endpoints
7
+ const ENDPOINT_REGEX = /(?:\/api\/|GET\s+|POST\s+|PUT\s+|DELETE\s+|PATCH\s+)/i;
8
+ // Patterns for clear success conditions
9
+ const SUCCESS_CONDITION_REGEX = /\b(?:returns?|displays?|shows?|navigates?\s+to|renders?|saves?|stores?|loads?|creates?|sends?|emits?)\b/i;
10
+ // Patterns for a measurable threshold (numeric value with unit or comparison)
11
+ const MEASURABLE_THRESHOLD_REGEX = /\b(?:at (?:most|least)|no more than|within|fewer than|greater than|more than|\d+\s*(?:ms|seconds?|items?|%|kb|mb))\b/i;
12
+ // Patterns for named components/features
13
+ const COMPONENT_REGEX = /\b(?:[A-Z][a-zA-Z]+(?:Component|Page|Modal|Service|Store|API|Endpoint|Handler|Manager|Controller|View|Form|Button|Panel|Screen)|\w+[-_]\w+)\b/;
14
+ // Patterns for trigger conditions
15
+ const TRIGGER_REGEX = /\b(?:when|if|while|where|after|before|on(?:ce)?)\b/i;
16
+ // Patterns for actors
17
+ const ACTOR_REGEX = /\b(?:user|admin|system|operator|manager|client|server|guest|subscriber|owner)\b/i;
18
+ /**
19
+ * Score a single acceptance criterion using EARS and testability heuristics.
20
+ */
21
+ export function scoreCriterion(text) {
22
+ const earsPattern = detectEarsPattern(text);
23
+ const earsCompliant = isEarsCompliant(text);
24
+ const vaguenessFlagsFound = detectVaguenessFlags(text);
25
+ const vaguenessDeduction = Math.min(vaguenessFlagsFound.length * 2, 10);
26
+ // --- Testability Score (0-10) ---
27
+ let testabilityScore = 0;
28
+ if (NUMERIC_VALUE_REGEX.test(text)) {
29
+ testabilityScore += 3;
30
+ }
31
+ if (earsCompliant) {
32
+ testabilityScore += 3;
33
+ }
34
+ if (ENDPOINT_REGEX.test(text)) {
35
+ testabilityScore += 2;
36
+ }
37
+ if (SUCCESS_CONDITION_REGEX.test(text)) {
38
+ testabilityScore += 2;
39
+ }
40
+ testabilityScore = Math.max(0, testabilityScore - vaguenessDeduction);
41
+ testabilityScore = Math.min(10, testabilityScore);
42
+ // --- Specificity Score (0-10) ---
43
+ let specificityScore = 0;
44
+ if (MEASURABLE_THRESHOLD_REGEX.test(text) || NUMERIC_VALUE_REGEX.test(text)) {
45
+ specificityScore += 4;
46
+ }
47
+ if (COMPONENT_REGEX.test(text)) {
48
+ specificityScore += 3;
49
+ }
50
+ if (TRIGGER_REGEX.test(text)) {
51
+ specificityScore += 2;
52
+ }
53
+ if (ACTOR_REGEX.test(text)) {
54
+ specificityScore += 1;
55
+ }
56
+ specificityScore = Math.max(0, specificityScore - vaguenessDeduction);
57
+ specificityScore = Math.min(10, specificityScore);
58
+ const overallScore = Math.round(((testabilityScore + specificityScore) / 2) * 10) / 10;
59
+ // Generate rewrite suggestions only when score is below threshold
60
+ const rewriteSuggestions = overallScore < 7 ? generateRewrites(text, earsPattern) : [];
61
+ return {
62
+ text,
63
+ testabilityScore,
64
+ specificityScore,
65
+ earsPattern,
66
+ earsCompliant,
67
+ vaguenessFlagsFound,
68
+ overallScore,
69
+ rewriteSuggestions,
70
+ };
71
+ }
72
+ export function gradeSpec(avgScore) {
73
+ if (avgScore >= 9) {
74
+ return 'A';
75
+ }
76
+ if (avgScore >= 7) {
77
+ return 'B';
78
+ }
79
+ if (avgScore >= 5) {
80
+ return 'C';
81
+ }
82
+ if (avgScore >= 3) {
83
+ return 'D';
84
+ }
85
+ return 'F';
86
+ }
87
+ //# sourceMappingURL=criterion-scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criterion-scorer.js","sourceRoot":"","sources":["../../../src/engine/ears/criterion-scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { EarsPattern } from '../../types/ears.js';
2
+ export declare function detectEarsPattern(criterion: string): EarsPattern;
3
+ export declare function detectVaguenessFlags(criterion: string): string[];
4
+ export declare function isEarsCompliant(criterion: string): boolean;
5
+ //# sourceMappingURL=pattern-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-matcher.d.ts","sourceRoot":"","sources":["../../../src/engine/ears/pattern-matcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA+BvD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAOhE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D"}