@lumenflow/cli 3.1.2 → 3.1.3

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 (389) hide show
  1. package/README.md +36 -35
  2. package/dist/agent-issues-query.js +13 -8
  3. package/dist/agent-log-issue.js +15 -4
  4. package/dist/agent-session-end.js +15 -4
  5. package/dist/agent-session.js +18 -6
  6. package/dist/backlog-prune.js +1 -1
  7. package/dist/commands/integrate.js +32 -18
  8. package/dist/config-get.js +27 -15
  9. package/dist/config-set.js +104 -37
  10. package/dist/delegation-list.js +1 -1
  11. package/dist/doctor.js +19 -13
  12. package/dist/file-delete.js +1 -1
  13. package/dist/file-edit.js +1 -1
  14. package/dist/file-read.js +1 -1
  15. package/dist/file-write.js +1 -1
  16. package/dist/flow-bottlenecks.js +1 -1
  17. package/dist/flow-report.js +10 -9
  18. package/dist/gates.js +3 -2
  19. package/dist/git-branch.js +1 -1
  20. package/dist/git-diff.js +1 -1
  21. package/dist/git-log.js +1 -1
  22. package/dist/init.js +238 -42
  23. package/dist/initiative-add-wu.js +1 -1
  24. package/dist/initiative-bulk-assign-wus.js +1 -1
  25. package/dist/initiative-create.js +2 -2
  26. package/dist/initiative-edit.js +1 -1
  27. package/dist/initiative-list.js +1 -1
  28. package/dist/initiative-plan.js +1 -3
  29. package/dist/initiative-status.js +47 -6
  30. package/dist/lane-edit.js +19 -10
  31. package/dist/lane-health.js +13 -24
  32. package/dist/lane-lock.js +4 -5
  33. package/dist/lane-setup.js +5 -5
  34. package/dist/lane-status.js +4 -5
  35. package/dist/lane-suggest.js +9 -7
  36. package/dist/lane-validate.js +4 -5
  37. package/dist/lumenflow-upgrade.js +17 -11
  38. package/dist/mem-checkpoint.js +1 -1
  39. package/dist/mem-cleanup.js +6 -23
  40. package/dist/mem-context.js +1 -1
  41. package/dist/mem-create.js +1 -1
  42. package/dist/mem-delete.js +1 -1
  43. package/dist/mem-export.js +1 -1
  44. package/dist/mem-inbox.js +1 -1
  45. package/dist/mem-init.js +1 -1
  46. package/dist/mem-ready.js +1 -1
  47. package/dist/mem-recover.js +1 -1
  48. package/dist/mem-signal.js +1 -1
  49. package/dist/mem-start.js +1 -1
  50. package/dist/mem-summarize.js +8 -7
  51. package/dist/mem-triage.js +7 -5
  52. package/dist/metrics-cli.js +1 -1
  53. package/dist/metrics-snapshot.js +1 -1
  54. package/dist/onboard.js +295 -120
  55. package/dist/orchestrate-init-status.js +12 -7
  56. package/dist/orchestrate-initiative.js +23 -12
  57. package/dist/orchestrate-monitor.js +20 -8
  58. package/dist/pack-scaffold.js +1 -1
  59. package/dist/plan-create.js +1 -3
  60. package/dist/plan-edit.js +1 -3
  61. package/dist/plan-link.js +1 -3
  62. package/dist/plan-promote.js +1 -3
  63. package/dist/release.js +1 -3
  64. package/dist/signal-cleanup.js +4 -18
  65. package/dist/state-bootstrap.js +11 -8
  66. package/dist/state-cleanup.js +5 -19
  67. package/dist/state-doctor.js +213 -9
  68. package/dist/task-claim.js +1 -1
  69. package/dist/validate.js +1 -1
  70. package/dist/workspace-init.js +61 -61
  71. package/dist/wu-block.js +1 -1
  72. package/dist/wu-brief.js +1 -1
  73. package/dist/wu-claim.js +1 -1
  74. package/dist/wu-cleanup.js +1 -1
  75. package/dist/wu-create.js +3 -3
  76. package/dist/wu-delegate.js +1 -1
  77. package/dist/wu-deps.js +1 -1
  78. package/dist/wu-done.js +66 -34
  79. package/dist/wu-edit.js +1 -1
  80. package/dist/wu-infer-lane.js +1 -1
  81. package/dist/wu-preflight.js +1 -1
  82. package/dist/wu-prep.js +1 -1
  83. package/dist/wu-proto.js +1 -1
  84. package/dist/wu-prune.js +1 -1
  85. package/dist/wu-recover.js +1 -1
  86. package/dist/wu-release.js +1 -1
  87. package/dist/wu-repair.js +1 -1
  88. package/dist/wu-sandbox.js +40 -27
  89. package/dist/wu-status.js +1 -1
  90. package/dist/wu-unblock.js +1 -1
  91. package/dist/wu-unlock-lane.js +1 -1
  92. package/dist/wu-validate.js +1 -1
  93. package/package.json +12 -8
  94. package/packs/software-delivery/constants.ts +10 -0
  95. package/packs/software-delivery/extensions.ts +140 -0
  96. package/packs/software-delivery/gate-policies.ts +134 -0
  97. package/packs/software-delivery/index.ts +8 -0
  98. package/packs/software-delivery/manifest-schema.ts +236 -0
  99. package/packs/software-delivery/manifest.ts +417 -0
  100. package/packs/software-delivery/manifest.yaml +711 -0
  101. package/packs/software-delivery/pack-registration.ts +113 -0
  102. package/packs/software-delivery/tool-impl/agent-tools.ts +263 -0
  103. package/packs/software-delivery/tool-impl/delegation-tools.ts +66 -0
  104. package/packs/software-delivery/tool-impl/flow-metrics-tools.ts +219 -0
  105. package/packs/software-delivery/tool-impl/git-runner.ts +113 -0
  106. package/packs/software-delivery/tool-impl/git-tools.ts +316 -0
  107. package/packs/software-delivery/tool-impl/index.ts +15 -0
  108. package/packs/software-delivery/tool-impl/initiative-orchestration-tools.ts +720 -0
  109. package/packs/software-delivery/tool-impl/lane-lock.ts +246 -0
  110. package/packs/software-delivery/tool-impl/memory-tools.ts +415 -0
  111. package/packs/software-delivery/tool-impl/pending-runtime-tools.ts +21 -0
  112. package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +328 -0
  113. package/packs/software-delivery/tool-impl/runtime-native-tools.ts +687 -0
  114. package/packs/software-delivery/tool-impl/worker-loader.ts +52 -0
  115. package/packs/software-delivery/tool-impl/worktree-tools.ts +46 -0
  116. package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +759 -0
  117. package/packs/software-delivery/tools/delegation-tools.ts +23 -0
  118. package/packs/software-delivery/tools/git-tools.ts +55 -0
  119. package/packs/software-delivery/tools/index.ts +8 -0
  120. package/packs/software-delivery/tools/lane-lock-tool.ts +37 -0
  121. package/packs/software-delivery/tools/types.ts +71 -0
  122. package/packs/software-delivery/tools/worktree-tools.ts +49 -0
  123. package/templates/core/LUMENFLOW.md.template +3 -3
  124. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +1 -1
  125. package/templates/core/ai/onboarding/lumenflow-force-usage.md.template +1 -1
  126. package/templates/core/ai/onboarding/quick-ref-commands.md.template +5 -5
  127. package/templates/core/ai/onboarding/starting-prompt.md.template +3 -3
  128. package/templates/core/ai/onboarding/vendor-support.md.template +1 -1
  129. package/templates/core/ai/onboarding/wu-create-checklist.md.template +1 -1
  130. package/dist/agent-issues-query.js.map +0 -1
  131. package/dist/agent-log-issue.js.map +0 -1
  132. package/dist/agent-session-end.js.map +0 -1
  133. package/dist/agent-session.js.map +0 -1
  134. package/dist/backlog-prune.js.map +0 -1
  135. package/dist/cli-entry-point.js +0 -149
  136. package/dist/cli-entry-point.js.map +0 -1
  137. package/dist/commands/integrate.js.map +0 -1
  138. package/dist/commands.js.map +0 -1
  139. package/dist/config-get.js.map +0 -1
  140. package/dist/config-set.js.map +0 -1
  141. package/dist/delegation-list.js.map +0 -1
  142. package/dist/deps-add.js +0 -259
  143. package/dist/deps-add.js.map +0 -1
  144. package/dist/deps-remove.js +0 -105
  145. package/dist/deps-remove.js.map +0 -1
  146. package/dist/docs-sync.js.map +0 -1
  147. package/dist/doctor.js.map +0 -1
  148. package/dist/file-delete.js.map +0 -1
  149. package/dist/file-edit.js.map +0 -1
  150. package/dist/file-read.js.map +0 -1
  151. package/dist/file-write.js.map +0 -1
  152. package/dist/flow-bottlenecks.js.map +0 -1
  153. package/dist/flow-report.js.map +0 -1
  154. package/dist/formatters.js +0 -151
  155. package/dist/formatters.js.map +0 -1
  156. package/dist/gate-defaults.js +0 -131
  157. package/dist/gate-defaults.js.map +0 -1
  158. package/dist/gate-registry.js +0 -73
  159. package/dist/gate-registry.js.map +0 -1
  160. package/dist/gates-graceful-degradation.js +0 -153
  161. package/dist/gates-graceful-degradation.js.map +0 -1
  162. package/dist/gates-plan-resolvers.js +0 -152
  163. package/dist/gates-plan-resolvers.js.map +0 -1
  164. package/dist/gates-runners.js +0 -509
  165. package/dist/gates-runners.js.map +0 -1
  166. package/dist/gates-types.js +0 -4
  167. package/dist/gates-types.js.map +0 -1
  168. package/dist/gates-utils.js +0 -323
  169. package/dist/gates-utils.js.map +0 -1
  170. package/dist/gates.js.map +0 -1
  171. package/dist/git-branch.js.map +0 -1
  172. package/dist/git-diff.js.map +0 -1
  173. package/dist/git-log.js.map +0 -1
  174. package/dist/git-status.js.map +0 -1
  175. package/dist/guard-locked.js +0 -172
  176. package/dist/guard-locked.js.map +0 -1
  177. package/dist/guard-main-branch.js +0 -217
  178. package/dist/guard-main-branch.js.map +0 -1
  179. package/dist/guard-worktree-commit.js +0 -163
  180. package/dist/guard-worktree-commit.js.map +0 -1
  181. package/dist/hooks/auto-checkpoint-utils.js +0 -54
  182. package/dist/hooks/auto-checkpoint-utils.js.map +0 -1
  183. package/dist/hooks/enforcement-checks.js +0 -399
  184. package/dist/hooks/enforcement-checks.js.map +0 -1
  185. package/dist/hooks/enforcement-generator.js +0 -139
  186. package/dist/hooks/enforcement-generator.js.map +0 -1
  187. package/dist/hooks/enforcement-sync.js +0 -385
  188. package/dist/hooks/enforcement-sync.js.map +0 -1
  189. package/dist/hooks/generators/auto-checkpoint.js +0 -125
  190. package/dist/hooks/generators/auto-checkpoint.js.map +0 -1
  191. package/dist/hooks/generators/enforce-worktree.js +0 -190
  192. package/dist/hooks/generators/enforce-worktree.js.map +0 -1
  193. package/dist/hooks/generators/index.js +0 -18
  194. package/dist/hooks/generators/index.js.map +0 -1
  195. package/dist/hooks/generators/pre-compact-checkpoint.js +0 -136
  196. package/dist/hooks/generators/pre-compact-checkpoint.js.map +0 -1
  197. package/dist/hooks/generators/require-wu.js +0 -117
  198. package/dist/hooks/generators/require-wu.js.map +0 -1
  199. package/dist/hooks/generators/session-start-recovery.js +0 -103
  200. package/dist/hooks/generators/session-start-recovery.js.map +0 -1
  201. package/dist/hooks/generators/signal-utils.js +0 -54
  202. package/dist/hooks/generators/signal-utils.js.map +0 -1
  203. package/dist/hooks/generators/warn-incomplete.js +0 -67
  204. package/dist/hooks/generators/warn-incomplete.js.map +0 -1
  205. package/dist/hooks/index.js +0 -10
  206. package/dist/hooks/index.js.map +0 -1
  207. package/dist/index.js.map +0 -1
  208. package/dist/init-detection.js +0 -232
  209. package/dist/init-detection.js.map +0 -1
  210. package/dist/init-lane-validation.js +0 -143
  211. package/dist/init-lane-validation.js.map +0 -1
  212. package/dist/init-scaffolding.js +0 -158
  213. package/dist/init-scaffolding.js.map +0 -1
  214. package/dist/init-templates.js +0 -1982
  215. package/dist/init-templates.js.map +0 -1
  216. package/dist/init.js.map +0 -1
  217. package/dist/initiative-add-wu.js.map +0 -1
  218. package/dist/initiative-bulk-assign-wus.js.map +0 -1
  219. package/dist/initiative-create.js.map +0 -1
  220. package/dist/initiative-edit.js.map +0 -1
  221. package/dist/initiative-list.js.map +0 -1
  222. package/dist/initiative-plan.js.map +0 -1
  223. package/dist/initiative-remove-wu.js.map +0 -1
  224. package/dist/initiative-status.js.map +0 -1
  225. package/dist/lane-edit.js.map +0 -1
  226. package/dist/lane-health.js.map +0 -1
  227. package/dist/lane-lifecycle-process.js +0 -366
  228. package/dist/lane-lifecycle-process.js.map +0 -1
  229. package/dist/lane-lock.js.map +0 -1
  230. package/dist/lane-setup.js.map +0 -1
  231. package/dist/lane-status.js.map +0 -1
  232. package/dist/lane-suggest.js.map +0 -1
  233. package/dist/lane-validate.js.map +0 -1
  234. package/dist/lifecycle-regression-harness.js +0 -181
  235. package/dist/lifecycle-regression-harness.js.map +0 -1
  236. package/dist/lumenflow-upgrade.js.map +0 -1
  237. package/dist/mem-checkpoint.js.map +0 -1
  238. package/dist/mem-cleanup.js.map +0 -1
  239. package/dist/mem-context.js.map +0 -1
  240. package/dist/mem-create.js.map +0 -1
  241. package/dist/mem-delete.js.map +0 -1
  242. package/dist/mem-export.js.map +0 -1
  243. package/dist/mem-inbox.js.map +0 -1
  244. package/dist/mem-index.js +0 -214
  245. package/dist/mem-index.js.map +0 -1
  246. package/dist/mem-init.js.map +0 -1
  247. package/dist/mem-profile.js +0 -210
  248. package/dist/mem-profile.js.map +0 -1
  249. package/dist/mem-promote.js +0 -257
  250. package/dist/mem-promote.js.map +0 -1
  251. package/dist/mem-ready.js.map +0 -1
  252. package/dist/mem-recover.js.map +0 -1
  253. package/dist/mem-signal.js.map +0 -1
  254. package/dist/mem-start.js.map +0 -1
  255. package/dist/mem-summarize.js.map +0 -1
  256. package/dist/mem-triage.js.map +0 -1
  257. package/dist/merge-block.js +0 -225
  258. package/dist/merge-block.js.map +0 -1
  259. package/dist/metrics-cli.js.map +0 -1
  260. package/dist/metrics-snapshot.js.map +0 -1
  261. package/dist/onboard.js.map +0 -1
  262. package/dist/onboarding-smoke-test.js +0 -418
  263. package/dist/onboarding-smoke-test.js.map +0 -1
  264. package/dist/orchestrate-init-status.js.map +0 -1
  265. package/dist/orchestrate-initiative.js.map +0 -1
  266. package/dist/orchestrate-monitor.js.map +0 -1
  267. package/dist/pack-author.js.map +0 -1
  268. package/dist/pack-hash.js.map +0 -1
  269. package/dist/pack-install.js.map +0 -1
  270. package/dist/pack-publish.js.map +0 -1
  271. package/dist/pack-scaffold.js.map +0 -1
  272. package/dist/pack-search.js.map +0 -1
  273. package/dist/pack-validate.js.map +0 -1
  274. package/dist/plan-create.js.map +0 -1
  275. package/dist/plan-edit.js.map +0 -1
  276. package/dist/plan-link.js.map +0 -1
  277. package/dist/plan-promote.js.map +0 -1
  278. package/dist/public-manifest.js +0 -920
  279. package/dist/public-manifest.js.map +0 -1
  280. package/dist/release.js.map +0 -1
  281. package/dist/rotate-progress.js +0 -253
  282. package/dist/rotate-progress.js.map +0 -1
  283. package/dist/session-coordinator.js +0 -303
  284. package/dist/session-coordinator.js.map +0 -1
  285. package/dist/shared-validators.js +0 -81
  286. package/dist/shared-validators.js.map +0 -1
  287. package/dist/signal-cleanup.js.map +0 -1
  288. package/dist/state-bootstrap.js.map +0 -1
  289. package/dist/state-cleanup.js.map +0 -1
  290. package/dist/state-doctor-fix.js +0 -226
  291. package/dist/state-doctor-fix.js.map +0 -1
  292. package/dist/state-doctor-stamps.js +0 -23
  293. package/dist/state-doctor-stamps.js.map +0 -1
  294. package/dist/state-doctor.js.map +0 -1
  295. package/dist/strict-progress.js +0 -255
  296. package/dist/strict-progress.js.map +0 -1
  297. package/dist/sync-templates.js.map +0 -1
  298. package/dist/task-claim.js.map +0 -1
  299. package/dist/trace-gen.js +0 -401
  300. package/dist/trace-gen.js.map +0 -1
  301. package/dist/validate-agent-skills.js +0 -223
  302. package/dist/validate-agent-skills.js.map +0 -1
  303. package/dist/validate-agent-sync.js +0 -151
  304. package/dist/validate-agent-sync.js.map +0 -1
  305. package/dist/validate-backlog-sync.js +0 -77
  306. package/dist/validate-backlog-sync.js.map +0 -1
  307. package/dist/validate-skills-spec.js +0 -211
  308. package/dist/validate-skills-spec.js.map +0 -1
  309. package/dist/validate.js.map +0 -1
  310. package/dist/validator-defaults.js +0 -107
  311. package/dist/validator-defaults.js.map +0 -1
  312. package/dist/validator-registry.js +0 -71
  313. package/dist/validator-registry.js.map +0 -1
  314. package/dist/workspace-init.js.map +0 -1
  315. package/dist/wu-block.js.map +0 -1
  316. package/dist/wu-brief.js.map +0 -1
  317. package/dist/wu-claim-branch.js +0 -123
  318. package/dist/wu-claim-branch.js.map +0 -1
  319. package/dist/wu-claim-cloud.js +0 -79
  320. package/dist/wu-claim-cloud.js.map +0 -1
  321. package/dist/wu-claim-mode.js +0 -82
  322. package/dist/wu-claim-mode.js.map +0 -1
  323. package/dist/wu-claim-output.js +0 -85
  324. package/dist/wu-claim-output.js.map +0 -1
  325. package/dist/wu-claim-repair-guidance.js +0 -12
  326. package/dist/wu-claim-repair-guidance.js.map +0 -1
  327. package/dist/wu-claim-resume-handler.js +0 -87
  328. package/dist/wu-claim-resume-handler.js.map +0 -1
  329. package/dist/wu-claim-state.js +0 -581
  330. package/dist/wu-claim-state.js.map +0 -1
  331. package/dist/wu-claim-validation.js +0 -457
  332. package/dist/wu-claim-validation.js.map +0 -1
  333. package/dist/wu-claim-worktree.js +0 -223
  334. package/dist/wu-claim-worktree.js.map +0 -1
  335. package/dist/wu-claim.js.map +0 -1
  336. package/dist/wu-cleanup-cloud.js +0 -78
  337. package/dist/wu-cleanup-cloud.js.map +0 -1
  338. package/dist/wu-cleanup.js.map +0 -1
  339. package/dist/wu-code-path-coverage.js +0 -83
  340. package/dist/wu-code-path-coverage.js.map +0 -1
  341. package/dist/wu-create-cloud.js +0 -30
  342. package/dist/wu-create-cloud.js.map +0 -1
  343. package/dist/wu-create-content.js +0 -264
  344. package/dist/wu-create-content.js.map +0 -1
  345. package/dist/wu-create-readiness.js +0 -59
  346. package/dist/wu-create-readiness.js.map +0 -1
  347. package/dist/wu-create-validation.js +0 -128
  348. package/dist/wu-create-validation.js.map +0 -1
  349. package/dist/wu-create.js.map +0 -1
  350. package/dist/wu-delegate.js.map +0 -1
  351. package/dist/wu-delete.js.map +0 -1
  352. package/dist/wu-deps.js.map +0 -1
  353. package/dist/wu-done-auto-cleanup.js +0 -203
  354. package/dist/wu-done-auto-cleanup.js.map +0 -1
  355. package/dist/wu-done-check.js +0 -38
  356. package/dist/wu-done-check.js.map +0 -1
  357. package/dist/wu-done-cloud.js +0 -48
  358. package/dist/wu-done-cloud.js.map +0 -1
  359. package/dist/wu-done-decay.js +0 -86
  360. package/dist/wu-done-decay.js.map +0 -1
  361. package/dist/wu-done.js.map +0 -1
  362. package/dist/wu-edit-operations.js +0 -399
  363. package/dist/wu-edit-operations.js.map +0 -1
  364. package/dist/wu-edit-validators.js +0 -282
  365. package/dist/wu-edit-validators.js.map +0 -1
  366. package/dist/wu-edit.js.map +0 -1
  367. package/dist/wu-infer-lane.js.map +0 -1
  368. package/dist/wu-preflight.js.map +0 -1
  369. package/dist/wu-prep.js.map +0 -1
  370. package/dist/wu-proto.js.map +0 -1
  371. package/dist/wu-prune.js.map +0 -1
  372. package/dist/wu-recover.js.map +0 -1
  373. package/dist/wu-release.js.map +0 -1
  374. package/dist/wu-repair.js.map +0 -1
  375. package/dist/wu-sandbox.js.map +0 -1
  376. package/dist/wu-spawn-completion.js +0 -33
  377. package/dist/wu-spawn-completion.js.map +0 -1
  378. package/dist/wu-spawn-prompt-builders.js +0 -1197
  379. package/dist/wu-spawn-prompt-builders.js.map +0 -1
  380. package/dist/wu-spawn-strategy-resolver.js +0 -322
  381. package/dist/wu-spawn-strategy-resolver.js.map +0 -1
  382. package/dist/wu-spawn.js +0 -59
  383. package/dist/wu-spawn.js.map +0 -1
  384. package/dist/wu-state-cloud.js +0 -41
  385. package/dist/wu-state-cloud.js.map +0 -1
  386. package/dist/wu-status.js.map +0 -1
  387. package/dist/wu-unblock.js.map +0 -1
  388. package/dist/wu-unlock-lane.js.map +0 -1
  389. package/dist/wu-validate.js.map +0 -1
