@lumenflow/cli 4.24.0 → 5.0.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.
- package/README.md +54 -52
- package/dist/agent-issues-query.js +10 -2
- package/dist/agent-issues-query.js.map +1 -1
- package/dist/agent-runtime-enrollment-events.js +44 -0
- package/dist/agent-runtime-enrollment-events.js.map +1 -0
- package/dist/agent-session-end.js +47 -0
- package/dist/agent-session-end.js.map +1 -1
- package/dist/agent-session-heartbeat.js +250 -0
- package/dist/agent-session-heartbeat.js.map +1 -0
- package/dist/agent-session.js +299 -5
- package/dist/agent-session.js.map +1 -1
- package/dist/capacity-snapshot-emitter.js +73 -0
- package/dist/capacity-snapshot-emitter.js.map +1 -0
- package/dist/claim-queue.js +276 -0
- package/dist/claim-queue.js.map +1 -0
- package/dist/config-set.js +22 -3
- package/dist/config-set.js.map +1 -1
- package/dist/control-plane-sidecar-runner.js +145 -0
- package/dist/control-plane-sidecar-runner.js.map +1 -0
- package/dist/delegation-list.js +160 -1
- package/dist/delegation-list.js.map +1 -1
- package/dist/delegation-role-resolver.js +69 -0
- package/dist/delegation-role-resolver.js.map +1 -0
- package/dist/docs-generate-pack-reference.js +500 -0
- package/dist/docs-generate-pack-reference.js.map +1 -0
- package/dist/docs-sync.js +116 -1
- package/dist/docs-sync.js.map +1 -1
- package/dist/file-edit.js +28 -8
- package/dist/file-edit.js.map +1 -1
- package/dist/file-write.js +29 -5
- package/dist/file-write.js.map +1 -1
- package/dist/gate-co-change.js +25 -7
- package/dist/gate-co-change.js.map +1 -1
- package/dist/gate-conditional.js +19 -7
- package/dist/gate-conditional.js.map +1 -1
- package/dist/gates-runners.js +42 -33
- package/dist/gates-runners.js.map +1 -1
- package/dist/gates-utils.js +34 -20
- package/dist/gates-utils.js.map +1 -1
- package/dist/gates.js +79 -7
- package/dist/gates.js.map +1 -1
- package/dist/hooks/config-resolver.js +10 -1
- package/dist/hooks/config-resolver.js.map +1 -1
- package/dist/init-package-config.js +1 -1
- package/dist/init-package-config.js.map +1 -1
- package/dist/init-scaffolding.js +5 -1
- package/dist/init-scaffolding.js.map +1 -1
- package/dist/init-templates.js +10 -0
- package/dist/init-templates.js.map +1 -1
- package/dist/init.js +1 -1
- package/dist/init.js.map +1 -1
- package/dist/initiative-create.js +17 -0
- package/dist/initiative-create.js.map +1 -1
- package/dist/initiative-remove-wu.js +17 -3
- package/dist/initiative-remove-wu.js.map +1 -1
- package/dist/kernel-event-sync/emitters.js +104 -0
- package/dist/kernel-event-sync/emitters.js.map +1 -0
- package/dist/kernel-event-sync/index.js +13 -0
- package/dist/kernel-event-sync/index.js.map +1 -0
- package/dist/kernel-event-sync/lifecycle-emitters.js +160 -0
- package/dist/kernel-event-sync/lifecycle-emitters.js.map +1 -0
- package/dist/kernel-event-sync/narrow-emissions.js +89 -0
- package/dist/kernel-event-sync/narrow-emissions.js.map +1 -0
- package/dist/kernel-event-sync/software-delivery-emitters.js +297 -0
- package/dist/kernel-event-sync/software-delivery-emitters.js.map +1 -0
- package/dist/lane-lock.js +14 -1
- package/dist/lane-lock.js.map +1 -1
- package/dist/lane-suggest.js +21 -0
- package/dist/lane-suggest.js.map +1 -1
- package/dist/lumenflow-upgrade.js +7 -5
- package/dist/lumenflow-upgrade.js.map +1 -1
- package/dist/mem-context.js +145 -0
- package/dist/mem-context.js.map +1 -1
- package/dist/mem-create.js +39 -6
- package/dist/mem-create.js.map +1 -1
- package/dist/mem-inbox.js +16 -0
- package/dist/mem-inbox.js.map +1 -1
- package/dist/mem-roster.js +95 -0
- package/dist/mem-roster.js.map +1 -0
- package/dist/mem-signal.js +97 -2
- package/dist/mem-signal.js.map +1 -1
- package/dist/metrics-snapshot.js +3 -2
- package/dist/metrics-snapshot.js.map +1 -1
- package/dist/orchestrate-init-status.js +117 -2
- package/dist/orchestrate-init-status.js.map +1 -1
- package/dist/orchestrate-initiative.js +83 -10
- package/dist/orchestrate-initiative.js.map +1 -1
- package/dist/orchestrate-monitor-quality.js +289 -0
- package/dist/orchestrate-monitor-quality.js.map +1 -0
- package/dist/orchestrate-monitor.js +85 -0
- package/dist/orchestrate-monitor.js.map +1 -1
- package/dist/pack-validate.js +127 -2
- package/dist/pack-validate.js.map +1 -1
- package/dist/plan-create.js +18 -0
- package/dist/plan-create.js.map +1 -1
- package/dist/plan-link.js +13 -0
- package/dist/plan-link.js.map +1 -1
- package/dist/plan-promote.js +14 -0
- package/dist/plan-promote.js.map +1 -1
- package/dist/pre-commit-check.js +4 -3
- package/dist/pre-commit-check.js.map +1 -1
- package/dist/public-manifest.js +17 -3
- package/dist/public-manifest.js.map +1 -1
- package/dist/release.js +28 -10
- package/dist/release.js.map +1 -1
- package/dist/session-cross-link.js +139 -0
- package/dist/session-cross-link.js.map +1 -0
- package/dist/sidecar-manager.js +208 -0
- package/dist/sidecar-manager.js.map +1 -0
- package/dist/state-path-resolvers.js +18 -0
- package/dist/state-path-resolvers.js.map +1 -1
- package/dist/stream-heartbeat.js +151 -0
- package/dist/stream-heartbeat.js.map +1 -0
- package/dist/sync-templates.js +56 -2
- package/dist/sync-templates.js.map +1 -1
- package/dist/wu-block.js +47 -5
- package/dist/wu-block.js.map +1 -1
- package/dist/wu-claim-branch.js +8 -4
- package/dist/wu-claim-branch.js.map +1 -1
- package/dist/wu-claim-state.js +5 -3
- package/dist/wu-claim-state.js.map +1 -1
- package/dist/wu-claim-worktree.js +5 -3
- package/dist/wu-claim-worktree.js.map +1 -1
- package/dist/wu-claim.js +261 -9
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-done-auto-cleanup.js +3 -2
- package/dist/wu-done-auto-cleanup.js.map +1 -1
- package/dist/wu-done-git-ops.js +12 -8
- package/dist/wu-done-git-ops.js.map +1 -1
- package/dist/wu-done-preflight.js +3 -3
- package/dist/wu-done-preflight.js.map +1 -1
- package/dist/wu-done.js +46 -10
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-lifecycle-sync/gate-scope-resolver.js +16 -0
- package/dist/wu-lifecycle-sync/gate-scope-resolver.js.map +1 -0
- package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js +10 -0
- package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js.map +1 -0
- package/dist/wu-prep.js +363 -22
- package/dist/wu-prep.js.map +1 -1
- package/dist/wu-prune.js +68 -27
- package/dist/wu-prune.js.map +1 -1
- package/dist/wu-release.js +34 -3
- package/dist/wu-release.js.map +1 -1
- package/dist/wu-review.js +167 -0
- package/dist/wu-review.js.map +1 -0
- package/dist/wu-spawn-prompt-builders.js +296 -40
- package/dist/wu-spawn-prompt-builders.js.map +1 -1
- package/dist/wu-spawn-strategy-resolver.js +126 -14
- package/dist/wu-spawn-strategy-resolver.js.map +1 -1
- package/dist/wu-unblock.js +52 -22
- package/dist/wu-unblock.js.map +1 -1
- package/package.json +13 -8
- package/packs/agent-runtime/agent-heartbeat.ts +163 -0
- package/packs/agent-runtime/auto-session-integration.ts +874 -0
- package/packs/agent-runtime/delegation-registry-schema.ts +220 -0
- package/packs/agent-runtime/delegation-registry-store.ts +269 -0
- package/packs/agent-runtime/delegation-tree.ts +328 -0
- package/packs/agent-runtime/index.ts +9 -0
- package/packs/agent-runtime/manifest.ts +109 -19
- package/packs/agent-runtime/manifest.yaml +150 -0
- package/packs/agent-runtime/memory-coordination-contract.ts +86 -0
- package/packs/agent-runtime/memory.d.ts +19 -0
- package/packs/agent-runtime/orchestration.ts +238 -23
- package/packs/agent-runtime/package.json +11 -2
- package/packs/agent-runtime/remote-controls/index.ts +7 -0
- package/packs/agent-runtime/remote-controls/operations.ts +399 -0
- package/packs/agent-runtime/remote-controls/port.ts +48 -0
- package/packs/agent-runtime/remote-controls/state-store.ts +258 -0
- package/packs/agent-runtime/remote-controls/types.ts +105 -0
- package/packs/agent-runtime/session-schema.ts +423 -0
- package/packs/agent-runtime/tool-impl/index.ts +1 -0
- package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +252 -0
- package/packs/agent-runtime/tool-impl/remote-controls.ts +273 -0
- package/packs/agent-runtime/tsconfig.json +1 -1
- package/packs/agent-runtime/turn-lifecycle-events.ts +501 -0
- package/packs/sidekick/channel-ingress.ts +137 -0
- package/packs/sidekick/manifest.ts +74 -0
- package/packs/sidekick/manifest.yaml +88 -0
- package/packs/sidekick/package.json +3 -1
- package/packs/sidekick/sidekick-events.ts +517 -0
- package/packs/sidekick/src/adapters/cloud-queue.ts +101 -0
- package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +378 -0
- package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +224 -0
- package/packs/sidekick/src/domain/channel.types.ts +84 -0
- package/packs/sidekick/src/ports/channel-bridge.port.ts +75 -0
- package/packs/sidekick/src/routines/commit.ts +74 -0
- package/packs/sidekick/tool-impl/channel-tools.ts +47 -0
- package/packs/sidekick/tool-impl/memory-tools.ts +17 -0
- package/packs/sidekick/tool-impl/routine-commit.ts +102 -0
- package/packs/sidekick/tool-impl/routine-tools.ts +67 -7
- package/packs/sidekick/tool-impl/runtime-context.ts +4 -0
- package/packs/sidekick/tool-impl/storage.ts +3 -0
- package/packs/sidekick/tool-impl/system-tools.ts +7 -0
- package/packs/sidekick/tool-impl/task-tools.ts +46 -0
- package/packs/sidekick/tsconfig.json +1 -1
- package/packs/software-delivery/manifest-schema.ts +30 -0
- package/packs/software-delivery/manifest.ts +160 -11
- package/packs/software-delivery/manifest.yaml +210 -230
- package/packs/software-delivery/package.json +88 -3
- package/packs/software-delivery/src/commands/index.ts +5 -0
- package/packs/software-delivery/src/config/delivery-review-contract.ts +20 -0
- package/packs/software-delivery/src/config/env-accessors.ts +19 -0
- package/packs/software-delivery/src/config/index.ts +8 -0
- package/packs/software-delivery/src/config/normalize-config-keys.ts +19 -0
- package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +436 -0
- package/packs/software-delivery/src/config/workspace-reader.ts +310 -0
- package/packs/software-delivery/src/constants/backlog-patterns.ts +31 -0
- package/packs/software-delivery/src/constants/client-ids.ts +19 -0
- package/packs/software-delivery/src/constants/config-contract.ts +7 -0
- package/packs/software-delivery/src/constants/docs-layout-presets.ts +50 -0
- package/packs/software-delivery/src/constants/duration-constants.ts +20 -0
- package/packs/software-delivery/src/constants/gate-constants.ts +32 -0
- package/packs/software-delivery/src/constants/index.ts +29 -0
- package/packs/software-delivery/src/constants/lock-constants.ts +35 -0
- package/packs/software-delivery/src/constants/object-guards.ts +12 -0
- package/packs/software-delivery/src/constants/section-headings.ts +107 -0
- package/packs/software-delivery/src/constants/wu-cli-constants.ts +485 -0
- package/packs/software-delivery/src/constants/wu-domain-constants.ts +466 -0
- package/packs/software-delivery/src/constants/wu-git-constants.ts +7 -0
- package/packs/software-delivery/src/constants/wu-id-format.ts +327 -0
- package/packs/software-delivery/src/constants/wu-paths-constants.ts +358 -0
- package/packs/software-delivery/src/constants/wu-statuses.ts +287 -0
- package/packs/software-delivery/src/constants/wu-type-helpers.ts +67 -0
- package/packs/software-delivery/src/constants/wu-ui-constants.ts +267 -0
- package/packs/software-delivery/src/constants/wu-validation-constants.ts +73 -0
- package/packs/software-delivery/src/domain/index.ts +5 -0
- package/packs/software-delivery/src/domain/orchestration.constants.ts +168 -0
- package/packs/software-delivery/src/domain/orchestration.schemas.ts +239 -0
- package/packs/software-delivery/src/domain/orchestration.types.ts +178 -0
- package/packs/software-delivery/src/methodology/incremental-test.ts +90 -0
- package/packs/software-delivery/src/methodology/index.ts +6 -0
- package/packs/software-delivery/src/methodology/manual-test-validator.ts +292 -0
- package/packs/software-delivery/src/policy/coverage-gate.ts +270 -0
- package/packs/software-delivery/src/policy/gates-agent-mode.ts +223 -0
- package/packs/software-delivery/src/policy/gates-config-internal.ts +121 -0
- package/packs/software-delivery/src/policy/gates-config.ts +293 -0
- package/packs/software-delivery/src/policy/gates-coverage.ts +247 -0
- package/packs/software-delivery/src/policy/gates-presets.ts +134 -0
- package/packs/software-delivery/src/policy/gates-schemas.ts +173 -0
- package/packs/software-delivery/src/policy/index.ts +22 -0
- package/packs/software-delivery/src/policy/package-manager-resolver.ts +319 -0
- package/packs/software-delivery/src/policy/resolve-policy.ts +518 -0
- package/packs/software-delivery/src/ports/config.ports.ts +90 -0
- package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +125 -0
- package/packs/software-delivery/src/ports/index.ts +10 -0
- package/packs/software-delivery/src/ports/sync-validator.ports.ts +59 -0
- package/packs/software-delivery/src/ports/wu-helpers.ports.ts +168 -0
- package/packs/software-delivery/src/ports/wu-state.ports.ts +241 -0
- package/packs/software-delivery/src/primitives/index.ts +5 -0
- package/packs/software-delivery/src/runtime/index.ts +6 -0
- package/packs/software-delivery/src/runtime/work-classifier.ts +561 -0
- package/packs/software-delivery/src/sandbox/index.ts +10 -0
- package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +118 -0
- package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +88 -0
- package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +154 -0
- package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +47 -0
- package/packs/software-delivery/src/sandbox/sandbox-profile.ts +153 -0
- package/packs/software-delivery/src/schemas/index.ts +5 -0
- package/packs/software-delivery/src/state/date-utils.ts +158 -0
- package/packs/software-delivery/src/state/index.ts +15 -0
- package/packs/software-delivery/src/state/state-machine.ts +119 -0
- package/packs/software-delivery/src/state/wu-doc-types.ts +51 -0
- package/packs/software-delivery/src/state/wu-paths.ts +381 -0
- package/packs/software-delivery/src/state/wu-schema.ts +1139 -0
- package/packs/software-delivery/src/state/wu-state-schema.ts +255 -0
- package/packs/software-delivery/src/state/wu-yaml.ts +338 -0
- package/packs/software-delivery/src/types.d.ts +16 -0
- package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +18 -0
- package/packs/software-delivery/tsconfig.json +28 -2
- package/templates/core/AGENTS.md.template +76 -17
- package/templates/core/LUMENFLOW.md.template +265 -66
- package/templates/core/_frameworks/lumenflow/wu-sizing-guide.md.template +180 -116
- package/templates/core/ai/onboarding/agent-invocation-guide.md.template +26 -8
- package/templates/core/ai/onboarding/existing-project-bootstrap.md.template +171 -0
- package/templates/core/ai/onboarding/first-15-mins.md.template +3 -1
- package/templates/core/ai/onboarding/first-wu-mistakes.md.template +1 -1
- package/templates/core/ai/onboarding/initiative-orchestration.md.template +46 -30
- package/templates/core/ai/onboarding/quick-ref-commands.md.template +36 -33
- package/templates/core/ai/onboarding/release-process.md.template +8 -7
- package/templates/core/ai/onboarding/starting-prompt.md.template +2 -0
- package/templates/core/ai/onboarding/troubleshooting-wu-done.md.template +62 -0
- package/templates/vendors/claude/.claude/CLAUDE.md.template +29 -54
- package/templates/vendors/cursor/.cursor/rules/lumenflow.md.template +24 -52
- package/templates/vendors/windsurf/.windsurf/rules/lumenflow.md.template +24 -52
- package/packs/agent-runtime/.turbo/turbo-build.log +0 -4
- package/packs/sidekick/.turbo/turbo-build.log +0 -4
- package/packs/software-delivery/.turbo/turbo-build.log +0 -4
|
@@ -18,6 +18,13 @@ import {
|
|
|
18
18
|
type ToolContextLike,
|
|
19
19
|
type ToolOutput,
|
|
20
20
|
} from './shared.js';
|
|
21
|
+
import {
|
|
22
|
+
buildTaskCompletedEvent,
|
|
23
|
+
buildTaskCreatedEvent,
|
|
24
|
+
buildTaskScheduledEvent,
|
|
25
|
+
buildTaskSnoozedEvent,
|
|
26
|
+
emitSidekickEvent,
|
|
27
|
+
} from '../sidekick-events.js';
|
|
21
28
|
|
|
22
29
|
// ---------------------------------------------------------------------------
|
|
23
30
|
// Constants
|
|
@@ -97,6 +104,16 @@ function buildCanceledTask(task: TaskRecord): TaskRecord {
|
|
|
97
104
|
};
|
|
98
105
|
}
|
|
99
106
|
|
|
107
|
+
function movedDueDateLater(
|
|
108
|
+
previousDueAt: string | undefined,
|
|
109
|
+
nextDueAt: string | undefined,
|
|
110
|
+
): boolean {
|
|
111
|
+
if (!previousDueAt || !nextDueAt) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return Date.parse(nextDueAt) > Date.parse(previousDueAt);
|
|
115
|
+
}
|
|
116
|
+
|
|
100
117
|
// ---------------------------------------------------------------------------
|
|
101
118
|
// task:create
|
|
102
119
|
// ---------------------------------------------------------------------------
|
|
@@ -140,6 +157,8 @@ async function taskCreateTool(input: unknown, context?: ToolContextLike): Promis
|
|
|
140
157
|
);
|
|
141
158
|
});
|
|
142
159
|
|
|
160
|
+
await emitSidekickEvent(buildTaskCreatedEvent(task));
|
|
161
|
+
|
|
143
162
|
return success({ task: task as unknown as Record<string, unknown> });
|
|
144
163
|
}
|
|
145
164
|
|
|
@@ -234,6 +253,8 @@ async function taskUpdateTool(input: unknown, context?: ToolContextLike): Promis
|
|
|
234
253
|
});
|
|
235
254
|
}
|
|
236
255
|
|
|
256
|
+
const previousDueAt = task.due_at ?? null;
|
|
257
|
+
|
|
237
258
|
await storage.withLock(async () => {
|
|
238
259
|
const latest = await storage.readStore('tasks');
|
|
239
260
|
const target = latest.find((entry) => entry.id === id);
|
|
@@ -254,6 +275,15 @@ async function taskUpdateTool(input: unknown, context?: ToolContextLike): Promis
|
|
|
254
275
|
|
|
255
276
|
const updated = await storage.readStore('tasks');
|
|
256
277
|
const updatedTask = updated.find((entry) => entry.id === id);
|
|
278
|
+
if (updatedTask && movedDueDateLater(previousDueAt ?? undefined, updatedTask.due_at)) {
|
|
279
|
+
await emitSidekickEvent(
|
|
280
|
+
buildTaskSnoozedEvent({
|
|
281
|
+
task_id: id,
|
|
282
|
+
previous_due_at: previousDueAt,
|
|
283
|
+
due_at: updatedTask.due_at ?? previousDueAt ?? '',
|
|
284
|
+
}),
|
|
285
|
+
);
|
|
286
|
+
}
|
|
257
287
|
return success({ task: updatedTask as unknown as Record<string, unknown> });
|
|
258
288
|
}
|
|
259
289
|
|
|
@@ -309,6 +339,9 @@ async function taskCompleteTool(input: unknown, context?: ToolContextLike): Prom
|
|
|
309
339
|
|
|
310
340
|
const updated = await storage.readStore('tasks');
|
|
311
341
|
const completedTask = updated.find((t) => t.id === id);
|
|
342
|
+
if (completedTask) {
|
|
343
|
+
await emitSidekickEvent(buildTaskCompletedEvent(completedTask));
|
|
344
|
+
}
|
|
312
345
|
|
|
313
346
|
return success({ task: completedTask as unknown as Record<string, unknown> });
|
|
314
347
|
}
|
|
@@ -391,6 +424,7 @@ async function taskScheduleTool(input: unknown, context?: ToolContextLike): Prom
|
|
|
391
424
|
|
|
392
425
|
const dueAt = asNonEmptyString(parsed.due_at);
|
|
393
426
|
const cron = asNonEmptyString(parsed.cron);
|
|
427
|
+
const previousDueAt = task.due_at ?? null;
|
|
394
428
|
|
|
395
429
|
if (isDryRun(parsed)) {
|
|
396
430
|
const preview = {
|
|
@@ -429,6 +463,18 @@ async function taskScheduleTool(input: unknown, context?: ToolContextLike): Prom
|
|
|
429
463
|
|
|
430
464
|
const updated = await storage.readStore('tasks');
|
|
431
465
|
const scheduledTask = updated.find((t) => t.id === id);
|
|
466
|
+
if (scheduledTask) {
|
|
467
|
+
await emitSidekickEvent(buildTaskScheduledEvent(scheduledTask));
|
|
468
|
+
if (movedDueDateLater(previousDueAt ?? undefined, scheduledTask.due_at)) {
|
|
469
|
+
await emitSidekickEvent(
|
|
470
|
+
buildTaskSnoozedEvent({
|
|
471
|
+
task_id: id,
|
|
472
|
+
previous_due_at: previousDueAt,
|
|
473
|
+
due_at: scheduledTask.due_at ?? previousDueAt ?? '',
|
|
474
|
+
}),
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
432
478
|
|
|
433
479
|
return success({ task: scheduledTask as unknown as Record<string, unknown> });
|
|
434
480
|
}
|
|
@@ -37,6 +37,13 @@ export interface SoftwareDeliveryManifestTool {
|
|
|
37
37
|
permission: ToolPermission;
|
|
38
38
|
required_scopes: PathScope[];
|
|
39
39
|
internal_only?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* WU-2729 (INIT-060 Phase 2, ADR-013 §3): approval-surface identifiers the
|
|
42
|
+
* tool must present to callers before runtime dispatch. Empty array means
|
|
43
|
+
* no approval gate; undefined means the tool does not declare approval
|
|
44
|
+
* metadata (treated the same as empty by the discovery surface).
|
|
45
|
+
*/
|
|
46
|
+
required_approvals?: string[];
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
export interface SoftwareDeliveryManifestPolicy {
|
|
@@ -57,6 +64,11 @@ export interface SoftwareDeliveryPackManifest {
|
|
|
57
64
|
evidence_types: string[];
|
|
58
65
|
state_aliases: Record<string, string>;
|
|
59
66
|
lane_templates: Array<{ id: string }>;
|
|
67
|
+
/** WU-2718 (INIT-060 WU-1, ADR-013). */
|
|
68
|
+
emitted_event_kinds: string[];
|
|
69
|
+
subscribed_event_kinds: string[];
|
|
70
|
+
required_approvals: string[];
|
|
71
|
+
surfaces_required: string[];
|
|
60
72
|
}
|
|
61
73
|
|
|
62
74
|
function asRecord(input: unknown, label: string): Record<string, unknown> {
|
|
@@ -166,6 +178,12 @@ function parseTool(input: unknown, index: number): SoftwareDeliveryManifestTool
|
|
|
166
178
|
throw new Error(`tools[${index}].permission is invalid.`);
|
|
167
179
|
}
|
|
168
180
|
|
|
181
|
+
// WU-2729: optional per-tool required_approvals list.
|
|
182
|
+
const parsedApprovals =
|
|
183
|
+
tool.required_approvals === undefined
|
|
184
|
+
? undefined
|
|
185
|
+
: parseStringArray(tool.required_approvals, `tools[${index}].required_approvals`);
|
|
186
|
+
|
|
169
187
|
return {
|
|
170
188
|
name: parseNonEmptyString(tool.name, `tools[${index}].name`),
|
|
171
189
|
entry: parseNonEmptyString(tool.entry, `tools[${index}].entry`),
|
|
@@ -180,6 +198,7 @@ function parseTool(input: unknown, index: number): SoftwareDeliveryManifestTool
|
|
|
180
198
|
}
|
|
181
199
|
return tool.internal_only;
|
|
182
200
|
})(),
|
|
201
|
+
...(parsedApprovals === undefined ? {} : { required_approvals: parsedApprovals }),
|
|
183
202
|
};
|
|
184
203
|
}
|
|
185
204
|
|
|
@@ -233,6 +252,17 @@ export const SoftwareDeliveryManifestSchema: Parser<SoftwareDeliveryPackManifest
|
|
|
233
252
|
const entry = asRecord(laneTemplate, `lane_templates[${index}]`);
|
|
234
253
|
return { id: parseNonEmptyString(entry.id, `lane_templates[${index}].id`) };
|
|
235
254
|
}),
|
|
255
|
+
// WU-2718 (INIT-060 WU-1, ADR-013): manifest extension fields.
|
|
256
|
+
emitted_event_kinds: parseStringArray(
|
|
257
|
+
manifest.emitted_event_kinds ?? [],
|
|
258
|
+
'emitted_event_kinds',
|
|
259
|
+
),
|
|
260
|
+
subscribed_event_kinds: parseStringArray(
|
|
261
|
+
manifest.subscribed_event_kinds ?? [],
|
|
262
|
+
'subscribed_event_kinds',
|
|
263
|
+
),
|
|
264
|
+
required_approvals: parseStringArray(manifest.required_approvals ?? [], 'required_approvals'),
|
|
265
|
+
surfaces_required: parseStringArray(manifest.surfaces_required ?? [], 'surfaces_required'),
|
|
236
266
|
};
|
|
237
267
|
},
|
|
238
268
|
};
|
|
@@ -31,6 +31,51 @@ export type {
|
|
|
31
31
|
} from './manifest-schema.js';
|
|
32
32
|
|
|
33
33
|
const FULL_WORKSPACE_SCOPE_PATTERN = '**';
|
|
34
|
+
const SOFTWARE_DELIVERY_WRITE_DIRECTORY_PATTERNS = [
|
|
35
|
+
'.changeset/**',
|
|
36
|
+
'.claude/**',
|
|
37
|
+
'.codex/**',
|
|
38
|
+
'.cursor/**',
|
|
39
|
+
'.github/**',
|
|
40
|
+
'.git/**',
|
|
41
|
+
'.husky/**',
|
|
42
|
+
'.lumenflow/**',
|
|
43
|
+
'.vercel/**',
|
|
44
|
+
'.windsurf/**',
|
|
45
|
+
'apps/**',
|
|
46
|
+
'docs/**',
|
|
47
|
+
'packages/**',
|
|
48
|
+
'scripts/**',
|
|
49
|
+
'tools/**',
|
|
50
|
+
'worktrees/**',
|
|
51
|
+
] as const;
|
|
52
|
+
const SOFTWARE_DELIVERY_ROOT_WRITE_FILE_PATTERNS = [
|
|
53
|
+
'.gitignore',
|
|
54
|
+
'.npmrc',
|
|
55
|
+
'LUMENFLOW.md',
|
|
56
|
+
'README.md',
|
|
57
|
+
'package.json',
|
|
58
|
+
'pnpm-lock.yaml',
|
|
59
|
+
'pnpm-workspace.yaml',
|
|
60
|
+
'turbo.json',
|
|
61
|
+
'workspace.yaml',
|
|
62
|
+
'*.cjs',
|
|
63
|
+
'*.js',
|
|
64
|
+
'*.json',
|
|
65
|
+
'*.md',
|
|
66
|
+
'*.mjs',
|
|
67
|
+
'*.sh',
|
|
68
|
+
'*.toml',
|
|
69
|
+
'*.ts',
|
|
70
|
+
'*.tsx',
|
|
71
|
+
'*.txt',
|
|
72
|
+
'*.yaml',
|
|
73
|
+
'*.yml',
|
|
74
|
+
] as const;
|
|
75
|
+
const SOFTWARE_DELIVERY_WRITE_SCOPE_PATTERNS = [
|
|
76
|
+
...SOFTWARE_DELIVERY_WRITE_DIRECTORY_PATTERNS,
|
|
77
|
+
...SOFTWARE_DELIVERY_ROOT_WRITE_FILE_PATTERNS,
|
|
78
|
+
] as const;
|
|
34
79
|
const GIT_STATUS_TOOL_ENTRY = 'tool-impl/git-tools.ts#gitStatusTool';
|
|
35
80
|
const WU_STATUS_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuStatusTool';
|
|
36
81
|
const WU_CREATE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuCreateTool';
|
|
@@ -55,6 +100,10 @@ const WU_RELEASE_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuReleaseTool';
|
|
|
55
100
|
const WU_RECOVER_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuRecoverTool';
|
|
56
101
|
const WU_REPAIR_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#wuRepairTool';
|
|
57
102
|
const GATES_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#gatesTool';
|
|
103
|
+
// WU-2729 (INIT-060 Phase 2): gates:docs exposes docs-only gate runs via a
|
|
104
|
+
// dedicated manifest entry so remote callers can request the docs gate
|
|
105
|
+
// without opting into the permissive gates handler surface.
|
|
106
|
+
const GATES_DOCS_TOOL_ENTRY = 'tool-impl/wu-lifecycle-tools.ts#gatesDocsTool';
|
|
58
107
|
const CONFIG_SET_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#configSetTool';
|
|
59
108
|
const CONFIG_GET_TOOL_ENTRY = 'tool-impl/runtime-native-tools.ts#configGetTool';
|
|
60
109
|
const MEM_INIT_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memInitTool';
|
|
@@ -193,6 +242,7 @@ const TOOL_PERMISSIONS = {
|
|
|
193
242
|
'flow:bottlenecks': 'read',
|
|
194
243
|
'flow:report': 'read',
|
|
195
244
|
gates: 'write',
|
|
245
|
+
'gates:docs': 'write',
|
|
196
246
|
'file:delete': 'write',
|
|
197
247
|
'file:edit': 'write',
|
|
198
248
|
'file:read': 'read',
|
|
@@ -272,6 +322,7 @@ const TOOL_ENTRY_OVERRIDES: Partial<Record<ToolName, string>> = {
|
|
|
272
322
|
'wu:repair': WU_REPAIR_TOOL_ENTRY,
|
|
273
323
|
'wu:infer-lane': WU_INFER_LANE_TOOL_ENTRY,
|
|
274
324
|
gates: GATES_TOOL_ENTRY,
|
|
325
|
+
'gates:docs': GATES_DOCS_TOOL_ENTRY,
|
|
275
326
|
'mem:init': MEM_INIT_TOOL_ENTRY,
|
|
276
327
|
'mem:start': MEM_START_TOOL_ENTRY,
|
|
277
328
|
'mem:ready': MEM_READY_TOOL_ENTRY,
|
|
@@ -348,28 +399,104 @@ export interface SoftwareDeliveryMigrationScorecard {
|
|
|
348
399
|
realHandlerEntries: number;
|
|
349
400
|
}
|
|
350
401
|
|
|
402
|
+
function createPathScopes(
|
|
403
|
+
patterns: readonly string[],
|
|
404
|
+
access: (typeof TOOL_SCOPE_ACCESS)[keyof typeof TOOL_SCOPE_ACCESS],
|
|
405
|
+
): PathScope[] {
|
|
406
|
+
return patterns.map((pattern) => ({
|
|
407
|
+
type: TOOL_SCOPE_TYPES.PATH,
|
|
408
|
+
pattern,
|
|
409
|
+
access,
|
|
410
|
+
}));
|
|
411
|
+
}
|
|
412
|
+
|
|
351
413
|
function requiredScopesForPermission(permission: ToolPermission): PathScope[] {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
414
|
+
if (permission === TOOL_PERMISSION_VALUES.READ) {
|
|
415
|
+
return createPathScopes([FULL_WORKSPACE_SCOPE_PATTERN], TOOL_SCOPE_ACCESS.READ);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return createPathScopes(SOFTWARE_DELIVERY_WRITE_SCOPE_PATTERNS, TOOL_SCOPE_ACCESS.WRITE);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* WU-2729 (INIT-060 Phase 2): the 10 software-delivery pack tools that are
|
|
423
|
+
* callable remotely via POST /tools/:name. The HTTP surface uses this list
|
|
424
|
+
* to build its allowlist so the set is the single source of truth (no
|
|
425
|
+
* duplicate allowlist in surface code). ADR-013 §3 tool exposure.
|
|
426
|
+
*/
|
|
427
|
+
export const REMOTE_CALLABLE_TOOLS = [
|
|
428
|
+
'gates',
|
|
429
|
+
'gates:docs',
|
|
430
|
+
'lane:suggest',
|
|
431
|
+
'lane:health',
|
|
432
|
+
'plan:create',
|
|
433
|
+
'plan:promote',
|
|
434
|
+
'initiative:create',
|
|
435
|
+
'initiative:add-wu',
|
|
436
|
+
'initiative:status',
|
|
437
|
+
'flow:report',
|
|
438
|
+
] as const satisfies readonly ToolName[];
|
|
439
|
+
|
|
440
|
+
export type RemoteCallableToolName = (typeof REMOTE_CALLABLE_TOOLS)[number];
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Well-known approval identifiers the software-delivery pack may request.
|
|
444
|
+
* Kept narrow on purpose; adding a new identifier requires an ADR.
|
|
445
|
+
*/
|
|
446
|
+
export const SOFTWARE_DELIVERY_APPROVAL_IDS = {
|
|
447
|
+
REMOTE_MUTATION: 'software-delivery:remote_mutation',
|
|
448
|
+
} as const;
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* WU-2729 (INIT-060 Phase 2): per-tool required_approvals overrides.
|
|
452
|
+
* Tools absent from this table default to `[]` (no approval required).
|
|
453
|
+
* Read-only tools MUST remain at `[]`; state-mutating remote-callable
|
|
454
|
+
* tools SHOULD request an explicit approval identifier so the conductor
|
|
455
|
+
* UI can surface the approval gate to operators.
|
|
456
|
+
*/
|
|
457
|
+
const APPROVAL_OVERRIDES: Partial<Record<ToolName, readonly string[]>> = {
|
|
458
|
+
'lane:suggest': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
|
|
459
|
+
'plan:create': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
|
|
460
|
+
'plan:promote': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
|
|
461
|
+
'initiative:create': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
|
|
462
|
+
'initiative:add-wu': [SOFTWARE_DELIVERY_APPROVAL_IDS.REMOTE_MUTATION],
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
function requiredApprovalsForTool(name: ToolName): string[] | undefined {
|
|
466
|
+
// WU-2729: only the 10 remote-callable tools carry explicit
|
|
467
|
+
// required_approvals metadata (even if empty). Other tools leave the
|
|
468
|
+
// field undefined so the manifest stays minimally descriptive.
|
|
469
|
+
const isRemoteCallable = (REMOTE_CALLABLE_TOOLS as readonly string[]).includes(name);
|
|
470
|
+
if (!isRemoteCallable) {
|
|
471
|
+
return undefined;
|
|
472
|
+
}
|
|
473
|
+
const override = APPROVAL_OVERRIDES[name];
|
|
474
|
+
return override ? [...override] : [];
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* WU-2729: ordered list of the 10 remote-callable tool names. Preserves
|
|
479
|
+
* declaration order from REMOTE_CALLABLE_TOOLS so callers can render
|
|
480
|
+
* stable UIs without re-sorting.
|
|
481
|
+
*/
|
|
482
|
+
export function getRemoteCallableToolNames(): RemoteCallableToolName[] {
|
|
483
|
+
return [...REMOTE_CALLABLE_TOOLS];
|
|
362
484
|
}
|
|
363
485
|
|
|
364
486
|
function createManifestTools(): SoftwareDeliveryManifestTool[] {
|
|
365
487
|
return (Object.keys(TOOL_PERMISSIONS) as ToolName[]).map((name) => {
|
|
366
488
|
const permission = TOOL_PERMISSIONS[name];
|
|
367
|
-
|
|
489
|
+
const approvals = requiredApprovalsForTool(name);
|
|
490
|
+
const entry: SoftwareDeliveryManifestTool = {
|
|
368
491
|
name,
|
|
369
492
|
entry: resolveToolEntry(name),
|
|
370
493
|
permission,
|
|
371
494
|
required_scopes: requiredScopesForPermission(permission),
|
|
372
495
|
};
|
|
496
|
+
if (approvals !== undefined) {
|
|
497
|
+
entry.required_approvals = approvals;
|
|
498
|
+
}
|
|
499
|
+
return entry;
|
|
373
500
|
});
|
|
374
501
|
}
|
|
375
502
|
|
|
@@ -400,6 +527,24 @@ export function renderSoftwareDeliveryMigrationScorecard(
|
|
|
400
527
|
}
|
|
401
528
|
|
|
402
529
|
const POLICY_SUFFIXES = ['format', 'lint', 'typecheck', 'test', 'coverage'] as const;
|
|
530
|
+
const SOFTWARE_DELIVERY_EMITTED_EVENT_KINDS = [
|
|
531
|
+
'software-delivery:gate_started',
|
|
532
|
+
'software-delivery:gate_passed',
|
|
533
|
+
'software-delivery:gate_failed',
|
|
534
|
+
'software-delivery:co_change_rule_fired',
|
|
535
|
+
'software-delivery:conditional_command_fired',
|
|
536
|
+
'software-delivery:lane_wip_breached',
|
|
537
|
+
'software-delivery:lane_locked',
|
|
538
|
+
'software-delivery:lane_unlocked',
|
|
539
|
+
'software-delivery:lane_suggestion_emitted',
|
|
540
|
+
'software-delivery:initiative_created',
|
|
541
|
+
'software-delivery:initiative_closed',
|
|
542
|
+
'software-delivery:initiative_phase_advanced',
|
|
543
|
+
'software-delivery:plan_created',
|
|
544
|
+
'software-delivery:plan_linked',
|
|
545
|
+
'software-delivery:plan_promoted',
|
|
546
|
+
] as const;
|
|
547
|
+
const SOFTWARE_DELIVERY_REQUIRED_SURFACES = ['http'] as const;
|
|
403
548
|
|
|
404
549
|
export const SOFTWARE_DELIVERY_MANIFEST: SoftwareDeliveryPackManifest = {
|
|
405
550
|
id: SOFTWARE_DELIVERY_PACK_ID,
|
|
@@ -415,4 +560,8 @@ export const SOFTWARE_DELIVERY_MANIFEST: SoftwareDeliveryPackManifest = {
|
|
|
415
560
|
evidence_types: ['gate-run'],
|
|
416
561
|
state_aliases: { active: 'in_progress' },
|
|
417
562
|
lane_templates: [],
|
|
563
|
+
emitted_event_kinds: [...SOFTWARE_DELIVERY_EMITTED_EVENT_KINDS],
|
|
564
|
+
subscribed_event_kinds: [],
|
|
565
|
+
required_approvals: [],
|
|
566
|
+
surfaces_required: [...SOFTWARE_DELIVERY_REQUIRED_SURFACES],
|
|
418
567
|
};
|