@lumenflow/cli 5.4.0 → 5.7.12

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 (227) hide show
  1. package/README.md +42 -40
  2. package/dist/db-journal-recover.js +400 -0
  3. package/dist/db-journal-recover.js.map +1 -0
  4. package/dist/docs-sync.js +8 -3
  5. package/dist/docs-sync.js.map +1 -1
  6. package/dist/gate-defaults.js +191 -9
  7. package/dist/gate-defaults.js.map +1 -1
  8. package/dist/gate-registry.js.map +1 -1
  9. package/dist/gates/monolithic-file-contention-guard.js +167 -0
  10. package/dist/gates/monolithic-file-contention-guard.js.map +1 -0
  11. package/dist/gates/prod-migration-drift.js +207 -0
  12. package/dist/gates/prod-migration-drift.js.map +1 -0
  13. package/dist/gates/test-over-deletion-guard.js +255 -0
  14. package/dist/gates/test-over-deletion-guard.js.map +1 -0
  15. package/dist/gates-runners.js +401 -2
  16. package/dist/gates-runners.js.map +1 -1
  17. package/dist/gates.js +349 -4
  18. package/dist/gates.js.map +1 -1
  19. package/dist/lumenflow-setup.js +144 -0
  20. package/dist/lumenflow-setup.js.map +1 -0
  21. package/dist/lumenflow-upgrade.js +2 -1
  22. package/dist/lumenflow-upgrade.js.map +1 -1
  23. package/dist/mem-create.js +10 -1
  24. package/dist/mem-create.js.map +1 -1
  25. package/dist/mem-signal.js +21 -4
  26. package/dist/mem-signal.js.map +1 -1
  27. package/dist/metrics-cli.js +19 -2
  28. package/dist/metrics-cli.js.map +1 -1
  29. package/dist/metrics-snapshot.js +25 -2
  30. package/dist/metrics-snapshot.js.map +1 -1
  31. package/dist/orchestrate-initiative.js +28 -3
  32. package/dist/orchestrate-initiative.js.map +1 -1
  33. package/dist/public-manifest.js +17 -0
  34. package/dist/public-manifest.js.map +1 -1
  35. package/dist/release.js +53 -18
  36. package/dist/release.js.map +1 -1
  37. package/dist/wu-done-gates.js +121 -8
  38. package/dist/wu-done-gates.js.map +1 -1
  39. package/dist/wu-done.js +30 -6
  40. package/dist/wu-done.js.map +1 -1
  41. package/dist/wu-edit-operations.js +74 -0
  42. package/dist/wu-edit-operations.js.map +1 -1
  43. package/dist/wu-edit-validators.js +58 -0
  44. package/dist/wu-edit-validators.js.map +1 -1
  45. package/dist/wu-edit.js +106 -4
  46. package/dist/wu-edit.js.map +1 -1
  47. package/dist/wu-prep.js +132 -8
  48. package/dist/wu-prep.js.map +1 -1
  49. package/dist/wu-recover.js +6 -0
  50. package/dist/wu-recover.js.map +1 -1
  51. package/dist/wu-release.js +120 -2
  52. package/dist/wu-release.js.map +1 -1
  53. package/dist/wu-sizing-validation.js +47 -17
  54. package/dist/wu-sizing-validation.js.map +1 -1
  55. package/dist/wu-status.js +33 -0
  56. package/dist/wu-status.js.map +1 -1
  57. package/package.json +13 -11
  58. package/packs/agent-runtime/package.json +1 -1
  59. package/packs/sidekick/package.json +1 -1
  60. package/packs/software-delivery/package.json +1 -1
  61. package/templates/core/AGENTS.md.template +162 -26
  62. package/templates/core/LUMENFLOW.md.template +381 -70
  63. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +0 -5
  64. package/templates/core/ai/onboarding/agent-safety-card.md.template +63 -17
  65. package/templates/core/ai/onboarding/initiative-orchestration.md.template +4 -0
  66. package/templates/core/ai/onboarding/release-process.md.template +7 -7
  67. package/templates/core/ai/onboarding/vendor-support.md.template +74 -10
  68. package/templates/vendors/claude/.claude/skills/frontend-design/SKILL.md.template +1 -1
  69. package/templates/vendors/claude/.claude/skills/wu-lifecycle/SKILL.md.template +28 -0
  70. package/packs/agent-runtime/agent-heartbeat.ts +0 -163
  71. package/packs/agent-runtime/auto-session-integration.ts +0 -888
  72. package/packs/agent-runtime/capability-factory.ts +0 -104
  73. package/packs/agent-runtime/constants.ts +0 -21
  74. package/packs/agent-runtime/delegation-registry-schema.ts +0 -220
  75. package/packs/agent-runtime/delegation-registry-store.ts +0 -269
  76. package/packs/agent-runtime/delegation-tree.ts +0 -328
  77. package/packs/agent-runtime/index.ts +0 -20
  78. package/packs/agent-runtime/manifest.ts +0 -348
  79. package/packs/agent-runtime/memory-coordination-contract.ts +0 -86
  80. package/packs/agent-runtime/orchestration.ts +0 -2027
  81. package/packs/agent-runtime/pack-registration.ts +0 -110
  82. package/packs/agent-runtime/policy-factory.ts +0 -165
  83. package/packs/agent-runtime/remote-controls/index.ts +0 -7
  84. package/packs/agent-runtime/remote-controls/operations.ts +0 -405
  85. package/packs/agent-runtime/remote-controls/port.ts +0 -48
  86. package/packs/agent-runtime/remote-controls/state-store.ts +0 -258
  87. package/packs/agent-runtime/remote-controls/types.ts +0 -105
  88. package/packs/agent-runtime/session-schema.ts +0 -467
  89. package/packs/agent-runtime/tool-impl/agent-turn-tools.ts +0 -793
  90. package/packs/agent-runtime/tool-impl/index.ts +0 -6
  91. package/packs/agent-runtime/tool-impl/provider-adapters.ts +0 -1245
  92. package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +0 -256
  93. package/packs/agent-runtime/tool-impl/remote-controls.ts +0 -273
  94. package/packs/agent-runtime/tools/index.ts +0 -4
  95. package/packs/agent-runtime/tools/types.ts +0 -47
  96. package/packs/agent-runtime/turn-lifecycle-events.ts +0 -590
  97. package/packs/agent-runtime/types.ts +0 -128
  98. package/packs/agent-runtime/vitest.config.ts +0 -11
  99. package/packs/sidekick/channel-ingress.ts +0 -137
  100. package/packs/sidekick/constants.ts +0 -10
  101. package/packs/sidekick/index.ts +0 -8
  102. package/packs/sidekick/manifest-schema.ts +0 -49
  103. package/packs/sidekick/manifest.ts +0 -512
  104. package/packs/sidekick/pack-registration.ts +0 -110
  105. package/packs/sidekick/policy-factory.ts +0 -38
  106. package/packs/sidekick/sidekick-events.ts +0 -694
  107. package/packs/sidekick/src/adapters/cloud-queue.ts +0 -101
  108. package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +0 -386
  109. package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +0 -228
  110. package/packs/sidekick/src/domain/channel.types.ts +0 -64
  111. package/packs/sidekick/src/ports/channel-bridge.port.ts +0 -92
  112. package/packs/sidekick/src/routines/commit.ts +0 -74
  113. package/packs/sidekick/tool-impl/channel-tools.ts +0 -577
  114. package/packs/sidekick/tool-impl/channel-transports.ts +0 -75
  115. package/packs/sidekick/tool-impl/index.ts +0 -29
  116. package/packs/sidekick/tool-impl/memory-tools.ts +0 -290
  117. package/packs/sidekick/tool-impl/routine-commit.ts +0 -102
  118. package/packs/sidekick/tool-impl/routine-tools.ts +0 -440
  119. package/packs/sidekick/tool-impl/runtime-context.ts +0 -28
  120. package/packs/sidekick/tool-impl/shared.ts +0 -125
  121. package/packs/sidekick/tool-impl/storage.ts +0 -325
  122. package/packs/sidekick/tool-impl/system-tools.ts +0 -160
  123. package/packs/sidekick/tool-impl/task-tools.ts +0 -506
  124. package/packs/sidekick/tools/channel-tools.ts +0 -53
  125. package/packs/sidekick/tools/index.ts +0 -9
  126. package/packs/sidekick/tools/memory-tools.ts +0 -53
  127. package/packs/sidekick/tools/routine-tools.ts +0 -53
  128. package/packs/sidekick/tools/system-tools.ts +0 -47
  129. package/packs/sidekick/tools/task-tools.ts +0 -61
  130. package/packs/sidekick/tools/types.ts +0 -57
  131. package/packs/sidekick/vitest.config.ts +0 -11
  132. package/packs/software-delivery/constants.ts +0 -10
  133. package/packs/software-delivery/extensions.ts +0 -140
  134. package/packs/software-delivery/gate-policies.ts +0 -134
  135. package/packs/software-delivery/index.ts +0 -8
  136. package/packs/software-delivery/manifest-schema.ts +0 -268
  137. package/packs/software-delivery/manifest.ts +0 -657
  138. package/packs/software-delivery/pack-registration.ts +0 -113
  139. package/packs/software-delivery/src/commands/index.ts +0 -5
  140. package/packs/software-delivery/src/config/delivery-review-contract.ts +0 -256
  141. package/packs/software-delivery/src/config/env-accessors.ts +0 -66
  142. package/packs/software-delivery/src/config/index.ts +0 -8
  143. package/packs/software-delivery/src/config/normalize-config-keys.ts +0 -9
  144. package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +0 -460
  145. package/packs/software-delivery/src/config/workspace-reader.ts +0 -375
  146. package/packs/software-delivery/src/constants/backlog-patterns.ts +0 -31
  147. package/packs/software-delivery/src/constants/client-ids.ts +0 -19
  148. package/packs/software-delivery/src/constants/config-contract.ts +0 -7
  149. package/packs/software-delivery/src/constants/docs-layout-presets.ts +0 -50
  150. package/packs/software-delivery/src/constants/duration-constants.ts +0 -20
  151. package/packs/software-delivery/src/constants/gate-constants.ts +0 -32
  152. package/packs/software-delivery/src/constants/index.ts +0 -29
  153. package/packs/software-delivery/src/constants/lock-constants.ts +0 -35
  154. package/packs/software-delivery/src/constants/object-guards.ts +0 -12
  155. package/packs/software-delivery/src/constants/section-headings.ts +0 -107
  156. package/packs/software-delivery/src/constants/wu-cli-constants.ts +0 -488
  157. package/packs/software-delivery/src/constants/wu-domain-constants.ts +0 -466
  158. package/packs/software-delivery/src/constants/wu-git-constants.ts +0 -7
  159. package/packs/software-delivery/src/constants/wu-id-format.ts +0 -327
  160. package/packs/software-delivery/src/constants/wu-paths-constants.ts +0 -384
  161. package/packs/software-delivery/src/constants/wu-statuses.ts +0 -287
  162. package/packs/software-delivery/src/constants/wu-type-helpers.ts +0 -67
  163. package/packs/software-delivery/src/constants/wu-ui-constants.ts +0 -267
  164. package/packs/software-delivery/src/constants/wu-validation-constants.ts +0 -73
  165. package/packs/software-delivery/src/domain/index.ts +0 -5
  166. package/packs/software-delivery/src/domain/orchestration.constants.ts +0 -166
  167. package/packs/software-delivery/src/domain/orchestration.schemas.ts +0 -238
  168. package/packs/software-delivery/src/domain/orchestration.types.ts +0 -176
  169. package/packs/software-delivery/src/methodology/incremental-test.ts +0 -122
  170. package/packs/software-delivery/src/methodology/index.ts +0 -6
  171. package/packs/software-delivery/src/methodology/manual-test-validator.ts +0 -292
  172. package/packs/software-delivery/src/policy/coverage-gate.ts +0 -270
  173. package/packs/software-delivery/src/policy/gates-agent-mode.ts +0 -223
  174. package/packs/software-delivery/src/policy/gates-config-internal.ts +0 -121
  175. package/packs/software-delivery/src/policy/gates-config.ts +0 -300
  176. package/packs/software-delivery/src/policy/gates-coverage.ts +0 -356
  177. package/packs/software-delivery/src/policy/gates-presets.ts +0 -134
  178. package/packs/software-delivery/src/policy/gates-schemas.ts +0 -173
  179. package/packs/software-delivery/src/policy/index.ts +0 -22
  180. package/packs/software-delivery/src/policy/package-manager-resolver.ts +0 -319
  181. package/packs/software-delivery/src/policy/resolve-policy.ts +0 -601
  182. package/packs/software-delivery/src/ports/config.ports.ts +0 -90
  183. package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +0 -125
  184. package/packs/software-delivery/src/ports/index.ts +0 -10
  185. package/packs/software-delivery/src/ports/sync-validator.ports.ts +0 -59
  186. package/packs/software-delivery/src/ports/wu-helpers.ports.ts +0 -168
  187. package/packs/software-delivery/src/ports/wu-state.ports.ts +0 -241
  188. package/packs/software-delivery/src/primitives/index.ts +0 -5
  189. package/packs/software-delivery/src/runtime/index.ts +0 -6
  190. package/packs/software-delivery/src/runtime/work-classifier.ts +0 -561
  191. package/packs/software-delivery/src/sandbox/index.ts +0 -10
  192. package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +0 -118
  193. package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +0 -88
  194. package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +0 -154
  195. package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +0 -47
  196. package/packs/software-delivery/src/sandbox/sandbox-profile.ts +0 -153
  197. package/packs/software-delivery/src/schemas/index.ts +0 -5
  198. package/packs/software-delivery/src/state/date-utils.ts +0 -158
  199. package/packs/software-delivery/src/state/index.ts +0 -15
  200. package/packs/software-delivery/src/state/state-machine.ts +0 -119
  201. package/packs/software-delivery/src/state/wu-doc-types.ts +0 -51
  202. package/packs/software-delivery/src/state/wu-paths.ts +0 -381
  203. package/packs/software-delivery/src/state/wu-schema.ts +0 -1139
  204. package/packs/software-delivery/src/state/wu-state-schema.ts +0 -255
  205. package/packs/software-delivery/src/state/wu-yaml.ts +0 -338
  206. package/packs/software-delivery/tool-impl/agent-tools.ts +0 -263
  207. package/packs/software-delivery/tool-impl/delegation-tools.ts +0 -66
  208. package/packs/software-delivery/tool-impl/flow-metrics-tools.ts +0 -219
  209. package/packs/software-delivery/tool-impl/git-runner.ts +0 -113
  210. package/packs/software-delivery/tool-impl/git-tools.ts +0 -316
  211. package/packs/software-delivery/tool-impl/index.ts +0 -15
  212. package/packs/software-delivery/tool-impl/initiative-orchestration-tools.ts +0 -720
  213. package/packs/software-delivery/tool-impl/lane-lock.ts +0 -246
  214. package/packs/software-delivery/tool-impl/memory-tools.ts +0 -470
  215. package/packs/software-delivery/tool-impl/pending-runtime-tools.ts +0 -21
  216. package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +0 -329
  217. package/packs/software-delivery/tool-impl/runtime-native-tools.ts +0 -687
  218. package/packs/software-delivery/tool-impl/worker-loader.ts +0 -52
  219. package/packs/software-delivery/tool-impl/worktree-tools.ts +0 -46
  220. package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +0 -807
  221. package/packs/software-delivery/tools/delegation-tools.ts +0 -23
  222. package/packs/software-delivery/tools/git-tools.ts +0 -55
  223. package/packs/software-delivery/tools/index.ts +0 -8
  224. package/packs/software-delivery/tools/lane-lock-tool.ts +0 -37
  225. package/packs/software-delivery/tools/types.ts +0 -71
  226. package/packs/software-delivery/tools/worktree-tools.ts +0 -49
  227. package/packs/software-delivery/vitest.config.ts +0 -11
