@mclawnet/swarm 0.1.13 → 0.1.15
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/dist/__tests__/always-on-activity-reader.test.d.ts +2 -0
- package/dist/__tests__/always-on-activity-reader.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-activity-reader.test.js +193 -0
- package/dist/__tests__/always-on-activity-reader.test.js.map +1 -0
- package/dist/__tests__/always-on-config.test.d.ts +2 -0
- package/dist/__tests__/always-on-config.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-config.test.js +285 -0
- package/dist/__tests__/always-on-config.test.js.map +1 -0
- package/dist/__tests__/always-on-manager.test.d.ts +2 -0
- package/dist/__tests__/always-on-manager.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-manager.test.js +797 -0
- package/dist/__tests__/always-on-manager.test.js.map +1 -0
- package/dist/__tests__/always-on-parity.test.d.ts +2 -0
- package/dist/__tests__/always-on-parity.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-parity.test.js +20 -0
- package/dist/__tests__/always-on-parity.test.js.map +1 -0
- package/dist/__tests__/cascade-picker.test.d.ts +2 -0
- package/dist/__tests__/cascade-picker.test.d.ts.map +1 -0
- package/dist/__tests__/cascade-picker.test.js +122 -0
- package/dist/__tests__/cascade-picker.test.js.map +1 -0
- package/dist/__tests__/coordinator-shipment.test.d.ts +2 -0
- package/dist/__tests__/coordinator-shipment.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-shipment.test.js +280 -0
- package/dist/__tests__/coordinator-shipment.test.js.map +1 -0
- package/dist/__tests__/coordinator-workspace-recover.test.d.ts +2 -0
- package/dist/__tests__/coordinator-workspace-recover.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-workspace-recover.test.js +140 -0
- package/dist/__tests__/coordinator-workspace-recover.test.js.map +1 -0
- package/dist/__tests__/coordinator-workspace.test.d.ts +2 -0
- package/dist/__tests__/coordinator-workspace.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-workspace.test.js +135 -0
- package/dist/__tests__/coordinator-workspace.test.js.map +1 -0
- package/dist/__tests__/default-runner-epipe.test.d.ts +2 -0
- package/dist/__tests__/default-runner-epipe.test.d.ts.map +1 -0
- package/dist/__tests__/default-runner-epipe.test.js +43 -0
- package/dist/__tests__/default-runner-epipe.test.js.map +1 -0
- package/dist/__tests__/discovery-scheduler.test.d.ts +2 -0
- package/dist/__tests__/discovery-scheduler.test.d.ts.map +1 -0
- package/dist/__tests__/discovery-scheduler.test.js +367 -0
- package/dist/__tests__/discovery-scheduler.test.js.map +1 -0
- package/dist/__tests__/env-forward-e2e.test.d.ts +2 -0
- package/dist/__tests__/env-forward-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/env-forward-e2e.test.js +57 -0
- package/dist/__tests__/env-forward-e2e.test.js.map +1 -0
- package/dist/__tests__/gh-pr-creator.test.d.ts +2 -0
- package/dist/__tests__/gh-pr-creator.test.d.ts.map +1 -0
- package/dist/__tests__/gh-pr-creator.test.js +107 -0
- package/dist/__tests__/gh-pr-creator.test.js.map +1 -0
- package/dist/__tests__/git-worktree-provider.test.d.ts +2 -0
- package/dist/__tests__/git-worktree-provider.test.d.ts.map +1 -0
- package/dist/__tests__/git-worktree-provider.test.js +98 -0
- package/dist/__tests__/git-worktree-provider.test.js.map +1 -0
- package/dist/__tests__/gitignore-check.test.d.ts +2 -0
- package/dist/__tests__/gitignore-check.test.d.ts.map +1 -0
- package/dist/__tests__/gitignore-check.test.js +39 -0
- package/dist/__tests__/gitignore-check.test.js.map +1 -0
- package/dist/__tests__/idea-research-source.test.d.ts +2 -0
- package/dist/__tests__/idea-research-source.test.d.ts.map +1 -0
- package/dist/__tests__/idea-research-source.test.js +425 -0
- package/dist/__tests__/idea-research-source.test.js.map +1 -0
- package/dist/__tests__/idea-todo-source.test.d.ts +2 -0
- package/dist/__tests__/idea-todo-source.test.d.ts.map +1 -0
- package/dist/__tests__/idea-todo-source.test.js +258 -0
- package/dist/__tests__/idea-todo-source.test.js.map +1 -0
- package/dist/__tests__/introspection-dedupe.test.d.ts +2 -0
- package/dist/__tests__/introspection-dedupe.test.d.ts.map +1 -0
- package/dist/__tests__/introspection-dedupe.test.js +484 -0
- package/dist/__tests__/introspection-dedupe.test.js.map +1 -0
- package/dist/__tests__/introspection-source.test.d.ts +2 -0
- package/dist/__tests__/introspection-source.test.d.ts.map +1 -0
- package/dist/__tests__/introspection-source.test.js +1051 -0
- package/dist/__tests__/introspection-source.test.js.map +1 -0
- package/dist/__tests__/migration-roles.test.js +1 -22
- package/dist/__tests__/migration-roles.test.js.map +1 -1
- package/dist/__tests__/reconcile-researching.test.d.ts +2 -0
- package/dist/__tests__/reconcile-researching.test.d.ts.map +1 -0
- package/dist/__tests__/reconcile-researching.test.js +224 -0
- package/dist/__tests__/reconcile-researching.test.js.map +1 -0
- package/dist/__tests__/role-loader-preamble-all.test.js +3 -1
- package/dist/__tests__/role-loader-preamble-all.test.js.map +1 -1
- package/dist/__tests__/role-loader.test.js +95 -0
- package/dist/__tests__/role-loader.test.js.map +1 -1
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.js +3 -1
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.js.map +1 -1
- package/dist/__tests__/secret-scrub.test.d.ts +2 -0
- package/dist/__tests__/secret-scrub.test.d.ts.map +1 -0
- package/dist/__tests__/secret-scrub.test.js +55 -0
- package/dist/__tests__/secret-scrub.test.js.map +1 -0
- package/dist/__tests__/shipment-actions.test.d.ts +2 -0
- package/dist/__tests__/shipment-actions.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-actions.test.js +378 -0
- package/dist/__tests__/shipment-actions.test.js.map +1 -0
- package/dist/__tests__/shipment-persistence.test.d.ts +2 -0
- package/dist/__tests__/shipment-persistence.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-persistence.test.js +120 -0
- package/dist/__tests__/shipment-persistence.test.js.map +1 -0
- package/dist/__tests__/shipment-pipeline.test.d.ts +2 -0
- package/dist/__tests__/shipment-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-pipeline.test.js +392 -0
- package/dist/__tests__/shipment-pipeline.test.js.map +1 -0
- package/dist/__tests__/shipment-report.test.d.ts +2 -0
- package/dist/__tests__/shipment-report.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-report.test.js +78 -0
- package/dist/__tests__/shipment-report.test.js.map +1 -0
- package/dist/__tests__/shipment-stdin-integration.test.d.ts +2 -0
- package/dist/__tests__/shipment-stdin-integration.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-stdin-integration.test.js +49 -0
- package/dist/__tests__/shipment-stdin-integration.test.js.map +1 -0
- package/dist/__tests__/shipment-type-parity.test.d.ts +2 -0
- package/dist/__tests__/shipment-type-parity.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-type-parity.test.js +10 -0
- package/dist/__tests__/shipment-type-parity.test.js.map +1 -0
- package/dist/__tests__/snapshot-copy-provider.test.d.ts +2 -0
- package/dist/__tests__/snapshot-copy-provider.test.d.ts.map +1 -0
- package/dist/__tests__/snapshot-copy-provider.test.js +88 -0
- package/dist/__tests__/snapshot-copy-provider.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-backend.test.js +153 -0
- package/dist/__tests__/swarm-coordinator-backend.test.js.map +1 -1
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.js +111 -0
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.js.map +1 -0
- package/dist/__tests__/task-store-source.test.d.ts +2 -0
- package/dist/__tests__/task-store-source.test.d.ts.map +1 -0
- package/dist/__tests__/task-store-source.test.js +56 -0
- package/dist/__tests__/task-store-source.test.js.map +1 -0
- package/dist/__tests__/transport-detect.test.d.ts +2 -0
- package/dist/__tests__/transport-detect.test.d.ts.map +1 -0
- package/dist/__tests__/transport-detect.test.js +92 -0
- package/dist/__tests__/transport-detect.test.js.map +1 -0
- package/dist/__tests__/workcycle-runner-cascade.test.d.ts +2 -0
- package/dist/__tests__/workcycle-runner-cascade.test.d.ts.map +1 -0
- package/dist/__tests__/workcycle-runner-cascade.test.js +203 -0
- package/dist/__tests__/workcycle-runner-cascade.test.js.map +1 -0
- package/dist/__tests__/workcycle-runner.test.d.ts +2 -0
- package/dist/__tests__/workcycle-runner.test.d.ts.map +1 -0
- package/dist/__tests__/workcycle-runner.test.js +369 -0
- package/dist/__tests__/workcycle-runner.test.js.map +1 -0
- package/dist/__tests__/workspace-diff.test.d.ts +2 -0
- package/dist/__tests__/workspace-diff.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-diff.test.js +62 -0
- package/dist/__tests__/workspace-diff.test.js.map +1 -0
- package/dist/__tests__/workspace-manager.test.d.ts +2 -0
- package/dist/__tests__/workspace-manager.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-manager.test.js +120 -0
- package/dist/__tests__/workspace-manager.test.js.map +1 -0
- package/dist/__tests__/workspace-types.test.d.ts +2 -0
- package/dist/__tests__/workspace-types.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-types.test.js +37 -0
- package/dist/__tests__/workspace-types.test.js.map +1 -0
- package/dist/__tests__/worktree-gc.test.d.ts +2 -0
- package/dist/__tests__/worktree-gc.test.d.ts.map +1 -0
- package/dist/__tests__/worktree-gc.test.js +183 -0
- package/dist/__tests__/worktree-gc.test.js.map +1 -0
- package/dist/always-on/activity-reader.d.ts +27 -0
- package/dist/always-on/activity-reader.d.ts.map +1 -0
- package/dist/always-on/activity-reader.js +95 -0
- package/dist/always-on/activity-reader.js.map +1 -0
- package/dist/always-on/always-on-manager.d.ts +170 -0
- package/dist/always-on/always-on-manager.d.ts.map +1 -0
- package/dist/always-on/always-on-manager.js +538 -0
- package/dist/always-on/always-on-manager.js.map +1 -0
- package/dist/always-on/config.d.ts +141 -0
- package/dist/always-on/config.d.ts.map +1 -0
- package/dist/always-on/config.js +324 -0
- package/dist/always-on/config.js.map +1 -0
- package/dist/always-on/discovery-scheduler.d.ts +60 -0
- package/dist/always-on/discovery-scheduler.d.ts.map +1 -0
- package/dist/always-on/discovery-scheduler.js +287 -0
- package/dist/always-on/discovery-scheduler.js.map +1 -0
- package/dist/always-on/ideas-client.d.ts +23 -0
- package/dist/always-on/ideas-client.d.ts.map +1 -0
- package/dist/always-on/ideas-client.js +13 -0
- package/dist/always-on/ideas-client.js.map +1 -0
- package/dist/always-on/reconcile-researching.d.ts +42 -0
- package/dist/always-on/reconcile-researching.d.ts.map +1 -0
- package/dist/always-on/reconcile-researching.js +133 -0
- package/dist/always-on/reconcile-researching.js.map +1 -0
- package/dist/always-on/task-sources/cascade-picker.d.ts +42 -0
- package/dist/always-on/task-sources/cascade-picker.d.ts.map +1 -0
- package/dist/always-on/task-sources/cascade-picker.js +65 -0
- package/dist/always-on/task-sources/cascade-picker.js.map +1 -0
- package/dist/always-on/task-sources/idea-dedupe.d.ts +62 -0
- package/dist/always-on/task-sources/idea-dedupe.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-dedupe.js +130 -0
- package/dist/always-on/task-sources/idea-dedupe.js.map +1 -0
- package/dist/always-on/task-sources/idea-research-source.d.ts +46 -0
- package/dist/always-on/task-sources/idea-research-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-research-source.js +308 -0
- package/dist/always-on/task-sources/idea-research-source.js.map +1 -0
- package/dist/always-on/task-sources/idea-sort.d.ts +3 -0
- package/dist/always-on/task-sources/idea-sort.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-sort.js +25 -0
- package/dist/always-on/task-sources/idea-sort.js.map +1 -0
- package/dist/always-on/task-sources/idea-todo-source.d.ts +48 -0
- package/dist/always-on/task-sources/idea-todo-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-todo-source.js +226 -0
- package/dist/always-on/task-sources/idea-todo-source.js.map +1 -0
- package/dist/always-on/task-sources/introspection-source.d.ts +101 -0
- package/dist/always-on/task-sources/introspection-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/introspection-source.js +695 -0
- package/dist/always-on/task-sources/introspection-source.js.map +1 -0
- package/dist/always-on/task-sources/task-store-source.d.ts +15 -0
- package/dist/always-on/task-sources/task-store-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/task-store-source.js +59 -0
- package/dist/always-on/task-sources/task-store-source.js.map +1 -0
- package/dist/always-on/task-sources/types.d.ts +108 -0
- package/dist/always-on/task-sources/types.d.ts.map +1 -0
- package/dist/always-on/task-sources/types.js +13 -0
- package/dist/always-on/task-sources/types.js.map +1 -0
- package/dist/always-on/types.d.ts +76 -0
- package/dist/always-on/types.d.ts.map +1 -0
- package/dist/always-on/types.js +17 -0
- package/dist/always-on/types.js.map +1 -0
- package/dist/always-on/workcycle-runner.d.ts +115 -0
- package/dist/always-on/workcycle-runner.d.ts.map +1 -0
- package/dist/always-on/workcycle-runner.js +285 -0
- package/dist/always-on/workcycle-runner.js.map +1 -0
- package/dist/always-on/worktree-gc.d.ts +41 -0
- package/dist/always-on/worktree-gc.d.ts.map +1 -0
- package/dist/always-on/worktree-gc.js +167 -0
- package/dist/always-on/worktree-gc.js.map +1 -0
- package/dist/index.d.ts +26 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/persistence.d.ts +37 -1
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +48 -0
- package/dist/persistence.js.map +1 -1
- package/dist/retrospective.d.ts.map +1 -1
- package/dist/retrospective.js +6 -0
- package/dist/retrospective.js.map +1 -1
- package/dist/roles/role-loader.d.ts +1 -1
- package/dist/roles/role-loader.d.ts.map +1 -1
- package/dist/roles/role-loader.js +18 -0
- package/dist/roles/role-loader.js.map +1 -1
- package/dist/roles/types.d.ts +12 -0
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/shipment/gh-pr-creator.d.ts +28 -0
- package/dist/shipment/gh-pr-creator.d.ts.map +1 -0
- package/dist/shipment/gh-pr-creator.js +80 -0
- package/dist/shipment/gh-pr-creator.js.map +1 -0
- package/dist/shipment/report.d.ts +27 -0
- package/dist/shipment/report.d.ts.map +1 -0
- package/dist/shipment/report.js +41 -0
- package/dist/shipment/report.js.map +1 -0
- package/dist/shipment/secret-scrub.d.ts +12 -0
- package/dist/shipment/secret-scrub.d.ts.map +1 -0
- package/dist/shipment/secret-scrub.js +30 -0
- package/dist/shipment/secret-scrub.js.map +1 -0
- package/dist/shipment/shipment-actions.d.ts +85 -0
- package/dist/shipment/shipment-actions.d.ts.map +1 -0
- package/dist/shipment/shipment-actions.js +190 -0
- package/dist/shipment/shipment-actions.js.map +1 -0
- package/dist/shipment/shipment-pipeline.d.ts +48 -0
- package/dist/shipment/shipment-pipeline.d.ts.map +1 -0
- package/dist/shipment/shipment-pipeline.js +256 -0
- package/dist/shipment/shipment-pipeline.js.map +1 -0
- package/dist/shipment/transport-detect.d.ts +16 -0
- package/dist/shipment/transport-detect.d.ts.map +1 -0
- package/dist/shipment/transport-detect.js +54 -0
- package/dist/shipment/transport-detect.js.map +1 -0
- package/dist/shipment/workspace-diff.d.ts +39 -0
- package/dist/shipment/workspace-diff.d.ts.map +1 -0
- package/dist/shipment/workspace-diff.js +64 -0
- package/dist/shipment/workspace-diff.js.map +1 -0
- package/dist/swarm-coordinator.d.ts +20 -1
- package/dist/swarm-coordinator.d.ts.map +1 -1
- package/dist/swarm-coordinator.js +193 -10
- package/dist/swarm-coordinator.js.map +1 -1
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace/git-worktree-provider.d.ts +11 -0
- package/dist/workspace/git-worktree-provider.d.ts.map +1 -0
- package/dist/workspace/git-worktree-provider.js +123 -0
- package/dist/workspace/git-worktree-provider.js.map +1 -0
- package/dist/workspace/gitignore-check.d.ts +10 -0
- package/dist/workspace/gitignore-check.d.ts.map +1 -0
- package/dist/workspace/gitignore-check.js +25 -0
- package/dist/workspace/gitignore-check.js.map +1 -0
- package/dist/workspace/index.d.ts +5 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +5 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/snapshot-copy-provider.d.ts +11 -0
- package/dist/workspace/snapshot-copy-provider.d.ts.map +1 -0
- package/dist/workspace/snapshot-copy-provider.js +66 -0
- package/dist/workspace/snapshot-copy-provider.js.map +1 -0
- package/dist/workspace/types.d.ts +36 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +2 -0
- package/dist/workspace/types.js.map +1 -0
- package/dist/workspace/workspace-manager.d.ts +30 -0
- package/dist/workspace/workspace-manager.d.ts.map +1 -0
- package/dist/workspace/workspace-manager.js +104 -0
- package/dist/workspace/workspace-manager.js.map +1 -0
- package/package.json +4 -4
- package/roles/queen.md +1 -0
- package/templates/introspection.md +64 -0
- package/templates/research-only.md +58 -0
- package/roles/preset-analyst-simons.md +0 -39
- package/roles/preset-architect-knuth.md +0 -39
- package/roles/preset-designer-norman.md +0 -39
- package/roles/preset-designer.md +0 -39
- package/roles/preset-dev-carmack.md +0 -39
- package/roles/preset-dev-gosling.md +0 -39
- package/roles/preset-developer.md +0 -52
- package/roles/preset-manager-grove.md +0 -39
- package/roles/preset-manager-musk.md +0 -39
- package/roles/preset-pm.md +0 -78
- package/roles/preset-researcher-feynman.md +0 -39
- package/roles/preset-reviewer.md +0 -46
- package/roles/preset-strategist-buffett.md +0 -39
- package/roles/preset-strategist-munger.md +0 -39
- package/roles/preset-strategist-sunzi.md +0 -39
- package/roles/preset-tester-beck.md +0 -40
- package/roles/preset-tester.md +0 -47
- package/roles/preset-writer-orwell.md +0 -39
- package/roles/preset-writer.md +0 -39
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipment-pipeline.js","sourceRoot":"","sources":["../../src/shipment/shipment-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface TransportDetectResult {
|
|
2
|
+
kind: "pr" | "diff-only" | "no-remote";
|
|
3
|
+
reason: string;
|
|
4
|
+
defaultBranch?: string;
|
|
5
|
+
remoteUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export type CommandRunner = (cmd: string, args: string[], cwd?: string) => Promise<{
|
|
8
|
+
exitCode: number;
|
|
9
|
+
stdout: string;
|
|
10
|
+
stderr: string;
|
|
11
|
+
}>;
|
|
12
|
+
export interface TransportDetectOptions {
|
|
13
|
+
runner?: CommandRunner;
|
|
14
|
+
}
|
|
15
|
+
export declare function detectTransport(cwd: string, opts?: TransportDetectOptions): Promise<TransportDetectResult>;
|
|
16
|
+
//# sourceMappingURL=transport-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-detect.d.ts","sourceRoot":"","sources":["../../src/shipment/transport-detect.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,MAAM,KACT,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAkBD,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAkDhC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
const INSTALL_HINTS = "macOS: brew install gh | " +
|
|
3
|
+
"Linux: see https://github.com/cli/cli/blob/trunk/docs/install_linux.md | " +
|
|
4
|
+
"Windows: winget install --id GitHub.cli";
|
|
5
|
+
const defaultRunner = (cmd, args, cwd) => new Promise((resolve) => {
|
|
6
|
+
const child = spawn(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
|
|
7
|
+
let stdout = "";
|
|
8
|
+
let stderr = "";
|
|
9
|
+
child.stdout?.on("data", (c) => (stdout += c.toString("utf-8")));
|
|
10
|
+
child.stderr?.on("data", (c) => (stderr += c.toString("utf-8")));
|
|
11
|
+
child.on("error", (e) => resolve({ exitCode: -1, stdout, stderr: e.message }));
|
|
12
|
+
child.on("close", (code) => resolve({ exitCode: code ?? -1, stdout, stderr }));
|
|
13
|
+
});
|
|
14
|
+
export async function detectTransport(cwd, opts = {}) {
|
|
15
|
+
const run = opts.runner ?? defaultRunner;
|
|
16
|
+
// 1. Origin remote
|
|
17
|
+
const remote = await run("git", ["remote", "get-url", "origin"], cwd).catch(() => null);
|
|
18
|
+
if (!remote || remote.exitCode !== 0 || !remote.stdout.trim()) {
|
|
19
|
+
return { kind: "no-remote", reason: "no 'origin' remote configured" };
|
|
20
|
+
}
|
|
21
|
+
const remoteUrl = remote.stdout.trim();
|
|
22
|
+
// 2. gh CLI
|
|
23
|
+
const gh = await run("gh", ["--version"]).catch(() => null);
|
|
24
|
+
if (!gh || gh.exitCode !== 0) {
|
|
25
|
+
return {
|
|
26
|
+
kind: "diff-only",
|
|
27
|
+
reason: `gh CLI not installed; install with: ${INSTALL_HINTS}`,
|
|
28
|
+
remoteUrl,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// 3. Default branch
|
|
32
|
+
const symref = await run("git", ["symbolic-ref", "refs/remotes/origin/HEAD"], cwd).catch(() => null);
|
|
33
|
+
let defaultBranch = "main";
|
|
34
|
+
if (symref && symref.exitCode === 0 && symref.stdout.trim()) {
|
|
35
|
+
defaultBranch =
|
|
36
|
+
symref.stdout.trim().replace(/^refs\/remotes\/origin\//, "") || "main";
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Fresh clones often have origin/HEAD unset → symbolic-ref exits non-zero.
|
|
40
|
+
// Ask gh for the repo's declared default branch before falling back to "main"
|
|
41
|
+
// (which is wrong on legacy master repos and breaks PR creation).
|
|
42
|
+
const ghDefault = await run("gh", ["repo", "view", "--json", "defaultBranchRef", "-q", ".defaultBranchRef.name"], cwd).catch(() => null);
|
|
43
|
+
if (ghDefault && ghDefault.exitCode === 0 && ghDefault.stdout.trim()) {
|
|
44
|
+
defaultBranch = ghDefault.stdout.trim();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
kind: "pr",
|
|
49
|
+
reason: "remote + gh ok",
|
|
50
|
+
defaultBranch,
|
|
51
|
+
remoteUrl,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=transport-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-detect.js","sourceRoot":"","sources":["../../src/shipment/transport-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type DiffCommandRunner = (cmd: string, args: string[], cwd?: string) => Promise<{
|
|
2
|
+
exitCode: number;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
}>;
|
|
6
|
+
export interface WorkspaceDiffFile {
|
|
7
|
+
path: string;
|
|
8
|
+
added: number;
|
|
9
|
+
removed: number;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkspaceDiff {
|
|
12
|
+
/** Human-readable `git diff --stat` body. Empty when no changes. */
|
|
13
|
+
stat: string;
|
|
14
|
+
/** Full unified diff (may be empty). */
|
|
15
|
+
patch: string;
|
|
16
|
+
/** Structured per-file additions/removals. */
|
|
17
|
+
files: WorkspaceDiffFile[];
|
|
18
|
+
/** Set when the underlying git command failed. */
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ComputeWorkspaceDiffInput {
|
|
22
|
+
/** Absolute path to the worktree. */
|
|
23
|
+
worktreeCwd: string;
|
|
24
|
+
/** Base commit (the commit the worktree was created from). */
|
|
25
|
+
baseCommit: string;
|
|
26
|
+
/** Optional injected runner (defaults to internal spawn-based git). */
|
|
27
|
+
runner?: DiffCommandRunner;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compute the diff of a worktree relative to its base commit. Includes both
|
|
31
|
+
* committed (HEAD vs baseCommit) and uncommitted (workdir + index vs HEAD)
|
|
32
|
+
* changes — `git diff <baseCommit>` covers both naturally.
|
|
33
|
+
*
|
|
34
|
+
* Returns an error result (not throws) on non-git dirs / git failures, so the
|
|
35
|
+
* caller (ShipmentPipeline) can gracefully fall back to a "skipped" outcome
|
|
36
|
+
* instead of aborting the swarm destroy flow.
|
|
37
|
+
*/
|
|
38
|
+
export declare function computeWorkspaceDiff(input: ComputeWorkspaceDiffInput): Promise<WorkspaceDiff>;
|
|
39
|
+
//# sourceMappingURL=workspace-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-diff.d.ts","sourceRoot":"","sources":["../../src/shipment/workspace-diff.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,MAAM,KACT,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createLogger } from "@mclawnet/logger";
|
|
3
|
+
const log = createLogger({ module: "swarm/shipment/workspace-diff" });
|
|
4
|
+
/**
|
|
5
|
+
* Compute the diff of a worktree relative to its base commit. Includes both
|
|
6
|
+
* committed (HEAD vs baseCommit) and uncommitted (workdir + index vs HEAD)
|
|
7
|
+
* changes — `git diff <baseCommit>` covers both naturally.
|
|
8
|
+
*
|
|
9
|
+
* Returns an error result (not throws) on non-git dirs / git failures, so the
|
|
10
|
+
* caller (ShipmentPipeline) can gracefully fall back to a "skipped" outcome
|
|
11
|
+
* instead of aborting the swarm destroy flow.
|
|
12
|
+
*/
|
|
13
|
+
export async function computeWorkspaceDiff(input) {
|
|
14
|
+
const run = input.runner ?? ((cmd, args, cwd) => defaultSpawn(cmd, args, cwd));
|
|
15
|
+
const stat = await run("git", ["diff", "--stat", input.baseCommit], input.worktreeCwd).catch(() => null);
|
|
16
|
+
if (!stat || stat.exitCode !== 0) {
|
|
17
|
+
return {
|
|
18
|
+
stat: "",
|
|
19
|
+
patch: "",
|
|
20
|
+
files: [],
|
|
21
|
+
error: stat?.stderr || "git diff --stat failed",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const patch = await run("git", ["diff", input.baseCommit], input.worktreeCwd).catch(() => null);
|
|
25
|
+
if (!patch || patch.exitCode !== 0) {
|
|
26
|
+
return {
|
|
27
|
+
stat: "",
|
|
28
|
+
patch: "",
|
|
29
|
+
files: [],
|
|
30
|
+
error: patch?.stderr || "git diff failed",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const numstat = await run("git", ["diff", "--numstat", input.baseCommit], input.worktreeCwd).catch(() => null);
|
|
34
|
+
const files = [];
|
|
35
|
+
if (numstat && numstat.exitCode === 0) {
|
|
36
|
+
for (const line of numstat.stdout.split("\n")) {
|
|
37
|
+
if (!line.trim())
|
|
38
|
+
continue;
|
|
39
|
+
const parts = line.split("\t");
|
|
40
|
+
if (parts.length < 3)
|
|
41
|
+
continue;
|
|
42
|
+
const [a, r, ...rest] = parts;
|
|
43
|
+
const path = rest.join("\t");
|
|
44
|
+
// For binary files git emits "-" "-" — treat as 0/0
|
|
45
|
+
const added = a === "-" ? 0 : parseInt(a, 10) || 0;
|
|
46
|
+
const removed = r === "-" ? 0 : parseInt(r, 10) || 0;
|
|
47
|
+
files.push({ path, added, removed });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
log.debug({ worktreeCwd: input.worktreeCwd, baseCommit: input.baseCommit, fileCount: files.length }, "computeWorkspaceDiff ok");
|
|
51
|
+
return { stat: stat.stdout, patch: patch.stdout, files };
|
|
52
|
+
}
|
|
53
|
+
function defaultSpawn(cmd, args, cwd) {
|
|
54
|
+
return new Promise((resolve) => {
|
|
55
|
+
const child = spawn(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
|
|
56
|
+
let stdout = "";
|
|
57
|
+
let stderr = "";
|
|
58
|
+
child.stdout?.on("data", (c) => (stdout += c.toString("utf-8")));
|
|
59
|
+
child.stderr?.on("data", (c) => (stderr += c.toString("utf-8")));
|
|
60
|
+
child.on("error", (e) => resolve({ exitCode: -1, stdout, stderr: e.message }));
|
|
61
|
+
child.on("close", (code) => resolve({ exitCode: code ?? -1, stdout, stderr }));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=workspace-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-diff.js","sourceRoot":"","sources":["../../src/shipment/workspace-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { InboxWatcher } from "./inbox-watcher.js";
|
|
|
4
4
|
import { TaskStore } from "@mclawnet/task";
|
|
5
5
|
import type { SwarmInstance, RoleInstance, SwarmCreateOptions, CustomRoleDefinition } from "./types.js";
|
|
6
6
|
import { type SandboxLevel } from "@mclawnet/shared";
|
|
7
|
+
import { WorkspaceManager } from "./workspace/index.js";
|
|
7
8
|
/**
|
|
8
9
|
* SwarmCoordinator — orchestrates multi-role Claude CLI swarms.
|
|
9
10
|
*
|
|
@@ -30,6 +31,14 @@ export declare class SwarmCoordinator {
|
|
|
30
31
|
* inline call sites still honour `CLAWNET_HOME` env var as before.
|
|
31
32
|
*/
|
|
32
33
|
private home?;
|
|
34
|
+
/**
|
|
35
|
+
* Optional WorkspaceManager (M6). Used to prepare an isolated workspace
|
|
36
|
+
* (git worktree or snapshot copy) per swarm on create(), and to dispose
|
|
37
|
+
* it on destroy(). When omitted, a default WorkspaceManager is created
|
|
38
|
+
* (git-worktree → snapshot-copy fallback). Workspace prepare is
|
|
39
|
+
* best-effort: if it fails the swarm continues using `workDir` as before.
|
|
40
|
+
*/
|
|
41
|
+
private workspaceManager;
|
|
33
42
|
private swarms;
|
|
34
43
|
readonly inboxRelay: InboxRelay;
|
|
35
44
|
readonly inboxWatcher: InboxWatcher;
|
|
@@ -61,7 +70,15 @@ export declare class SwarmCoordinator {
|
|
|
61
70
|
* `homedir()` and write files into the real `~/.clawnet`. When omitted,
|
|
62
71
|
* inline call sites still honour `CLAWNET_HOME` env var as before.
|
|
63
72
|
*/
|
|
64
|
-
home?: string | undefined
|
|
73
|
+
home?: string | undefined,
|
|
74
|
+
/**
|
|
75
|
+
* Optional WorkspaceManager (M6). Used to prepare an isolated workspace
|
|
76
|
+
* (git worktree or snapshot copy) per swarm on create(), and to dispose
|
|
77
|
+
* it on destroy(). When omitted, a default WorkspaceManager is created
|
|
78
|
+
* (git-worktree → snapshot-copy fallback). Workspace prepare is
|
|
79
|
+
* best-effort: if it fails the swarm continues using `workDir` as before.
|
|
80
|
+
*/
|
|
81
|
+
workspaceManager?: WorkspaceManager);
|
|
65
82
|
/** Resolve the user-home root used for InboxStore / TaskStore lookups. */
|
|
66
83
|
private resolveHome;
|
|
67
84
|
/**
|
|
@@ -144,6 +161,8 @@ export declare class SwarmCoordinator {
|
|
|
144
161
|
presetInstanceId?: string;
|
|
145
162
|
backendOverride?: "claude" | "codex";
|
|
146
163
|
sandboxOverride?: SandboxLevel;
|
|
164
|
+
modelOverride?: string;
|
|
165
|
+
modeOverride?: string;
|
|
147
166
|
isDynamicAdd?: boolean;
|
|
148
167
|
}): Promise<RoleInstance>;
|
|
149
168
|
/** Spawn a new role instance in a swarm (real implementation, serialized by spawnRole). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swarm-coordinator.d.ts","sourceRoot":"","sources":["../src/swarm-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,SAAS,EAA+J,MAAM,gBAAgB,CAAC;AAMxM,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"swarm-coordinator.d.ts","sourceRoot":"","sources":["../src/swarm-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { resolveRoleTools } from "./roles/role-tools.js";
|
|
|
3
3
|
import { loadTemplate } from "./templates/template-loader.js";
|
|
4
4
|
import { parsePlanFromText } from "./action-parser.js";
|
|
5
5
|
import { BUILTIN_ROLES, initDatabase, syncToAutoMemory } from "@mclawnet/memory";
|
|
6
|
-
import { saveSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, loadSwarmSnapshot, readMessageLog, listRecoverableSwarmIds } from "./persistence.js";
|
|
6
|
+
import { saveSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, loadSwarmSnapshot, readMessageLog, listRecoverableSwarmIds, saveShipmentResult } from "./persistence.js";
|
|
7
7
|
import { runRetrospective } from "./retrospective.js";
|
|
8
8
|
import { InboxRelay } from "./inbox-relay.js";
|
|
9
9
|
import { InboxStore } from "./inbox-store.js";
|
|
@@ -17,6 +17,7 @@ import { homedir } from "node:os";
|
|
|
17
17
|
import { join } from "node:path";
|
|
18
18
|
import { createLogger } from "@mclawnet/logger";
|
|
19
19
|
import { DEFAULT_SANDBOX } from "@mclawnet/shared";
|
|
20
|
+
import { WorkspaceManager } from "./workspace/index.js";
|
|
20
21
|
const log = createLogger({ module: "swarm" });
|
|
21
22
|
// Queen periodic patrol: pure safety-net heartbeat now that crash detection
|
|
22
23
|
// is event-driven via handleRoleCrashed. Worker `task_set_status` /
|
|
@@ -48,6 +49,7 @@ export class SwarmCoordinator {
|
|
|
48
49
|
hub;
|
|
49
50
|
taskStoreFactory;
|
|
50
51
|
home;
|
|
52
|
+
workspaceManager;
|
|
51
53
|
swarms = new Map();
|
|
52
54
|
inboxRelay;
|
|
53
55
|
inboxWatcher;
|
|
@@ -79,11 +81,20 @@ export class SwarmCoordinator {
|
|
|
79
81
|
* `homedir()` and write files into the real `~/.clawnet`. When omitted,
|
|
80
82
|
* inline call sites still honour `CLAWNET_HOME` env var as before.
|
|
81
83
|
*/
|
|
82
|
-
home
|
|
84
|
+
home,
|
|
85
|
+
/**
|
|
86
|
+
* Optional WorkspaceManager (M6). Used to prepare an isolated workspace
|
|
87
|
+
* (git worktree or snapshot copy) per swarm on create(), and to dispose
|
|
88
|
+
* it on destroy(). When omitted, a default WorkspaceManager is created
|
|
89
|
+
* (git-worktree → snapshot-copy fallback). Workspace prepare is
|
|
90
|
+
* best-effort: if it fails the swarm continues using `workDir` as before.
|
|
91
|
+
*/
|
|
92
|
+
workspaceManager = new WorkspaceManager()) {
|
|
83
93
|
this.sessionAdapter = sessionAdapter;
|
|
84
94
|
this.hub = hub;
|
|
85
95
|
this.taskStoreFactory = taskStoreFactory;
|
|
86
96
|
this.home = home;
|
|
97
|
+
this.workspaceManager = workspaceManager;
|
|
87
98
|
this.inboxRelay = new InboxRelay(sessionAdapter, (id) => this.swarms.get(id), (swarmId, instanceId, msg) => this.handleInterceptedMessage(swarmId, instanceId, msg), home);
|
|
88
99
|
this.inboxWatcher = new InboxWatcher(this.inboxRelay);
|
|
89
100
|
}
|
|
@@ -217,7 +228,7 @@ export class SwarmCoordinator {
|
|
|
217
228
|
const idx = roleSpecs.findIndex((s, i) => !claimed.has(i) && s.roleName === uiRole.roleName);
|
|
218
229
|
if (idx >= 0) {
|
|
219
230
|
claimed.add(idx);
|
|
220
|
-
if (uiRole.backend) {
|
|
231
|
+
if (uiRole.backend !== undefined) {
|
|
221
232
|
roleSpecs[idx] = { ...roleSpecs[idx], backend: uiRole.backend };
|
|
222
233
|
}
|
|
223
234
|
// Mirror backend overlay for sandbox so user's per-role choice in
|
|
@@ -225,9 +236,20 @@ export class SwarmCoordinator {
|
|
|
225
236
|
// persistence.json. Without this, only dynamically-added roles
|
|
226
237
|
// ever carried `sandbox`; the 6 initial roles silently dropped to
|
|
227
238
|
// undefined and recovery.json had no record of the user's pick.
|
|
228
|
-
if (uiRole.sandbox) {
|
|
239
|
+
if (uiRole.sandbox !== undefined) {
|
|
229
240
|
roleSpecs[idx] = { ...roleSpecs[idx], sandbox: uiRole.sandbox };
|
|
230
241
|
}
|
|
242
|
+
// N4.5 per-role sticky model + mode (UI ModelPicker / ModePicker).
|
|
243
|
+
// Same overlay pattern as backend/sandbox so the per-role choice
|
|
244
|
+
// reaches spawnRole → definition → SessionAdapter.createSession.
|
|
245
|
+
// Use !== undefined (not truthy) so a future caller can clear a
|
|
246
|
+
// field by passing "" without being silently ignored.
|
|
247
|
+
if (uiRole.model !== undefined) {
|
|
248
|
+
roleSpecs[idx] = { ...roleSpecs[idx], model: uiRole.model };
|
|
249
|
+
}
|
|
250
|
+
if (uiRole.mode !== undefined) {
|
|
251
|
+
roleSpecs[idx] = { ...roleSpecs[idx], mode: uiRole.mode };
|
|
252
|
+
}
|
|
231
253
|
}
|
|
232
254
|
}
|
|
233
255
|
}
|
|
@@ -249,9 +271,27 @@ export class SwarmCoordinator {
|
|
|
249
271
|
isPaused: false,
|
|
250
272
|
status: "creating",
|
|
251
273
|
planStatus: "none",
|
|
274
|
+
// PR-B D11 — default "user" when caller doesn't specify (preserves
|
|
275
|
+
// pre-D11 chat-driven create() behaviour).
|
|
276
|
+
kind: options.kind ?? "user",
|
|
252
277
|
};
|
|
253
278
|
// Store pending role specs for on-demand spawning
|
|
254
279
|
this.swarms.set(swarmSessionId, swarm);
|
|
280
|
+
// M6: prepare an isolated workspace for this swarm (git worktree or
|
|
281
|
+
// snapshot copy). Best-effort — if it fails, the swarm falls back to
|
|
282
|
+
// using `workDir` directly (legacy behavior, no regression).
|
|
283
|
+
if (swarm.workDir) {
|
|
284
|
+
try {
|
|
285
|
+
swarm.workspace = await this.workspaceManager.prepare({
|
|
286
|
+
swarmId: swarmSessionId,
|
|
287
|
+
projectRoot: swarm.workDir,
|
|
288
|
+
});
|
|
289
|
+
log.info({ swarmId: swarmSessionId, strategy: swarm.workspace.strategy, cwd: swarm.workspace.cwd }, "workspace prepared for swarm");
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
log.warn({ err, swarmId: swarmSessionId }, "workspace prepare failed; swarm continues using main workDir");
|
|
293
|
+
}
|
|
294
|
+
}
|
|
255
295
|
// Snapshot may already exist from a prior run (continuation, or
|
|
256
296
|
// restart-after-crash with the same swarmId). Record this BEFORE any
|
|
257
297
|
// spawnRole writes a new one — cleanup must not delete what wasn't ours.
|
|
@@ -283,6 +323,8 @@ export class SwarmCoordinator {
|
|
|
283
323
|
customDefinition: spec.customDefinition,
|
|
284
324
|
backendOverride: spec.backend,
|
|
285
325
|
sandboxOverride: spec.sandbox,
|
|
326
|
+
modelOverride: spec.model,
|
|
327
|
+
modeOverride: spec.mode,
|
|
286
328
|
});
|
|
287
329
|
trackOpen(role);
|
|
288
330
|
}
|
|
@@ -529,7 +571,7 @@ export class SwarmCoordinator {
|
|
|
529
571
|
}
|
|
530
572
|
/** Spawn a new role instance in a swarm (real implementation, serialized by spawnRole). */
|
|
531
573
|
async doSpawnRole(swarmId, roleName, opts = {}) {
|
|
532
|
-
const { taskPrompt, customPrompt, customDefinition, additionalDirs, resumeId, presetInstanceId, backendOverride, sandboxOverride, isDynamicAdd, } = opts;
|
|
574
|
+
const { taskPrompt, customPrompt, customDefinition, additionalDirs, resumeId, presetInstanceId, backendOverride, sandboxOverride, modelOverride, modeOverride, isDynamicAdd, } = opts;
|
|
533
575
|
const swarm = this.swarms.get(swarmId);
|
|
534
576
|
if (!swarm)
|
|
535
577
|
throw new Error(`Swarm ${swarmId} not found`);
|
|
@@ -545,6 +587,8 @@ export class SwarmCoordinator {
|
|
|
545
587
|
color: customDefinition.color,
|
|
546
588
|
promptBody: customDefinition.promptBody,
|
|
547
589
|
backend: customDefinition.backend,
|
|
590
|
+
model: customDefinition.model,
|
|
591
|
+
mode: customDefinition.mode,
|
|
548
592
|
};
|
|
549
593
|
}
|
|
550
594
|
else {
|
|
@@ -556,16 +600,26 @@ export class SwarmCoordinator {
|
|
|
556
600
|
}
|
|
557
601
|
// Per-spawn backend override (UI selector) takes precedence over the
|
|
558
602
|
// role definition's static backend. Frozen here for the lifetime of the
|
|
559
|
-
// role instance.
|
|
560
|
-
|
|
603
|
+
// role instance. Use !== undefined (not truthy) so callers can opt out
|
|
604
|
+
// explicitly with an empty string in the future without being ignored.
|
|
605
|
+
if (backendOverride !== undefined) {
|
|
561
606
|
definition = { ...definition, backend: backendOverride };
|
|
562
607
|
}
|
|
563
608
|
// Per-spawn sandbox override — same precedence rule. Each adapter
|
|
564
609
|
// maps the abstract level to its own permission model (see
|
|
565
610
|
// SpawnOptions.sandbox in @mclawnet/agent).
|
|
566
|
-
if (sandboxOverride) {
|
|
611
|
+
if (sandboxOverride !== undefined) {
|
|
567
612
|
definition = { ...definition, sandbox: sandboxOverride };
|
|
568
613
|
}
|
|
614
|
+
// N4.5 per-spawn sticky model / mode override (UI ModelPicker / ModePicker).
|
|
615
|
+
// Same precedence rule as backend/sandbox: per-spawn override wins over
|
|
616
|
+
// any value baked into the role definition (frontmatter or customDefinition).
|
|
617
|
+
if (modelOverride !== undefined) {
|
|
618
|
+
definition = { ...definition, model: modelOverride };
|
|
619
|
+
}
|
|
620
|
+
if (modeOverride !== undefined) {
|
|
621
|
+
definition = { ...definition, mode: modeOverride };
|
|
622
|
+
}
|
|
569
623
|
// Final default: role files don't currently declare `sandbox`, and not
|
|
570
624
|
// every caller passes an override (e.g. legacy recovery, programmatic
|
|
571
625
|
// spawns). Pin to DEFAULT_SANDBOX so snapshots and the membership-change
|
|
@@ -634,7 +688,7 @@ export class SwarmCoordinator {
|
|
|
634
688
|
try {
|
|
635
689
|
await this.sessionAdapter.createSession({
|
|
636
690
|
sessionId: roleSessionId,
|
|
637
|
-
workDir: swarm.workDir,
|
|
691
|
+
workDir: swarm.workspace?.cwd ?? swarm.workDir,
|
|
638
692
|
systemPrompt: finalPrompt,
|
|
639
693
|
roleId,
|
|
640
694
|
additionalDirs,
|
|
@@ -646,6 +700,20 @@ export class SwarmCoordinator {
|
|
|
646
700
|
disallowedTools: tools.disallowedTools,
|
|
647
701
|
backend: definition.backend,
|
|
648
702
|
sandbox: definition.sandbox,
|
|
703
|
+
model: definition.model,
|
|
704
|
+
mode: definition.mode,
|
|
705
|
+
// M6 T7: when the swarm is running inside a prepared workspace (worktree
|
|
706
|
+
// or snapshot), the role's cwd is the workspace path — NOT the original
|
|
707
|
+
// project root. MCP tools (inbox / task / wakeup) take a `workDir` arg
|
|
708
|
+
// that the LLM typically derives from `process.cwd()`, which would now
|
|
709
|
+
// land in a per-worktree namespace and break cross-swarm routing.
|
|
710
|
+
// Expose the original project root via env so MCP tools can fall back
|
|
711
|
+
// to it when `workDir` is missing or when the caller wants the canonical
|
|
712
|
+
// namespace. Always set (even when no workspace) so tools have a
|
|
713
|
+
// consistent fallback.
|
|
714
|
+
...(swarm.workDir
|
|
715
|
+
? { env: { CLAWNET_PROJECT_ROOT: swarm.workDir } }
|
|
716
|
+
: {}),
|
|
649
717
|
});
|
|
650
718
|
sessionOpened = true;
|
|
651
719
|
}
|
|
@@ -782,6 +850,27 @@ export class SwarmCoordinator {
|
|
|
782
850
|
planStatus: snapshot.planStatus ?? "none",
|
|
783
851
|
};
|
|
784
852
|
this.swarms.set(swarmId, swarm);
|
|
853
|
+
// M6 T8: re-adopt the per-swarm workspace from the snapshot. We do this
|
|
854
|
+
// BEFORE respawning roles so spawnRole sees the correct workspace.cwd and
|
|
855
|
+
// routes the role into the same worktree the previous session used. If the
|
|
856
|
+
// workspace directory disappeared between sessions (e.g. user `rm -rf`'d
|
|
857
|
+
// it), fall back to the main workDir without throwing.
|
|
858
|
+
if (snapshot.workspace) {
|
|
859
|
+
const { existsSync } = await import("node:fs");
|
|
860
|
+
if (existsSync(snapshot.workspace.cwd)) {
|
|
861
|
+
this.workspaceManager.adopt(snapshot.workspace);
|
|
862
|
+
swarm.workspace = snapshot.workspace;
|
|
863
|
+
log.info({ swarmId, cwd: snapshot.workspace.cwd, strategy: snapshot.workspace.strategy }, "workspace adopted from snapshot");
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
866
|
+
log.warn({ swarmId, cwd: snapshot.workspace.cwd }, "workspace dir missing on disk (deleted between sessions); swarm falls back to main workDir");
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
// M6.1 T7: Restore shipment result from snapshot (one-shot — never re-run
|
|
870
|
+
// shipment on recover, only surface the previous outcome to the UI).
|
|
871
|
+
if (snapshot.shipment) {
|
|
872
|
+
swarm.shipment = snapshot.shipment;
|
|
873
|
+
}
|
|
785
874
|
// Respawn each role with the same instanceId, passing backendSessionId
|
|
786
875
|
// through as resumeId so SessionAdapter can `--resume` the conversation.
|
|
787
876
|
// Suppress per-role snapshot writes — we save once at the end with the
|
|
@@ -946,6 +1035,14 @@ export class SwarmCoordinator {
|
|
|
946
1035
|
else {
|
|
947
1036
|
log.warn({ swarmId }, "destroy: swarm.workDir missing, cannot delete snapshot");
|
|
948
1037
|
}
|
|
1038
|
+
// M6: dispose the per-swarm workspace (git worktree or snapshot copy).
|
|
1039
|
+
// Best-effort: never block destroy on filesystem cleanup.
|
|
1040
|
+
try {
|
|
1041
|
+
await this.workspaceManager.dispose(swarmId, { keep: false });
|
|
1042
|
+
}
|
|
1043
|
+
catch (err) {
|
|
1044
|
+
log.warn({ err, swarmId }, "workspace dispose failed (best-effort)");
|
|
1045
|
+
}
|
|
949
1046
|
log.info({ swarmId }, "swarm destroyed");
|
|
950
1047
|
}
|
|
951
1048
|
/** Check if a session ID belongs to any swarm. */
|
|
@@ -1119,6 +1216,30 @@ export class SwarmCoordinator {
|
|
|
1119
1216
|
* idempotent so duplicate reviewer envelopes (e.g. retries) are safe.
|
|
1120
1217
|
*/
|
|
1121
1218
|
async handleInterceptedMessage(swarmId, instanceId, msg) {
|
|
1219
|
+
// PR-B Sub-PR-B2 — `swarm_complete_request` (queen → self via the
|
|
1220
|
+
// `swarm_complete` MCP tool). Coordinator runs the full cleanup chain
|
|
1221
|
+
// (runRetroAndCleanup → closeSession → workspace dispose → shipment).
|
|
1222
|
+
// Returns true to drop the raw message from the LLM payload.
|
|
1223
|
+
if (msg.type === "swarm_complete_request") {
|
|
1224
|
+
// Authorization: only queen instances may complete a swarm. The MCP
|
|
1225
|
+
// tool's `from.startsWith("queen-")` guard is advisory across the
|
|
1226
|
+
// process boundary — enforce again at the trust boundary.
|
|
1227
|
+
if (!msg.from.startsWith("queen-")) {
|
|
1228
|
+
log.warn({ swarmId, instanceId, msgId: msg.id, from: msg.from }, "swarm_complete_request interceptor: rejected non-queen sender — consuming");
|
|
1229
|
+
return true;
|
|
1230
|
+
}
|
|
1231
|
+
log.info({ swarmId, instanceId, from: msg.from, msgId: msg.id }, "swarm_complete_request interceptor: queen requested completion — running cleanup");
|
|
1232
|
+
try {
|
|
1233
|
+
await this.complete(swarmId);
|
|
1234
|
+
}
|
|
1235
|
+
catch (err) {
|
|
1236
|
+
// Best-effort: complete() is idempotent. A failure here would mean
|
|
1237
|
+
// the swarm stays alive after the queen tried to close it; the
|
|
1238
|
+
// runner's D14 paused-fallback or a manual UI cancel will catch it.
|
|
1239
|
+
log.warn({ err, swarmId, from: msg.from }, "swarm_complete_request interceptor: complete() threw — leaving swarm for fallback paths");
|
|
1240
|
+
}
|
|
1241
|
+
return true;
|
|
1242
|
+
}
|
|
1122
1243
|
if (msg.type !== "plan_review_result")
|
|
1123
1244
|
return false;
|
|
1124
1245
|
// Authorization: only reviewer instances may flip planStatus via this path.
|
|
@@ -1349,6 +1470,68 @@ export class SwarmCoordinator {
|
|
|
1349
1470
|
for (const role of swarm.roles.values()) {
|
|
1350
1471
|
await this.sessionAdapter.closeSession(role.roleSessionId).catch(() => { });
|
|
1351
1472
|
}
|
|
1473
|
+
// 3.5 M6.1: Shipment — compute diff, generate report, try PR / write
|
|
1474
|
+
// fallback artifacts. Best-effort: never block destroy. Runs after role
|
|
1475
|
+
// sessions are closed (so git commands don't race with role processes)
|
|
1476
|
+
// and before workspace dispose / snapshot delete (so the worktree dir
|
|
1477
|
+
// still exists and the snapshot can record the result for M6.2 UI).
|
|
1478
|
+
// Skips snapshot-copy and missing workspaces — git-worktree only.
|
|
1479
|
+
if (swarm.workspace && swarm.workspace.strategy === "git-worktree") {
|
|
1480
|
+
if (swarm.shipment) {
|
|
1481
|
+
// Re-entrancy guard: double-destroy must not re-run shipment and
|
|
1482
|
+
// overwrite the first result. Existing snapshot already has the
|
|
1483
|
+
// outcome from the prior call (or from recovery restoration above).
|
|
1484
|
+
log.info({ swarmId, existing: swarm.shipment.strategy }, "shipment already ran; skipping re-entry");
|
|
1485
|
+
}
|
|
1486
|
+
else {
|
|
1487
|
+
try {
|
|
1488
|
+
const { runShipment } = await import("./shipment/shipment-pipeline.js");
|
|
1489
|
+
const result = await runShipment({ swarm });
|
|
1490
|
+
swarm.shipment = result;
|
|
1491
|
+
log.info({ swarmId, strategy: result.strategy, prUrl: result.prUrl, error: result.error }, "shipment complete");
|
|
1492
|
+
// M6.2.0: persist to dedicated shipment.json *first* — this file
|
|
1493
|
+
// survives `deleteSwarmSnapshot` below (which only wipes
|
|
1494
|
+
// recovery.json), so the M6.2 UI can still read the outcome after
|
|
1495
|
+
// the workspace is disposed. Done before saveSwarmSnapshot so a
|
|
1496
|
+
// snapshot-write failure can't strand the shipment outcome.
|
|
1497
|
+
if (swarm.workDir) {
|
|
1498
|
+
try {
|
|
1499
|
+
saveShipmentResult(swarm.workDir, swarmId, result);
|
|
1500
|
+
}
|
|
1501
|
+
catch (err) {
|
|
1502
|
+
log.warn({ err, swarmId }, "shipment: saveShipmentResult failed");
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
// Persist so M6.2 UI can read it after dispose.
|
|
1506
|
+
if (swarm.workDir) {
|
|
1507
|
+
try {
|
|
1508
|
+
saveSwarmSnapshot(swarm);
|
|
1509
|
+
}
|
|
1510
|
+
catch (err) {
|
|
1511
|
+
log.warn({ err, swarmId }, "shipment snapshot save failed");
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
// M6.2.1: best-effort live push to the hub so the UI can react
|
|
1515
|
+
// immediately without waiting for the user to reload. The file
|
|
1516
|
+
// (shipment.json) already saved above is the source of truth; this
|
|
1517
|
+
// push is purely a notification. Swallow all errors so a flaky hub
|
|
1518
|
+
// connection can never block destroy.
|
|
1519
|
+
try {
|
|
1520
|
+
this.hub.send({
|
|
1521
|
+
type: "swarm.shipment",
|
|
1522
|
+
sessionId: swarmId,
|
|
1523
|
+
shipment: result,
|
|
1524
|
+
});
|
|
1525
|
+
}
|
|
1526
|
+
catch (err) {
|
|
1527
|
+
log.warn({ err, swarmId }, "shipment: hub push failed (best-effort, file already saved)");
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
catch (err) {
|
|
1531
|
+
log.warn({ swarmId, err }, "shipment failed (best-effort)");
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1352
1535
|
// 4. Delete recovery.json (keep messages.jsonl)
|
|
1353
1536
|
if (swarm.workDir) {
|
|
1354
1537
|
// Detach tasks before deleting snapshot — keeps task index consistent
|
|
@@ -1715,7 +1898,7 @@ ${planJson}
|
|
|
1715
1898
|
await this.deliverInbox(swarm, queen.instanceId, {
|
|
1716
1899
|
from: "system",
|
|
1717
1900
|
type: "system",
|
|
1718
|
-
data: `[系统] 蜂群已自动暂停。连续${swarm.maxIdleChecks}
|
|
1901
|
+
data: `[系统] 蜂群已自动暂停。连续${swarm.maxIdleChecks}次巡查发现所有成员空闲。注意:资源(CLI 进程、worktree、内存)仍占用——如不再需要请 cancel 释放,或 resume 继续。Queen 任务完成后应该显式调 swarm_complete 工具,而不是依赖此暂停兜底。`,
|
|
1719
1902
|
});
|
|
1720
1903
|
log.info({ swarmId, idleChecks: swarm.maxIdleChecks }, "swarm auto-paused");
|
|
1721
1904
|
return; // Don't schedule next tick
|