@lumenflow/cli 3.1.3 → 3.2.1

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 (267) hide show
  1. package/dist/agent-issues-query.js.map +1 -0
  2. package/dist/agent-log-issue.js.map +1 -0
  3. package/dist/agent-session-end.js.map +1 -0
  4. package/dist/agent-session.js.map +1 -0
  5. package/dist/backlog-prune.js.map +1 -0
  6. package/dist/cli-entry-point.js +139 -0
  7. package/dist/cli-entry-point.js.map +1 -0
  8. package/dist/commands/integrate.js.map +1 -0
  9. package/dist/commands.js.map +1 -0
  10. package/dist/config-get.js.map +1 -0
  11. package/dist/config-set.js.map +1 -0
  12. package/dist/constants.js +98 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/delegation-list.js.map +1 -0
  15. package/dist/deps-add.js +259 -0
  16. package/dist/deps-add.js.map +1 -0
  17. package/dist/deps-remove.js +105 -0
  18. package/dist/deps-remove.js.map +1 -0
  19. package/dist/docs-sync.js.map +1 -0
  20. package/dist/doctor.js.map +1 -0
  21. package/dist/file-delete.js.map +1 -0
  22. package/dist/file-edit.js.map +1 -0
  23. package/dist/file-read.js.map +1 -0
  24. package/dist/file-write.js.map +1 -0
  25. package/dist/flow-bottlenecks.js.map +1 -0
  26. package/dist/flow-report.js.map +1 -0
  27. package/dist/formatters.js +151 -0
  28. package/dist/formatters.js.map +1 -0
  29. package/dist/gate-defaults.js +137 -0
  30. package/dist/gate-defaults.js.map +1 -0
  31. package/dist/gate-registry.js +73 -0
  32. package/dist/gate-registry.js.map +1 -0
  33. package/dist/gates-graceful-degradation.js +153 -0
  34. package/dist/gates-graceful-degradation.js.map +1 -0
  35. package/dist/gates-plan-resolvers.js +190 -0
  36. package/dist/gates-plan-resolvers.js.map +1 -0
  37. package/dist/gates-runners.js +545 -0
  38. package/dist/gates-runners.js.map +1 -0
  39. package/dist/gates-types.js +4 -0
  40. package/dist/gates-types.js.map +1 -0
  41. package/dist/gates-utils.js +333 -0
  42. package/dist/gates-utils.js.map +1 -0
  43. package/dist/gates.js.map +1 -0
  44. package/dist/git-branch.js.map +1 -0
  45. package/dist/git-diff.js.map +1 -0
  46. package/dist/git-log.js.map +1 -0
  47. package/dist/git-status.js.map +1 -0
  48. package/dist/guard-locked.js +172 -0
  49. package/dist/guard-locked.js.map +1 -0
  50. package/dist/guard-main-branch.js +217 -0
  51. package/dist/guard-main-branch.js.map +1 -0
  52. package/dist/guard-worktree-commit.js +163 -0
  53. package/dist/guard-worktree-commit.js.map +1 -0
  54. package/dist/hooks/auto-checkpoint-utils.js +54 -0
  55. package/dist/hooks/auto-checkpoint-utils.js.map +1 -0
  56. package/dist/hooks/enforcement-checks.js +399 -0
  57. package/dist/hooks/enforcement-checks.js.map +1 -0
  58. package/dist/hooks/enforcement-generator.js +139 -0
  59. package/dist/hooks/enforcement-generator.js.map +1 -0
  60. package/dist/hooks/enforcement-sync.js +380 -0
  61. package/dist/hooks/enforcement-sync.js.map +1 -0
  62. package/dist/hooks/generators/auto-checkpoint.js +125 -0
  63. package/dist/hooks/generators/auto-checkpoint.js.map +1 -0
  64. package/dist/hooks/generators/enforce-worktree.js +190 -0
  65. package/dist/hooks/generators/enforce-worktree.js.map +1 -0
  66. package/dist/hooks/generators/index.js +18 -0
  67. package/dist/hooks/generators/index.js.map +1 -0
  68. package/dist/hooks/generators/pre-compact-checkpoint.js +136 -0
  69. package/dist/hooks/generators/pre-compact-checkpoint.js.map +1 -0
  70. package/dist/hooks/generators/require-wu.js +117 -0
  71. package/dist/hooks/generators/require-wu.js.map +1 -0
  72. package/dist/hooks/generators/session-start-recovery.js +103 -0
  73. package/dist/hooks/generators/session-start-recovery.js.map +1 -0
  74. package/dist/hooks/generators/signal-utils.js +54 -0
  75. package/dist/hooks/generators/signal-utils.js.map +1 -0
  76. package/dist/hooks/generators/warn-incomplete.js +67 -0
  77. package/dist/hooks/generators/warn-incomplete.js.map +1 -0
  78. package/dist/hooks/index.js +10 -0
  79. package/dist/hooks/index.js.map +1 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/init-detection.js +232 -0
  82. package/dist/init-detection.js.map +1 -0
  83. package/dist/init-lane-validation.js +147 -0
  84. package/dist/init-lane-validation.js.map +1 -0
  85. package/dist/init-scaffolding.js +158 -0
  86. package/dist/init-scaffolding.js.map +1 -0
  87. package/dist/init-templates.js +1983 -0
  88. package/dist/init-templates.js.map +1 -0
  89. package/dist/init.js.map +1 -0
  90. package/dist/initiative-add-wu.js.map +1 -0
  91. package/dist/initiative-bulk-assign-wus.js.map +1 -0
  92. package/dist/initiative-create.js.map +1 -0
  93. package/dist/initiative-edit.js.map +1 -0
  94. package/dist/initiative-list.js.map +1 -0
  95. package/dist/initiative-plan.js.map +1 -0
  96. package/dist/initiative-remove-wu.js.map +1 -0
  97. package/dist/initiative-status.js.map +1 -0
  98. package/dist/lane-edit.js.map +1 -0
  99. package/dist/lane-health.js.map +1 -0
  100. package/dist/lane-lifecycle-process.js +381 -0
  101. package/dist/lane-lifecycle-process.js.map +1 -0
  102. package/dist/lane-lock.js.map +1 -0
  103. package/dist/lane-setup.js.map +1 -0
  104. package/dist/lane-status.js.map +1 -0
  105. package/dist/lane-suggest.js.map +1 -0
  106. package/dist/lane-validate.js.map +1 -0
  107. package/dist/lifecycle-regression-harness.js +181 -0
  108. package/dist/lifecycle-regression-harness.js.map +1 -0
  109. package/dist/lumenflow-upgrade.js +18 -10
  110. package/dist/lumenflow-upgrade.js.map +1 -0
  111. package/dist/mem-checkpoint.js.map +1 -0
  112. package/dist/mem-cleanup.js.map +1 -0
  113. package/dist/mem-context.js.map +1 -0
  114. package/dist/mem-create.js.map +1 -0
  115. package/dist/mem-delete.js.map +1 -0
  116. package/dist/mem-export.js.map +1 -0
  117. package/dist/mem-inbox.js.map +1 -0
  118. package/dist/mem-index.js +214 -0
  119. package/dist/mem-index.js.map +1 -0
  120. package/dist/mem-init.js.map +1 -0
  121. package/dist/mem-profile.js +210 -0
  122. package/dist/mem-profile.js.map +1 -0
  123. package/dist/mem-promote.js +257 -0
  124. package/dist/mem-promote.js.map +1 -0
  125. package/dist/mem-ready.js.map +1 -0
  126. package/dist/mem-recover.js.map +1 -0
  127. package/dist/mem-signal.js.map +1 -0
  128. package/dist/mem-start.js.map +1 -0
  129. package/dist/mem-summarize.js.map +1 -0
  130. package/dist/mem-triage.js.map +1 -0
  131. package/dist/merge-block.js +225 -0
  132. package/dist/merge-block.js.map +1 -0
  133. package/dist/metrics-cli.js.map +1 -0
  134. package/dist/metrics-snapshot.js.map +1 -0
  135. package/dist/object-guards.js +9 -0
  136. package/dist/object-guards.js.map +1 -0
  137. package/dist/onboard.js.map +1 -0
  138. package/dist/onboarding-smoke-test.js +432 -0
  139. package/dist/onboarding-smoke-test.js.map +1 -0
  140. package/dist/orchestrate-init-status.js.map +1 -0
  141. package/dist/orchestrate-initiative.js.map +1 -0
  142. package/dist/orchestrate-monitor.js.map +1 -0
  143. package/dist/pack-author.js.map +1 -0
  144. package/dist/pack-hash.js.map +1 -0
  145. package/dist/pack-install.js.map +1 -0
  146. package/dist/pack-publish.js.map +1 -0
  147. package/dist/pack-scaffold.js.map +1 -0
  148. package/dist/pack-search.js.map +1 -0
  149. package/dist/pack-validate.js.map +1 -0
  150. package/dist/plan-create.js.map +1 -0
  151. package/dist/plan-edit.js.map +1 -0
  152. package/dist/plan-link.js.map +1 -0
  153. package/dist/plan-promote.js.map +1 -0
  154. package/dist/public-manifest.js +931 -0
  155. package/dist/public-manifest.js.map +1 -0
  156. package/dist/release.js +664 -116
  157. package/dist/release.js.map +1 -0
  158. package/dist/rotate-progress.js +253 -0
  159. package/dist/rotate-progress.js.map +1 -0
  160. package/dist/session-coordinator.js +303 -0
  161. package/dist/session-coordinator.js.map +1 -0
  162. package/dist/shared-validators.js +81 -0
  163. package/dist/shared-validators.js.map +1 -0
  164. package/dist/signal-cleanup.js.map +1 -0
  165. package/dist/state-bootstrap.js.map +1 -0
  166. package/dist/state-cleanup.js.map +1 -0
  167. package/dist/state-doctor-fix.js +226 -0
  168. package/dist/state-doctor-fix.js.map +1 -0
  169. package/dist/state-doctor-stamps.js +23 -0
  170. package/dist/state-doctor-stamps.js.map +1 -0
  171. package/dist/state-doctor.js.map +1 -0
  172. package/dist/strict-progress.js +255 -0
  173. package/dist/strict-progress.js.map +1 -0
  174. package/dist/sync-templates.js.map +1 -0
  175. package/dist/task-claim.js.map +1 -0
  176. package/dist/trace-gen.js +401 -0
  177. package/dist/trace-gen.js.map +1 -0
  178. package/dist/validate-agent-skills.js +224 -0
  179. package/dist/validate-agent-skills.js.map +1 -0
  180. package/dist/validate-agent-sync.js +152 -0
  181. package/dist/validate-agent-sync.js.map +1 -0
  182. package/dist/validate-backlog-sync.js +77 -0
  183. package/dist/validate-backlog-sync.js.map +1 -0
  184. package/dist/validate-skills-spec.js +211 -0
  185. package/dist/validate-skills-spec.js.map +1 -0
  186. package/dist/validate.js.map +1 -0
  187. package/dist/validator-defaults.js +107 -0
  188. package/dist/validator-defaults.js.map +1 -0
  189. package/dist/validator-registry.js +71 -0
  190. package/dist/validator-registry.js.map +1 -0
  191. package/dist/workspace-init.js.map +1 -0
  192. package/dist/wu-block.js.map +1 -0
  193. package/dist/wu-brief.js.map +1 -0
  194. package/dist/wu-claim-branch.js +123 -0
  195. package/dist/wu-claim-branch.js.map +1 -0
  196. package/dist/wu-claim-cloud.js +79 -0
  197. package/dist/wu-claim-cloud.js.map +1 -0
  198. package/dist/wu-claim-mode.js +82 -0
  199. package/dist/wu-claim-mode.js.map +1 -0
  200. package/dist/wu-claim-output.js +85 -0
  201. package/dist/wu-claim-output.js.map +1 -0
  202. package/dist/wu-claim-repair-guidance.js +12 -0
  203. package/dist/wu-claim-repair-guidance.js.map +1 -0
  204. package/dist/wu-claim-resume-handler.js +87 -0
  205. package/dist/wu-claim-resume-handler.js.map +1 -0
  206. package/dist/wu-claim-state.js +581 -0
  207. package/dist/wu-claim-state.js.map +1 -0
  208. package/dist/wu-claim-validation.js +458 -0
  209. package/dist/wu-claim-validation.js.map +1 -0
  210. package/dist/wu-claim-worktree.js +238 -0
  211. package/dist/wu-claim-worktree.js.map +1 -0
  212. package/dist/wu-claim.js.map +1 -0
  213. package/dist/wu-cleanup-cloud.js +78 -0
  214. package/dist/wu-cleanup-cloud.js.map +1 -0
  215. package/dist/wu-cleanup.js.map +1 -0
  216. package/dist/wu-code-path-coverage.js +83 -0
  217. package/dist/wu-code-path-coverage.js.map +1 -0
  218. package/dist/wu-create-cloud.js +30 -0
  219. package/dist/wu-create-cloud.js.map +1 -0
  220. package/dist/wu-create-content.js +264 -0
  221. package/dist/wu-create-content.js.map +1 -0
  222. package/dist/wu-create-readiness.js +59 -0
  223. package/dist/wu-create-readiness.js.map +1 -0
  224. package/dist/wu-create-validation.js +128 -0
  225. package/dist/wu-create-validation.js.map +1 -0
  226. package/dist/wu-create.js.map +1 -0
  227. package/dist/wu-delegate.js.map +1 -0
  228. package/dist/wu-delete.js.map +1 -0
  229. package/dist/wu-deps.js.map +1 -0
  230. package/dist/wu-done-auto-cleanup.js +194 -0
  231. package/dist/wu-done-auto-cleanup.js.map +1 -0
  232. package/dist/wu-done-check.js +38 -0
  233. package/dist/wu-done-check.js.map +1 -0
  234. package/dist/wu-done-cloud.js +48 -0
  235. package/dist/wu-done-cloud.js.map +1 -0
  236. package/dist/wu-done-decay.js +83 -0
  237. package/dist/wu-done-decay.js.map +1 -0
  238. package/dist/wu-done.js.map +1 -0
  239. package/dist/wu-edit-operations.js +399 -0
  240. package/dist/wu-edit-operations.js.map +1 -0
  241. package/dist/wu-edit-validators.js +282 -0
  242. package/dist/wu-edit-validators.js.map +1 -0
  243. package/dist/wu-edit.js.map +1 -0
  244. package/dist/wu-infer-lane.js.map +1 -0
  245. package/dist/wu-preflight.js.map +1 -0
  246. package/dist/wu-prep.js.map +1 -0
  247. package/dist/wu-proto.js.map +1 -0
  248. package/dist/wu-prune.js.map +1 -0
  249. package/dist/wu-recover.js.map +1 -0
  250. package/dist/wu-release.js.map +1 -0
  251. package/dist/wu-repair.js.map +1 -0
  252. package/dist/wu-sandbox.js.map +1 -0
  253. package/dist/wu-spawn-completion.js +58 -0
  254. package/dist/wu-spawn-completion.js.map +1 -0
  255. package/dist/wu-spawn-prompt-builders.js +1190 -0
  256. package/dist/wu-spawn-prompt-builders.js.map +1 -0
  257. package/dist/wu-spawn-strategy-resolver.js +322 -0
  258. package/dist/wu-spawn-strategy-resolver.js.map +1 -0
  259. package/dist/wu-spawn.js +59 -0
  260. package/dist/wu-spawn.js.map +1 -0
  261. package/dist/wu-state-cloud.js +41 -0
  262. package/dist/wu-state-cloud.js.map +1 -0
  263. package/dist/wu-status.js.map +1 -0
  264. package/dist/wu-unblock.js.map +1 -0
  265. package/dist/wu-unlock-lane.js.map +1 -0
  266. package/dist/wu-validate.js.map +1 -0
  267. package/package.json +8 -10
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env node
2
+ // Copyright (c) 2026 Hellmai Ltd
3
+ // SPDX-License-Identifier: AGPL-3.0-only
4
+ /**
5
+ * @file validate-agent-sync.ts
6
+ * @description Validates agent sync state (WU-1111)
7
+ *
8
+ * Validates that agent configuration files exist and are properly structured.
9
+ * Checks .claude/agents/ for valid agent definitions.
10
+ *
11
+ * Usage:
12
+ * validate-agent-sync # Validate agent configuration
13
+ *
14
+ * Exit codes:
15
+ * 0 - Agent configuration valid
16
+ * 1 - Validation errors found
17
+ *
18
+ * @see {@link .claude/agents/} - Agent definitions
19
+ */
20
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
21
+ import path from 'node:path';
22
+ import { FILE_SYSTEM, EMOJI } from '@lumenflow/core/wu-constants';
23
+ import { runCLI } from './cli-entry-point.js';
24
+ import { MIN_AGENT_CONTENT_LENGTH } from './constants.js';
25
+ const LOG_PREFIX = '[validate-agent-sync]';
26
+ /**
27
+ * Validate agent sync state
28
+ *
29
+ * @param options - Validation options
30
+ * @param options.cwd - Working directory (default: process.cwd())
31
+ * @returns Validation result
32
+ */
33
+ export async function validateAgentSync(options = {}) {
34
+ const { cwd = process.cwd() } = options;
35
+ const errors = [];
36
+ const warnings = [];
37
+ const agents = [];
38
+ const agentDir = path.join(cwd, '.claude', 'agents');
39
+ // Check if agents directory exists
40
+ if (!existsSync(agentDir)) {
41
+ errors.push(`Agents directory not found: ${agentDir}`);
42
+ return { valid: false, errors, warnings, agents };
43
+ }
44
+ // Read agent definitions
45
+ const files = readdirSync(agentDir).filter((f) => f.endsWith('.json') || f.endsWith('.md'));
46
+ if (files.length === 0) {
47
+ warnings.push('No agent definitions found in .claude/agents/');
48
+ return { valid: true, errors, warnings, agents };
49
+ }
50
+ for (const file of files) {
51
+ const filePath = path.join(agentDir, file);
52
+ const agentName = path.basename(file, path.extname(file));
53
+ agents.push(agentName);
54
+ if (file.endsWith('.json')) {
55
+ // Validate JSON agent definition
56
+ try {
57
+ const content = readFileSync(filePath, { encoding: FILE_SYSTEM.UTF8 });
58
+ const agentDef = JSON.parse(content);
59
+ // Check required fields
60
+ if (!agentDef.name) {
61
+ warnings.push(`${agentName}: Missing "name" field`);
62
+ }
63
+ if (!agentDef.description) {
64
+ warnings.push(`${agentName}: Missing "description" field`);
65
+ }
66
+ }
67
+ catch (e) {
68
+ errors.push(`${agentName}: Failed to parse JSON: ${e.message}`);
69
+ }
70
+ }
71
+ else if (file.endsWith('.md')) {
72
+ // Validate markdown agent definition
73
+ try {
74
+ const content = readFileSync(filePath, { encoding: FILE_SYSTEM.UTF8 });
75
+ // Check for title
76
+ if (!content.includes('# ')) {
77
+ warnings.push(`${agentName}: Missing title heading`);
78
+ }
79
+ // Check for minimum content
80
+ if (content.length < MIN_AGENT_CONTENT_LENGTH) {
81
+ warnings.push(`${agentName}: Agent definition is very short`);
82
+ }
83
+ }
84
+ catch (e) {
85
+ errors.push(`${agentName}: Failed to read file: ${e.message}`);
86
+ }
87
+ }
88
+ }
89
+ return {
90
+ valid: errors.length === 0,
91
+ errors,
92
+ warnings,
93
+ agents,
94
+ };
95
+ }
96
+ /**
97
+ * Main CLI entry point
98
+ */
99
+ export async function main() {
100
+ const args = process.argv.slice(2);
101
+ // Parse arguments
102
+ let cwd = process.cwd();
103
+ for (let i = 0; i < args.length; i++) {
104
+ const arg = args[i];
105
+ if (arg === '--cwd' || arg === '-C') {
106
+ cwd = args[++i];
107
+ }
108
+ else if (arg === '--help' || arg === '-h') {
109
+ console.log(`Usage: validate-agent-sync [options]
110
+
111
+ Validate agent configuration and sync state.
112
+
113
+ Options:
114
+ --cwd, -C DIR Working directory (default: current directory)
115
+ -h, --help Show this help message
116
+
117
+ Examples:
118
+ validate-agent-sync
119
+ validate-agent-sync --cwd /path/to/project
120
+ `);
121
+ process.exit(0);
122
+ }
123
+ }
124
+ console.log(`${LOG_PREFIX} Validating agent sync...`);
125
+ const result = await validateAgentSync({ cwd });
126
+ if (result.errors.length > 0) {
127
+ console.log(`${EMOJI.FAILURE} Validation errors:`);
128
+ result.errors.forEach((e) => console.log(` ${e}`));
129
+ }
130
+ if (result.warnings.length > 0) {
131
+ console.log(`${EMOJI.WARNING} Warnings:`);
132
+ result.warnings.forEach((w) => console.log(` ${w}`));
133
+ }
134
+ if (result.agents.length > 0) {
135
+ console.log(`${LOG_PREFIX} Found ${result.agents.length} agent(s):`);
136
+ result.agents.forEach((a) => console.log(` - ${a}`));
137
+ }
138
+ if (result.valid) {
139
+ console.log(`${EMOJI.SUCCESS} Agent sync validation passed`);
140
+ }
141
+ else {
142
+ process.exit(1);
143
+ }
144
+ }
145
+ // WU-1181: Use import.meta.main instead of process.argv[1] comparison
146
+ // The old pattern fails with pnpm symlinks because process.argv[1] is the symlink
147
+ // path but import.meta.url resolves to the real path - they never match
148
+ // WU-1537: Use import.meta.main + runCLI for consistent EPIPE and error handling
149
+ if (import.meta.main) {
150
+ void runCLI(main);
151
+ }
152
+ //# sourceMappingURL=validate-agent-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-agent-sync.js","sourceRoot":"","sources":["../src/validate-agent-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+ // Copyright (c) 2026 Hellmai Ltd
3
+ // SPDX-License-Identifier: AGPL-3.0-only
4
+ /**
5
+ * @file validate-backlog-sync.ts
6
+ * @description Validates backlog.md is in sync with WU YAML files (WU-1111)
7
+ *
8
+ * Checks that all WU YAML files are referenced in backlog.md and vice versa.
9
+ * This is the TypeScript replacement for tools/validate-backlog-sync.js.
10
+ *
11
+ * Usage:
12
+ * validate-backlog-sync # Validate sync
13
+ *
14
+ * Exit codes:
15
+ * 0 - Backlog is in sync
16
+ * 1 - Sync issues found
17
+ *
18
+ * @see {@link docs/04-operations/tasks/backlog.md} - Backlog file
19
+ */
20
+ import { validateBacklogSync, } from '@lumenflow/core/validators/backlog-sync';
21
+ import { EMOJI } from '@lumenflow/core/wu-constants';
22
+ import { runCLI } from './cli-entry-point.js';
23
+ const LOG_PREFIX = '[validate-backlog-sync]';
24
+ export { validateBacklogSync };
25
+ /**
26
+ * Main CLI entry point
27
+ */
28
+ export async function main() {
29
+ const args = process.argv.slice(2);
30
+ // Parse arguments
31
+ let cwd = process.cwd();
32
+ for (let i = 0; i < args.length; i++) {
33
+ const arg = args[i];
34
+ if (arg === '--cwd' || arg === '-C') {
35
+ cwd = args[++i];
36
+ }
37
+ else if (arg === '--help' || arg === '-h') {
38
+ console.log(`Usage: validate-backlog-sync [options]
39
+
40
+ Validate that backlog.md is in sync with WU YAML files.
41
+
42
+ Options:
43
+ --cwd, -C DIR Working directory (default: current directory)
44
+ -h, --help Show this help message
45
+
46
+ Examples:
47
+ validate-backlog-sync
48
+ `);
49
+ process.exit(0);
50
+ }
51
+ }
52
+ console.log(`${LOG_PREFIX} Validating backlog sync...`);
53
+ const result = await validateBacklogSync({ cwd });
54
+ if (result.errors.length > 0) {
55
+ console.log(`${EMOJI.FAILURE} Sync errors:`);
56
+ result.errors.forEach((e) => console.log(` ${e}`));
57
+ }
58
+ if (result.warnings.length > 0) {
59
+ console.log(`${EMOJI.WARNING} Warnings:`);
60
+ result.warnings.forEach((w) => console.log(` ${w}`));
61
+ }
62
+ console.log(`${LOG_PREFIX} WU files: ${result.wuCount}, Backlog references: ${result.backlogCount}`);
63
+ if (result.valid) {
64
+ console.log(`${EMOJI.SUCCESS} Backlog is in sync`);
65
+ }
66
+ else {
67
+ process.exit(1);
68
+ }
69
+ }
70
+ // WU-1181: Use import.meta.main instead of process.argv[1] comparison
71
+ // The old pattern fails with pnpm symlinks because process.argv[1] is the symlink
72
+ // path but import.meta.url resolves to the real path - they never match
73
+ // WU-1537: Use import.meta.main + runCLI for consistent EPIPE and error handling
74
+ if (import.meta.main) {
75
+ void runCLI(main);
76
+ }
77
+ //# sourceMappingURL=validate-backlog-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-backlog-sync.js","sourceRoot":"","sources":["../src/validate-backlog-sync.ts"],"names":[],"mappings":";AACA,iCAAiC;AACjC,yCAAyC;AACzC;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,mBAAmB,GAEpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAG7C,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,kBAAkB;IAClB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACpC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUjB,CAAC,CAAC;YACG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,6BAA6B,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,GAAG,CACT,GAAG,UAAU,cAAc,MAAM,CAAC,OAAO,yBAAyB,MAAM,CAAC,YAAY,EAAE,CACxF,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,kFAAkF;AAClF,wEAAwE;AACxE,iFAAiF;AACjF,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,211 @@
1
+ #!/usr/bin/env node
2
+ // Copyright (c) 2026 Hellmai Ltd
3
+ // SPDX-License-Identifier: AGPL-3.0-only
4
+ /**
5
+ * @file validate-skills-spec.ts
6
+ * @description Validates skills spec format (WU-1111)
7
+ *
8
+ * Validates that skill specification files follow the required format
9
+ * with proper sections and structure.
10
+ *
11
+ * Usage:
12
+ * validate-skills-spec SKILL.md # Validate specific file
13
+ * validate-skills-spec --dir ./skills # Validate all in directory
14
+ *
15
+ * Exit codes:
16
+ * 0 - Validation passed
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-skills-spec]';
26
+ /**
27
+ * Required sections for a valid skill spec
28
+ */
29
+ const REQUIRED_SECTIONS = ['When to Use'];
30
+ /**
31
+ * Recommended sections (produce warnings if missing)
32
+ */
33
+ const RECOMMENDED_SECTIONS = ['Examples'];
34
+ /**
35
+ * Validate a skill specification file
36
+ *
37
+ * @param skillPath - Path to skill spec file
38
+ * @returns Validation result
39
+ */
40
+ export function validateSkillsSpec(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 (# Title)
50
+ const hasTitle = lines.some((line) => /^#\s+\S/.test(line));
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 "When to Use" section has content
71
+ const whenToUseMatch = content.match(/##\s+When to Use\s*\n([\s\S]*?)(?=\n##|$)/i);
72
+ if (whenToUseMatch) {
73
+ const sectionContent = whenToUseMatch[1].trim();
74
+ if (sectionContent.length < 20) {
75
+ warnings.push('"When to Use" section has minimal content');
76
+ }
77
+ }
78
+ // Check for minimum overall content
79
+ if (content.length < 100) {
80
+ warnings.push('Skill spec is very short (< 100 characters)');
81
+ }
82
+ return {
83
+ valid: errors.length === 0,
84
+ errors,
85
+ warnings,
86
+ };
87
+ }
88
+ /**
89
+ * Validate all skill specs in a directory
90
+ *
91
+ * @param dir - Directory to scan
92
+ * @returns Map of file path to validation result
93
+ */
94
+ export function validateSkillsSpecDir(dir) {
95
+ const results = new Map();
96
+ if (!existsSync(dir)) {
97
+ results.set(dir, {
98
+ valid: false,
99
+ errors: [`Directory not found: ${dir}`],
100
+ warnings: [],
101
+ });
102
+ return results;
103
+ }
104
+ const entries = readdirSync(dir);
105
+ for (const entry of entries) {
106
+ const entryPath = path.join(dir, entry);
107
+ const stat = statSync(entryPath);
108
+ if (stat.isDirectory()) {
109
+ // Check for SKILL.md in subdirectory
110
+ const skillFile = path.join(entryPath, 'SKILL.md');
111
+ if (existsSync(skillFile)) {
112
+ results.set(entry, validateSkillsSpec(skillFile));
113
+ }
114
+ }
115
+ else if (entry.endsWith('.md')) {
116
+ results.set(entry, validateSkillsSpec(entryPath));
117
+ }
118
+ }
119
+ return results;
120
+ }
121
+ /**
122
+ * Main CLI entry point
123
+ */
124
+ export async function main() {
125
+ const args = process.argv.slice(2);
126
+ // Parse arguments
127
+ let skillPath;
128
+ let dir;
129
+ for (let i = 0; i < args.length; i++) {
130
+ const arg = args[i];
131
+ if (arg === '--dir' || arg === '-d') {
132
+ dir = args[++i];
133
+ }
134
+ else if (arg === '--help' || arg === '-h') {
135
+ console.log(`Usage: validate-skills-spec [file.md] [options]
136
+
137
+ Validate skill specification format.
138
+
139
+ Options:
140
+ --dir, -d DIR Validate all specs in directory
141
+ -h, --help Show this help message
142
+
143
+ Examples:
144
+ validate-skills-spec SKILL.md
145
+ validate-skills-spec --dir .claude/skills
146
+ `);
147
+ process.exit(0);
148
+ }
149
+ else if (!skillPath) {
150
+ skillPath = arg;
151
+ }
152
+ }
153
+ if (!skillPath && !dir) {
154
+ console.error(`${LOG_PREFIX} Error: Provide a skill file or --dir option`);
155
+ process.exit(1);
156
+ }
157
+ if (skillPath) {
158
+ // Validate single file
159
+ console.log(`${LOG_PREFIX} Validating ${skillPath}...`);
160
+ const result = validateSkillsSpec(skillPath);
161
+ if (result.errors.length > 0) {
162
+ console.log(`${EMOJI.FAILURE} Validation failed:`);
163
+ result.errors.forEach((e) => console.log(` ${e}`));
164
+ }
165
+ if (result.warnings.length > 0) {
166
+ console.log(`${EMOJI.WARNING} Warnings:`);
167
+ result.warnings.forEach((w) => console.log(` ${w}`));
168
+ }
169
+ if (result.valid) {
170
+ console.log(`${EMOJI.SUCCESS} Skill spec is valid`);
171
+ }
172
+ else {
173
+ process.exit(1);
174
+ }
175
+ }
176
+ else if (dir) {
177
+ // Validate directory
178
+ console.log(`${LOG_PREFIX} Validating skills in ${dir}...`);
179
+ const results = validateSkillsSpecDir(dir);
180
+ let totalValid = 0;
181
+ let totalInvalid = 0;
182
+ for (const [name, result] of results) {
183
+ if (result.errors.length > 0) {
184
+ console.log(`${EMOJI.FAILURE} ${name}:`);
185
+ result.errors.forEach((e) => console.log(` ${e}`));
186
+ totalInvalid++;
187
+ }
188
+ else {
189
+ totalValid++;
190
+ }
191
+ if (result.warnings.length > 0) {
192
+ console.log(`${EMOJI.WARNING} ${name}: ${result.warnings.length} warning(s)`);
193
+ }
194
+ }
195
+ console.log('');
196
+ console.log(`${LOG_PREFIX} Summary:`);
197
+ console.log(` ${EMOJI.SUCCESS} Valid: ${totalValid}`);
198
+ console.log(` ${EMOJI.FAILURE} Invalid: ${totalInvalid}`);
199
+ if (totalInvalid > 0) {
200
+ process.exit(1);
201
+ }
202
+ }
203
+ }
204
+ // WU-1181: Use import.meta.main instead of process.argv[1] comparison
205
+ // The old pattern fails with pnpm symlinks because process.argv[1] is the symlink
206
+ // path but import.meta.url resolves to the real path - they never match
207
+ // WU-1537: Use import.meta.main + runCLI for consistent EPIPE and error handling
208
+ if (import.meta.main) {
209
+ void runCLI(main);
210
+ }
211
+ //# sourceMappingURL=validate-skills-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-skills-spec.js","sourceRoot":"","sources":["../src/validate-skills-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":";AACA,iCAAiC;AACjC,yCAAyC;AACzC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,gBAAgB,EAChB,cAAc,GAGf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,UAAU,GAAG,YAAY,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,kBAAkB;IAClB,IAAI,IAAwB,CAAC;IAC7B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACjC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcjB,CAAC,CAAC;YACG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAClD,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,qBAAqB;QACrB,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,mBAAmB,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,eAAe,IAAI,KAAK,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,mCAAmC,CAAC,CAAC;YACjE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,WAAW,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,sBAAsB,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEpF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;YAC1E,MAAM;YACN,QAAQ;SACT,CAAC,CAAC;QAEH,gBAAgB;QAChB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;gBAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;gBACrF,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;oBACxB,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,WAAW,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,WAAW,UAAU,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,aAAa,YAAY,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,cAAc,aAAa,EAAE,CAAC,CAAC;QAE7D,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,kFAAkF;AAClF,wEAAwE;AACxE,iFAAiF;AACjF,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,107 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Register preflight validators into the registry.
5
+ *
6
+ * Preflight validators run before gates to catch issues early
7
+ * (e.g., missing code paths, type mismatches, spec completeness).
8
+ *
9
+ * @param registry - Validator registry to populate
10
+ */
11
+ export function registerPreflightValidators(registry) {
12
+ // WU-1805: Preflight code_paths validation before gates
13
+ registry.register({
14
+ name: 'code-path-preflight',
15
+ phase: 'preflight',
16
+ validate: () => ({ valid: true, errors: [] }),
17
+ blocking: true,
18
+ });
19
+ // WU-2310: Type vs code_paths preflight validation
20
+ registry.register({
21
+ name: 'type-vs-code-paths',
22
+ phase: 'preflight',
23
+ validate: () => ({ valid: true, errors: [] }),
24
+ blocking: true,
25
+ });
26
+ // Spec completeness validation
27
+ registry.register({
28
+ name: 'spec-completeness',
29
+ phase: 'preflight',
30
+ validate: () => ({ valid: true, errors: [] }),
31
+ blocking: true,
32
+ });
33
+ // WU consistency check
34
+ registry.register({
35
+ name: 'wu-consistency',
36
+ phase: 'preflight',
37
+ validate: () => ({ valid: true, errors: [] }),
38
+ blocking: true,
39
+ });
40
+ // WU-1503: Dirty-main pre-merge guard
41
+ registry.register({
42
+ name: 'dirty-main-guard',
43
+ phase: 'preflight',
44
+ validate: () => ({ valid: true, errors: [] }),
45
+ blocking: true,
46
+ });
47
+ // Preflight tasks validation
48
+ registry.register({
49
+ name: 'preflight-tasks',
50
+ phase: 'preflight',
51
+ validate: () => ({ valid: true, errors: [] }),
52
+ blocking: true,
53
+ });
54
+ }
55
+ /**
56
+ * Register completion validators into the registry.
57
+ *
58
+ * Completion validators run after gates pass, before the final
59
+ * merge/stamp/cleanup sequence.
60
+ *
61
+ * @param registry - Validator registry to populate
62
+ */
63
+ export function registerCompletionValidators(registry) {
64
+ // Code paths existence validation
65
+ registry.register({
66
+ name: 'code-paths-exist',
67
+ phase: 'completion',
68
+ validate: () => ({ valid: true, errors: [] }),
69
+ blocking: true,
70
+ });
71
+ // WU-1542: Mandatory agents compliance
72
+ registry.register({
73
+ name: 'mandatory-agents-compliance',
74
+ phase: 'completion',
75
+ validate: () => ({ valid: true, errors: [] }),
76
+ blocking: true,
77
+ });
78
+ // WU-1012: Docs-only flag validation
79
+ registry.register({
80
+ name: 'docs-only-flag',
81
+ phase: 'completion',
82
+ validate: () => ({ valid: true, errors: [] }),
83
+ blocking: true,
84
+ });
85
+ // WU-1999: Exposure validation (non-blocking warnings)
86
+ registry.register({
87
+ name: 'exposure-warnings',
88
+ phase: 'completion',
89
+ validate: () => ({ valid: true, warnings: [] }),
90
+ blocking: false,
91
+ });
92
+ // WU-2022: Feature accessibility validation
93
+ registry.register({
94
+ name: 'feature-accessibility',
95
+ phase: 'completion',
96
+ validate: () => ({ valid: true, errors: [] }),
97
+ blocking: true,
98
+ });
99
+ // Backlog sync validation
100
+ registry.register({
101
+ name: 'backlog-sync',
102
+ phase: 'completion',
103
+ validate: () => ({ valid: true, errors: [] }),
104
+ blocking: true,
105
+ });
106
+ }
107
+ //# sourceMappingURL=validator-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator-defaults.js","sourceRoot":"","sources":["../src/validator-defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Registry for wu-done validators.
5
+ *
6
+ * Validators are registered with a phase (preflight or completion) and
7
+ * executed in insertion order within each phase.
8
+ */
9
+ export class ValidatorRegistry {
10
+ validators = [];
11
+ nameIndex = new Map();
12
+ /**
13
+ * Register a single validator definition.
14
+ *
15
+ * @param validator - Validator definition to register
16
+ * @throws Error if a validator with the same name is already registered
17
+ */
18
+ register(validator) {
19
+ if (this.nameIndex.has(validator.name)) {
20
+ throw new Error(`Validator "${validator.name}" is already registered`);
21
+ }
22
+ this.nameIndex.set(validator.name, this.validators.length);
23
+ this.validators.push(validator);
24
+ }
25
+ /**
26
+ * Get validators for a specific phase, in insertion order.
27
+ *
28
+ * @param phase - Phase to filter by
29
+ * @returns Copy of the validators for the given phase
30
+ */
31
+ getByPhase(phase) {
32
+ return this.validators.filter((v) => v.phase === phase).map((v) => ({ ...v }));
33
+ }
34
+ /**
35
+ * Get all registered validators across all phases.
36
+ *
37
+ * @returns Copy of all validators
38
+ */
39
+ getAll() {
40
+ return [...this.validators];
41
+ }
42
+ /**
43
+ * Check if a validator with the given name is registered.
44
+ *
45
+ * @param name - Validator name to check
46
+ * @returns true if the validator exists
47
+ */
48
+ has(name) {
49
+ return this.nameIndex.has(name);
50
+ }
51
+ /**
52
+ * Get all phases that have at least one registered validator.
53
+ *
54
+ * @returns Array of phase names
55
+ */
56
+ getPhases() {
57
+ const phases = new Set();
58
+ for (const v of this.validators) {
59
+ phases.add(v.phase);
60
+ }
61
+ return [...phases];
62
+ }
63
+ /**
64
+ * Remove all registered validators.
65
+ */
66
+ clear() {
67
+ this.validators.length = 0;
68
+ this.nameIndex.clear();
69
+ }
70
+ }
71
+ //# sourceMappingURL=validator-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator-registry.js","sourceRoot":"","sources":["../src/validator-registry.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAwCzC;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACX,UAAU,GAA0B,EAAE,CAAC;IACvC,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD;;;;;OAKG;IACH,QAAQ,CAAC,SAA8B;QACrC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,CAAC,IAAI,yBAAyB,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,KAAqB;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}