package/dist/trace-gen.js DELETED
@@ -1,401 +0,0 @@
1
- #!/usr/bin/env node
2
- // Copyright (c) 2026 Hellmai Ltd
3
- // SPDX-License-Identifier: AGPL-3.0-only
4
- /**
5
- * Trace Generator CLI Command
6
- *
7
- * Creates traceability reports linking WUs to code changes.
8
- * Useful for audit trails, compliance documentation, and understanding
9
- * what code was changed as part of each WU.
10
- *
11
- * WU-1112: INIT-003 Phase 6 - Migrate remaining Tier 1 tools
12
- * WU-1534: Harden CLI command execution surfaces - argv-based git invocations
13
- *
14
- * Usage:
15
- * pnpm trace:gen --wu WU-1112
16
- * pnpm trace:gen --since 2024-01-01 --format json
17
- * pnpm trace:gen --format markdown --output trace.md
18
- */
19
- import { readFileSync, writeFileSync, existsSync, readdirSync } from 'node:fs';
20
- import { join } from 'node:path';
21
- import { execFileSync } from 'node:child_process';
22
- import { parse as parseYaml } from 'yaml';
23
- import { EXIT_CODES, FILE_SYSTEM } from '@lumenflow/core/wu-constants';
24
- import { WU_PATHS } from '@lumenflow/core/wu-paths';
25
- import { runCLI } from './cli-entry-point.js';
26
- /** Log prefix for console output */
27
- const LOG_PREFIX = '[trace:gen]';
28
- /**
29
- * Regex for validating WU IDs.
30
- * Valid format: WU-<digits> (e.g., WU-1112, WU-1, WU-99999)
31
- */
32
- const WU_ID_PATTERN = /^WU-\d+$/;
33
- const MAX_WU_ID_LENGTH = 32;
34
- /**
35
- * Output formats for trace report
36
- */
37
- export var TraceFormat;
38
- (function (TraceFormat) {
39
- TraceFormat["JSON"] = "json";
40
- TraceFormat["MARKDOWN"] = "markdown";
41
- TraceFormat["CSV"] = "csv";
42
- })(TraceFormat || (TraceFormat = {}));
43
- /**
44
- * Validate a WU ID to ensure it matches the expected format.
45
- *
46
- * WU-1534: Input validation layer (defense-in-depth alongside argv-based execution).
47
- *
48
- * @param wuId - WU ID to validate
49
- * @returns true if the WU ID matches the WU-<digits> pattern
50
- */
51
- export function validateWuId(wuId) {
52
- if (!wuId || wuId.length > MAX_WU_ID_LENGTH) {
53
- return false;
54
- }
55
- return WU_ID_PATTERN.test(wuId);
56
- }
57
- /**
58
- * Build argv array for git log commit lookup.
59
- *
60
- * WU-1534: Returns an argv array for use with execFileSync (no shell).
61
- * The WU ID is passed as a literal --grep= value, not interpolated into a shell string.
62
- *
63
- * @param wuId - WU ID to search for in commit messages
64
- * @returns Argv array for execFileSync('git', args)
65
- */
66
- export function buildGitLogArgs(wuId) {
67
- return ['log', '--all', '--oneline', '--date=iso-strict', '--format=%H|%ad|%s', `--grep=${wuId}`];
68
- }
69
- /**
70
- * Build argv array for git log file listing.
71
- *
72
- * WU-1534: Returns an argv array for use with execFileSync (no shell).
73
- * Replaces the previous shell pipe `| sort -u` with in-process dedup.
74
- *
75
- * @param wuId - WU ID to search for in commit messages
76
- * @returns Argv array for execFileSync('git', args)
77
- */
78
- export function buildGitFilesArgs(wuId) {
79
- return ['log', '--all', '--name-only', '--format=', `--grep=${wuId}`];
80
- }
81
- /**
82
- * Parse command line arguments for trace-gen
83
- *
84
- * @param argv - Process argv array
85
- * @returns Parsed arguments
86
- */
87
- export function parseTraceArgs(argv) {
88
- const args = {};
89
- // Skip node and script name
90
- const cliArgs = argv.slice(2);
91
- for (let i = 0; i < cliArgs.length; i++) {
92
- const arg = cliArgs[i];
93
- if (arg === '--help' || arg === '-h') {
94
- args.help = true;
95
- }
96
- else if (arg === '--wu' || arg === '-w') {
97
- args.wuId = cliArgs[++i];
98
- }
99
- else if (arg === '--format' || arg === '-f') {
100
- args.format = cliArgs[++i];
101
- }
102
- else if (arg === '--output' || arg === '-o') {
103
- args.output = cliArgs[++i];
104
- }
105
- else if (arg === '--since' || arg === '-s') {
106
- args.since = cliArgs[++i];
107
- }
108
- }
109
- return args;
110
- }
111
- /**
112
- * Build a trace entry from WU and commit data
113
- *
114
- * @param input - Input data containing WU info, commits, and files
115
- * @returns Trace entry with summary statistics
116
- */
117
- export function buildTraceEntry(input) {
118
- const { wuId, title, status, commits, files } = input;
119
- const entry = {
120
- wuId,
121
- title,
122
- status,
123
- commitCount: commits.length,
124
- fileCount: files.length,
125
- };
126
- if (commits.length > 0) {
127
- // Sort commits by date
128
- const sorted = [...commits].sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime());
129
- entry.firstCommit = sorted[0].date;
130
- entry.lastCommit = sorted[sorted.length - 1].date;
131
- entry.commits = sorted;
132
- }
133
- if (files.length > 0) {
134
- entry.files = files;
135
- }
136
- return entry;
137
- }
138
- /**
139
- * Get commits for a WU by searching git log.
140
- *
141
- * WU-1534: Uses execFileSync with argv array (no shell interpolation).
142
- */
143
- function getWuCommits(wuId) {
144
- try {
145
- const gitArgs = buildGitLogArgs(wuId);
146
- // eslint-disable-next-line sonarjs/no-os-command-from-path -- git resolved from PATH; CLI tool requires git
147
- const output = execFileSync('git', gitArgs, {
148
- encoding: FILE_SYSTEM.ENCODING,
149
- });
150
- const commits = [];
151
- for (const line of output.trim().split('\n')) {
152
- if (!line)
153
- continue;
154
- const [sha, date, ...messageParts] = line.split('|');
155
- commits.push({
156
- sha: sha.slice(0, 8),
157
- date,
158
- message: messageParts.join('|'),
159
- });
160
- }
161
- return commits;
162
- }
163
- catch {
164
- return [];
165
- }
166
- }
167
- /**
168
- * Get files changed by a WU.
169
- *
170
- * WU-1534: Uses execFileSync with argv array (no shell interpolation).
171
- * Dedup/sort done in-process instead of shell pipe `| sort -u`.
172
- */
173
- function getWuFiles(wuId) {
174
- try {
175
- const gitArgs = buildGitFilesArgs(wuId);
176
- // eslint-disable-next-line sonarjs/no-os-command-from-path -- git resolved from PATH; CLI tool requires git
177
- const output = execFileSync('git', gitArgs, {
178
- encoding: FILE_SYSTEM.ENCODING,
179
- });
180
- // In-process dedup and sort (replaces shell `| sort -u`)
181
- const files = output
182
- .trim()
183
- .split('\n')
184
- .filter((f) => f.length > 0);
185
- return [...new Set(files)].sort();
186
- }
187
- catch {
188
- return [];
189
- }
190
- }
191
- /**
192
- * Get WU info from YAML file
193
- */
194
- function getWuInfo(wuId) {
195
- // WU-1301: Use config-based paths
196
- const yamlPath = join(process.cwd(), WU_PATHS.WU(wuId));
197
- if (!existsSync(yamlPath)) {
198
- return null;
199
- }
200
- try {
201
- const content = readFileSync(yamlPath, { encoding: FILE_SYSTEM.ENCODING });
202
- const yaml = parseYaml(content);
203
- return {
204
- title: yaml?.title || wuId,
205
- status: yaml?.status || 'unknown',
206
- };
207
- }
208
- catch {
209
- return null;
210
- }
211
- }
212
- /**
213
- * Format trace report as JSON
214
- */
215
- function formatJson(entries) {
216
- return JSON.stringify(entries, null, 2);
217
- }
218
- /**
219
- * Format trace report as Markdown
220
- */
221
- function formatMarkdown(entries) {
222
- const lines = [
223
- '# Traceability Report',
224
- '',
225
- `Generated: ${new Date().toISOString()}`,
226
- '',
227
- '## WU Summary',
228
- '',
229
- '| WU ID | Title | Status | Commits | Files |',
230
- '|-------|-------|--------|---------|-------|',
231
- ];
232
- for (const entry of entries) {
233
- lines.push(`| ${entry.wuId} | ${entry.title.slice(0, 30)} | ${entry.status} | ${entry.commitCount} | ${entry.fileCount} |`);
234
- }
235
- lines.push('', '## Details', '');
236
- for (const entry of entries) {
237
- lines.push(`### ${entry.wuId}: ${entry.title}`, '');
238
- lines.push(`- **Status:** ${entry.status}`);
239
- lines.push(`- **Commits:** ${entry.commitCount}`);
240
- lines.push(`- **Files:** ${entry.fileCount}`);
241
- if (entry.firstCommit) {
242
- lines.push(`- **First commit:** ${entry.firstCommit}`);
243
- lines.push(`- **Last commit:** ${entry.lastCommit}`);
244
- }
245
- if (entry.files && entry.files.length > 0) {
246
- lines.push('', '**Files changed:**');
247
- for (const file of entry.files.slice(0, 20)) {
248
- lines.push(`- ${file}`);
249
- }
250
- if (entry.files.length > 20) {
251
- lines.push(`- ... and ${entry.files.length - 20} more`);
252
- }
253
- }
254
- lines.push('');
255
- }
256
- return lines.join('\n');
257
- }
258
- /**
259
- * Format trace report as CSV
260
- */
261
- function formatCsv(entries) {
262
- const lines = ['WU ID,Title,Status,Commits,Files,First Commit,Last Commit'];
263
- for (const entry of entries) {
264
- const title = entry.title.replace(/,/g, ';');
265
- lines.push(`${entry.wuId},"${title}",${entry.status},${entry.commitCount},${entry.fileCount},${entry.firstCommit || ''},${entry.lastCommit || ''}`);
266
- }
267
- return lines.join('\n');
268
- }
269
- /**
270
- * Print help message for trace-gen
271
- */
272
- /* istanbul ignore next -- CLI entry point */
273
- function printHelp() {
274
- console.log(`
275
- Usage: trace-gen [options]
276
-
277
- Generate traceability reports linking WUs to code changes.
278
-
279
- Options:
280
- -w, --wu <id> Trace specific WU (otherwise traces all)
281
- -f, --format <fmt> Output format: json, markdown, csv (default: json)
282
- -o, --output <file> Write output to file (default: stdout)
283
- -s, --since <date> Only trace WUs modified since date (ISO format)
284
- -h, --help Show this help message
285
-
286
- Examples:
287
- trace:gen --wu WU-1112 # Trace single WU
288
- trace:gen --format markdown --output report.md # Markdown report
289
- trace:gen --since 2024-01-01 --format csv # CSV report since date
290
-
291
- Output includes:
292
- - WU ID and title
293
- - Status
294
- - Number of commits
295
- - Number of files changed
296
- - First and last commit dates
297
- - List of changed files
298
- `);
299
- }
300
- /**
301
- * Main entry point for trace-gen command
302
- */
303
- /* istanbul ignore next -- CLI entry point */
304
- async function main() {
305
- const args = parseTraceArgs(process.argv);
306
- if (args.help) {
307
- printHelp();
308
- process.exit(EXIT_CODES.SUCCESS);
309
- }
310
- // WU-1534: Validate WU ID if provided
311
- if (args.wuId && !validateWuId(args.wuId)) {
312
- console.error(`${LOG_PREFIX} Error: Invalid WU ID format: ${args.wuId}`);
313
- console.error(`${LOG_PREFIX} Expected format: WU-<number> (e.g., WU-1112)`);
314
- process.exit(EXIT_CODES.ERROR);
315
- }
316
- const format = args.format || TraceFormat.JSON;
317
- const entries = [];
318
- if (args.wuId) {
319
- // Trace single WU
320
- console.error(`${LOG_PREFIX} Tracing ${args.wuId}...`);
321
- const info = getWuInfo(args.wuId);
322
- if (!info) {
323
- console.error(`${LOG_PREFIX} Error: WU ${args.wuId} not found`);
324
- process.exit(EXIT_CODES.ERROR);
325
- }
326
- const commits = getWuCommits(args.wuId);
327
- const files = getWuFiles(args.wuId);
328
- entries.push(buildTraceEntry({
329
- wuId: args.wuId,
330
- title: info.title,
331
- status: info.status,
332
- commits,
333
- files,
334
- }));
335
- }
336
- else {
337
- // Trace all WUs
338
- console.error(`${LOG_PREFIX} Scanning all WUs...`);
339
- // WU-1301: Use config-based paths
340
- const wuDir = join(process.cwd(), WU_PATHS.WU_DIR());
341
- if (!existsSync(wuDir)) {
342
- console.error(`${LOG_PREFIX} Error: WU directory not found`);
343
- process.exit(EXIT_CODES.ERROR);
344
- }
345
- const files = readdirSync(wuDir);
346
- for (const file of files) {
347
- if (!file.endsWith('.yaml') && !file.endsWith('.yml'))
348
- continue;
349
- const wuId = file.replace(/\.ya?ml$/, '');
350
- const info = getWuInfo(wuId);
351
- if (!info)
352
- continue;
353
- // Filter by since date if specified
354
- if (args.since) {
355
- const commits = getWuCommits(wuId);
356
- if (commits.length === 0)
357
- continue;
358
- const lastCommitDate = new Date(commits[commits.length - 1]?.date || 0);
359
- if (lastCommitDate < new Date(args.since))
360
- continue;
361
- }
362
- const commits = getWuCommits(wuId);
363
- const wuFiles = getWuFiles(wuId);
364
- entries.push(buildTraceEntry({
365
- wuId,
366
- title: info.title,
367
- status: info.status,
368
- commits,
369
- files: wuFiles,
370
- }));
371
- }
372
- console.error(`${LOG_PREFIX} Found ${entries.length} WU(s)`);
373
- }
374
- // Format output
375
- let output;
376
- switch (format) {
377
- case TraceFormat.MARKDOWN:
378
- output = formatMarkdown(entries);
379
- break;
380
- case TraceFormat.CSV:
381
- output = formatCsv(entries);
382
- break;
383
- case TraceFormat.JSON:
384
- default:
385
- output = formatJson(entries);
386
- break;
387
- }
388
- // Write output
389
- if (args.output) {
390
- writeFileSync(args.output, output, { encoding: FILE_SYSTEM.ENCODING });
391
- console.error(`${LOG_PREFIX} Report written to ${args.output}`);
392
- }
393
- else {
394
- console.log(output);
395
- }
396
- }
397
- // Run main if executed directly
398
- if (import.meta.main) {
399
- void runCLI(main);
400
- }
401
- //# sourceMappingURL=trace-gen.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace-gen.js","sourceRoot":"","sources":["../src/trace-gen.ts"],"names":[],"mappings":"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"}
@@ -1,223 +0,0 @@
1
- #!/usr/bin/env node
2
- // Copyright (c) 2026 Hellmai Ltd
3
- // SPDX-License-Identifier: AGPL-3.0-only
4
- /**
5
- * @file validate-agent-skills.ts
6
- * @description Validates agent skill definitions (WU-1111)
7
- *
8
- * Validates that skill files in .claude/skills/ follow the expected format
9
- * and contain required sections.
10
- *
11
- * Usage:
12
- * validate-agent-skills # Validate all skills
13
- * validate-agent-skills --skill wu-lifecycle # Validate specific skill
14
- *
15
- * Exit codes:
16
- * 0 - All skills valid
17
- * 1 - Validation errors found
18
- *
19
- * @see {@link .claude/skills/} - Skill definitions
20
- */
21
- import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
22
- import path from 'node:path';
23
- import { FILE_SYSTEM, EMOJI } from '@lumenflow/core/wu-constants';
24
- import { runCLI } from './cli-entry-point.js';
25
- const LOG_PREFIX = '[validate-agent-skills]';
26
- /**
27
- * Required sections in a skill file
28
- */
29
- const REQUIRED_SECTIONS = ['When to Use'];
30
- /**
31
- * Recommended sections (produce warnings if missing)
32
- */
33
- const RECOMMENDED_SECTIONS = ['Examples', 'Key Concepts', 'Core Concepts'];
34
- /**
35
- * Validate a single skill file
36
- *
37
- * @param skillPath - Path to SKILL.md file
38
- * @returns Validation result
39
- */
40
- export function validateSkillFile(skillPath) {
41
- const errors = [];
42
- const warnings = [];
43
- if (!existsSync(skillPath)) {
44
- errors.push(`Skill file not found: ${skillPath}`);
45
- return { valid: false, errors, warnings };
46
- }
47
- const content = readFileSync(skillPath, { encoding: FILE_SYSTEM.UTF8 });
48
- const lines = content.split('\n');
49
- // Check for title heading
50
- const hasTitle = lines.some((line) => line.startsWith('# '));
51
- if (!hasTitle) {
52
- errors.push('Missing title heading (# Skill Name)');
53
- }
54
- // Check for required sections
55
- for (const section of REQUIRED_SECTIONS) {
56
- // eslint-disable-next-line security/detect-non-literal-regexp -- section name from internal constant array, not user input
57
- const sectionPattern = new RegExp(`^##\\s+${section}`, 'im');
58
- if (!sectionPattern.test(content)) {
59
- errors.push(`Missing required section: "## ${section}"`);
60
- }
61
- }
62
- // Check for recommended sections
63
- for (const section of RECOMMENDED_SECTIONS) {
64
- // eslint-disable-next-line security/detect-non-literal-regexp -- section name from internal constant array, not user input
65
- const sectionPattern = new RegExp(`^##\\s+${section}`, 'im');
66
- if (!sectionPattern.test(content)) {
67
- warnings.push(`Missing recommended section: "## ${section}"`);
68
- }
69
- }
70
- // Check for minimum content
71
- if (content.length < 100) {
72
- warnings.push('Skill content is very short (< 100 characters)');
73
- }
74
- return {
75
- valid: errors.length === 0,
76
- errors,
77
- warnings,
78
- };
79
- }
80
- /**
81
- * Validate all skills in a directory
82
- *
83
- * @param skillsDir - Path to skills directory
84
- * @returns Validation summary
85
- */
86
- export function validateAllSkills(skillsDir) {
87
- const results = [];
88
- let totalValid = 0;
89
- let totalInvalid = 0;
90
- if (!existsSync(skillsDir)) {
91
- return {
92
- totalValid: 0,
93
- totalInvalid: 1,
94
- results: [
95
- {
96
- skillName: 'DIRECTORY',
97
- valid: false,
98
- errors: [`Skills directory not found: ${skillsDir}`],
99
- warnings: [],
100
- },
101
- ],
102
- };
103
- }
104
- const entries = readdirSync(skillsDir);
105
- for (const entry of entries) {
106
- const entryPath = path.join(skillsDir, entry);
107
- const stat = statSync(entryPath);
108
- if (!stat.isDirectory()) {
109
- continue;
110
- }
111
- // Check for SKILL.md in the skill directory
112
- const skillFile = path.join(entryPath, 'SKILL.md');
113
- if (!existsSync(skillFile)) {
114
- results.push({
115
- skillName: entry,
116
- valid: false,
117
- errors: [`Missing SKILL.md in ${entry}/`],
118
- warnings: [],
119
- });
120
- totalInvalid++;
121
- continue;
122
- }
123
- const result = validateSkillFile(skillFile);
124
- results.push({ skillName: entry, ...result });
125
- if (result.valid) {
126
- totalValid++;
127
- }
128
- else {
129
- totalInvalid++;
130
- }
131
- }
132
- return { totalValid, totalInvalid, results };
133
- }
134
- /**
135
- * Get default skills directory based on cwd
136
- */
137
- function getDefaultSkillsDir() {
138
- return path.join(process.cwd(), '.claude', 'skills');
139
- }
140
- /**
141
- * Main CLI entry point
142
- */
143
- async function main() {
144
- const args = process.argv.slice(2);
145
- // Parse arguments
146
- let skillName;
147
- let skillsDir = getDefaultSkillsDir();
148
- for (let i = 0; i < args.length; i++) {
149
- const arg = args[i];
150
- if (arg === '--skill' || arg === '-s') {
151
- skillName = args[++i];
152
- }
153
- else if (arg === '--dir' || arg === '-d') {
154
- skillsDir = args[++i];
155
- }
156
- else if (arg === '--help' || arg === '-h') {
157
- console.log(`Usage: validate-agent-skills [options]
158
-
159
- Validate agent skill definitions.
160
-
161
- Options:
162
- --skill, -s NAME Validate specific skill
163
- --dir, -d DIR Skills directory (default: .claude/skills)
164
- -h, --help Show this help message
165
-
166
- Examples:
167
- validate-agent-skills # Validate all skills
168
- validate-agent-skills --skill wu-lifecycle # Validate specific skill
169
- `);
170
- process.exit(0);
171
- }
172
- }
173
- if (skillName) {
174
- // Validate specific skill
175
- const skillPath = path.join(skillsDir, skillName, 'SKILL.md');
176
- console.log(`${LOG_PREFIX} Validating skill: ${skillName}...`);
177
- const result = validateSkillFile(skillPath);
178
- if (result.errors.length > 0) {
179
- console.log(`${EMOJI.FAILURE} Validation failed:`);
180
- result.errors.forEach((e) => console.log(` ${e}`));
181
- }
182
- if (result.warnings.length > 0) {
183
- console.log(`${EMOJI.WARNING} Warnings:`);
184
- result.warnings.forEach((w) => console.log(` ${w}`));
185
- }
186
- if (result.valid) {
187
- console.log(`${EMOJI.SUCCESS} ${skillName} is valid`);
188
- }
189
- else {
190
- process.exit(1);
191
- }
192
- }
193
- else {
194
- // Validate all skills
195
- console.log(`${LOG_PREFIX} Validating all skills in ${skillsDir}...`);
196
- const { totalValid, totalInvalid, results } = validateAllSkills(skillsDir);
197
- // Print results
198
- for (const result of results) {
199
- if (result.errors.length > 0) {
200
- console.log(`${EMOJI.FAILURE} ${result.skillName}:`);
201
- result.errors.forEach((e) => console.log(` ${e}`));
202
- }
203
- if (result.warnings.length > 0) {
204
- console.log(`${EMOJI.WARNING} ${result.skillName}: ${result.warnings.length} warning(s)`);
205
- }
206
- }
207
- console.log('');
208
- console.log(`${LOG_PREFIX} Summary:`);
209
- console.log(` ${EMOJI.SUCCESS} Valid: ${totalValid}`);
210
- console.log(` ${EMOJI.FAILURE} Invalid: ${totalInvalid}`);
211
- if (totalInvalid > 0) {
212
- process.exit(1);
213
- }
214
- }
215
- }
216
- // WU-1181: Use import.meta.main instead of process.argv[1] comparison
217
- // The old pattern fails with pnpm symlinks because process.argv[1] is the symlink
218
- // path but import.meta.url resolves to the real path - they never match
219
- // WU-1537: Use import.meta.main + runCLI for consistent EPIPE and error handling
220
- if (import.meta.main) {
221
- void runCLI(main);
222
- }
223
- //# sourceMappingURL=validate-agent-skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-agent-skills.js","sourceRoot":"","sources":["../src/validate-agent-skills.ts"],"names":[],"mappings":"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"}