@lumenflow/cli 2.21.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/LICENSE +13 -185
  2. package/README.md +62 -48
  3. package/dist/agent-issues-query.js +2 -0
  4. package/dist/agent-issues-query.js.map +1 -1
  5. package/dist/agent-log-issue.js +2 -0
  6. package/dist/agent-log-issue.js.map +1 -1
  7. package/dist/agent-session-end.js +2 -0
  8. package/dist/agent-session-end.js.map +1 -1
  9. package/dist/agent-session.js +2 -0
  10. package/dist/agent-session.js.map +1 -1
  11. package/dist/backlog-prune.js +2 -0
  12. package/dist/backlog-prune.js.map +1 -1
  13. package/dist/cli-entry-point.js +30 -1
  14. package/dist/cli-entry-point.js.map +1 -1
  15. package/dist/commands/integrate.js +2 -0
  16. package/dist/commands/integrate.js.map +1 -1
  17. package/dist/commands.js +7 -1
  18. package/dist/commands.js.map +1 -1
  19. package/dist/config-get.js +58 -0
  20. package/dist/config-get.js.map +1 -0
  21. package/dist/config-set.js +289 -0
  22. package/dist/config-set.js.map +1 -0
  23. package/dist/delegation-list.js +2 -0
  24. package/dist/delegation-list.js.map +1 -1
  25. package/dist/deps-add.js +2 -0
  26. package/dist/deps-add.js.map +1 -1
  27. package/dist/deps-remove.js +2 -0
  28. package/dist/deps-remove.js.map +1 -1
  29. package/dist/docs-sync.js +2 -0
  30. package/dist/docs-sync.js.map +1 -1
  31. package/dist/doctor.js +2 -0
  32. package/dist/doctor.js.map +1 -1
  33. package/dist/file-delete.js +2 -0
  34. package/dist/file-delete.js.map +1 -1
  35. package/dist/file-edit.js +2 -0
  36. package/dist/file-edit.js.map +1 -1
  37. package/dist/file-read.js +2 -0
  38. package/dist/file-read.js.map +1 -1
  39. package/dist/file-write.js +2 -0
  40. package/dist/file-write.js.map +1 -1
  41. package/dist/flow-bottlenecks.js +2 -0
  42. package/dist/flow-bottlenecks.js.map +1 -1
  43. package/dist/flow-report.js +2 -0
  44. package/dist/flow-report.js.map +1 -1
  45. package/dist/formatters.js +151 -0
  46. package/dist/formatters.js.map +1 -0
  47. package/dist/gate-defaults.js +2 -10
  48. package/dist/gate-defaults.js.map +1 -1
  49. package/dist/gate-registry.js +2 -11
  50. package/dist/gate-registry.js.map +1 -1
  51. package/dist/gates-graceful-degradation.js +2 -0
  52. package/dist/gates-graceful-degradation.js.map +1 -1
  53. package/dist/gates-plan-resolvers.js +2 -0
  54. package/dist/gates-plan-resolvers.js.map +1 -1
  55. package/dist/gates-runners.js +3 -1
  56. package/dist/gates-runners.js.map +1 -1
  57. package/dist/gates-types.js +2 -11
  58. package/dist/gates-types.js.map +1 -1
  59. package/dist/gates-utils.js +2 -0
  60. package/dist/gates-utils.js.map +1 -1
  61. package/dist/gates.js +7 -2
  62. package/dist/gates.js.map +1 -1
  63. package/dist/git-branch.js +2 -0
  64. package/dist/git-branch.js.map +1 -1
  65. package/dist/git-diff.js +2 -0
  66. package/dist/git-diff.js.map +1 -1
  67. package/dist/git-log.js +7 -3
  68. package/dist/git-log.js.map +1 -1
  69. package/dist/git-status.js +2 -0
  70. package/dist/git-status.js.map +1 -1
  71. package/dist/guard-locked.js +2 -0
  72. package/dist/guard-locked.js.map +1 -1
  73. package/dist/guard-main-branch.js +2 -0
  74. package/dist/guard-main-branch.js.map +1 -1
  75. package/dist/guard-worktree-commit.js +3 -1
  76. package/dist/guard-worktree-commit.js.map +1 -1
  77. package/dist/hooks/auto-checkpoint-utils.js +2 -0
  78. package/dist/hooks/auto-checkpoint-utils.js.map +1 -1
  79. package/dist/hooks/enforcement-checks.js +2 -0
  80. package/dist/hooks/enforcement-checks.js.map +1 -1
  81. package/dist/hooks/enforcement-generator.js +2 -0
  82. package/dist/hooks/enforcement-generator.js.map +1 -1
  83. package/dist/hooks/enforcement-sync.js +2 -0
  84. package/dist/hooks/enforcement-sync.js.map +1 -1
  85. package/dist/hooks/generators/auto-checkpoint.js +2 -0
  86. package/dist/hooks/generators/auto-checkpoint.js.map +1 -1
  87. package/dist/hooks/generators/enforce-worktree.js +2 -0
  88. package/dist/hooks/generators/enforce-worktree.js.map +1 -1
  89. package/dist/hooks/generators/index.js +2 -0
  90. package/dist/hooks/generators/index.js.map +1 -1
  91. package/dist/hooks/generators/pre-compact-checkpoint.js +2 -0
  92. package/dist/hooks/generators/pre-compact-checkpoint.js.map +1 -1
  93. package/dist/hooks/generators/require-wu.js +2 -0
  94. package/dist/hooks/generators/require-wu.js.map +1 -1
  95. package/dist/hooks/generators/session-start-recovery.js +2 -0
  96. package/dist/hooks/generators/session-start-recovery.js.map +1 -1
  97. package/dist/hooks/generators/signal-utils.js +2 -0
  98. package/dist/hooks/generators/signal-utils.js.map +1 -1
  99. package/dist/hooks/generators/warn-incomplete.js +2 -0
  100. package/dist/hooks/generators/warn-incomplete.js.map +1 -1
  101. package/dist/hooks/index.js +2 -0
  102. package/dist/hooks/index.js.map +1 -1
  103. package/dist/index.js +5 -1
  104. package/dist/index.js.map +1 -1
  105. package/dist/init-detection.js +2 -0
  106. package/dist/init-detection.js.map +1 -1
  107. package/dist/init-lane-validation.js +2 -0
  108. package/dist/init-lane-validation.js.map +1 -1
  109. package/dist/init-scaffolding.js +2 -0
  110. package/dist/init-scaffolding.js.map +1 -1
  111. package/dist/init-templates.js +8 -0
  112. package/dist/init-templates.js.map +1 -1
  113. package/dist/init.js +36 -3
  114. package/dist/init.js.map +1 -1
  115. package/dist/initiative-add-wu.js +2 -0
  116. package/dist/initiative-add-wu.js.map +1 -1
  117. package/dist/initiative-bulk-assign-wus.js +2 -0
  118. package/dist/initiative-bulk-assign-wus.js.map +1 -1
  119. package/dist/initiative-create.js +2 -0
  120. package/dist/initiative-create.js.map +1 -1
  121. package/dist/initiative-edit.js +2 -0
  122. package/dist/initiative-edit.js.map +1 -1
  123. package/dist/initiative-list.js +2 -0
  124. package/dist/initiative-list.js.map +1 -1
  125. package/dist/initiative-plan.js +2 -0
  126. package/dist/initiative-plan.js.map +1 -1
  127. package/dist/initiative-remove-wu.js +2 -0
  128. package/dist/initiative-remove-wu.js.map +1 -1
  129. package/dist/initiative-status.js +2 -0
  130. package/dist/initiative-status.js.map +1 -1
  131. package/dist/lane-edit.js +320 -0
  132. package/dist/lane-edit.js.map +1 -0
  133. package/dist/lane-health.js +2 -0
  134. package/dist/lane-health.js.map +1 -1
  135. package/dist/lane-lifecycle-process.js +2 -0
  136. package/dist/lane-lifecycle-process.js.map +1 -1
  137. package/dist/lane-lock.js +2 -0
  138. package/dist/lane-lock.js.map +1 -1
  139. package/dist/lane-setup.js +2 -0
  140. package/dist/lane-setup.js.map +1 -1
  141. package/dist/lane-status.js +2 -0
  142. package/dist/lane-status.js.map +1 -1
  143. package/dist/lane-suggest.js +2 -0
  144. package/dist/lane-suggest.js.map +1 -1
  145. package/dist/lane-validate.js +2 -0
  146. package/dist/lane-validate.js.map +1 -1
  147. package/dist/lifecycle-regression-harness.js +2 -0
  148. package/dist/lifecycle-regression-harness.js.map +1 -1
  149. package/dist/lumenflow-upgrade.js +2 -0
  150. package/dist/lumenflow-upgrade.js.map +1 -1
  151. package/dist/mem-checkpoint.js +72 -3
  152. package/dist/mem-checkpoint.js.map +1 -1
  153. package/dist/mem-cleanup.js +2 -0
  154. package/dist/mem-cleanup.js.map +1 -1
  155. package/dist/mem-context.js +2 -0
  156. package/dist/mem-context.js.map +1 -1
  157. package/dist/mem-create.js +2 -0
  158. package/dist/mem-create.js.map +1 -1
  159. package/dist/mem-delete.js +2 -0
  160. package/dist/mem-delete.js.map +1 -1
  161. package/dist/mem-export.js +2 -0
  162. package/dist/mem-export.js.map +1 -1
  163. package/dist/mem-inbox.js +2 -0
  164. package/dist/mem-inbox.js.map +1 -1
  165. package/dist/mem-index.js +2 -0
  166. package/dist/mem-index.js.map +1 -1
  167. package/dist/mem-init.js +2 -0
  168. package/dist/mem-init.js.map +1 -1
  169. package/dist/mem-profile.js +2 -0
  170. package/dist/mem-profile.js.map +1 -1
  171. package/dist/mem-promote.js +2 -0
  172. package/dist/mem-promote.js.map +1 -1
  173. package/dist/mem-ready.js +2 -0
  174. package/dist/mem-ready.js.map +1 -1
  175. package/dist/mem-recover.js +2 -0
  176. package/dist/mem-recover.js.map +1 -1
  177. package/dist/mem-signal.js +2 -0
  178. package/dist/mem-signal.js.map +1 -1
  179. package/dist/mem-start.js +2 -0
  180. package/dist/mem-start.js.map +1 -1
  181. package/dist/mem-summarize.js +2 -0
  182. package/dist/mem-summarize.js.map +1 -1
  183. package/dist/mem-triage.js +2 -0
  184. package/dist/mem-triage.js.map +1 -1
  185. package/dist/merge-block.js +2 -0
  186. package/dist/merge-block.js.map +1 -1
  187. package/dist/metrics-cli.js +2 -0
  188. package/dist/metrics-cli.js.map +1 -1
  189. package/dist/metrics-snapshot.js +2 -0
  190. package/dist/metrics-snapshot.js.map +1 -1
  191. package/dist/onboard.js +532 -0
  192. package/dist/onboard.js.map +1 -0
  193. package/dist/onboarding-smoke-test.js +2 -0
  194. package/dist/onboarding-smoke-test.js.map +1 -1
  195. package/dist/orchestrate-init-status.js +2 -0
  196. package/dist/orchestrate-init-status.js.map +1 -1
  197. package/dist/orchestrate-initiative.js +17 -1
  198. package/dist/orchestrate-initiative.js.map +1 -1
  199. package/dist/orchestrate-monitor.js +2 -0
  200. package/dist/orchestrate-monitor.js.map +1 -1
  201. package/dist/pack-author.js +340 -0
  202. package/dist/pack-author.js.map +1 -0
  203. package/dist/pack-hash.js +103 -0
  204. package/dist/pack-hash.js.map +1 -0
  205. package/dist/pack-install.js +578 -0
  206. package/dist/pack-install.js.map +1 -0
  207. package/dist/pack-publish.js +283 -0
  208. package/dist/pack-publish.js.map +1 -0
  209. package/dist/pack-scaffold.js +271 -0
  210. package/dist/pack-scaffold.js.map +1 -0
  211. package/dist/pack-search.js +144 -0
  212. package/dist/pack-search.js.map +1 -0
  213. package/dist/pack-validate.js +314 -0
  214. package/dist/pack-validate.js.map +1 -0
  215. package/dist/plan-create.js +2 -0
  216. package/dist/plan-create.js.map +1 -1
  217. package/dist/plan-edit.js +2 -0
  218. package/dist/plan-edit.js.map +1 -1
  219. package/dist/plan-link.js +2 -0
  220. package/dist/plan-link.js.map +1 -1
  221. package/dist/plan-promote.js +2 -0
  222. package/dist/plan-promote.js.map +1 -1
  223. package/dist/public-manifest.js +104 -13
  224. package/dist/public-manifest.js.map +1 -1
  225. package/dist/release.js +3 -1
  226. package/dist/release.js.map +1 -1
  227. package/dist/rotate-progress.js +2 -0
  228. package/dist/rotate-progress.js.map +1 -1
  229. package/dist/session-coordinator.js +2 -0
  230. package/dist/session-coordinator.js.map +1 -1
  231. package/dist/shared-validators.js +2 -0
  232. package/dist/shared-validators.js.map +1 -1
  233. package/dist/signal-cleanup.js +2 -0
  234. package/dist/signal-cleanup.js.map +1 -1
  235. package/dist/state-bootstrap.js +2 -0
  236. package/dist/state-bootstrap.js.map +1 -1
  237. package/dist/state-cleanup.js +2 -0
  238. package/dist/state-cleanup.js.map +1 -1
  239. package/dist/state-doctor-fix.js +2 -0
  240. package/dist/state-doctor-fix.js.map +1 -1
  241. package/dist/state-doctor-stamps.js +2 -0
  242. package/dist/state-doctor-stamps.js.map +1 -1
  243. package/dist/state-doctor.js +2 -0
  244. package/dist/state-doctor.js.map +1 -1
  245. package/dist/strict-progress.js +2 -0
  246. package/dist/strict-progress.js.map +1 -1
  247. package/dist/sync-templates.js +2 -0
  248. package/dist/sync-templates.js.map +1 -1
  249. package/dist/task-claim.js +669 -0
  250. package/dist/task-claim.js.map +1 -0
  251. package/dist/trace-gen.js +2 -0
  252. package/dist/trace-gen.js.map +1 -1
  253. package/dist/validate-agent-skills.js +2 -0
  254. package/dist/validate-agent-skills.js.map +1 -1
  255. package/dist/validate-agent-sync.js +2 -0
  256. package/dist/validate-agent-sync.js.map +1 -1
  257. package/dist/validate-backlog-sync.js +2 -0
  258. package/dist/validate-backlog-sync.js.map +1 -1
  259. package/dist/validate-skills-spec.js +2 -0
  260. package/dist/validate-skills-spec.js.map +1 -1
  261. package/dist/validate.js +2 -0
  262. package/dist/validate.js.map +1 -1
  263. package/dist/validator-defaults.js +2 -14
  264. package/dist/validator-defaults.js.map +1 -1
  265. package/dist/validator-registry.js +2 -12
  266. package/dist/validator-registry.js.map +1 -1
  267. package/dist/workspace-init.js +323 -0
  268. package/dist/workspace-init.js.map +1 -0
  269. package/dist/wu-block.js +3 -1
  270. package/dist/wu-block.js.map +1 -1
  271. package/dist/wu-brief.js +2 -0
  272. package/dist/wu-brief.js.map +1 -1
  273. package/dist/wu-claim-branch.js +2 -0
  274. package/dist/wu-claim-branch.js.map +1 -1
  275. package/dist/wu-claim-cloud.js +2 -0
  276. package/dist/wu-claim-cloud.js.map +1 -1
  277. package/dist/wu-claim-mode.js +2 -0
  278. package/dist/wu-claim-mode.js.map +1 -1
  279. package/dist/wu-claim-output.js +2 -0
  280. package/dist/wu-claim-output.js.map +1 -1
  281. package/dist/wu-claim-repair-guidance.js +2 -0
  282. package/dist/wu-claim-repair-guidance.js.map +1 -1
  283. package/dist/wu-claim-resume-handler.js +2 -0
  284. package/dist/wu-claim-resume-handler.js.map +1 -1
  285. package/dist/wu-claim-state.js +2 -1
  286. package/dist/wu-claim-state.js.map +1 -1
  287. package/dist/wu-claim-validation.js +2 -0
  288. package/dist/wu-claim-validation.js.map +1 -1
  289. package/dist/wu-claim-worktree.js +2 -0
  290. package/dist/wu-claim-worktree.js.map +1 -1
  291. package/dist/wu-claim.js +3 -1
  292. package/dist/wu-claim.js.map +1 -1
  293. package/dist/wu-cleanup-cloud.js +2 -0
  294. package/dist/wu-cleanup-cloud.js.map +1 -1
  295. package/dist/wu-cleanup.js +2 -0
  296. package/dist/wu-cleanup.js.map +1 -1
  297. package/dist/wu-code-path-coverage.js +2 -0
  298. package/dist/wu-code-path-coverage.js.map +1 -1
  299. package/dist/wu-create-cloud.js +2 -12
  300. package/dist/wu-create-cloud.js.map +1 -1
  301. package/dist/wu-create-content.js +2 -0
  302. package/dist/wu-create-content.js.map +1 -1
  303. package/dist/wu-create-readiness.js +2 -0
  304. package/dist/wu-create-readiness.js.map +1 -1
  305. package/dist/wu-create-validation.js +2 -0
  306. package/dist/wu-create-validation.js.map +1 -1
  307. package/dist/wu-create.js +2 -0
  308. package/dist/wu-create.js.map +1 -1
  309. package/dist/wu-delegate.js +2 -0
  310. package/dist/wu-delegate.js.map +1 -1
  311. package/dist/wu-delete.js +2 -0
  312. package/dist/wu-delete.js.map +1 -1
  313. package/dist/wu-deps.js +2 -0
  314. package/dist/wu-deps.js.map +1 -1
  315. package/dist/wu-done-auto-cleanup.js +2 -0
  316. package/dist/wu-done-auto-cleanup.js.map +1 -1
  317. package/dist/wu-done-check.js +2 -0
  318. package/dist/wu-done-check.js.map +1 -1
  319. package/dist/wu-done-cloud.js +2 -0
  320. package/dist/wu-done-cloud.js.map +1 -1
  321. package/dist/wu-done-decay.js +2 -0
  322. package/dist/wu-done-decay.js.map +1 -1
  323. package/dist/wu-done.js +7 -3
  324. package/dist/wu-done.js.map +1 -1
  325. package/dist/wu-edit-operations.js +2 -0
  326. package/dist/wu-edit-operations.js.map +1 -1
  327. package/dist/wu-edit-validators.js +2 -0
  328. package/dist/wu-edit-validators.js.map +1 -1
  329. package/dist/wu-edit.js +2 -0
  330. package/dist/wu-edit.js.map +1 -1
  331. package/dist/wu-infer-lane.js +2 -0
  332. package/dist/wu-infer-lane.js.map +1 -1
  333. package/dist/wu-preflight.js +2 -0
  334. package/dist/wu-preflight.js.map +1 -1
  335. package/dist/wu-prep.js +2 -0
  336. package/dist/wu-prep.js.map +1 -1
  337. package/dist/wu-proto.js +2 -0
  338. package/dist/wu-proto.js.map +1 -1
  339. package/dist/wu-prune.js +2 -0
  340. package/dist/wu-prune.js.map +1 -1
  341. package/dist/wu-recover.js +2 -0
  342. package/dist/wu-recover.js.map +1 -1
  343. package/dist/wu-release.js +2 -0
  344. package/dist/wu-release.js.map +1 -1
  345. package/dist/wu-repair.js +2 -0
  346. package/dist/wu-repair.js.map +1 -1
  347. package/dist/wu-sandbox.js +2 -0
  348. package/dist/wu-sandbox.js.map +1 -1
  349. package/dist/wu-spawn-completion.js +2 -0
  350. package/dist/wu-spawn-completion.js.map +1 -1
  351. package/dist/wu-spawn-prompt-builders.js +88 -28
  352. package/dist/wu-spawn-prompt-builders.js.map +1 -1
  353. package/dist/wu-spawn-strategy-resolver.js +2 -0
  354. package/dist/wu-spawn-strategy-resolver.js.map +1 -1
  355. package/dist/wu-spawn.js +2 -0
  356. package/dist/wu-spawn.js.map +1 -1
  357. package/dist/wu-state-cloud.js +2 -0
  358. package/dist/wu-state-cloud.js.map +1 -1
  359. package/dist/wu-status.js +2 -0
  360. package/dist/wu-status.js.map +1 -1
  361. package/dist/wu-unblock.js +2 -0
  362. package/dist/wu-unblock.js.map +1 -1
  363. package/dist/wu-unlock-lane.js +2 -0
  364. package/dist/wu-unlock-lane.js.map +1 -1
  365. package/dist/wu-validate.js +2 -0
  366. package/dist/wu-validate.js.map +1 -1
  367. package/package.json +40 -11
  368. package/templates/core/UPGRADING.md.template +2 -2
  369. package/templates/core/ai/onboarding/release-process.md.template +1 -1
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env node
2
+ // Copyright (c) 2026 Hellmai Ltd
3
+ // SPDX-License-Identifier: AGPL-3.0-only
4
+ /**
5
+ * @file pack-publish.ts
6
+ * Publish a LumenFlow domain pack to a registry (WU-1838)
7
+ *
8
+ * Runs pack:validate, creates a tarball, and uploads to the registry
9
+ * with authentication. Requires a GitHub OAuth token or registry token.
10
+ *
11
+ * Usage:
12
+ * pnpm pack:publish --id my-pack
13
+ * pnpm pack:publish --pack-root ./path/to/pack --registry-url https://custom.registry.dev
14
+ * pnpm pack:publish --id my-pack --token ghp_xxx
15
+ */
16
+ import { execFile } from 'node:child_process';
17
+ import { mkdirSync } from 'node:fs';
18
+ import { readFile } from 'node:fs/promises';
19
+ import { join, resolve } from 'node:path';
20
+ import { tmpdir } from 'node:os';
21
+ import { promisify } from 'node:util';
22
+ import YAML from 'yaml';
23
+ import { DomainPackManifestSchema, PACK_MANIFEST_FILE_NAME, UTF8_ENCODING, } from '@lumenflow/kernel';
24
+ import { createWUParser, WU_OPTIONS } from '@lumenflow/core';
25
+ import { validatePack } from './pack-validate.js';
26
+ import { computePackHash } from './pack-hash.js';
27
+ import { runCLI } from './cli-entry-point.js';
28
+ export const LOG_PREFIX = '[pack:publish]';
29
+ const execFileAsync = promisify(execFile);
30
+ // --- Constants ---
31
+ const DEFAULT_PACKS_ROOT = 'packages/@lumenflow/packs';
32
+ const DEFAULT_REGISTRY_URL = 'https://registry.lumenflow.dev';
33
+ const TOKEN_ENV_VAR = 'LUMENFLOW_REGISTRY_TOKEN';
34
+ const GITHUB_TOKEN_ENV_VAR = 'GITHUB_TOKEN';
35
+ /**
36
+ * Create a gzipped tarball of the pack directory contents.
37
+ *
38
+ * Uses system `tar` command for simplicity and zero dependencies.
39
+ * The tarball is named `<packId>-<version>.tar.gz`.
40
+ *
41
+ * @returns Absolute path to the created tarball file
42
+ * @throws Error if tar command fails
43
+ */
44
+ export async function createPackTarball(options) {
45
+ const { packRoot, outputDir, packId, version } = options;
46
+ const absolutePackRoot = resolve(packRoot);
47
+ const tarballName = `${packId}-${version}.tar.gz`;
48
+ const tarballPath = resolve(outputDir, tarballName);
49
+ await execFileAsync('tar', ['-czf', tarballPath, '-C', absolutePackRoot, '.']);
50
+ return tarballPath;
51
+ }
52
+ // --- Core publish function ---
53
+ /**
54
+ * Publish a pack to a registry.
55
+ *
56
+ * Steps:
57
+ * 1. Validate the pack using pack:validate
58
+ * 2. Read manifest to get pack ID and version
59
+ * 3. Compute integrity hash
60
+ * 4. Create tarball of pack contents
61
+ * 5. Upload tarball to registry with authentication
62
+ *
63
+ * Returns PublishPackResult with success=false if validation fails,
64
+ * token is missing, or upload fails.
65
+ */
66
+ export async function publishPack(options) {
67
+ const { packRoot, registryUrl, token, uploadFn } = options;
68
+ const absolutePackRoot = resolve(packRoot);
69
+ // 0. Validate token
70
+ if (!token) {
71
+ return {
72
+ success: false,
73
+ error: `Authentication token is required. Set ${TOKEN_ENV_VAR} or ${GITHUB_TOKEN_ENV_VAR} environment variable, or pass --token.`,
74
+ };
75
+ }
76
+ // 1. Validate the pack
77
+ let validation;
78
+ try {
79
+ validation = await validatePack({ packRoot: absolutePackRoot });
80
+ }
81
+ catch (err) {
82
+ const message = err instanceof Error ? err.message : String(err);
83
+ return { success: false, error: `Pack validation failed: ${message}` };
84
+ }
85
+ if (!validation.allPassed) {
86
+ return {
87
+ success: false,
88
+ error: `Pack validation failed. Run pack:validate --pack-root ${absolutePackRoot} for details.`,
89
+ validation,
90
+ };
91
+ }
92
+ // 2. Read manifest for pack ID and version
93
+ let packId;
94
+ let version;
95
+ try {
96
+ const manifestPath = join(absolutePackRoot, PACK_MANIFEST_FILE_NAME);
97
+ const manifestRaw = await readFile(manifestPath, UTF8_ENCODING);
98
+ const manifest = DomainPackManifestSchema.parse(YAML.parse(manifestRaw));
99
+ packId = manifest.id;
100
+ version = manifest.version;
101
+ }
102
+ catch (err) {
103
+ const message = err instanceof Error ? err.message : String(err);
104
+ return { success: false, error: `Failed to read manifest: ${message}` };
105
+ }
106
+ // 3. Compute integrity hash
107
+ let integrity;
108
+ try {
109
+ integrity = await computePackHash({ packRoot: absolutePackRoot });
110
+ }
111
+ catch (err) {
112
+ const message = err instanceof Error ? err.message : String(err);
113
+ return { success: false, error: `Integrity hash computation failed: ${message}` };
114
+ }
115
+ // 4. Create tarball
116
+ let tarballPath;
117
+ try {
118
+ const outputDir = join(tmpdir(), `lumenflow-publish-${packId}-${Date.now()}`);
119
+ mkdirSync(outputDir, { recursive: true });
120
+ tarballPath = await createPackTarball({
121
+ packRoot: absolutePackRoot,
122
+ outputDir,
123
+ packId,
124
+ version,
125
+ });
126
+ }
127
+ catch (err) {
128
+ const message = err instanceof Error ? err.message : String(err);
129
+ return { success: false, error: `Tarball creation failed: ${message}` };
130
+ }
131
+ // 5. Upload to registry
132
+ try {
133
+ await uploadFn({
134
+ registryUrl,
135
+ packId,
136
+ version,
137
+ tarballPath,
138
+ token,
139
+ integrity,
140
+ });
141
+ }
142
+ catch (err) {
143
+ const message = err instanceof Error ? err.message : String(err);
144
+ return {
145
+ success: false,
146
+ error: message,
147
+ packId,
148
+ version,
149
+ integrity,
150
+ tarballPath,
151
+ validation,
152
+ };
153
+ }
154
+ return {
155
+ success: true,
156
+ packId,
157
+ version,
158
+ integrity,
159
+ tarballPath,
160
+ validation,
161
+ };
162
+ }
163
+ // --- Default upload implementation ---
164
+ /**
165
+ * Default upload function using Node.js built-in fetch.
166
+ *
167
+ * Sends a multipart/form-data POST to the registry's publish endpoint:
168
+ * POST {registryUrl}/api/registry/packs/{packId}/versions/{version}
169
+ *
170
+ * Headers:
171
+ * Authorization: Bearer {token}
172
+ *
173
+ * Body (multipart/form-data):
174
+ * tarball: pack tarball file (.tar.gz)
175
+ * integrity: sha256 hash string
176
+ * version: semver version string
177
+ */
178
+ export async function defaultUploadFn(options) {
179
+ const { registryUrl, packId, version, tarballPath, token, integrity } = options;
180
+ const { readFile: readFileFs } = await import('node:fs/promises');
181
+ const { basename } = await import('node:path');
182
+ const tarballBuffer = await readFileFs(tarballPath);
183
+ const url = `${registryUrl}/api/registry/packs/${packId}/versions/${version}`;
184
+ const formData = new FormData();
185
+ formData.append('tarball', new Blob([tarballBuffer], { type: 'application/gzip' }), basename(tarballPath));
186
+ formData.append('integrity', integrity);
187
+ formData.append('version', version);
188
+ const response = await fetch(url, {
189
+ method: 'POST',
190
+ headers: {
191
+ Authorization: `Bearer ${token}`,
192
+ },
193
+ body: formData,
194
+ });
195
+ if (!response.ok) {
196
+ const body = await response.text().catch(() => 'No response body');
197
+ throw new Error(`Registry upload failed: ${String(response.status)} ${response.statusText} - ${body}`);
198
+ }
199
+ }
200
+ // --- CLI options ---
201
+ const PACK_PUBLISH_OPTIONS = {
202
+ packId: {
203
+ name: 'id',
204
+ flags: '--id <packId>',
205
+ description: 'Pack ID to publish (resolves under --packs-root)',
206
+ },
207
+ packsRoot: {
208
+ name: 'packsRoot',
209
+ flags: '--packs-root <dir>',
210
+ description: `Root directory containing packs (default: "${DEFAULT_PACKS_ROOT}")`,
211
+ },
212
+ packRoot: {
213
+ name: 'packRoot',
214
+ flags: '--pack-root <dir>',
215
+ description: 'Direct path to pack directory (overrides --id and --packs-root)',
216
+ },
217
+ registryUrl: {
218
+ name: 'registryUrl',
219
+ flags: '--registry-url <url>',
220
+ description: `Registry URL (default: "${DEFAULT_REGISTRY_URL}")`,
221
+ },
222
+ token: {
223
+ name: 'token',
224
+ flags: '--token <token>',
225
+ description: `Authentication token (default: $${TOKEN_ENV_VAR} or $${GITHUB_TOKEN_ENV_VAR})`,
226
+ },
227
+ };
228
+ /**
229
+ * CLI main entry point for pack:publish
230
+ */
231
+ export async function main() {
232
+ const opts = createWUParser({
233
+ name: 'pack-publish',
234
+ description: 'Publish a LumenFlow domain pack to a registry',
235
+ options: [
236
+ PACK_PUBLISH_OPTIONS.packId,
237
+ PACK_PUBLISH_OPTIONS.packsRoot,
238
+ PACK_PUBLISH_OPTIONS.packRoot,
239
+ PACK_PUBLISH_OPTIONS.registryUrl,
240
+ PACK_PUBLISH_OPTIONS.token,
241
+ WU_OPTIONS.force,
242
+ ],
243
+ });
244
+ const packId = opts.id;
245
+ const packsRoot = opts.packsRoot ?? DEFAULT_PACKS_ROOT;
246
+ const directPackRoot = opts.packRoot;
247
+ const registryUrl = opts.registryUrl ?? DEFAULT_REGISTRY_URL;
248
+ const token = opts.token ??
249
+ process.env[TOKEN_ENV_VAR] ??
250
+ process.env[GITHUB_TOKEN_ENV_VAR] ??
251
+ '';
252
+ let resolvedPackRoot;
253
+ if (directPackRoot) {
254
+ resolvedPackRoot = resolve(directPackRoot);
255
+ }
256
+ else if (packId) {
257
+ resolvedPackRoot = resolve(packsRoot, packId);
258
+ }
259
+ else {
260
+ console.error(`${LOG_PREFIX} Error: Provide --id <packId> or --pack-root <dir>`);
261
+ process.exit(1);
262
+ }
263
+ console.log(`${LOG_PREFIX} Publishing pack at: ${resolvedPackRoot}`);
264
+ console.log(`${LOG_PREFIX} Registry: ${registryUrl}`);
265
+ const result = await publishPack({
266
+ packRoot: resolvedPackRoot,
267
+ registryUrl,
268
+ token,
269
+ uploadFn: defaultUploadFn,
270
+ });
271
+ if (!result.success) {
272
+ console.error(`${LOG_PREFIX} Publish failed: ${result.error}`);
273
+ process.exit(1);
274
+ }
275
+ console.log(`${LOG_PREFIX} Published "${result.packId}" v${result.version} successfully.`);
276
+ console.log(`${LOG_PREFIX} Integrity: ${result.integrity}`);
277
+ console.log(`${LOG_PREFIX} Tarball: ${result.tarballPath}`);
278
+ }
279
+ // Run if executed directly
280
+ if (import.meta.main) {
281
+ void runCLI(main);
282
+ }
283
+ //# sourceMappingURL=pack-publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-publish.js","sourceRoot":"","sources":["../src/pack-publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ #!/usr/bin/env node
2
+ // Copyright (c) 2026 Hellmai Ltd
3
+ // SPDX-License-Identifier: AGPL-3.0-only
4
+ /**
5
+ * @file pack-scaffold.ts
6
+ * Scaffold a new LumenFlow domain pack (WU-1823)
7
+ *
8
+ * Usage:
9
+ * pnpm pack:scaffold --id my-domain --version 0.1.0
10
+ * pnpm pack:scaffold --id my-domain --version 0.1.0 --task-type investigation --tool my-tool
11
+ */
12
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
13
+ import { join } from 'node:path';
14
+ import YAML from 'yaml';
15
+ import { createWUParser, WU_OPTIONS } from '@lumenflow/core';
16
+ import { runCLI } from './cli-entry-point.js';
17
+ export const LOG_PREFIX = '[pack:scaffold]';
18
+ // --- Validation constants ---
19
+ const PACK_ID_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
20
+ const SEMVER_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-.]+)?(?:\+[0-9A-Za-z-.]+)?$/;
21
+ const DEFAULT_TASK_TYPE = 'task';
22
+ const DEFAULT_OUTPUT_DIR = 'packs';
23
+ // --- Validation functions ---
24
+ /**
25
+ * Validate a pack ID is kebab-case, non-empty, starts with letter.
26
+ * @throws {Error} if pack ID is invalid
27
+ */
28
+ export function validatePackId(packId) {
29
+ if (!packId || !PACK_ID_PATTERN.test(packId)) {
30
+ throw new Error(`Invalid pack ID "${packId}". Must be kebab-case (lowercase letters, numbers, hyphens), ` +
31
+ `start with a letter, and not start/end with a hyphen. Examples: "my-domain", "customer-support"`);
32
+ }
33
+ }
34
+ /**
35
+ * Validate a version string is valid semver.
36
+ * @throws {Error} if version is invalid
37
+ */
38
+ export function validateVersion(version) {
39
+ if (!version || !SEMVER_PATTERN.test(version)) {
40
+ throw new Error(`Invalid version "${version}". Must be valid semver (e.g., "0.1.0", "1.0.0", "2.3.4-beta.1")`);
41
+ }
42
+ }
43
+ // --- Template generators ---
44
+ function generateManifestYaml(options) {
45
+ const { packId, version, taskTypes, toolNames } = options;
46
+ const tools = toolNames.map((toolName) => ({
47
+ name: toolName,
48
+ entry: `tool-impl/${toolName}.ts#${toCamelCase(toolName)}Tool`,
49
+ permission: 'read',
50
+ required_scopes: [
51
+ {
52
+ type: 'path',
53
+ pattern: '**',
54
+ access: 'read',
55
+ },
56
+ ],
57
+ }));
58
+ const manifest = {
59
+ id: packId,
60
+ version,
61
+ task_types: taskTypes,
62
+ tools,
63
+ policies: [],
64
+ evidence_types: [],
65
+ state_aliases: {},
66
+ lane_templates: [],
67
+ };
68
+ return YAML.stringify(manifest, { lineWidth: 120 });
69
+ }
70
+ function generateToolImpl(toolName, packId) {
71
+ const camelName = toCamelCase(toolName);
72
+ return `// ${packId} pack - ${toolName} tool implementation
73
+ //
74
+ // This file contains the runtime logic for the "${toolName}" tool.
75
+ // It is invoked by the LumenFlow kernel when an agent calls this tool.
76
+
77
+ import type { ToolRequest, ToolContext, ToolResult } from '@lumenflow/kernel';
78
+
79
+ /**
80
+ * ${toolName} tool handler.
81
+ *
82
+ * @param request - The tool invocation request from the kernel
83
+ * @param context - Execution context (workspace, task, scopes)
84
+ * @returns Tool result with output or error
85
+ */
86
+ export async function ${camelName}Tool(
87
+ request: ToolRequest,
88
+ context: ToolContext,
89
+ ): Promise<ToolResult> {
90
+ // TODO: Implement ${toolName} logic
91
+ return {
92
+ success: true,
93
+ output: \`${toolName} executed for task \${context.taskId}\`,
94
+ };
95
+ }
96
+ `;
97
+ }
98
+ function generateToolDescriptor(toolName) {
99
+ const camelName = toCamelCase(toolName);
100
+ return `// Tool descriptor for "${toolName}"
101
+ //
102
+ // This file re-exports the tool implementation for use in the manifest.
103
+ // The manifest.yaml references tool-impl/${toolName}.ts#${camelName}Tool
104
+
105
+ export { ${camelName}Tool } from '../tool-impl/${toolName}.js';
106
+ `;
107
+ }
108
+ function generateReadme(packId, version) {
109
+ return `# ${packId}
110
+
111
+ LumenFlow domain pack - version ${version}
112
+
113
+ ## Overview
114
+
115
+ This pack provides domain-specific tools and policies for the LumenFlow kernel.
116
+
117
+ ## Structure
118
+
119
+ \`\`\`
120
+ ${packId}/
121
+ manifest.yaml # Pack manifest (tools, policies, task types)
122
+ tool-impl/ # Tool runtime implementations
123
+ tools/ # Tool descriptor re-exports
124
+ README.md # This file
125
+ \`\`\`
126
+
127
+ ## Getting Started
128
+
129
+ 1. Define your task types in \`manifest.yaml\`
130
+ 2. Implement tool logic in \`tool-impl/\`
131
+ 3. Register tools in the manifest
132
+ 4. Validate with: \`pnpm pack:validate --id ${packId}\`
133
+
134
+ ## Tools
135
+
136
+ See \`manifest.yaml\` for the list of registered tools.
137
+ `;
138
+ }
139
+ // --- Helpers ---
140
+ function toCamelCase(kebab) {
141
+ return kebab.replace(/-([a-z0-9])/g, (_match, letter) => letter.toUpperCase());
142
+ }
143
+ // --- Core scaffold function ---
144
+ /**
145
+ * Scaffold a new domain pack directory structure.
146
+ *
147
+ * Creates:
148
+ * - <outputDir>/<packId>/manifest.yaml
149
+ * - <outputDir>/<packId>/tool-impl/<toolName>.ts (for each tool)
150
+ * - <outputDir>/<packId>/tools/<toolName>.ts (for each tool)
151
+ * - <outputDir>/<packId>/README.md
152
+ *
153
+ * @throws {Error} if pack ID or version is invalid, or directory already exists
154
+ */
155
+ export function scaffoldPack(options) {
156
+ const { outputDir, packId, version, taskTypes, toolNames = [] } = options;
157
+ // Validate inputs
158
+ validatePackId(packId);
159
+ validateVersion(version);
160
+ const resolvedTaskTypes = taskTypes && taskTypes.length > 0 ? taskTypes : [DEFAULT_TASK_TYPE];
161
+ const packDir = join(outputDir, packId);
162
+ // Prevent overwriting
163
+ if (existsSync(packDir)) {
164
+ throw new Error(`Pack directory "${packDir}" already exists. Remove it first or choose a different ID.`);
165
+ }
166
+ // Create directory structure
167
+ const toolImplDir = join(packDir, 'tool-impl');
168
+ const toolsDir = join(packDir, 'tools');
169
+ mkdirSync(toolImplDir, { recursive: true });
170
+ mkdirSync(toolsDir, { recursive: true });
171
+ const filesCreated = [];
172
+ // Generate manifest.yaml
173
+ const manifestContent = generateManifestYaml({
174
+ packId,
175
+ version,
176
+ taskTypes: resolvedTaskTypes,
177
+ toolNames,
178
+ });
179
+ const manifestPath = join(packDir, 'manifest.yaml');
180
+ writeFileSync(manifestPath, manifestContent, 'utf-8');
181
+ filesCreated.push(manifestPath);
182
+ // Generate tool files
183
+ for (const toolName of toolNames) {
184
+ const implPath = join(toolImplDir, `${toolName}.ts`);
185
+ writeFileSync(implPath, generateToolImpl(toolName, packId), 'utf-8');
186
+ filesCreated.push(implPath);
187
+ const descPath = join(toolsDir, `${toolName}.ts`);
188
+ writeFileSync(descPath, generateToolDescriptor(toolName), 'utf-8');
189
+ filesCreated.push(descPath);
190
+ }
191
+ // Generate README
192
+ const readmePath = join(packDir, 'README.md');
193
+ writeFileSync(readmePath, generateReadme(packId, version), 'utf-8');
194
+ filesCreated.push(readmePath);
195
+ return { packDir, filesCreated };
196
+ }
197
+ // --- CLI options ---
198
+ const PACK_SCAFFOLD_OPTIONS = {
199
+ packId: {
200
+ name: 'id',
201
+ flags: '--id <packId>',
202
+ description: 'Pack ID in kebab-case (e.g., "my-domain", "customer-support")',
203
+ },
204
+ version: {
205
+ name: 'version',
206
+ flags: '--version <version>',
207
+ description: 'Pack version in semver format (e.g., "0.1.0")',
208
+ },
209
+ taskType: {
210
+ name: 'taskType',
211
+ flags: '--task-type <type>',
212
+ description: 'Task type name (repeatable)',
213
+ isRepeatable: true,
214
+ },
215
+ tool: {
216
+ name: 'tool',
217
+ flags: '--tool <name>',
218
+ description: 'Tool name to scaffold (repeatable)',
219
+ isRepeatable: true,
220
+ },
221
+ output: {
222
+ name: 'output',
223
+ flags: '--output <dir>',
224
+ description: `Output directory (default: "${DEFAULT_OUTPUT_DIR}")`,
225
+ },
226
+ };
227
+ /**
228
+ * CLI main entry point for pack:scaffold
229
+ */
230
+ export async function main() {
231
+ const opts = createWUParser({
232
+ name: 'pack-scaffold',
233
+ description: 'Scaffold a new LumenFlow domain pack',
234
+ options: [
235
+ PACK_SCAFFOLD_OPTIONS.packId,
236
+ PACK_SCAFFOLD_OPTIONS.version,
237
+ PACK_SCAFFOLD_OPTIONS.taskType,
238
+ PACK_SCAFFOLD_OPTIONS.tool,
239
+ PACK_SCAFFOLD_OPTIONS.output,
240
+ WU_OPTIONS.force,
241
+ ],
242
+ required: ['id', 'version'],
243
+ });
244
+ const packId = opts.id;
245
+ const version = opts.version;
246
+ const taskTypes = opts.taskType ?? [];
247
+ const toolNames = opts.tool ?? [];
248
+ const outputDir = opts.output ?? DEFAULT_OUTPUT_DIR;
249
+ console.log(`${LOG_PREFIX} Scaffolding pack "${packId}" v${version}...`);
250
+ const result = scaffoldPack({
251
+ outputDir,
252
+ packId,
253
+ version,
254
+ taskTypes: taskTypes.length > 0 ? taskTypes : undefined,
255
+ toolNames: toolNames.length > 0 ? toolNames : undefined,
256
+ });
257
+ console.log(`${LOG_PREFIX} Pack scaffolded at: ${result.packDir}`);
258
+ console.log(`${LOG_PREFIX} Files created:`);
259
+ for (const file of result.filesCreated) {
260
+ console.log(` - ${file}`);
261
+ }
262
+ console.log(`${LOG_PREFIX} Next steps:`);
263
+ console.log(` 1. Edit manifest.yaml to define your tools and policies`);
264
+ console.log(` 2. Implement tool logic in tool-impl/`);
265
+ console.log(` 3. Validate with: pnpm pack:validate --id ${packId}`);
266
+ }
267
+ // Run if executed directly
268
+ if (import.meta.main) {
269
+ void runCLI(main);
270
+ }
271
+ //# sourceMappingURL=pack-scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-scaffold.js","sourceRoot":"","sources":["../src/pack-scaffold.ts"],"names":[],"mappings":"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"}