specweave 3.0.3 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/README.md +2 -2
  3. package/bin/specweave.js +12 -7
  4. package/bin/startup-check.js +1 -1
  5. package/dist/src/cli/commands/auto-handoff.d.ts +17 -23
  6. package/dist/src/cli/commands/auto-handoff.d.ts.map +1 -1
  7. package/dist/src/cli/commands/auto-handoff.js +140 -65
  8. package/dist/src/cli/commands/auto-handoff.js.map +1 -1
  9. package/dist/src/cli/commands/handoff.d.ts +10 -0
  10. package/dist/src/cli/commands/handoff.d.ts.map +1 -1
  11. package/dist/src/cli/commands/handoff.js +50 -0
  12. package/dist/src/cli/commands/handoff.js.map +1 -1
  13. package/dist/src/cli/commands/jev-helpers.d.ts +1 -1
  14. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -1
  15. package/dist/src/cli/commands/jev-helpers.js +8 -4
  16. package/dist/src/cli/commands/jev-helpers.js.map +1 -1
  17. package/dist/src/cli/commands/jev.js +4 -4
  18. package/dist/src/cli/commands/jev.js.map +1 -1
  19. package/dist/src/cli/commands/pickup.d.ts +11 -0
  20. package/dist/src/cli/commands/pickup.d.ts.map +1 -1
  21. package/dist/src/cli/commands/pickup.js +28 -8
  22. package/dist/src/cli/commands/pickup.js.map +1 -1
  23. package/dist/src/cli/helpers/init/gitignore-generator.d.ts.map +1 -1
  24. package/dist/src/cli/helpers/init/gitignore-generator.js +26 -5
  25. package/dist/src/cli/helpers/init/gitignore-generator.js.map +1 -1
  26. package/dist/src/core/config/types.d.ts +2 -2
  27. package/dist/src/core/config/types.d.ts.map +1 -1
  28. package/dist/src/core/jev/client.d.ts +4 -1
  29. package/dist/src/core/jev/client.d.ts.map +1 -1
  30. package/dist/src/core/jev/client.js +118 -23
  31. package/dist/src/core/jev/client.js.map +1 -1
  32. package/dist/src/core/jev/config.d.ts +1 -1
  33. package/dist/src/core/jev/config.d.ts.map +1 -1
  34. package/dist/src/core/jev/config.js +8 -3
  35. package/dist/src/core/jev/config.js.map +1 -1
  36. package/dist/src/core/jev/openai.d.ts +21 -0
  37. package/dist/src/core/jev/openai.d.ts.map +1 -0
  38. package/dist/src/core/jev/openai.js +116 -0
  39. package/dist/src/core/jev/openai.js.map +1 -0
  40. package/dist/src/core/jev/usage.d.ts +4 -0
  41. package/dist/src/core/jev/usage.d.ts.map +1 -1
  42. package/dist/src/core/jev/usage.js +3 -0
  43. package/dist/src/core/jev/usage.js.map +1 -1
  44. package/dist/src/core/session/checkpoint-worker.d.ts +2 -0
  45. package/dist/src/core/session/checkpoint-worker.d.ts.map +1 -0
  46. package/dist/src/core/session/checkpoint-worker.js +43 -0
  47. package/dist/src/core/session/checkpoint-worker.js.map +1 -0
  48. package/dist/src/core/session/handoff-all.d.ts +124 -0
  49. package/dist/src/core/session/handoff-all.d.ts.map +1 -0
  50. package/dist/src/core/session/handoff-all.js +429 -0
  51. package/dist/src/core/session/handoff-all.js.map +1 -0
  52. package/dist/src/core/session/handoff-doc-format.d.ts +9 -0
  53. package/dist/src/core/session/handoff-doc-format.d.ts.map +1 -1
  54. package/dist/src/core/session/handoff-doc-format.js +28 -4
  55. package/dist/src/core/session/handoff-doc-format.js.map +1 -1
  56. package/dist/src/core/session/handoff-git-state.d.ts +3 -1
  57. package/dist/src/core/session/handoff-git-state.d.ts.map +1 -1
  58. package/dist/src/core/session/handoff-git-state.js +32 -12
  59. package/dist/src/core/session/handoff-git-state.js.map +1 -1
  60. package/dist/src/core/session/handoff-report.js +1 -0
  61. package/dist/src/core/session/handoff-report.js.map +1 -1
  62. package/dist/src/core/session/nested-repos.d.ts +90 -0
  63. package/dist/src/core/session/nested-repos.d.ts.map +1 -0
  64. package/dist/src/core/session/nested-repos.js +239 -0
  65. package/dist/src/core/session/nested-repos.js.map +1 -0
  66. package/dist/src/core/session/pickup.d.ts +1 -0
  67. package/dist/src/core/session/pickup.d.ts.map +1 -1
  68. package/dist/src/core/session/pickup.js +4 -4
  69. package/dist/src/core/session/pickup.js.map +1 -1
  70. package/dist/src/core/session/session-checkpoint.d.ts +46 -0
  71. package/dist/src/core/session/session-checkpoint.d.ts.map +1 -0
  72. package/dist/src/core/session/session-checkpoint.js +262 -0
  73. package/dist/src/core/session/session-checkpoint.js.map +1 -0
  74. package/dist/src/core/session/usage-guard.d.ts +59 -51
  75. package/dist/src/core/session/usage-guard.d.ts.map +1 -1
  76. package/dist/src/core/session/usage-guard.js +148 -88
  77. package/dist/src/core/session/usage-guard.js.map +1 -1
  78. package/dist/src/core/session/work-handoff.d.ts +6 -0
  79. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  80. package/dist/src/core/session/work-handoff.js +55 -13
  81. package/dist/src/core/session/work-handoff.js.map +1 -1
  82. package/dist/src/core/tasks/ledger.d.ts +5 -1
  83. package/dist/src/core/tasks/ledger.d.ts.map +1 -1
  84. package/dist/src/core/tasks/ledger.js +6 -2
  85. package/dist/src/core/tasks/ledger.js.map +1 -1
  86. package/package.json +1 -1
  87. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  88. package/plugins/specweave/skills/handoff/SKILL.md +54 -9
  89. package/plugins/specweave/skills/jev/SKILL.md +81 -83
  90. package/src/templates/AGENTS.md.template +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"handoff-git-state.d.ts","sourceRoot":"","sources":["../../../../src/core/session/handoff-git-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,qBAAqB,EAAE,OAAO,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EASlD,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,QAAQ,CA8DlF"}