@@ -1,657 +0,0 @@
1
- // Copyright (c) 2026 Hellmai Ltd
2
- // SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
3
-
4
- import {
5
- SOFTWARE_DELIVERY_PACK_ID,
6
- SOFTWARE_DELIVERY_PACK_VERSION,
7
- SOFTWARE_DELIVERY_POLICY_ID_PREFIX,
8
- } from './constants.js';
9
- import {
10
- MANIFEST_POLICY_DECISIONS,
11
- MANIFEST_POLICY_TRIGGERS,
12
- SoftwareDeliveryManifestSchema,
13
- type SoftwareDeliveryManifestTool,
14
- type SoftwareDeliveryPackManifest,
15
- } from './manifest-schema.js';
16
- import {
17
- TOOL_PERMISSIONS as TOOL_PERMISSION_VALUES,
18
- TOOL_SCOPE_ACCESS,
19
- TOOL_SCOPE_TYPES,
20
- type PathScope,
21
- type ToolPermission,
22
- } from './tools/types.js';
23
-
24
- export { SoftwareDeliveryManifestSchema };
25
- export type {
26
- ManifestPolicyDecision,
27
- ManifestPolicyTrigger,
28
- SoftwareDeliveryManifestPolicy,
29
- SoftwareDeliveryManifestTool,
30
- SoftwareDeliveryPackManifest,
31
- } from './manifest-schema.js';
32
-
33
- const FULL_WORKSPACE_SCOPE_PATTERN = '**';
34
- // WU-2833 (INIT-062 WU-G): the canonical read-only workspace scope used by
35
- // validation runners like gates / gates:docs. Exposed so remote callers
36
- // cannot mis-declare a read-only runner with a broader write scope.
37
- export const SOFTWARE_DELIVERY_READ_SCOPE_PATTERN = FULL_WORKSPACE_SCOPE_PATTERN;
38
- /**
39
- * WU-2833 (INIT-062 WU-G): tools whose runtime handlers perform only
40
- * read-side inspection (no filesystem mutation, no git mutation). Any
41
- * attempt to re-declare these tools with permission: write or admin MUST
42
- * fail the pack:validate gate so the security posture established by
43
- * WU-2810/2811/2816 cannot drift without an explicit ADR.
44
- */
45
- export const SOFTWARE_DELIVERY_READ_ONLY_RUNNER_TOOLS = ['gates', 'gates:docs'] as const;
46
- export type SoftwareDeliveryReadOnlyRunnerTool =
47
- (typeof SOFTWARE_DELIVERY_READ_ONLY_RUNNER_TOOLS)[number];
48
- // WU-2833: metrics:snapshot reads the workspace to compute DORA metrics
49
- // but writes the computed snapshot back into workspace state. This narrow
50
- // write scope keeps mobile/cloud tokens for metrics:snapshot from leaking
51
- // full-tree write access (principle of least privilege).
52
- const SOFTWARE_DELIVERY_WORKSPACE_STATE_WRITE_PATTERN = '.lumenflow/state/**';
53
- const SOFTWARE_DELIVERY_WRITE_DIRECTORY_PATTERNS = [
54
- '.changeset/**',
55
- '.claude/**',
56
- '.codex/**',
57
- '.cursor/**',
58
- '.github/**',
59
- '.git/**',
60
- '.husky/**',
61
- '.lumenflow/**',
62
- '.vercel/**',
63
- '.windsurf/**',
64
- 'apps/**',
65
- 'docs/**',
66
- 'packages/**',
67
- 'scripts/**',
68
- 'tools/**',
69
- 'worktrees/**',
70
- ] as const;
71
- const SOFTWARE_DELIVERY_ROOT_WRITE_FILE_PATTERNS = [
72
- '.gitignore',
73
- '.npmrc',
74
- 'LUMENFLOW.md',
75
- 'README.md',
76
- 'package.json',
77
- 'pnpm-lock.yaml',
78
- 'pnpm-workspace.yaml',
79
- 'turbo.json',
80
- 'workspace.yaml',
81
- '*.cjs',
82
- '*.js',
83
- '*.json',
84
- '*.md',
85
- '*.mjs',
86
- '*.sh',
87
- '*.toml',
88
- '*.ts',
89
- '*.tsx',
90
- '*.txt',
91
- '*.yaml',
92
- '*.yml',
93
- ] as const;
94
- const SOFTWARE_DELIVERY_WRITE_SCOPE_PATTERNS = [
95
- ...SOFTWARE_DELIVERY_WRITE_DIRECTORY_PATTERNS,
96
- ...SOFTWARE_DELIVERY_ROOT_WRITE_FILE_PATTERNS,
97
- ] as const;
98
- const GIT_STATUS_TOOL_ENTRY = 'tool-impl/git-tools.ts#gitStatusTool';
99
- const WU_STATUS_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuStatusTool';
100
- const WU_CREATE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuCreateTool';
101
- const WU_CLAIM_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuClaimTool';
102
- const WU_DONE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuDoneTool';
103
- const WU_PREP_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuPrepTool';
104
- const WU_PREFLIGHT_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuPreflightTool';
105
- const WU_VALIDATE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuValidateTool';
106
- const WU_SANDBOX_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuSandboxTool';
107
- const WU_PRUNE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuPruneTool';
108
- const WU_DELETE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuDeleteTool';
109
- const WU_CLEANUP_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuCleanupTool';
110
- const WU_UNLOCK_LANE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuUnlockLaneTool';
111
- const WU_BRIEF_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuBriefTool';
112
- const WU_DELEGATE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuDelegateTool';
113
- const WU_DEPS_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuDepsTool';
114
- const WU_EDIT_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuEditTool';
115
- const WU_PROTO_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuProtoTool';
116
- const WU_BLOCK_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuBlockTool';
117
- const WU_UNBLOCK_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuUnblockTool';
118
- const WU_RELEASE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuReleaseTool';
119
- const WU_RECOVER_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuRecoverTool';
120
- const WU_REPAIR_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuRepairTool';
121
- // WU-2833 (INIT-062 WU-G): admin-mode wu:repair wrapper that forces the
122
- // `--admin` flag; exposed as a separate manifest tool so approvals can
123
- // be attached to the privileged surface independently of wu:repair.
124
- const WU_REPAIR_ADMIN_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuRepairAdminTool';
125
- const GATES_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#gatesTool';
126
- // WU-2729 (INIT-060 Phase 2): gates:docs exposes docs-only gate runs via a
127
- // dedicated manifest entry so remote callers can request the docs gate
128
- // without opting into the permissive gates handler surface.
129
- const GATES_DOCS_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#gatesDocsTool';
130
- const CONFIG_SET_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#configSetTool';
131
- const CONFIG_GET_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#configGetTool';
132
- const MEM_INIT_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memInitTool';
133
- const MEM_START_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memStartTool';
134
- const MEM_READY_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memReadyTool';
135
- const MEM_CHECKPOINT_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memCheckpointTool';
136
- const MEM_CLEANUP_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memCleanupTool';
137
- const MEM_CONTEXT_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memContextTool';
138
- const MEM_CREATE_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memCreateTool';
139
- const MEM_DELETE_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memDeleteTool';
140
- const MEM_EXPORT_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memExportTool';
141
- const MEM_INBOX_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memInboxTool';
142
- const MEM_SIGNAL_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memSignalTool';
143
- const MEM_CONVERGED_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memConvergedTool';
144
- const MEM_SUMMARIZE_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memSummarizeTool';
145
- const MEM_TRIAGE_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memTriageTool';
146
- const MEM_RECOVER_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memRecoverTool';
147
- const AGENT_SESSION_TOOL_ENTRY = 'tool-impl/agent-tools.ts#agentSessionTool';
148
- const AGENT_SESSION_END_TOOL_ENTRY = 'tool-impl/agent-tools.ts#agentSessionEndTool';
149
- const AGENT_LOG_ISSUE_TOOL_ENTRY = 'tool-impl/agent-tools.ts#agentLogIssueTool';
150
- const AGENT_ISSUES_QUERY_TOOL_ENTRY = 'tool-impl/agent-tools.ts#agentIssuesQueryTool';
151
- const FLOW_BOTTLENECKS_TOOL_ENTRY = 'tool-impl/flow-metrics-tools.ts#flowBottlenecksTool';
152
- const FLOW_REPORT_TOOL_ENTRY = 'tool-impl/flow-metrics-tools.ts#flowReportTool';
153
- const METRICS_TOOL_ENTRY = 'tool-impl/flow-metrics-tools.ts#metricsTool';
154
- const METRICS_SNAPSHOT_TOOL_ENTRY = 'tool-impl/flow-metrics-tools.ts#metricsSnapshotTool';
155
- const WU_INFER_LANE_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#wuInferLaneTool';
156
- const LANE_HEALTH_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#laneHealthTool';
157
- const LANE_SUGGEST_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#laneSuggestTool';
158
- const FILE_READ_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#fileReadTool';
159
- const FILE_WRITE_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#fileWriteTool';
160
- const FILE_EDIT_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#fileEditTool';
161
- const FILE_DELETE_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#fileDeleteTool';
162
- const GIT_BRANCH_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#gitBranchTool';
163
- const GIT_DIFF_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#gitDiffTool';
164
- const GIT_LOG_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#gitLogTool';
165
- const STATE_BOOTSTRAP_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#stateBootstrapTool';
166
- const STATE_CLEANUP_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#stateCleanupTool';
167
- const STATE_DOCTOR_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#stateDoctorTool';
168
- const BACKLOG_PRUNE_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#backlogPruneTool';
169
- const SIGNAL_CLEANUP_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#signalCleanupTool';
170
- const LUMENFLOW_METRICS_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#lumenflowMetricsTool';
171
- const VALIDATE_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#validateTool';
172
- const LUMENFLOW_VALIDATE_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#lumenflowValidateTool';
173
- const VALIDATE_AGENT_SKILLS_TOOL_ENTRY =
174
- 'tool-impl/runtime-native-tools.ts#validateAgentSkillsTool';
175
- const VALIDATE_AGENT_SYNC_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#validateAgentSyncTool';
176
- const VALIDATE_BACKLOG_SYNC_TOOL_ENTRY =
177
- 'tool-impl/runtime-native-tools.ts#validateBacklogSyncTool';
178
- const VALIDATE_SKILLS_SPEC_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#validateSkillsSpecTool';
179
- const INITIATIVE_ADD_WU_TOOL_ENTRY =
180
- 'tool-impl/initiative-orchestration-tools.ts#initiativeAddWuTool';
181
- const INITIATIVE_BULK_ASSIGN_TOOL_ENTRY =
182
- 'tool-impl/initiative-orchestration-tools.ts#initiativeBulkAssignTool';
183
- const INITIATIVE_CREATE_TOOL_ENTRY =
184
- 'tool-impl/initiative-orchestration-tools.ts#initiativeCreateTool';
185
- const INITIATIVE_EDIT_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#initiativeEditTool';
186
- const INITIATIVE_LIST_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#initiativeListTool';
187
- const INITIATIVE_PLAN_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#initiativePlanTool';
188
- const INITIATIVE_REMOVE_WU_TOOL_ENTRY =
189
- 'tool-impl/initiative-orchestration-tools.ts#initiativeRemoveWuTool';
190
- const INITIATIVE_STATUS_TOOL_ENTRY =
191
- 'tool-impl/initiative-orchestration-tools.ts#initiativeStatusTool';
192
- const ORCHESTRATE_INIT_STATUS_TOOL_ENTRY =
193
- 'tool-impl/initiative-orchestration-tools.ts#orchestrateInitStatusTool';
194
- const ORCHESTRATE_INITIATIVE_TOOL_ENTRY =
195
- 'tool-impl/initiative-orchestration-tools.ts#orchestrateInitiativeTool';
196
- const ORCHESTRATE_MONITOR_TOOL_ENTRY =
197
- 'tool-impl/initiative-orchestration-tools.ts#orchestrateMonitorTool';
198
- const PLAN_CREATE_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#planCreateTool';
199
- const PLAN_EDIT_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#planEditTool';
200
- const PLAN_LINK_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#planLinkTool';
201
- const PLAN_PROMOTE_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#planPromoteTool';
202
- const DELEGATION_LIST_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#delegationListTool';
203
- const CLOUD_CONNECT_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#cloudConnectTool';
204
- const DOCS_SYNC_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#docsSyncTool';
205
- const INIT_PLAN_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#initPlanTool';
206
- const LUMENFLOW_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#lumenflowTool';
207
- const LUMENFLOW_DOCTOR_TOOL_ENTRY =
208
- 'tool-impl/initiative-orchestration-tools.ts#lumenflowDoctorTool';
209
- const LUMENFLOW_INTEGRATE_TOOL_ENTRY =
210
- 'tool-impl/initiative-orchestration-tools.ts#lumenflowIntegrateTool';
211
- const LUMENFLOW_RELEASE_TOOL_ENTRY =
212
- 'tool-impl/initiative-orchestration-tools.ts#lumenflowReleaseTool';
213
- const LUMENFLOW_UPGRADE_TOOL_ENTRY =
214
- 'tool-impl/initiative-orchestration-tools.ts#lumenflowUpgradeTool';
215
- const WORKSPACE_INIT_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#workspaceInitTool';
216
- const SYNC_TEMPLATES_TOOL_ENTRY = 'tool-impl/initiative-orchestration-tools.ts#syncTemplatesTool';
217
-
218
- const TOOL_PERMISSIONS = {
219
- 'wu:block': 'write',
220
- 'wu:brief': 'read',
221
- 'wu:claim': 'write',
222
- 'wu:cleanup': 'write',
223
- 'wu:create': 'write',
224
- 'wu:delegate': 'write',
225
- 'wu:delete': 'write',
226
- 'wu:deps': 'read',
227
- 'wu:done': 'write',
228
- 'wu:edit': 'write',
229
- 'wu:infer-lane': 'read',
230
- 'wu:preflight': 'read',
231
- 'wu:prep': 'write',
232
- 'wu:proto': 'write',
233
- 'wu:prune': 'write',
234
- 'wu:recover': 'write',
235
- 'wu:release': 'write',
236
- 'wu:repair': 'write',
237
- // WU-2833 (INIT-062 WU-G): privileged recovery surface for cloud-team
238
- // phone UX. Distinct tool name so an approval gate + admin permission
239
- // can be declared without widening the scope of the default wu:repair
240
- // implementer tool.
241
- 'wu:repair:admin': 'admin',
242
- 'wu:sandbox': 'write',
243
- 'wu:status': 'read',
244
- 'wu:unblock': 'write',
245
- 'wu:unlock-lane': 'write',
246
- 'wu:validate': 'read',
247
- 'mem:checkpoint': 'write',
248
- 'mem:cleanup': 'write',
249
- 'mem:converged': 'read',
250
- 'mem:context': 'read',
251
- 'mem:create': 'write',
252
- 'mem:delete': 'write',
253
- 'mem:export': 'read',
254
- 'mem:inbox': 'read',
255
- 'mem:init': 'write',
256
- 'mem:ready': 'read',
257
- 'mem:recover': 'write',
258
- 'mem:signal': 'write',
259
- 'mem:start': 'write',
260
- 'mem:summarize': 'read',
261
- 'mem:triage': 'write',
262
- 'initiative:add-wu': 'write',
263
- 'initiative:bulk-assign': 'write',
264
- 'initiative:create': 'write',
265
- 'initiative:edit': 'write',
266
- 'initiative:list': 'read',
267
- 'initiative:plan': 'read',
268
- 'initiative:remove-wu': 'write',
269
- 'initiative:status': 'read',
270
- 'lane:health': 'read',
271
- 'lane:suggest': 'write',
272
- 'flow:bottlenecks': 'read',
273
- 'flow:report': 'read',
274
- // WU-2833 (INIT-062 WU-G): gates and gates:docs are read-only validation
275
- // runners. Mobile/cloud tokens for these tools must not carry workspace
276
- // write access (principle of least privilege; matches the security
277
- // posture established by WU-2810/2811/2816).
278
- gates: 'read',
279
- 'gates:docs': 'read',
280
- 'file:delete': 'write',
281
- 'file:edit': 'write',
282
- 'file:read': 'read',
283
- 'file:write': 'write',
284
- 'git:branch': 'write',
285
- 'git:diff': 'read',
286
- 'git:log': 'read',
287
- 'git:status': 'read',
288
- 'agent:issues-query': 'read',
289
- 'agent:log-issue': 'write',
290
- 'agent:session': 'write',
291
- 'agent:session-end': 'write',
292
- 'orchestrate:init-status': 'read',
293
- 'orchestrate:initiative': 'write',
294
- 'orchestrate:monitor': 'read',
295
- 'state:bootstrap': 'write',
296
- 'state:cleanup': 'write',
297
- 'state:doctor': 'read',
298
- 'plan:create': 'write',
299
- 'plan:edit': 'write',
300
- 'plan:link': 'write',
301
- 'plan:promote': 'write',
302
- 'backlog:prune': 'write',
303
- 'cloud:connect': 'write',
304
- 'config:get': 'read',
305
- 'config:set': 'write',
306
- 'delegation:list': 'read',
307
- 'docs:sync': 'write',
308
- 'init:plan': 'read',
309
- lumenflow: 'write',
310
- 'lumenflow:doctor': 'read',
311
- 'lumenflow:integrate': 'write',
312
- 'lumenflow:release': 'write',
313
- 'lumenflow:upgrade': 'write',
314
- metrics: 'read',
315
- // WU-2833 (INIT-062 WU-G): metrics:snapshot reads the workspace and
316
- // writes a DORA snapshot back into .lumenflow/state/. Permission role
317
- // is "write" because it mutates state; the explicit SCOPE_OVERRIDE
318
- // narrows the write path to .lumenflow/state/** (no full-tree write).
319
- 'metrics:snapshot': 'write',
320
- 'lumenflow:metrics': 'read',
321
- 'signal:cleanup': 'write',
322
- 'sync:templates': 'write',
323
- validate: 'read',
324
- 'lumenflow:validate': 'read',
325
- 'validate:agent-skills': 'read',
326
- 'validate:agent-sync': 'read',
327
- 'validate:backlog-sync': 'read',
328
- 'validate:skills-spec': 'read',
329
- 'workspace:init': 'write',
330
- } as const satisfies Record<string, ToolPermission>;
331
-
332
- type ToolName = keyof typeof TOOL_PERMISSIONS;
333
-
334
- const TOOL_ENTRY_OVERRIDES: Partial<Record<ToolName, string>> = {
335
- 'git:status': GIT_STATUS_TOOL_ENTRY,
336
- 'git:branch': GIT_BRANCH_TOOL_ENTRY,
337
- 'git:diff': GIT_DIFF_TOOL_ENTRY,
338
- 'git:log': GIT_LOG_TOOL_ENTRY,
339
- 'wu:status': WU_STATUS_TOOL_ENTRY,
340
- 'wu:create': WU_CREATE_TOOL_ENTRY,
341
- 'wu:claim': WU_CLAIM_TOOL_ENTRY,
342
- 'wu:done': WU_DONE_TOOL_ENTRY,
343
- 'wu:prep': WU_PREP_TOOL_ENTRY,
344
- 'wu:preflight': WU_PREFLIGHT_TOOL_ENTRY,
345
- 'wu:validate': WU_VALIDATE_TOOL_ENTRY,
346
- 'wu:sandbox': WU_SANDBOX_TOOL_ENTRY,
347
- 'wu:prune': WU_PRUNE_TOOL_ENTRY,
348
- 'wu:delete': WU_DELETE_TOOL_ENTRY,
349
- 'wu:cleanup': WU_CLEANUP_TOOL_ENTRY,
350
- 'wu:unlock-lane': WU_UNLOCK_LANE_TOOL_ENTRY,
351
- 'wu:brief': WU_BRIEF_TOOL_ENTRY,
352
- 'wu:delegate': WU_DELEGATE_TOOL_ENTRY,
353
- 'wu:deps': WU_DEPS_TOOL_ENTRY,
354
- 'wu:edit': WU_EDIT_TOOL_ENTRY,
355
- 'wu:proto': WU_PROTO_TOOL_ENTRY,
356
- 'wu:block': WU_BLOCK_TOOL_ENTRY,
357
- 'wu:unblock': WU_UNBLOCK_TOOL_ENTRY,
358
- 'wu:release': WU_RELEASE_TOOL_ENTRY,
359
- 'wu:recover': WU_RECOVER_TOOL_ENTRY,
360
- 'wu:repair': WU_REPAIR_TOOL_ENTRY,
361
- 'wu:repair:admin': WU_REPAIR_ADMIN_TOOL_ENTRY,
362
- 'wu:infer-lane': WU_INFER_LANE_TOOL_ENTRY,
363
- gates: GATES_TOOL_ENTRY,
364
- 'gates:docs': GATES_DOCS_TOOL_ENTRY,
365
- 'mem:init': MEM_INIT_TOOL_ENTRY,
366
- 'mem:start': MEM_START_TOOL_ENTRY,
367
- 'mem:ready': MEM_READY_TOOL_ENTRY,
368
- 'mem:checkpoint': MEM_CHECKPOINT_TOOL_ENTRY,
369
- 'mem:cleanup': MEM_CLEANUP_TOOL_ENTRY,
370
- 'mem:context': MEM_CONTEXT_TOOL_ENTRY,
371
- 'mem:create': MEM_CREATE_TOOL_ENTRY,
372
- 'mem:delete': MEM_DELETE_TOOL_ENTRY,
373
- 'mem:export': MEM_EXPORT_TOOL_ENTRY,
374
- 'mem:inbox': MEM_INBOX_TOOL_ENTRY,
375
- 'mem:signal': MEM_SIGNAL_TOOL_ENTRY,
376
- 'mem:converged': MEM_CONVERGED_TOOL_ENTRY,
377
- 'mem:summarize': MEM_SUMMARIZE_TOOL_ENTRY,
378
- 'mem:triage': MEM_TRIAGE_TOOL_ENTRY,
379
- 'mem:recover': MEM_RECOVER_TOOL_ENTRY,
380
- 'agent:session': AGENT_SESSION_TOOL_ENTRY,
381
- 'agent:session-end': AGENT_SESSION_END_TOOL_ENTRY,
382
- 'agent:log-issue': AGENT_LOG_ISSUE_TOOL_ENTRY,
383
- 'agent:issues-query': AGENT_ISSUES_QUERY_TOOL_ENTRY,
384
- 'flow:bottlenecks': FLOW_BOTTLENECKS_TOOL_ENTRY,
385
- 'flow:report': FLOW_REPORT_TOOL_ENTRY,
386
- metrics: METRICS_TOOL_ENTRY,
387
- 'metrics:snapshot': METRICS_SNAPSHOT_TOOL_ENTRY,
388
- 'lumenflow:metrics': LUMENFLOW_METRICS_TOOL_ENTRY,
389
- 'lane:health': LANE_HEALTH_TOOL_ENTRY,
390
- 'lane:suggest': LANE_SUGGEST_TOOL_ENTRY,
391
- 'file:read': FILE_READ_TOOL_ENTRY,
392
- 'file:write': FILE_WRITE_TOOL_ENTRY,
393
- 'file:edit': FILE_EDIT_TOOL_ENTRY,
394
- 'file:delete': FILE_DELETE_TOOL_ENTRY,
395
- 'state:bootstrap': STATE_BOOTSTRAP_TOOL_ENTRY,
396
- 'state:cleanup': STATE_CLEANUP_TOOL_ENTRY,
397
- 'state:doctor': STATE_DOCTOR_TOOL_ENTRY,
398
- 'backlog:prune': BACKLOG_PRUNE_TOOL_ENTRY,
399
- 'config:set': CONFIG_SET_TOOL_ENTRY,
400
- 'config:get': CONFIG_GET_TOOL_ENTRY,
401
- 'signal:cleanup': SIGNAL_CLEANUP_TOOL_ENTRY,
402
- validate: VALIDATE_TOOL_ENTRY,
403
- 'lumenflow:validate': LUMENFLOW_VALIDATE_TOOL_ENTRY,
404
- 'validate:agent-skills': VALIDATE_AGENT_SKILLS_TOOL_ENTRY,
405
- 'validate:agent-sync': VALIDATE_AGENT_SYNC_TOOL_ENTRY,
406
- 'validate:backlog-sync': VALIDATE_BACKLOG_SYNC_TOOL_ENTRY,
407
- 'validate:skills-spec': VALIDATE_SKILLS_SPEC_TOOL_ENTRY,
408
- 'initiative:add-wu': INITIATIVE_ADD_WU_TOOL_ENTRY,
409
- 'initiative:bulk-assign': INITIATIVE_BULK_ASSIGN_TOOL_ENTRY,
410
- 'initiative:create': INITIATIVE_CREATE_TOOL_ENTRY,
411
- 'initiative:edit': INITIATIVE_EDIT_TOOL_ENTRY,
412
- 'initiative:list': INITIATIVE_LIST_TOOL_ENTRY,
413
- 'initiative:plan': INITIATIVE_PLAN_TOOL_ENTRY,
414
- 'initiative:remove-wu': INITIATIVE_REMOVE_WU_TOOL_ENTRY,
415
- 'initiative:status': INITIATIVE_STATUS_TOOL_ENTRY,
416
- 'orchestrate:init-status': ORCHESTRATE_INIT_STATUS_TOOL_ENTRY,
417
- 'orchestrate:initiative': ORCHESTRATE_INITIATIVE_TOOL_ENTRY,
418
- 'orchestrate:monitor': ORCHESTRATE_MONITOR_TOOL_ENTRY,
419
- 'plan:create': PLAN_CREATE_TOOL_ENTRY,
420
- 'plan:edit': PLAN_EDIT_TOOL_ENTRY,
421
- 'plan:link': PLAN_LINK_TOOL_ENTRY,
422
- 'plan:promote': PLAN_PROMOTE_TOOL_ENTRY,
423
- 'cloud:connect': CLOUD_CONNECT_TOOL_ENTRY,
424
- 'delegation:list': DELEGATION_LIST_TOOL_ENTRY,
425
- 'docs:sync': DOCS_SYNC_TOOL_ENTRY,
426
- 'init:plan': INIT_PLAN_TOOL_ENTRY,
427
- lumenflow: LUMENFLOW_TOOL_ENTRY,
428
- 'lumenflow:doctor': LUMENFLOW_DOCTOR_TOOL_ENTRY,
429
- 'lumenflow:integrate': LUMENFLOW_INTEGRATE_TOOL_ENTRY,
430
- 'lumenflow:release': LUMENFLOW_RELEASE_TOOL_ENTRY,
431
- 'lumenflow:upgrade': LUMENFLOW_UPGRADE_TOOL_ENTRY,
432
- 'workspace:init': WORKSPACE_INIT_TOOL_ENTRY,
433
- 'sync:templates': SYNC_TEMPLATES_TOOL_ENTRY,
434
- };
435
-
436
- export interface SoftwareDeliveryMigrationScorecard {
437
- declaredTools: number;
438
- pendingRuntimeEntries: number;
439
- realHandlerEntries: number;
440
- }
441
-
442
- function createPathScopes(
443
- patterns: readonly string[],
444
- access: (typeof TOOL_SCOPE_ACCESS)[keyof typeof TOOL_SCOPE_ACCESS],
445
- ): PathScope[] {
446
- return patterns.map((pattern) => ({
447
- type: TOOL_SCOPE_TYPES.PATH,
448
- pattern,
449
- access,
450
- }));
451
- }
452
-
453
- function requiredScopesForPermission(permission: ToolPermission): PathScope[] {
454
- if (permission === TOOL_PERMISSION_VALUES.READ) {
455
- return createPathScopes([FULL_WORKSPACE_SCOPE_PATTERN], TOOL_SCOPE_ACCESS.READ);
456
- }
457
-
458
- // WU-2833: admin permission inherits the same constrained write-scope
459
- // set as write permission. The admin distinction is carried by the
460
- // required_approvals gate, not by broader path access.
461
- return createPathScopes(SOFTWARE_DELIVERY_WRITE_SCOPE_PATTERNS, TOOL_SCOPE_ACCESS.WRITE);
462
- }
463
-
464
- /**
465
- * WU-2833 (INIT-062 WU-G): per-tool scope overrides for tools whose
466
- * runtime semantics do not match the default read/write scope set. Used
467
- * sparingly — only when a tool legitimately needs both read and a narrow
468
- * write scope (or vice versa).
469
- */
470
- const SCOPE_OVERRIDES: Partial<Record<string, PathScope[]>> = {
471
- // metrics:snapshot reads the full workspace to compute DORA metrics,
472
- // then writes the snapshot back into workspace state. The narrow write
473
- // scope prevents mobile/cloud tokens from leaking full-tree write.
474
- 'metrics:snapshot': [
475
- {
476
- type: TOOL_SCOPE_TYPES.PATH,
477
- pattern: FULL_WORKSPACE_SCOPE_PATTERN,
478
- access: TOOL_SCOPE_ACCESS.READ,
479
- },
480
- {
481
- type: TOOL_SCOPE_TYPES.PATH,
482
- pattern: SOFTWARE_DELIVERY_WORKSPACE_STATE_WRITE_PATTERN,
483
- access: TOOL_SCOPE_ACCESS.WRITE,
484
- },
485
- ],
486
- };
487
-
488
- /**
489
- * WU-2729 (INIT-060 Phase 2): the 10 software-delivery pack tools that are
490
- * callable remotely via POST /tools/:name. The HTTP surface uses this list
491
- * to build its allowlist so the set is the single source of truth (no
492
- * duplicate allowlist in surface code). ADR-013 §3 tool exposure.
493
- */
494
- export const REMOTE_CALLABLE_TOOLS = [
495
- 'gates',
496
- 'gates:docs',
497
- 'lane:suggest',
498
- 'lane:health',
499
- 'plan:create',
500
- 'plan:promote',
501
- 'initiative:create',
502
- 'initiative:add-wu',
503
- 'initiative:status',
504
- 'flow:report',
505
- ] as const satisfies readonly ToolName[];
506
-
507
- export type RemoteCallableToolName = (typeof REMOTE_CALLABLE_TOOLS)[number];
508
-
509
- /**
510
- * Well-known approval identifiers the software-delivery pack may request.
511
- * Kept narrow on purpose; adding a new identifier requires an ADR.
512
- */
513
- export const SOFTWARE_DELIVERY_APPROVAL_IDS = {
514
- REMOTE_MUTATION: 'software-delivery:remote_mutation',
515
- } as const;
516
-
517
- /**
518
- * WU-2729 (INIT-060 Phase 2): per-tool required_approvals overrides.
519
- * Tools absent from this table default to `[]` (no approval required).
520
- * Read-only tools MUST remain at `[]`; state-mutating remote-callable
521
- * tools SHOULD request an explicit approval identifier so the conductor
522
- * UI can surface the approval gate to operators.
523
- */
524
- const APPROVAL_OVERRIDES: Partial<Record<ToolName, readonly string[]>> = {
525
- 'lane:suggest': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
526
- 'plan:create': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
527
- 'plan:promote': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
528
- 'initiative:create': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
529
- 'initiative:add-wu': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
530
- // WU-2833: privileged recovery MUST present an explicit approval gate
531
- // to conductor/phone UX before dispatch. Without this the admin tool
532
- // is indistinguishable from wu:repair from an authorisation standpoint.
533
- 'wu:repair:admin': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
534
- };
535
-
536
- function requiredApprovalsForTool(name: ToolName): string[] | undefined {
537
- // WU-2729: the 10 remote-callable tools carry explicit
538
- // required_approvals metadata (even if empty). Other tools leave the
539
- // field undefined so the manifest stays minimally descriptive.
540
- // WU-2833: admin-permission tools also carry explicit approvals so the
541
- // privileged surface cannot be invoked without a visible approval gate.
542
- const isRemoteCallable = (REMOTE_CALLABLE_TOOLS as readonly string[]).includes(name);
543
- const override = APPROVAL_OVERRIDES[name];
544
- if (!isRemoteCallable && override === undefined) {
545
- return undefined;
546
- }
547
- return override ? [...override] : [];
548
- }
549
-
550
- /**
551
- * WU-2729: ordered list of the 10 remote-callable tool names. Preserves
552
- * declaration order from REMOTE_CALLABLE_TOOLS so callers can render
553
- * stable UIs without re-sorting.
554
- */
555
- export function getRemoteCallableToolNames(): RemoteCallableToolName[] {
556
- return [...REMOTE_CALLABLE_TOOLS];
557
- }
558
-
559
- function createManifestTools(): SoftwareDeliveryManifestTool[] {
560
- return (Object.keys(TOOL_PERMISSIONS) as ToolName[]).map((name) => {
561
- const permission = TOOL_PERMISSIONS[name];
562
- const approvals = requiredApprovalsForTool(name);
563
- // WU-2833: per-tool scope overrides take priority over the default
564
- // permission-derived scope set so read-plus-narrow-write tools like
565
- // metrics:snapshot can declare both accesses on a single entry.
566
- const scopeOverride = SCOPE_OVERRIDES[name];
567
- const entry: SoftwareDeliveryManifestTool = {
568
- name,
569
- entry: resolveToolEntry(name),
570
- permission,
571
- required_scopes: scopeOverride ? [...scopeOverride] : requiredScopesForPermission(permission),
572
- };
573
- if (approvals !== undefined) {
574
- entry.required_approvals = approvals;
575
- }
576
- return entry;
577
- });
578
- }
579
-
580
- function resolveToolEntry(name: ToolName): string {
581
- const entry = TOOL_ENTRY_OVERRIDES[name];
582
- if (!entry) {
583
- throw new Error(`Missing runtime-native tool entry mapping for "${name}"`);
584
- }
585
- return entry;
586
- }
587
-
588
- export function getSoftwareDeliveryMigrationScorecard(
589
- manifest: SoftwareDeliveryPackManifest = SOFTWARE_DELIVERY_MANIFEST,
590
- ): SoftwareDeliveryMigrationScorecard {
591
- const declaredTools = manifest.tools.length;
592
- const pendingRuntimeEntries = 0;
593
- return {
594
- declaredTools,
595
- pendingRuntimeEntries,
596
- realHandlerEntries: declaredTools - pendingRuntimeEntries,
597
- };
598
- }
599
-
600
- export function renderSoftwareDeliveryMigrationScorecard(
601
- manifest: SoftwareDeliveryPackManifest = SOFTWARE_DELIVERY_MANIFEST,
602
- ): string {
603
- return JSON.stringify(getSoftwareDeliveryMigrationScorecard(manifest));
604
- }
605
-
606
- const POLICY_SUFFIXES = ['format', 'lint', 'typecheck', 'test', 'coverage'] as const;
607
- const SOFTWARE_DELIVERY_EMITTED_EVENT_KINDS = [
608
- 'software-delivery:gate_started',
609
- 'software-delivery:gate_passed',
610
- 'software-delivery:gate_failed',
611
- 'software-delivery:co_change_rule_fired',
612
- 'software-delivery:conditional_command_fired',
613
- 'software-delivery:lane_wip_breached',
614
- 'software-delivery:lane_locked',
615
- 'software-delivery:lane_unlocked',
616
- 'software-delivery:lane_suggestion_emitted',
617
- 'software-delivery:initiative_created',
618
- 'software-delivery:initiative_closed',
619
- 'software-delivery:initiative_phase_advanced',
620
- 'software-delivery:plan_created',
621
- 'software-delivery:plan_linked',
622
- 'software-delivery:plan_promoted',
623
- // WU-2832 (INIT-062 WU-F): close the cloud-team polling gap with 9
624
- // additional ephemeral kinds. Validation pair (validated/invalid),
625
- // recovery, preflight, escalation, ratchet, bottleneck, DORA snapshot,
626
- // and replay-artifact addressable by event_id.
627
- 'software-delivery:wu_spec_validated',
628
- 'software-delivery:wu_spec_invalid',
629
- 'software-delivery:wu_recovered',
630
- 'software-delivery:wu_preflight_failed',
631
- 'software-delivery:wu_escalation_resolved',
632
- 'software-delivery:test_ratchet_adjusted',
633
- 'software-delivery:flow_bottleneck_detected',
634
- 'software-delivery:dora_metric_snapshot',
635
- 'software-delivery:replay_artifact_published',
636
- ] as const;
637
- const SOFTWARE_DELIVERY_REQUIRED_SURFACES = ['http'] as const;
638
-
639
- export const SOFTWARE_DELIVERY_MANIFEST: SoftwareDeliveryPackManifest = {
640
- id: SOFTWARE_DELIVERY_PACK_ID,
641
- version: SOFTWARE_DELIVERY_PACK_VERSION,
642
- config_key: 'software_delivery',
643
- task_types: ['work-unit'],
644
- tools: createManifestTools(),
645
- policies: POLICY_SUFFIXES.map((suffix) => ({
646
- id: `${SOFTWARE_DELIVERY_POLICY_ID_PREFIX}.${suffix}`,
647
- trigger: MANIFEST_POLICY_TRIGGERS.ON_COMPLETION,
648
- decision: MANIFEST_POLICY_DECISIONS.ALLOW,
649
- })),
650
- evidence_types: ['gate-run'],
651
- state_aliases: { active: 'in_progress' },
652
- lane_templates: [],
653
- emitted_event_kinds: [...SOFTWARE_DELIVERY_EMITTED_EVENT_KINDS],
654
- subscribed_event_kinds: [],
655
- required_approvals: [],
656
- surfaces_required: [...SOFTWARE_DELIVERY_REQUIRED_SURFACES],
657
- };