@mclawnet/swarm 0.1.13 → 0.1.14
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,98 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { mkdtempSync, writeFileSync, rmSync, existsSync } from "node:fs";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { GitWorktreeProvider } from "../workspace/git-worktree-provider.js";
|
|
7
|
+
function setupRepo() {
|
|
8
|
+
const dir = mkdtempSync(join(tmpdir(), "gwp-"));
|
|
9
|
+
execSync("git init -q", { cwd: dir });
|
|
10
|
+
execSync("git config user.email t@t.t && git config user.name t", { cwd: dir, shell: "/bin/sh" });
|
|
11
|
+
writeFileSync(join(dir, "README.md"), "# t\n");
|
|
12
|
+
execSync("git add -A && git commit -q -m init", { cwd: dir, shell: "/bin/sh" });
|
|
13
|
+
return dir;
|
|
14
|
+
}
|
|
15
|
+
describe("GitWorktreeProvider", () => {
|
|
16
|
+
it("isApplicable: true for clean git repo", async () => {
|
|
17
|
+
const dir = setupRepo();
|
|
18
|
+
const p = new GitWorktreeProvider();
|
|
19
|
+
expect(await p.isApplicable(dir)).toBe(true);
|
|
20
|
+
rmSync(dir, { recursive: true, force: true });
|
|
21
|
+
});
|
|
22
|
+
it("isApplicable: false for non-git dir", async () => {
|
|
23
|
+
const dir = mkdtempSync(join(tmpdir(), "non-git-"));
|
|
24
|
+
const p = new GitWorktreeProvider();
|
|
25
|
+
expect(await p.isApplicable(dir)).toBe(false);
|
|
26
|
+
rmSync(dir, { recursive: true, force: true });
|
|
27
|
+
});
|
|
28
|
+
it("isApplicable: false when working tree dirty", async () => {
|
|
29
|
+
const dir = setupRepo();
|
|
30
|
+
writeFileSync(join(dir, "dirty.txt"), "x");
|
|
31
|
+
const p = new GitWorktreeProvider();
|
|
32
|
+
expect(await p.isApplicable(dir)).toBe(false);
|
|
33
|
+
rmSync(dir, { recursive: true, force: true });
|
|
34
|
+
});
|
|
35
|
+
it("prepare: creates worktree at <projectRoot>/.worktrees/<swarmId> on a new branch", async () => {
|
|
36
|
+
const dir = setupRepo();
|
|
37
|
+
const p = new GitWorktreeProvider();
|
|
38
|
+
const h = await p.prepare({ swarmId: "swarm-abc", projectRoot: dir });
|
|
39
|
+
expect(h.cwd).toBe(join(dir, ".worktrees", "swarm-abc"));
|
|
40
|
+
expect(h.strategy).toBe("git-worktree");
|
|
41
|
+
expect(h.metadata.branchName).toBe("clawnet/swarm-swarm-abc");
|
|
42
|
+
expect(existsSync(h.cwd)).toBe(true);
|
|
43
|
+
expect(existsSync(join(h.cwd, "README.md"))).toBe(true);
|
|
44
|
+
await p.dispose(h, { keep: false });
|
|
45
|
+
expect(existsSync(h.cwd)).toBe(false);
|
|
46
|
+
rmSync(dir, { recursive: true, force: true });
|
|
47
|
+
});
|
|
48
|
+
it("dispose: keep=true leaves worktree on disk", async () => {
|
|
49
|
+
const dir = setupRepo();
|
|
50
|
+
const p = new GitWorktreeProvider();
|
|
51
|
+
const h = await p.prepare({ swarmId: "keep-me", projectRoot: dir });
|
|
52
|
+
await p.dispose(h, { keep: true });
|
|
53
|
+
expect(existsSync(h.cwd)).toBe(true);
|
|
54
|
+
rmSync(dir, { recursive: true, force: true });
|
|
55
|
+
});
|
|
56
|
+
it("dispose: idempotent — removing twice does not throw", async () => {
|
|
57
|
+
const dir = setupRepo();
|
|
58
|
+
const p = new GitWorktreeProvider();
|
|
59
|
+
const h = await p.prepare({ swarmId: "idem", projectRoot: dir });
|
|
60
|
+
await p.dispose(h, { keep: false });
|
|
61
|
+
await expect(p.dispose(h, { keep: false })).resolves.not.toThrow();
|
|
62
|
+
rmSync(dir, { recursive: true, force: true });
|
|
63
|
+
});
|
|
64
|
+
// After a crash, a stale worktree dir + branch may exist. A retry with the
|
|
65
|
+
// same swarmId must scrub-and-recreate rather than fail with "already exists".
|
|
66
|
+
it("prepare: scrubs a stale worktree at the same path/branch before re-creating", async () => {
|
|
67
|
+
const dir = setupRepo();
|
|
68
|
+
const p = new GitWorktreeProvider();
|
|
69
|
+
const h1 = await p.prepare({ swarmId: "stale", projectRoot: dir });
|
|
70
|
+
// Simulate a crash: leave files on disk + branch in place; do NOT call dispose.
|
|
71
|
+
writeFileSync(join(h1.cwd, "leftover.txt"), "from old run");
|
|
72
|
+
// Re-prepare with the same swarmId should succeed.
|
|
73
|
+
const h2 = await p.prepare({ swarmId: "stale", projectRoot: dir });
|
|
74
|
+
expect(existsSync(h2.cwd)).toBe(true);
|
|
75
|
+
// The leftover file from h1 must be gone (worktree was scrubbed)
|
|
76
|
+
expect(existsSync(join(h2.cwd, "leftover.txt"))).toBe(false);
|
|
77
|
+
await p.dispose(h2, { keep: false });
|
|
78
|
+
rmSync(dir, { recursive: true, force: true });
|
|
79
|
+
});
|
|
80
|
+
it("dispose: preserves branch with unmerged commits (uses branch -d not -D)", async () => {
|
|
81
|
+
const dir = setupRepo();
|
|
82
|
+
const p = new GitWorktreeProvider();
|
|
83
|
+
const h = await p.prepare({ swarmId: "with-commit", projectRoot: dir });
|
|
84
|
+
// make a commit on the worktree branch — represents work that would be lost
|
|
85
|
+
writeFileSync(join(h.cwd, "x"), "new");
|
|
86
|
+
execSync("git add -A && git commit -q -m work", { cwd: h.cwd, shell: "/bin/sh" });
|
|
87
|
+
await p.dispose(h, { keep: false });
|
|
88
|
+
// worktree dir is removed
|
|
89
|
+
expect(existsSync(h.cwd)).toBe(false);
|
|
90
|
+
// but branch is preserved (branch -d refused because unmerged)
|
|
91
|
+
const branches = execSync("git branch --list 'clawnet/swarm-*'", { cwd: dir }).toString();
|
|
92
|
+
expect(branches).toContain(h.metadata.branchName);
|
|
93
|
+
// cleanup
|
|
94
|
+
execSync(`git -C ${dir} branch -D ${h.metadata.branchName}`, { shell: "/bin/sh" });
|
|
95
|
+
rmSync(dir, { recursive: true, force: true });
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=git-worktree-provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-worktree-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/git-worktree-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore-check.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/gitignore-check.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { mkdtempSync, writeFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { isWorktreesIgnored } from "../workspace/gitignore-check.js";
|
|
6
|
+
describe("isWorktreesIgnored", () => {
|
|
7
|
+
it("true when .gitignore contains .worktrees/", () => {
|
|
8
|
+
const dir = mkdtempSync(join(tmpdir(), "gi-"));
|
|
9
|
+
writeFileSync(join(dir, ".gitignore"), "node_modules/\n.worktrees/\n");
|
|
10
|
+
expect(isWorktreesIgnored(dir)).toBe(true);
|
|
11
|
+
rmSync(dir, { recursive: true, force: true });
|
|
12
|
+
});
|
|
13
|
+
it("true for variants .worktrees, /.worktrees, .worktrees/**", () => {
|
|
14
|
+
const dir = mkdtempSync(join(tmpdir(), "gi-"));
|
|
15
|
+
for (const line of [".worktrees", "/.worktrees", ".worktrees/", "/.worktrees/", ".worktrees/**"]) {
|
|
16
|
+
writeFileSync(join(dir, ".gitignore"), line + "\n");
|
|
17
|
+
expect(isWorktreesIgnored(dir), `line: ${line}`).toBe(true);
|
|
18
|
+
}
|
|
19
|
+
rmSync(dir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
it("false when .gitignore missing the entry", () => {
|
|
22
|
+
const dir = mkdtempSync(join(tmpdir(), "gi-"));
|
|
23
|
+
writeFileSync(join(dir, ".gitignore"), "node_modules/\n");
|
|
24
|
+
expect(isWorktreesIgnored(dir)).toBe(false);
|
|
25
|
+
rmSync(dir, { recursive: true, force: true });
|
|
26
|
+
});
|
|
27
|
+
it("false when .gitignore does not exist", () => {
|
|
28
|
+
const dir = mkdtempSync(join(tmpdir(), "gi-"));
|
|
29
|
+
expect(isWorktreesIgnored(dir)).toBe(false);
|
|
30
|
+
rmSync(dir, { recursive: true, force: true });
|
|
31
|
+
});
|
|
32
|
+
it("ignores commented-out lines", () => {
|
|
33
|
+
const dir = mkdtempSync(join(tmpdir(), "gi-"));
|
|
34
|
+
writeFileSync(join(dir, ".gitignore"), "# .worktrees/\n\n");
|
|
35
|
+
expect(isWorktreesIgnored(dir)).toBe(false);
|
|
36
|
+
rmSync(dir, { recursive: true, force: true });
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=gitignore-check.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore-check.test.js","sourceRoot":"","sources":["../../src/__tests__/gitignore-check.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idea-research-source.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/idea-research-source.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { mkdtempSync, mkdirSync, writeFileSync, utimesSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { encodeCwd } from "@mclawnet/shared";
|
|
6
|
+
import { createIdeaResearchSource, sortIdeasForResearch, parseReportFrontmatter, normaliseConclusion, } from "../always-on/task-sources/idea-research-source.js";
|
|
7
|
+
function makeIdea(over) {
|
|
8
|
+
return {
|
|
9
|
+
id: "i1",
|
|
10
|
+
userId: "u1",
|
|
11
|
+
projectId: encodeCwd("/proj"),
|
|
12
|
+
title: "title",
|
|
13
|
+
body: "",
|
|
14
|
+
status: "idea",
|
|
15
|
+
priority: "medium",
|
|
16
|
+
tags: [],
|
|
17
|
+
sourceSessionId: null,
|
|
18
|
+
sourceMessageId: null,
|
|
19
|
+
sourceSwarmId: null,
|
|
20
|
+
sourceRole: null,
|
|
21
|
+
linkedSessionId: null,
|
|
22
|
+
linkedSwarmTaskId: null,
|
|
23
|
+
researchReports: [],
|
|
24
|
+
researchKind: null,
|
|
25
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
26
|
+
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
27
|
+
...over,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function makeClient(opts) {
|
|
31
|
+
return {
|
|
32
|
+
async list() {
|
|
33
|
+
if (opts.throwOnList)
|
|
34
|
+
throw new Error("net down");
|
|
35
|
+
return opts.list ?? [];
|
|
36
|
+
},
|
|
37
|
+
async get(id) {
|
|
38
|
+
return opts.byId?.[id] ?? opts.list?.find((i) => i.id === id) ?? null;
|
|
39
|
+
},
|
|
40
|
+
async patch(id, partial) {
|
|
41
|
+
opts.onPatch?.(id, partial);
|
|
42
|
+
const base = opts.byId?.[id] ?? opts.list?.find((i) => i.id === id) ?? makeIdea({ id });
|
|
43
|
+
return { ...base, ...partial };
|
|
44
|
+
},
|
|
45
|
+
async create(input) {
|
|
46
|
+
// Not exercised by IdeaResearchSource; satisfies the interface for M8.2.
|
|
47
|
+
return makeIdea({ id: "created", title: input.title });
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// ── parseReportFrontmatter ─────────────────────────────────────────────
|
|
52
|
+
describe("parseReportFrontmatter", () => {
|
|
53
|
+
it("extracts conclusion from a basic frontmatter block", () => {
|
|
54
|
+
const out = parseReportFrontmatter("---\nconclusion: promote\n---\nbody here");
|
|
55
|
+
expect(out).toEqual({ conclusion: "promote" });
|
|
56
|
+
});
|
|
57
|
+
it("returns null when no frontmatter is present", () => {
|
|
58
|
+
expect(parseReportFrontmatter("plain body without delimiters")).toBeNull();
|
|
59
|
+
});
|
|
60
|
+
it("strips quoted values and handles CRLF line endings", () => {
|
|
61
|
+
const out = parseReportFrontmatter("---\r\nconclusion: \"archive\"\r\ntitle: 'foo'\r\n---\r\nbody");
|
|
62
|
+
expect(out).toEqual({ conclusion: "archive", title: "foo" });
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// ── normaliseConclusion ────────────────────────────────────────────────
|
|
66
|
+
describe("normaliseConclusion", () => {
|
|
67
|
+
it("accepts canonical values", () => {
|
|
68
|
+
expect(normaliseConclusion("promote")).toBe("promote");
|
|
69
|
+
expect(normaliseConclusion("archive")).toBe("archive");
|
|
70
|
+
expect(normaliseConclusion("needs-info")).toBe("needs-info");
|
|
71
|
+
});
|
|
72
|
+
it("tolerates casing + whitespace + dash variants", () => {
|
|
73
|
+
expect(normaliseConclusion("PROMOTE")).toBe("promote");
|
|
74
|
+
expect(normaliseConclusion(" Archive ")).toBe("archive");
|
|
75
|
+
expect(normaliseConclusion("needs info")).toBe("needs-info");
|
|
76
|
+
expect(normaliseConclusion("needsInfo")).toBe("needs-info");
|
|
77
|
+
});
|
|
78
|
+
it("returns null for unknown values", () => {
|
|
79
|
+
expect(normaliseConclusion("maybe")).toBeNull();
|
|
80
|
+
expect(normaliseConclusion("")).toBeNull();
|
|
81
|
+
expect(normaliseConclusion(undefined)).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
// ── sortIdeasForResearch ───────────────────────────────────────────────
|
|
85
|
+
describe("sortIdeasForResearch", () => {
|
|
86
|
+
it("sorts priority desc then updatedAt asc", () => {
|
|
87
|
+
const high = makeIdea({ id: "high", priority: "high", updatedAt: "2026-01-05T00:00:00Z" });
|
|
88
|
+
const med1 = makeIdea({ id: "m1", priority: "medium", updatedAt: "2026-01-02T00:00:00Z" });
|
|
89
|
+
const med2 = makeIdea({ id: "m2", priority: "medium", updatedAt: "2026-01-04T00:00:00Z" });
|
|
90
|
+
const low = makeIdea({ id: "low", priority: "low", updatedAt: "2026-01-01T00:00:00Z" });
|
|
91
|
+
const sorted = sortIdeasForResearch([low, med2, high, med1]);
|
|
92
|
+
expect(sorted.map((i) => i.id)).toEqual(["high", "m1", "m2", "low"]);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
// ── IdeaResearchSource ─────────────────────────────────────────────────
|
|
96
|
+
describe("IdeaResearchSource", () => {
|
|
97
|
+
const projectRoot = "/proj";
|
|
98
|
+
const projectId = encodeCwd(projectRoot);
|
|
99
|
+
it("returns null when ideas list is empty", async () => {
|
|
100
|
+
const source = createIdeaResearchSource({ ideasClient: makeClient({ list: [] }) });
|
|
101
|
+
expect(await source.pick(projectRoot)).toBeNull();
|
|
102
|
+
});
|
|
103
|
+
it("filters by status=idea and projectId, picks highest priority oldest first", async () => {
|
|
104
|
+
const ideas = [
|
|
105
|
+
makeIdea({ id: "low", priority: "low", projectId }),
|
|
106
|
+
makeIdea({ id: "highnew", priority: "high", projectId, updatedAt: "2026-02-01T00:00:00Z" }),
|
|
107
|
+
makeIdea({
|
|
108
|
+
id: "highold",
|
|
109
|
+
priority: "high",
|
|
110
|
+
projectId,
|
|
111
|
+
updatedAt: "2026-01-15T00:00:00Z",
|
|
112
|
+
body: "investigate this",
|
|
113
|
+
}),
|
|
114
|
+
// status=todo should NOT be picked up by the research source.
|
|
115
|
+
makeIdea({ id: "todo", priority: "high", status: "todo", projectId }),
|
|
116
|
+
];
|
|
117
|
+
const source = createIdeaResearchSource({ ideasClient: makeClient({ list: ideas }) });
|
|
118
|
+
const ref = await source.pick(projectRoot);
|
|
119
|
+
expect(ref).toEqual({
|
|
120
|
+
id: "highold",
|
|
121
|
+
title: "title",
|
|
122
|
+
description: "investigate this",
|
|
123
|
+
sourceKind: "idea-research",
|
|
124
|
+
sourceId: "highold",
|
|
125
|
+
projectRoot,
|
|
126
|
+
cycleKind: "research",
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
it("returns null when list throws — best-effort", async () => {
|
|
130
|
+
const warn = vi.fn();
|
|
131
|
+
const source = createIdeaResearchSource({
|
|
132
|
+
ideasClient: makeClient({ throwOnList: true }),
|
|
133
|
+
warn,
|
|
134
|
+
});
|
|
135
|
+
expect(await source.pick(projectRoot)).toBeNull();
|
|
136
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
137
|
+
});
|
|
138
|
+
it("onClaim PATCHes researching + researchKind=investigate + linkedSwarmTaskId", async () => {
|
|
139
|
+
const patches = [];
|
|
140
|
+
const source = createIdeaResearchSource({
|
|
141
|
+
ideasClient: makeClient({
|
|
142
|
+
list: [],
|
|
143
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
144
|
+
}),
|
|
145
|
+
});
|
|
146
|
+
await source.onClaim({
|
|
147
|
+
id: "i9",
|
|
148
|
+
title: "x",
|
|
149
|
+
sourceKind: "idea-research",
|
|
150
|
+
sourceId: "i9",
|
|
151
|
+
projectRoot,
|
|
152
|
+
cycleKind: "research",
|
|
153
|
+
}, "swarm-77");
|
|
154
|
+
expect(patches).toEqual([
|
|
155
|
+
{
|
|
156
|
+
id: "i9",
|
|
157
|
+
partial: {
|
|
158
|
+
status: "researching",
|
|
159
|
+
researchKind: "investigate",
|
|
160
|
+
linkedSwarmTaskId: "swarm-77",
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
]);
|
|
164
|
+
});
|
|
165
|
+
it("onFailure reverts to status=idea, clears researchKind + linkedSwarmTaskId", async () => {
|
|
166
|
+
const patches = [];
|
|
167
|
+
const source = createIdeaResearchSource({
|
|
168
|
+
ideasClient: makeClient({
|
|
169
|
+
list: [],
|
|
170
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
171
|
+
}),
|
|
172
|
+
});
|
|
173
|
+
await source.onFailure({ id: "i1", title: "x", sourceId: "i1", projectRoot, cycleKind: "research" }, "swarm-1", "boom");
|
|
174
|
+
expect(patches).toEqual([
|
|
175
|
+
{
|
|
176
|
+
id: "i1",
|
|
177
|
+
partial: {
|
|
178
|
+
status: "idea",
|
|
179
|
+
researchKind: null,
|
|
180
|
+
linkedSwarmTaskId: null,
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
]);
|
|
184
|
+
});
|
|
185
|
+
// ── onSuccess: filesystem-driven transitions ────────────────────────
|
|
186
|
+
function tmpProject() {
|
|
187
|
+
const dir = mkdtempSync(join(tmpdir(), "idea-research-"));
|
|
188
|
+
return {
|
|
189
|
+
dir,
|
|
190
|
+
cleanup: () => {
|
|
191
|
+
try {
|
|
192
|
+
rmSync(dir, { recursive: true, force: true });
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// best-effort
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function writeReport(projDir, ideaId, name, body, mtimeMs) {
|
|
201
|
+
const dir = join(projDir, ".clawnet", "ideas", ideaId);
|
|
202
|
+
mkdirSync(dir, { recursive: true });
|
|
203
|
+
const full = join(dir, name);
|
|
204
|
+
writeFileSync(full, body, "utf-8");
|
|
205
|
+
if (mtimeMs !== undefined) {
|
|
206
|
+
const sec = mtimeMs / 1000;
|
|
207
|
+
utimesSync(full, sec, sec);
|
|
208
|
+
}
|
|
209
|
+
return full;
|
|
210
|
+
}
|
|
211
|
+
it("onSuccess parses promote → status=todo, appends ResearchRef newest-first", async () => {
|
|
212
|
+
const proj = tmpProject();
|
|
213
|
+
try {
|
|
214
|
+
const ideaId = "ix";
|
|
215
|
+
const existingRef = {
|
|
216
|
+
reportPath: ".clawnet/ideas/ix/research-old.md",
|
|
217
|
+
swarmId: "swarm-old",
|
|
218
|
+
conclusion: "needs-info",
|
|
219
|
+
ranAt: "2026-01-01T00:00:00.000Z",
|
|
220
|
+
};
|
|
221
|
+
const idea = makeIdea({
|
|
222
|
+
id: ideaId,
|
|
223
|
+
projectId: encodeCwd(proj.dir),
|
|
224
|
+
researchReports: [existingRef],
|
|
225
|
+
});
|
|
226
|
+
writeReport(proj.dir, ideaId, "research-2026-06-06T00:00:00Z.md", "---\nconclusion: promote\n---\nbody");
|
|
227
|
+
const patches = [];
|
|
228
|
+
const source = createIdeaResearchSource({
|
|
229
|
+
ideasClient: makeClient({
|
|
230
|
+
byId: { [ideaId]: idea },
|
|
231
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
232
|
+
}),
|
|
233
|
+
now: () => new Date("2026-06-06T00:00:00.000Z"),
|
|
234
|
+
});
|
|
235
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir, cycleKind: "research" }, "swarm-new");
|
|
236
|
+
expect(patches.length).toBe(1);
|
|
237
|
+
const { partial } = patches[0];
|
|
238
|
+
expect(partial.status).toBe("todo");
|
|
239
|
+
expect(partial.researchKind).toBeNull();
|
|
240
|
+
expect(partial.researchReports[0].conclusion).toBe("promote");
|
|
241
|
+
expect(partial.researchReports[0].swarmId).toBe("swarm-new");
|
|
242
|
+
expect(partial.researchReports[0].reportPath).toMatch(/\.clawnet\/ideas\/ix\/research-/);
|
|
243
|
+
expect(partial.researchReports[1]).toEqual(existingRef);
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
proj.cleanup();
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
it("onSuccess archive → status=archived", async () => {
|
|
250
|
+
const proj = tmpProject();
|
|
251
|
+
try {
|
|
252
|
+
const ideaId = "ia";
|
|
253
|
+
writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: archive\n---\nbody");
|
|
254
|
+
const patches = [];
|
|
255
|
+
const source = createIdeaResearchSource({
|
|
256
|
+
ideasClient: makeClient({
|
|
257
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
258
|
+
}),
|
|
259
|
+
});
|
|
260
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
|
|
261
|
+
expect(patches[0].partial.status).toBe("archived");
|
|
262
|
+
expect(patches[0].partial.researchReports[0].conclusion).toBe("archive");
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
proj.cleanup();
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
it("onSuccess needs-info → status=idea", async () => {
|
|
269
|
+
const proj = tmpProject();
|
|
270
|
+
try {
|
|
271
|
+
const ideaId = "in";
|
|
272
|
+
writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: needs-info\n---\nbody");
|
|
273
|
+
const patches = [];
|
|
274
|
+
const source = createIdeaResearchSource({
|
|
275
|
+
ideasClient: makeClient({
|
|
276
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
277
|
+
}),
|
|
278
|
+
});
|
|
279
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
|
|
280
|
+
expect(patches[0].partial.status).toBe("idea");
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
proj.cleanup();
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
it("onSuccess missing report → needs-info / status=idea", async () => {
|
|
287
|
+
const proj = tmpProject();
|
|
288
|
+
try {
|
|
289
|
+
const ideaId = "imiss";
|
|
290
|
+
// No file written.
|
|
291
|
+
const patches = [];
|
|
292
|
+
const warn = vi.fn();
|
|
293
|
+
const source = createIdeaResearchSource({
|
|
294
|
+
ideasClient: makeClient({
|
|
295
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
296
|
+
}),
|
|
297
|
+
warn,
|
|
298
|
+
});
|
|
299
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
|
|
300
|
+
expect(patches[0].partial.status).toBe("idea");
|
|
301
|
+
expect(patches[0].partial.researchReports[0].conclusion).toBe("needs-info");
|
|
302
|
+
expect(warn).toHaveBeenCalled();
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
proj.cleanup();
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
it("onSuccess malformed frontmatter → needs-info", async () => {
|
|
309
|
+
const proj = tmpProject();
|
|
310
|
+
try {
|
|
311
|
+
const ideaId = "ibad";
|
|
312
|
+
writeReport(proj.dir, ideaId, "research-x.md", "no frontmatter at all\njust prose");
|
|
313
|
+
const patches = [];
|
|
314
|
+
const source = createIdeaResearchSource({
|
|
315
|
+
ideasClient: makeClient({
|
|
316
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
317
|
+
}),
|
|
318
|
+
});
|
|
319
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
|
|
320
|
+
expect(patches[0].partial.status).toBe("idea");
|
|
321
|
+
expect(patches[0].partial.researchReports[0].conclusion).toBe("needs-info");
|
|
322
|
+
}
|
|
323
|
+
finally {
|
|
324
|
+
proj.cleanup();
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
it("onSuccess picks the newest report when multiple exist", async () => {
|
|
328
|
+
const proj = tmpProject();
|
|
329
|
+
try {
|
|
330
|
+
const ideaId = "imulti";
|
|
331
|
+
// Old report — archive.
|
|
332
|
+
writeReport(proj.dir, ideaId, "research-2026-01-01T00:00:00Z.md", "---\nconclusion: archive\n---\nbody", Date.parse("2026-01-01T00:00:00Z"));
|
|
333
|
+
// Newest — promote.
|
|
334
|
+
writeReport(proj.dir, ideaId, "research-2026-06-06T00:00:00Z.md", "---\nconclusion: promote\n---\nbody", Date.parse("2026-06-06T00:00:00Z"));
|
|
335
|
+
const patches = [];
|
|
336
|
+
const source = createIdeaResearchSource({
|
|
337
|
+
ideasClient: makeClient({
|
|
338
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
339
|
+
}),
|
|
340
|
+
});
|
|
341
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
|
|
342
|
+
expect(patches[0].partial.status).toBe("todo");
|
|
343
|
+
expect(patches[0].partial.researchReports[0].conclusion).toBe("promote");
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
proj.cleanup();
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
it("onSuccess tolerates conclusion casing variants", async () => {
|
|
350
|
+
const proj = tmpProject();
|
|
351
|
+
try {
|
|
352
|
+
const ideaId = "icase";
|
|
353
|
+
writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: PROMOTE\n---\nbody");
|
|
354
|
+
const patches = [];
|
|
355
|
+
const source = createIdeaResearchSource({
|
|
356
|
+
ideasClient: makeClient({
|
|
357
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
358
|
+
}),
|
|
359
|
+
});
|
|
360
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
|
|
361
|
+
expect(patches[0].partial.status).toBe("todo");
|
|
362
|
+
}
|
|
363
|
+
finally {
|
|
364
|
+
proj.cleanup();
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
it("M8 hotfix I5 — storedReportPath uses path.relative (no startsWith leak across sibling dirs)", async () => {
|
|
368
|
+
// Simulate the dangerous case from the brief: report path
|
|
369
|
+
// `/x/proj-other/.../report.md` evaluated against `/x/proj` as project
|
|
370
|
+
// root. Old code: `reportPath.startsWith(projectRoot)` returned true
|
|
371
|
+
// (substring match) and stripped "/x/proj" leaving "-other/.../report.md".
|
|
372
|
+
// New code: path.relative returns "../proj-other/.../report.md" which
|
|
373
|
+
// starts with ".." → we fall back to the absolute path.
|
|
374
|
+
const proj = tmpProject();
|
|
375
|
+
try {
|
|
376
|
+
const ideaId = "irel";
|
|
377
|
+
const otherProj = mkdtempSync(join(tmpdir(), `${proj.dir.split(/[\\/]/).pop()}-other-`));
|
|
378
|
+
try {
|
|
379
|
+
const reportInSibling = writeReport(otherProj, ideaId, "research-x.md", "---\nconclusion: promote\n---\nbody");
|
|
380
|
+
const patches = [];
|
|
381
|
+
const source = createIdeaResearchSource({
|
|
382
|
+
ideasClient: makeClient({
|
|
383
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
384
|
+
}),
|
|
385
|
+
// Force the resolver to point at the sibling tree (outside proj.dir).
|
|
386
|
+
resolveReportDir: () => join(otherProj, ".clawnet", "ideas", ideaId),
|
|
387
|
+
});
|
|
388
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-rel");
|
|
389
|
+
const stored = patches[0].partial.researchReports[0].reportPath;
|
|
390
|
+
// Must NOT begin with a stripped prefix like "-other/..."; should
|
|
391
|
+
// be either the absolute path or start with ".." (we accept either —
|
|
392
|
+
// implementation falls back to the absolute path).
|
|
393
|
+
expect(stored).toBe(reportInSibling);
|
|
394
|
+
expect(stored.startsWith("-")).toBe(false);
|
|
395
|
+
}
|
|
396
|
+
finally {
|
|
397
|
+
rmSync(otherProj, { recursive: true, force: true });
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
finally {
|
|
401
|
+
proj.cleanup();
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
it("M8 hotfix I5 — storedReportPath is relative without leading slash when inside projectRoot", async () => {
|
|
405
|
+
const proj = tmpProject();
|
|
406
|
+
try {
|
|
407
|
+
const ideaId = "iin";
|
|
408
|
+
writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: promote\n---\nbody");
|
|
409
|
+
const patches = [];
|
|
410
|
+
const source = createIdeaResearchSource({
|
|
411
|
+
ideasClient: makeClient({
|
|
412
|
+
onPatch: (id, partial) => patches.push({ id, partial }),
|
|
413
|
+
}),
|
|
414
|
+
});
|
|
415
|
+
await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-rel-in");
|
|
416
|
+
const stored = patches[0].partial.researchReports[0].reportPath;
|
|
417
|
+
expect(stored).toBe(`.clawnet/ideas/${ideaId}/research-x.md`);
|
|
418
|
+
expect(stored.startsWith("/")).toBe(false);
|
|
419
|
+
}
|
|
420
|
+
finally {
|
|
421
|
+
proj.cleanup();
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
//# sourceMappingURL=idea-research-source.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idea-research-source.test.js","sourceRoot":"","sources":["../../src/__tests__/idea-research-source.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idea-todo-source.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/idea-todo-source.test.ts"],"names":[],"mappings":""}
|