1
+ {"version":3,"file":"handoff-git-state.d.ts","sourceRoot":"","sources":["../../../../src/core/session/handoff-git-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,qBAAqB,EAAE,OAAO,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EASlD,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,QAAQ,CA+EnH"}
@@ -37,17 +37,20 @@ export const BOOKKEEPING_PATHSPECS = [
37
37
  /** Total Git budget leaves headroom below PreCompact's five-second budget. */
38
38
  export const GIT_CAPTURE_BUDGET_MS = 3500;
39
39
  /** Capture through a private index; an interrupted hook never stages user files. */
40
- export function captureGitState(repoRoot, diffOutputPath) {
40
+ export function captureGitState(repoRoot, diffOutputPath, opts = {}) {
41
41
  const empty = {
42
42
  isGitRepo: false, branch: '', shortSha: '', statusPorcelain: '',
43
43
  diffStat: '', hasUncommittedChanges: false,
44
44
  };
45
45
  const deadline = Date.now() + GIT_CAPTURE_BUDGET_MS;
46
46
  const env = { ...process.env, GIT_OPTIONAL_LOCKS: '0' };
47
- function git(args, trim = true) {
47
+ function git(args, trim = true, required = true) {
48
48
  const remaining = deadline - Date.now();
49
- if (remaining <= 0)
49
+ if (remaining <= 0) {
50
+ if (opts.strict)
51
+ throw new Error('checkpoint Git capture budget exceeded');
50
52
  return null;
53
+ }
51
54
  try {
52
55
  const result = execFileSync('git', args, {
53
56
  cwd: repoRoot, env, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
@@ -55,19 +58,32 @@ export function captureGitState(repoRoot, diffOutputPath) {
55
58
  });
56
59
  return trim ? result.trim() : result;
57
60
  }
58
- catch {
61
+ catch (error) {
62
+ // Missing HEAD/upstream are normal. Timeouts and required commands are not.
63
+ if (opts.strict && (required || error.status !== 128 ||
64
+ error.signal || typeof error.code === 'string')) {
65
+ throw new Error('checkpoint Git capture failed');
66
+ }
59
67
  return null;
60
68
  }
61
69
  }
70
+ function writeDiff(content) {
71
+ if (!opts.strict) {
72
+ safeWriteDiff(diffOutputPath, content);
73
+ return;
74
+ }
75
+ fs.mkdirSync(path.dirname(diffOutputPath), { recursive: true });
76
+ fs.writeFileSync(diffOutputPath, content, 'utf8');
77
+ }
62
78
  let temporary;
63
79
  try {
64
- if (git(['rev-parse', '--is-inside-work-tree']) !== 'true') {
65
- safeWriteDiff(diffOutputPath, '');
80
+ if (git(['rev-parse', '--is-inside-work-tree'], true, fs.existsSync(path.join(repoRoot, '.git'))) !== 'true') {
81
+ writeDiff('');
66
82
  return empty;
67
83
  }
68
84
  const indexPath = git(['rev-parse', '--path-format=absolute', '--git-path', 'index']);
69
85
  if (!indexPath) {
70
- safeWriteDiff(diffOutputPath, '');
86
+ writeDiff('');
71
87
  return empty;
72
88
  }
73
89
  temporary = fs.mkdtempSync(path.join(os.tmpdir(), 'specweave-handoff-index-'));
@@ -75,8 +91,8 @@ export function captureGitState(repoRoot, diffOutputPath) {
75
91
  if (fs.existsSync(indexPath))
76
92
  fs.copyFileSync(indexPath, privateIndex);
77
93
  Object.assign(env, { GIT_INDEX_FILE: privateIndex });
78
- const branch = git(['rev-parse', '--abbrev-ref', 'HEAD']) ?? '';
79
- const shortSha = git(['rev-parse', '--short', 'HEAD']) ?? '';
94
+ const branch = git(['rev-parse', '--abbrev-ref', 'HEAD'], true, false) ?? '';
95
+ const shortSha = git(['rev-parse', '--short', 'HEAD'], true, false) ?? '';
80
96
  const scope = ['--', '.', ...BOOKKEEPING_PATHSPECS];
81
97
  const statusPorcelain = git(['status', '--porcelain', ...scope]) ?? '';
82
98
  // NUL-delimited paths handle spaces, quotes, Unicode and embedded newlines.
@@ -91,9 +107,11 @@ export function captureGitState(repoRoot, diffOutputPath) {
91
107
  const stagedDiff = (hasHead ? git([...staged, ...scope]) : '') ?? '';
92
108
  const workingStat = git([...working, '--stat', ...scope]) ?? '';
93
109
  const stagedStat = (hasHead ? git([...staged, '--stat', ...scope]) : '') ?? '';
94
- safeWriteDiff(diffOutputPath, [workingDiff, stagedDiff].filter(Boolean).join('\n'));
95
- const upstream = git(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}']) ?? '';
110
+ writeDiff([workingDiff, stagedDiff].filter(Boolean).join('\n'));
111
+ const upstream = git(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], true, false) ?? '';
96
112
  const aheadRaw = upstream ? git(['rev-list', '--count', `${upstream}..HEAD`]) : null;
113
+ if (opts.strict && Date.now() > deadline)
114
+ throw new Error('checkpoint Git capture budget exceeded');
97
115
  return {
98
116
  isGitRepo: true, branch, shortSha, statusPorcelain,
99
117
  diffStat: [workingStat, stagedStat].filter(Boolean).join('\n'),
@@ -102,7 +120,9 @@ export function captureGitState(repoRoot, diffOutputPath) {
102
120
  ahead: aheadRaw !== null && aheadRaw !== '' ? Number(aheadRaw) : undefined,
103
121
  };
104
122
  }
105
- catch {
123
+ catch (error) {
124
+ if (opts.strict)
125
+ throw error;
106
126
  safeWriteDiff(diffOutputPath, '');
107
127
  return empty;
108
128
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handoff-git-state.js","sourceRoot":"","sources":["../../../../src/core/session/handoff-git-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handoff-git-state.js","sourceRoot":"","sources":["../../../../src/core/session/handoff-git-state.ts"],"names":[],"mappings":"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"}
@@ -119,6 +119,7 @@ function label(e) {
119
119
  case 'session': return 'started a session';
120
120
  case 'handoff': return 'handed off';
121
121
  case 'pickup': return 'picked up';
122
+ case 'wait': return 'waits on';
122
123
  }
123
124
  }
124
125
  function toolClass(agent) {
@@ -1 +1 @@
1
- {"version":3,"file":"handoff-report.js","sourceRoot":"","sources":["../../../../src/core/session/handoff-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handoff-report.js","sourceRoot":"","sources":["../../../../src/core/session/handoff-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Nested-repo scan for `specweave handoff --all` (read-only).
3
+ *
4
+ * An umbrella workspace keeps product code in its own Git checkouts under
5
+ * `repositories/<org>/<repo>`, usually gitignored by the umbrella, so the
6
+ * umbrella's own `git status` never sees them. This module lists every
7
+ * checkout there (plus the worktrees Git knows about for each, wherever they
8
+ * live, and the workspace root itself) and reports the ones holding work that
9
+ * exists only on this machine: uncommitted files, commits ahead of the
10
+ * upstream, or a branch with no remote.
11
+ *
12
+ * Nothing here writes: no fetch, no commit, no push. `gh pr list` is asked
13
+ * for the open PR of each flagged branch when `gh` is installed; when it is
14
+ * not, or it fails, the PR column stays empty.
15
+ *
16
+ * @module core/session/nested-repos
17
+ */
18
+ export interface PullRequestInfo {
19
+ number: number;
20
+ url: string;
21
+ state: string;
22
+ isDraft: boolean;
23
+ }
24
+ export interface CheckoutState {
25
+ /** Absolute path of the checkout. */
26
+ path: string;
27
+ /** Path for display: relative to the workspace root when inside it. */
28
+ display: string;
29
+ /** Branch name, or `(detached)`. */
30
+ branch: string;
31
+ detached: boolean;
32
+ /** Short sha of HEAD ('' in an empty repo). */
33
+ sha: string;
34
+ /** Changed, staged and untracked files. */
35
+ dirty: number;
36
+ /** Commits not on the upstream (or on no remote at all when there is no upstream). */
37
+ ahead: number;
38
+ /** `origin/x` style upstream, when one is set and still exists. */
39
+ upstream?: string;
40
+ /** The branch has no upstream and no remote-tracking branch of the same name. */
41
+ noRemote: boolean;
42
+ /** ISO time of the last commit. */
43
+ lastCommitAt?: string;
44
+ /** Open PR for the branch, when `gh` found one. */
45
+ pr?: PullRequestInfo;
46
+ /** 4-digit increment ids found in the path or branch name. */
47
+ incrementIds: string[];
48
+ /** Why it is listed: dirty, ahead, no remote. Empty when the checkout is safe. */
49
+ reasons: string[];
50
+ }
51
+ export type PrLookup = (cwd: string, branch: string) => Promise<PullRequestInfo | undefined>;
52
+ export interface ScanOptions {
53
+ /** 4-digit ids of the increments to map checkouts to. */
54
+ incrementIds?: string[];
55
+ /** Look up PRs (default: `gh pr list` when gh is installed). `false` skips it. */
56
+ prLookup?: PrLookup | false;
57
+ /** Parallel Git processes (default 8). */
58
+ concurrency?: number;
59
+ /** Include the workspace root checkout itself (default true). */
60
+ includeRoot?: boolean;
61
+ }
62
+ export interface NestedRepoScan {
63
+ /** Every checkout found, flagged or not. */
64
+ scanned: number;
65
+ /** Checkouts with local-only work, sorted by path. */
66
+ flagged: CheckoutState[];
67
+ }
68
+ /** `repositories/<org>/<repo>` checkouts (and a checkout directly at `repositories/<repo>`). */
69
+ export declare function findNestedCheckouts(root: string): string[];
70
+ /** Increment ids (4 digits, not part of a longer number) that appear in the text. */
71
+ export declare function matchIncrementIds(text: string, ids: string[]): string[];
72
+ /** Parse `git status --porcelain=v2 --branch` into branch, upstream, ahead and dirty count. */
73
+ export declare function parseStatusV2(out: string): {
74
+ branch: string;
75
+ detached: boolean;
76
+ upstream?: string;
77
+ ahead?: number;
78
+ dirty: number;
79
+ oid?: string;
80
+ };
81
+ /** State of one checkout. Returns null when it is not a readable Git checkout. */
82
+ export declare function inspectCheckout(dir: string, root: string, incrementIds?: string[]): Promise<CheckoutState | null>;
83
+ /** `gh pr list --head <branch>` in the checkout; undefined when gh is missing, fails or finds none. */
84
+ export declare const ghPrLookup: PrLookup;
85
+ /**
86
+ * Scan the workspace root, every nested checkout and their worktrees.
87
+ * Read-only; never throws for a single unreadable checkout.
88
+ */
89
+ export declare function scanNestedRepos(root: string, opts?: ScanOptions): Promise<NestedRepoScan>;
90
+ //# sourceMappingURL=nested-repos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-repos.d.ts","sourceRoot":"","sources":["../../../../src/core/session/nested-repos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kFAAkF;IAClF,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;AAE7F,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAiCD,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ1D;AASD,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEvE;AAED,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAkBhJ;AAED,kFAAkF;AAClF,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA+C3H;AAED,uGAAuG;AACvG,eAAO,MAAM,UAAU,EAAE,QAUxB,CAAC;AAmBF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiCnG"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Nested-repo scan for `specweave handoff --all` (read-only).
3
+ *
4
+ * An umbrella workspace keeps product code in its own Git checkouts under
5
+ * `repositories/<org>/<repo>`, usually gitignored by the umbrella, so the
6
+ * umbrella's own `git status` never sees them. This module lists every
7
+ * checkout there (plus the worktrees Git knows about for each, wherever they
8
+ * live, and the workspace root itself) and reports the ones holding work that
9
+ * exists only on this machine: uncommitted files, commits ahead of the
10
+ * upstream, or a branch with no remote.
11
+ *
12
+ * Nothing here writes: no fetch, no commit, no push. `gh pr list` is asked
13
+ * for the open PR of each flagged branch when `gh` is installed; when it is
14
+ * not, or it fails, the PR column stays empty.
15
+ *
16
+ * @module core/session/nested-repos
17
+ */
18
+ import { execFile } from 'child_process';
19
+ import * as fs from 'fs';
20
+ import * as path from 'path';
21
+ const GIT_TIMEOUT_MS = 15000;
22
+ const GH_TIMEOUT_MS = 15000;
23
+ function run(cmd, args, cwd, timeout = GIT_TIMEOUT_MS) {
24
+ return new Promise((resolve) => {
25
+ execFile(cmd, args, {
26
+ cwd, encoding: 'utf8', timeout, maxBuffer: 16 * 1024 * 1024,
27
+ env: { ...process.env, GIT_OPTIONAL_LOCKS: '0', GIT_TERMINAL_PROMPT: '0', GH_PROMPT_DISABLED: '1', NO_COLOR: '1' },
28
+ }, (err, stdout) => resolve(err ? null : String(stdout)));
29
+ });
30
+ }
31
+ const git = (cwd, args) => run('git', args, cwd);
32
+ /** A directory is a checkout when it has a `.git` folder or a `.git` file (worktree). */
33
+ function isCheckout(dir) {
34
+ try {
35
+ return fs.existsSync(path.join(dir, '.git'));
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ function listDirs(dir) {
42
+ try {
43
+ return fs.readdirSync(dir, { withFileTypes: true })
44
+ .filter((d) => d.isDirectory() && !d.name.startsWith('.'))
45
+ .map((d) => path.join(dir, d.name));
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ function real(p) {
52
+ try {
53
+ return fs.realpathSync(p);
54
+ }
55
+ catch {
56
+ return path.resolve(p);
57
+ }
58
+ }
59
+ /** `repositories/<org>/<repo>` checkouts (and a checkout directly at `repositories/<repo>`). */
60
+ export function findNestedCheckouts(root) {
61
+ const base = path.join(root, 'repositories');
62
+ const found = [];
63
+ for (const first of listDirs(base)) {
64
+ if (isCheckout(first)) {
65
+ found.push(first);
66
+ continue;
67
+ }
68
+ for (const second of listDirs(first))
69
+ if (isCheckout(second))
70
+ found.push(second);
71
+ }
72
+ return found.sort();
73
+ }
74
+ /** Worktrees Git records for a checkout (absolute paths, the checkout itself included). */
75
+ async function listWorktrees(dir) {
76
+ const out = await git(dir, ['worktree', 'list', '--porcelain']);
77
+ if (!out)
78
+ return [];
79
+ return out.split('\n').filter((l) => l.startsWith('worktree ')).map((l) => l.slice('worktree '.length).trim()).filter(Boolean);
80
+ }
81
+ /** Increment ids (4 digits, not part of a longer number) that appear in the text. */
82
+ export function matchIncrementIds(text, ids) {
83
+ return ids.filter((id) => new RegExp(`(?<!\\d)${id}(?!\\d)`).test(text));
84
+ }
85
+ /** Parse `git status --porcelain=v2 --branch` into branch, upstream, ahead and dirty count. */
86
+ export function parseStatusV2(out) {
87
+ let branch = '';
88
+ let upstream;
89
+ let ahead;
90
+ let oid;
91
+ let dirty = 0;
92
+ for (const line of out.split('\n')) {
93
+ if (!line)
94
+ continue;
95
+ if (line.startsWith('# branch.head '))
96
+ branch = line.slice('# branch.head '.length).trim();
97
+ else if (line.startsWith('# branch.upstream '))
98
+ upstream = line.slice('# branch.upstream '.length).trim();
99
+ else if (line.startsWith('# branch.oid '))
100
+ oid = line.slice('# branch.oid '.length).trim();
101
+ else if (line.startsWith('# branch.ab ')) {
102
+ const m = line.match(/\+(\d+)\s+-(\d+)/);
103
+ if (m)
104
+ ahead = Number(m[1]);
105
+ }
106
+ else if (!line.startsWith('#'))
107
+ dirty++;
108
+ }
109
+ const detached = branch === '(detached)' || branch === '';
110
+ return { branch: detached ? '(detached)' : branch, detached, upstream, ahead, dirty, oid: oid === '(initial)' ? undefined : oid };
111
+ }
112
+ /** State of one checkout. Returns null when it is not a readable Git checkout. */
113
+ export async function inspectCheckout(dir, root, incrementIds = []) {
114
+ const status = await git(dir, ['status', '--porcelain=v2', '--branch']);
115
+ if (status === null)
116
+ return null;
117
+ const s = parseStatusV2(status);
118
+ const hasHead = !!s.oid;
119
+ let upstream = s.upstream;
120
+ let ahead = s.ahead;
121
+ let noRemote = false;
122
+ if (upstream && ahead === undefined)
123
+ upstream = undefined; // upstream configured but gone
124
+ if (!upstream && !s.detached) {
125
+ const tracking = hasHead ? await git(dir, ['rev-parse', '--verify', '--quiet', `refs/remotes/origin/${s.branch}`]) : null;
126
+ if (tracking) {
127
+ const n = await git(dir, ['rev-list', '--count', `refs/remotes/origin/${s.branch}..HEAD`]);
128
+ ahead = n ? Number(n.trim()) || 0 : 0;
129
+ }
130
+ else {
131
+ noRemote = true;
132
+ }
133
+ }
134
+ if (ahead === undefined) {
135
+ // No upstream to compare with: count the commits that are on no remote at all.
136
+ const n = hasHead ? await git(dir, ['rev-list', '--count', 'HEAD', '--not', '--remotes']) : null;
137
+ ahead = n ? Number(n.trim()) || 0 : 0;
138
+ }
139
+ const last = hasHead ? (await git(dir, ['log', '-1', '--format=%cI']))?.trim() : undefined;
140
+ const reasons = [];
141
+ if (s.dirty)
142
+ reasons.push('dirty');
143
+ if (ahead)
144
+ reasons.push('ahead');
145
+ if (noRemote)
146
+ reasons.push('no remote');
147
+ const rel = path.relative(root, dir);
148
+ const display = !rel ? '.' : rel.startsWith('..') || path.isAbsolute(rel) ? dir : rel.split(path.sep).join('/');
149
+ return {
150
+ path: dir,
151
+ display,
152
+ branch: s.branch,
153
+ detached: s.detached,
154
+ sha: s.oid ? s.oid.slice(0, 7) : '',
155
+ dirty: s.dirty,
156
+ ahead,
157
+ upstream,
158
+ noRemote,
159
+ lastCommitAt: last || undefined,
160
+ incrementIds: matchIncrementIds(`${path.basename(dir)} ${s.detached ? '' : s.branch}`, incrementIds),
161
+ reasons,
162
+ };
163
+ }
164
+ /** `gh pr list --head <branch>` in the checkout; undefined when gh is missing, fails or finds none. */
165
+ export const ghPrLookup = async (cwd, branch) => {
166
+ const out = await run('gh', ['pr', 'list', '--head', branch, '--json', 'number,url,state,isDraft', '--limit', '1'], cwd, GH_TIMEOUT_MS);
167
+ if (!out)
168
+ return undefined;
169
+ try {
170
+ const list = JSON.parse(out);
171
+ const pr = Array.isArray(list) ? list[0] : undefined;
172
+ return pr && typeof pr.number === 'number' && typeof pr.url === 'string'
173
+ ? { number: pr.number, url: pr.url, state: String(pr.state ?? ''), isDraft: !!pr.isDraft }
174
+ : undefined;
175
+ }
176
+ catch {
177
+ return undefined;
178
+ }
179
+ };
180
+ async function ghAvailable(cwd) {
181
+ return (await run('gh', ['--version'], cwd, 5000)) !== null;
182
+ }
183
+ async function mapLimit(items, limit, fn) {
184
+ const results = new Array(items.length);
185
+ let next = 0;
186
+ const workers = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {
187
+ while (next < items.length) {
188
+ const i = next++;
189
+ results[i] = await fn(items[i]);
190
+ }
191
+ });
192
+ await Promise.all(workers);
193
+ return results;
194
+ }
195
+ /**
196
+ * Scan the workspace root, every nested checkout and their worktrees.
197
+ * Read-only; never throws for a single unreadable checkout.
198
+ */
199
+ export async function scanNestedRepos(root, opts = {}) {
200
+ const concurrency = opts.concurrency ?? 8;
201
+ const ids = opts.incrementIds ?? [];
202
+ const nested = findNestedCheckouts(root);
203
+ // Worktrees recorded by each main checkout, wherever they live (e.g. ../work/0042-x).
204
+ const trees = await mapLimit(nested, concurrency, listWorktrees);
205
+ const seen = new Set();
206
+ const all = [];
207
+ const add = (p) => {
208
+ const key = real(p);
209
+ if (seen.has(key) || !fs.existsSync(p))
210
+ return;
211
+ seen.add(key);
212
+ all.push(p);
213
+ };
214
+ if (opts.includeRoot !== false && isCheckout(root))
215
+ add(root);
216
+ for (const p of nested)
217
+ add(p);
218
+ for (const list of trees)
219
+ for (const p of list)
220
+ add(p);
221
+ // The root's own worktrees (e.g. `work/0042-x` beside the umbrella).
222
+ if (opts.includeRoot !== false && isCheckout(root))
223
+ for (const p of await listWorktrees(root))
224
+ add(p);
225
+ const states = (await mapLimit(all, concurrency, (p) => inspectCheckout(p, root, ids))).filter((s) => !!s);
226
+ const flagged = states.filter((s) => s.reasons.length > 0);
227
+ const lookup = opts.prLookup === false ? undefined : opts.prLookup ?? ((await ghAvailable(root)) ? ghPrLookup : undefined);
228
+ if (lookup) {
229
+ await mapLimit(flagged.filter((s) => !s.detached), Math.min(concurrency, 4), async (s) => {
230
+ try {
231
+ s.pr = await lookup(s.path, s.branch);
232
+ }
233
+ catch { /* skip silently */ }
234
+ });
235
+ }
236
+ flagged.sort((a, b) => (a.display === '.' ? -1 : b.display === '.' ? 1 : a.display.localeCompare(b.display)));
237
+ return { scanned: states.length, flagged };
238
+ }
239
+ //# sourceMappingURL=nested-repos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-repos.js","sourceRoot":"","sources":["../../../../src/core/session/nested-repos.ts"],"names":[],"mappings":"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"}
@@ -31,4 +31,5 @@ export interface PickupResult {
31
31
  export declare function buildPickup(projectRoot: string, opts?: PickupOptions): PickupResult;
32
32
  /** Title: metadata.title → spec.md frontmatter `title:` → first `# ` heading. */
33
33
  export declare function readTitle(incDir: string): string;
34
+ export declare function ageMs(ms: number): string;
34
35
  //# sourceMappingURL=pickup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pickup.d.ts","sourceRoot":"","sources":["../../../../src/core/session/pickup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,eAAO,MAAM,iBAAiB,gCAAgC,CAAC;AAM/D,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,YAAY,CAgDvF;AAiFD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQhD"}
1
+ {"version":3,"file":"pickup.d.ts","sourceRoot":"","sources":["../../../../src/core/session/pickup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,eAAO,MAAM,iBAAiB,gCAAgC,CAAC;AAM/D,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,YAAY,CAgDvF;AAiFD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQhD;AAiHD,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKxC"}
@@ -195,8 +195,8 @@ function lastHandoff(projectRoot, incDirs) {
195
195
  event = { e: last, dir };
196
196
  }
197
197
  if (event) {
198
- const docPath = path.join(event.dir, 'handoff.md');
199
- const where = fs.existsSync(docPath) ? ` → ${rel(projectRoot, docPath)}` : '';
198
+ const docs = ['handoff.md', 'handoff.auto.md'].map((f) => path.join(event.dir, f)).filter((p) => fs.existsSync(p));
199
+ const where = docs.length ? ` → ${docs.map((p) => rel(projectRoot, p)).join(' + ')}` : '';
200
200
  return `Last handoff: ${event.e.by} ${age(event.e.at)}${event.e.note ? `: ${oneLine(event.e.note, 200)}` : ''}${where}`;
201
201
  }
202
202
  const doc = newestHandoffDoc(projectRoot, incDirs);
@@ -206,7 +206,7 @@ function lastHandoff(projectRoot, incDirs) {
206
206
  }
207
207
  function newestHandoffDoc(projectRoot, incDirs) {
208
208
  const candidates = [
209
- ...incDirs.map((d) => path.join(d, 'handoff.md')),
209
+ ...incDirs.flatMap((d) => [path.join(d, 'handoff.md'), path.join(d, 'handoff.auto.md')]),
210
210
  path.join(projectRoot, '.specweave', 'state', 'handoff-latest.md'),
211
211
  ];
212
212
  // Canonical owned docs recover older absolute pointers after a project move.
@@ -294,7 +294,7 @@ function age(iso) {
294
294
  const t = iso ? Date.parse(iso) : NaN;
295
295
  return Number.isNaN(t) ? '' : ageMs(t);
296
296
  }
297
- function ageMs(ms) {
297
+ export function ageMs(ms) {
298
298
  const min = Math.max(0, Math.round((Date.now() - ms) / 60000));
299
299
  if (min < 60)
300
300
  return `${min}m ago`;