@paths.design/caws-cli 11.1.6 → 11.1.8

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 (190) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +55 -58
  3. package/dist/init/hook-packs/manifest-claude-code.d.ts +1 -1
  4. package/dist/init/hook-packs/manifest-claude-code.d.ts.map +1 -1
  5. package/dist/init/hook-packs/manifest-claude-code.js +317 -6
  6. package/dist/init/hook-packs/manifest-claude-code.js.map +1 -1
  7. package/dist/init/hook-packs/types.js +1 -1
  8. package/dist/init/hook-packs/types.js.map +1 -1
  9. package/dist/shell/binding/resolve-binding.d.ts.map +1 -1
  10. package/dist/shell/binding/resolve-binding.js +105 -1
  11. package/dist/shell/binding/resolve-binding.js.map +1 -1
  12. package/dist/shell/binding/types.d.ts +47 -3
  13. package/dist/shell/binding/types.d.ts.map +1 -1
  14. package/dist/shell/command-metadata.d.ts +93 -0
  15. package/dist/shell/command-metadata.d.ts.map +1 -0
  16. package/dist/shell/command-metadata.js +687 -0
  17. package/dist/shell/command-metadata.js.map +1 -0
  18. package/dist/shell/commands/agents.d.ts +48 -0
  19. package/dist/shell/commands/agents.d.ts.map +1 -0
  20. package/dist/shell/commands/agents.js +577 -0
  21. package/dist/shell/commands/agents.js.map +1 -0
  22. package/dist/shell/commands/claim.d.ts +16 -0
  23. package/dist/shell/commands/claim.d.ts.map +1 -1
  24. package/dist/shell/commands/claim.js +88 -30
  25. package/dist/shell/commands/claim.js.map +1 -1
  26. package/dist/shell/commands/events.d.ts +106 -0
  27. package/dist/shell/commands/events.d.ts.map +1 -0
  28. package/dist/shell/commands/events.js +510 -0
  29. package/dist/shell/commands/events.js.map +1 -0
  30. package/dist/shell/commands/gates.d.ts +2 -2
  31. package/dist/shell/commands/gates.d.ts.map +1 -1
  32. package/dist/shell/commands/gates.js +106 -25
  33. package/dist/shell/commands/gates.js.map +1 -1
  34. package/dist/shell/commands/init.d.ts.map +1 -1
  35. package/dist/shell/commands/init.js +26 -0
  36. package/dist/shell/commands/init.js.map +1 -1
  37. package/dist/shell/commands/prepush.d.ts +26 -0
  38. package/dist/shell/commands/prepush.d.ts.map +1 -0
  39. package/dist/shell/commands/prepush.js +373 -0
  40. package/dist/shell/commands/prepush.js.map +1 -0
  41. package/dist/shell/commands/scope.d.ts.map +1 -1
  42. package/dist/shell/commands/scope.js +31 -1
  43. package/dist/shell/commands/scope.js.map +1 -1
  44. package/dist/shell/commands/specs.d.ts +44 -3
  45. package/dist/shell/commands/specs.d.ts.map +1 -1
  46. package/dist/shell/commands/specs.js +411 -15
  47. package/dist/shell/commands/specs.js.map +1 -1
  48. package/dist/shell/commands/status.d.ts +12 -0
  49. package/dist/shell/commands/status.d.ts.map +1 -1
  50. package/dist/shell/commands/status.js +236 -21
  51. package/dist/shell/commands/status.js.map +1 -1
  52. package/dist/shell/commands/worktree.d.ts +9 -0
  53. package/dist/shell/commands/worktree.d.ts.map +1 -1
  54. package/dist/shell/commands/worktree.js +353 -1
  55. package/dist/shell/commands/worktree.js.map +1 -1
  56. package/dist/shell/gates/disposition.d.ts.map +1 -1
  57. package/dist/shell/gates/disposition.js +43 -2
  58. package/dist/shell/gates/disposition.js.map +1 -1
  59. package/dist/shell/index.d.ts +14 -6
  60. package/dist/shell/index.d.ts.map +1 -1
  61. package/dist/shell/index.js +32 -1
  62. package/dist/shell/index.js.map +1 -1
  63. package/dist/shell/legacy-command-map.js +832 -0
  64. package/dist/shell/push-range/classify-range.d.ts +99 -0
  65. package/dist/shell/push-range/classify-range.d.ts.map +1 -0
  66. package/dist/shell/push-range/classify-range.js +155 -0
  67. package/dist/shell/push-range/classify-range.js.map +1 -0
  68. package/dist/shell/push-range/scope-match.d.ts +13 -0
  69. package/dist/shell/push-range/scope-match.d.ts.map +1 -0
  70. package/dist/shell/push-range/scope-match.js +53 -0
  71. package/dist/shell/push-range/scope-match.js.map +1 -0
  72. package/dist/shell/register.d.ts.map +1 -1
  73. package/dist/shell/register.js +350 -165
  74. package/dist/shell/register.js.map +1 -1
  75. package/dist/shell/registered-command-groups.js +48 -0
  76. package/dist/shell/render/status.d.ts +7 -1
  77. package/dist/shell/render/status.d.ts.map +1 -1
  78. package/dist/shell/render/status.js +72 -0
  79. package/dist/shell/render/status.js.map +1 -1
  80. package/dist/shell/rules.d.ts +19 -0
  81. package/dist/shell/rules.d.ts.map +1 -1
  82. package/dist/shell/rules.js +27 -0
  83. package/dist/shell/rules.js.map +1 -1
  84. package/dist/shell/session/resolve-session.d.ts +29 -1
  85. package/dist/shell/session/resolve-session.d.ts.map +1 -1
  86. package/dist/shell/session/resolve-session.js +817 -11
  87. package/dist/shell/session/resolve-session.js.map +1 -1
  88. package/dist/shell/session/types.d.ts +127 -1
  89. package/dist/shell/session/types.d.ts.map +1 -1
  90. package/dist/shell/session/types.js +10 -4
  91. package/dist/shell/session/types.js.map +1 -1
  92. package/dist/store/agents-store.d.ts.map +1 -1
  93. package/dist/store/agents-store.js +9 -0
  94. package/dist/store/agents-store.js.map +1 -1
  95. package/dist/store/apply-patch.d.ts.map +1 -1
  96. package/dist/store/apply-patch.js +15 -0
  97. package/dist/store/apply-patch.js.map +1 -1
  98. package/dist/store/doctor-snapshot.d.ts.map +1 -1
  99. package/dist/store/doctor-snapshot.js +169 -3
  100. package/dist/store/doctor-snapshot.js.map +1 -1
  101. package/dist/store/events-migration.d.ts +207 -0
  102. package/dist/store/events-migration.d.ts.map +1 -0
  103. package/dist/store/events-migration.js +358 -0
  104. package/dist/store/events-migration.js.map +1 -0
  105. package/dist/store/events-store.d.ts +47 -1
  106. package/dist/store/events-store.d.ts.map +1 -1
  107. package/dist/store/events-store.js +278 -0
  108. package/dist/store/events-store.js.map +1 -1
  109. package/dist/store/git-autocommit.d.ts +46 -0
  110. package/dist/store/git-autocommit.d.ts.map +1 -0
  111. package/dist/store/git-autocommit.js +198 -0
  112. package/dist/store/git-autocommit.js.map +1 -0
  113. package/dist/store/git-sparse-checkout.d.ts +25 -0
  114. package/dist/store/git-sparse-checkout.d.ts.map +1 -0
  115. package/dist/store/git-sparse-checkout.js +101 -0
  116. package/dist/store/git-sparse-checkout.js.map +1 -0
  117. package/dist/store/index.d.ts +6 -1
  118. package/dist/store/index.d.ts.map +1 -1
  119. package/dist/store/index.js +16 -1
  120. package/dist/store/index.js.map +1 -1
  121. package/dist/store/leases-store.d.ts +89 -0
  122. package/dist/store/leases-store.d.ts.map +1 -0
  123. package/dist/store/leases-store.js +427 -0
  124. package/dist/store/leases-store.js.map +1 -0
  125. package/dist/store/lifecycle-transaction.d.ts.map +1 -1
  126. package/dist/store/lifecycle-transaction.js +34 -1
  127. package/dist/store/lifecycle-transaction.js.map +1 -1
  128. package/dist/store/rules.d.ts +74 -1
  129. package/dist/store/rules.d.ts.map +1 -1
  130. package/dist/store/rules.js +76 -0
  131. package/dist/store/rules.js.map +1 -1
  132. package/dist/store/specs-migration.d.ts +128 -0
  133. package/dist/store/specs-migration.d.ts.map +1 -0
  134. package/dist/store/specs-migration.js +481 -0
  135. package/dist/store/specs-migration.js.map +1 -0
  136. package/dist/store/specs-store.d.ts.map +1 -1
  137. package/dist/store/specs-store.js +14 -2
  138. package/dist/store/specs-store.js.map +1 -1
  139. package/dist/store/specs-writer.d.ts +130 -3
  140. package/dist/store/specs-writer.d.ts.map +1 -1
  141. package/dist/store/specs-writer.js +941 -102
  142. package/dist/store/specs-writer.js.map +1 -1
  143. package/dist/store/types.d.ts +31 -1
  144. package/dist/store/types.d.ts.map +1 -1
  145. package/dist/store/waivers-store.d.ts.map +1 -1
  146. package/dist/store/waivers-store.js +8 -1
  147. package/dist/store/waivers-store.js.map +1 -1
  148. package/dist/store/worktrees-migration.d.ts +141 -0
  149. package/dist/store/worktrees-migration.d.ts.map +1 -0
  150. package/dist/store/worktrees-migration.js +356 -0
  151. package/dist/store/worktrees-migration.js.map +1 -0
  152. package/dist/store/worktrees-writer.d.ts +28 -0
  153. package/dist/store/worktrees-writer.d.ts.map +1 -1
  154. package/dist/store/worktrees-writer.js +147 -13
  155. package/dist/store/worktrees-writer.js.map +1 -1
  156. package/package.json +5 -2
  157. package/templates/hook-packs/claude-code/CLAUDE.md +11 -5
  158. package/templates/hook-packs/claude-code/agent-heartbeat.sh +131 -0
  159. package/templates/hook-packs/claude-code/agent-register.sh +62 -0
  160. package/templates/hook-packs/claude-code/agent-stop.sh +51 -0
  161. package/templates/hook-packs/claude-code/audit.sh +1 -1
  162. package/templates/hook-packs/claude-code/block-dangerous.sh +1 -1
  163. package/templates/hook-packs/claude-code/classify_command.py +1 -1
  164. package/templates/hook-packs/claude-code/cwd-guard.sh +30 -0
  165. package/templates/hook-packs/claude-code/dispatch/post_tool_use.sh +15 -4
  166. package/templates/hook-packs/claude-code/dispatch/pre_tool_use.sh +19 -2
  167. package/templates/hook-packs/claude-code/dispatch/session_start.sh +6 -2
  168. package/templates/hook-packs/claude-code/dispatch/stop.sh +7 -2
  169. package/templates/hook-packs/claude-code/duplicate-export-check.sh +156 -0
  170. package/templates/hook-packs/claude-code/god-object-check.sh +102 -0
  171. package/templates/hook-packs/claude-code/guard-strikes.sh +1 -1
  172. package/templates/hook-packs/claude-code/lib/parse-input.sh +115 -1
  173. package/templates/hook-packs/claude-code/lib/run-handlers.sh +1 -1
  174. package/templates/hook-packs/claude-code/loc-delta-check.sh +91 -0
  175. package/templates/hook-packs/claude-code/naming-check.sh +128 -0
  176. package/templates/hook-packs/claude-code/plan-transcript-finalize.sh +59 -0
  177. package/templates/hook-packs/claude-code/plan-transcript-snapshot.sh +86 -0
  178. package/templates/hook-packs/claude-code/protected-paths.sh +59 -0
  179. package/templates/hook-packs/claude-code/quiet-merge.sh +68 -0
  180. package/templates/hook-packs/claude-code/reset-danger-latch.sh +1 -1
  181. package/templates/hook-packs/claude-code/reset-strikes.sh +1 -1
  182. package/templates/hook-packs/claude-code/runtime-paths.sh +1 -1
  183. package/templates/hook-packs/claude-code/scan-secrets.sh +98 -0
  184. package/templates/hook-packs/claude-code/scope-guard.sh +47 -65
  185. package/templates/hook-packs/claude-code/session-caws-status.sh +7 -1
  186. package/templates/hook-packs/claude-code/session-log.sh +1 -1
  187. package/templates/hook-packs/claude-code/session_log_renderer.py +956 -0
  188. package/templates/hook-packs/claude-code/shortcut-language-check.sh +147 -0
  189. package/templates/hook-packs/claude-code/worktree-guard.sh +130 -4
  190. package/templates/hook-packs/claude-code/worktree-write-guard.sh +133 -18
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ // caws prepush — MULTI-AGENT-PUSH-RANGE-GUARD-001 command surface.
3
+ //
4
+ // Thin command over the pure classifier (push-range/classify-range). It
5
+ // does the git READS (outgoing range, per-commit touched files, foreign
6
+ // worktree state, dirty-tree preflight), hands the collected facts to
7
+ // classifyRange(), renders the structured report, and returns an exit code.
8
+ //
9
+ // It NEVER invokes git push, never mutates repo state. v1 is prepush-first:
10
+ // `caws prepush` classifies + refuses; it does not wrap the transport. The
11
+ // operator runs `git push` themselves after a clean pass. (Per ADR 0001 +
12
+ // the maintainer's prepush-first v1 narrowing.)
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.runPrepushCommand = runPrepushCommand;
48
+ const node_child_process_1 = require("node:child_process");
49
+ const fs = __importStar(require("node:fs"));
50
+ const store_1 = require("../../store");
51
+ const classify_range_1 = require("../push-range/classify-range");
52
+ const defaultGitRunner = (args, cwd) => (0, node_child_process_1.execFileSync)('git', [...args], {
53
+ cwd,
54
+ encoding: 'utf8',
55
+ stdio: ['ignore', 'pipe', 'pipe'],
56
+ }).toString();
57
+ /**
58
+ * Parse NUL-delimited `git status --porcelain=v1 -z` output into the set of
59
+ * dirty paths. The `-z` form is the only robust parse: it does NOT quote or
60
+ * escape paths, and renames/copies emit the new path and the old path as two
61
+ * separate NUL-terminated fields immediately following the 3-char status
62
+ * prefix. We surface both sides of a rename so the operator sees the full
63
+ * dirty footprint. Lines are `XY <path>\0` (and for R/C, `<orig>\0` follows).
64
+ */
65
+ function parseDirtyPathsZ(zOutput) {
66
+ const fields = zOutput.split('\0').filter((f) => f.length > 0);
67
+ const paths = [];
68
+ for (let i = 0; i < fields.length; i++) {
69
+ const field = fields[i];
70
+ // Each status record is `XY <path>`; XY is two status chars + a space.
71
+ const status = field.slice(0, 2);
72
+ const p = field.slice(3);
73
+ if (p.length > 0)
74
+ paths.push(p);
75
+ // Rename (R) and copy (C) entries carry the original path in the NEXT
76
+ // NUL-terminated field with no status prefix — consume it too.
77
+ if (status[0] === 'R' || status[0] === 'C') {
78
+ const orig = fields[i + 1];
79
+ if (orig !== undefined) {
80
+ paths.push(orig);
81
+ i++; // skip the original-path field we just consumed
82
+ }
83
+ }
84
+ }
85
+ return paths;
86
+ }
87
+ /**
88
+ * Best-effort attribution of a commit SHA to a registered worktree's branch
89
+ * via `git branch --contains <sha>`. Returns the worktree NAME when exactly
90
+ * one registered branch contains the commit AND that branch is not the base
91
+ * branch we're pushing (a commit on the push branch itself is not "from a
92
+ * foreign worktree"). Returns undefined on any ambiguity or git failure —
93
+ * attribution is best-effort and NEVER fabricates an origin (invariant 3).
94
+ */
95
+ function attributeOriginWorktree(git, repoRoot, sha, registered) {
96
+ let containing;
97
+ try {
98
+ const out = git(['branch', '--contains', sha, '--format=%(refname:short)'], repoRoot);
99
+ containing = new Set(out
100
+ .split('\n')
101
+ .map((s) => s.trim())
102
+ .filter(Boolean));
103
+ }
104
+ catch {
105
+ return undefined; // git read failed — degrade silently.
106
+ }
107
+ const matches = registered.filter((wt) => wt.branch !== undefined && containing.has(wt.branch));
108
+ if (matches.length !== 1)
109
+ return undefined; // none, or ambiguous → undefined.
110
+ return matches[0].name;
111
+ }
112
+ /**
113
+ * Probe whether a branch is merged into the push base. Returns true (treated
114
+ * as "unmerged" by the caller) when the branch is NOT an ancestor of base.
115
+ * On any git failure we return false — we do not escalate on an unreadable
116
+ * merge state (invariant 3: failed observation is non-escalating).
117
+ */
118
+ function branchIsUnmerged(git, repoRoot, branch, baseRef) {
119
+ try {
120
+ // `merge-base --is-ancestor` exits 0 when branch IS an ancestor of base
121
+ // (i.e. merged), non-zero otherwise. The runner throws on non-zero.
122
+ git(['merge-base', '--is-ancestor', branch, baseRef], repoRoot);
123
+ return false; // ancestor → merged.
124
+ }
125
+ catch {
126
+ // Non-zero exit means "not an ancestor" (unmerged) — but a genuine git
127
+ // error (bad ref) lands here too. Distinguish by verifying the branch
128
+ // resolves; if it doesn't, we cannot claim it's unmerged.
129
+ try {
130
+ git(['rev-parse', '--verify', '--quiet', `${branch}^{commit}`], repoRoot);
131
+ return true; // branch resolves but is not an ancestor → unmerged.
132
+ }
133
+ catch {
134
+ return false; // branch unresolvable → no escalation.
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Enumerate physical git worktrees via `git worktree list --porcelain`.
140
+ * This is git's ground truth — it includes worktrees created OUTSIDE CAWS
141
+ * (the session-13 class) that are absent from .caws/worktrees.json. Returns
142
+ * an empty list on any git failure (non-escalating; invariant 3).
143
+ */
144
+ function listPhysicalWorktrees(git, repoRoot) {
145
+ let out;
146
+ try {
147
+ out = git(['worktree', 'list', '--porcelain'], repoRoot);
148
+ }
149
+ catch {
150
+ return [];
151
+ }
152
+ const result = [];
153
+ let curPath;
154
+ let curBranch;
155
+ const flush = () => {
156
+ if (curPath !== undefined) {
157
+ result.push({
158
+ path: curPath,
159
+ ...(curBranch !== undefined ? { branch: curBranch } : {}),
160
+ });
161
+ }
162
+ curPath = undefined;
163
+ curBranch = undefined;
164
+ };
165
+ for (const line of out.split('\n')) {
166
+ if (line.startsWith('worktree ')) {
167
+ flush();
168
+ curPath = line.slice('worktree '.length).trim();
169
+ }
170
+ else if (line.startsWith('branch ')) {
171
+ // `branch refs/heads/<name>` — normalize to the short name.
172
+ curBranch = line.slice('branch '.length).trim().replace(/^refs\/heads\//, '');
173
+ }
174
+ // `detached`, `HEAD <sha>`, `bare`, blank — ignored for our purposes.
175
+ }
176
+ flush();
177
+ return result;
178
+ }
179
+ /** Collect the outgoing range + per-commit touched files + dirty state. */
180
+ function collectGitFacts(git, repoRoot, baseRef, registered) {
181
+ // Dirty working-tree paths via NUL-delimited porcelain v1 (-z): robust for
182
+ // renames and non-ASCII/quoted paths, which the line-based parse mangled.
183
+ const status = git(['status', '--porcelain=v1', '-z'], repoRoot);
184
+ const dirtyPaths = parseDirtyPathsZ(status);
185
+ // Outgoing range SHAs, newest-first.
186
+ const revs = git(['rev-list', `${baseRef}..HEAD`], repoRoot)
187
+ .split('\n')
188
+ .map((s) => s.trim())
189
+ .filter(Boolean);
190
+ const commits = revs.map((sha) => {
191
+ const subject = git(['log', '-1', '--format=%s', sha], repoRoot).trim();
192
+ const files = git(['diff-tree', '--no-commit-id', '--name-only', '-r', sha], repoRoot)
193
+ .split('\n')
194
+ .map((s) => s.trim())
195
+ .filter(Boolean);
196
+ const origin = attributeOriginWorktree(git, repoRoot, sha, registered);
197
+ return {
198
+ sha: sha.slice(0, 12),
199
+ subject,
200
+ touchedFiles: files,
201
+ ...(origin !== undefined ? { originWorktree: origin } : {}),
202
+ };
203
+ });
204
+ return { commits, dirtyPaths };
205
+ }
206
+ function renderReport(report, out) {
207
+ out(`prepush: outgoing range ${report.baseRef}..HEAD → ${report.target.remote} ${report.target.branch}`);
208
+ if (report.commits.length === 0) {
209
+ out(' (no outgoing commits)');
210
+ }
211
+ for (const c of report.commits) {
212
+ const flag = c.currentSliceMatch
213
+ ? 'current-slice'
214
+ : c.acknowledged
215
+ ? 'acknowledged'
216
+ : c.ambiguous
217
+ ? 'AMBIGUOUS'
218
+ : 'UNEXPECTED';
219
+ const specs = c.inferredSpecIds.length > 0 ? c.inferredSpecIds.join(',') : '(none)';
220
+ out(` ${c.sha} [${flag}] ${c.subject}`);
221
+ out(` specs: ${specs} via: ${c.provenanceSource} files: ${c.touchedFiles.length}`);
222
+ if (c.originWorktree !== undefined) {
223
+ out(` origin-worktree: ${c.originWorktree}`);
224
+ }
225
+ }
226
+ for (const f of report.foreignWorktrees) {
227
+ out(` [${f.severity}] foreign worktree ${f.name} (${f.path})${f.branch ? ' @ ' + f.branch : ''}`);
228
+ for (const r of f.reasons)
229
+ out(` - ${r}`);
230
+ }
231
+ }
232
+ /**
233
+ * Run the prepush guard. Returns 0 on clean pass, 1 on refusal, 2 on a
234
+ * setup/composition error.
235
+ */
236
+ function runPrepushCommand(opts) {
237
+ const cwd = opts.cwd ?? process.cwd();
238
+ const out = opts.out ?? ((s) => process.stdout.write(s + '\n'));
239
+ const err = opts.err ?? ((s) => process.stderr.write(s + '\n'));
240
+ const git = opts.git ?? defaultGitRunner;
241
+ const remote = opts.remote ?? 'origin';
242
+ const branch = opts.branch ?? 'main';
243
+ const target = { remote, branch };
244
+ const baseRef = opts.base ?? `${remote}/${branch}`;
245
+ // 1. Repo root.
246
+ const rootResult = (0, store_1.resolveRepoRoot)(cwd);
247
+ if (!rootResult.ok) {
248
+ err('caws prepush: failed to resolve repo root (not a git repository?).');
249
+ return 2;
250
+ }
251
+ const { repoRoot, cawsDir } = rootResult.value;
252
+ // 2. Load the worktree registry FIRST — its branches feed per-commit origin
253
+ // attribution (git branch --contains) inside collectGitFacts.
254
+ const wtResult = (0, store_1.loadWorktrees)(cawsDir);
255
+ const registry = wtResult.ok ? wtResult.value : {};
256
+ const registered = Object.entries(registry).map(([name, rec]) => ({
257
+ name,
258
+ ...(typeof rec?.branch === 'string' ? { branch: rec.branch } : {}),
259
+ }));
260
+ // 3. Collect git facts (range + per-commit origin + dirty state). Wrap git
261
+ // failures as exit 2.
262
+ let facts;
263
+ try {
264
+ facts = collectGitFacts(git, repoRoot, baseRef, registered);
265
+ }
266
+ catch (e) {
267
+ err(`caws prepush: git read failed for base "${baseRef}": ${e.message}`);
268
+ return 2;
269
+ }
270
+ // 4. A8 — dirty-tree / governed-path preflight, BEFORE range classification.
271
+ // A dirty working tree means provenance is ambiguous (whose change is
272
+ // this?) — refuse early so the operator resolves it before publishing.
273
+ if (facts.dirtyPaths.length > 0) {
274
+ err('caws prepush: refusing — working tree is dirty before classification.');
275
+ for (const p of facts.dirtyPaths)
276
+ err(` dirty: ${p}`);
277
+ err(' Commit or stash these (and confirm they are yours) before prepush.');
278
+ return 1;
279
+ }
280
+ // 5. Load specs (control-plane facts for attribution).
281
+ const specsLoad = (0, store_1.loadSpecs)(cawsDir);
282
+ const specs = specsLoad.specs
283
+ .filter((s) => s.lifecycle_state === 'active' || s.lifecycle_state === 'closed')
284
+ .map((s) => ({
285
+ specId: s.id,
286
+ scopeIn: s.scope.in,
287
+ lifecycleState: s.lifecycle_state,
288
+ }));
289
+ // 6. Foreign worktrees, from git's PHYSICAL truth joined against the
290
+ // registry. A foreign worktree is any physical worktree that is NOT the
291
+ // current checkout (repoRoot) and is NOT the one bound to the current
292
+ // slice. For each we observe (read-only):
293
+ // - unregistered: its branch is absent from .caws/worktrees.json
294
+ // (ADR Q4 condition b — the session-13 "created outside CAWS" class);
295
+ // - unmerged: its branch is not an ancestor of the push base
296
+ // (ADR Q4 condition a);
297
+ // - originates: handled per-commit via originWorktree attribution,
298
+ // which classifyForeignWorktree reads (ADR Q4 condition c).
299
+ // Enumerating physical worktrees (not just the registry) is what lets the
300
+ // guard catch an unregistered sibling worktree at all.
301
+ let repoRootReal;
302
+ try {
303
+ repoRootReal = fs.realpathSync(repoRoot);
304
+ }
305
+ catch {
306
+ repoRootReal = repoRoot;
307
+ }
308
+ const registeredBranches = new Set(registered.map((r) => r.branch).filter((b) => b !== undefined));
309
+ const currentSliceBranches = new Set(Object.entries(registry)
310
+ .filter(([, rec]) => opts.specId !== undefined && rec?.specId === opts.specId)
311
+ .map(([, rec]) => rec?.branch)
312
+ .filter((b) => typeof b === 'string'));
313
+ const nameByBranch = new Map(registered
314
+ .filter((r) => r.branch !== undefined)
315
+ .map((r) => [r.branch, r.name]));
316
+ const foreignWorktrees = [];
317
+ for (const phys of listPhysicalWorktrees(git, repoRoot)) {
318
+ let physReal;
319
+ try {
320
+ physReal = fs.realpathSync(phys.path);
321
+ }
322
+ catch {
323
+ physReal = phys.path;
324
+ }
325
+ // Skip the current checkout (where the push originates from).
326
+ if (physReal === repoRootReal)
327
+ continue;
328
+ // Skip the worktree bound to the current slice — it is not "foreign".
329
+ if (phys.branch !== undefined && currentSliceBranches.has(phys.branch))
330
+ continue;
331
+ const unregistered = phys.branch === undefined || !registeredBranches.has(phys.branch);
332
+ const unmerged = phys.branch !== undefined &&
333
+ branchIsUnmerged(git, repoRoot, phys.branch, baseRef);
334
+ // Prefer the registry name when known; fall back to the branch or path.
335
+ const name = (phys.branch !== undefined ? nameByBranch.get(phys.branch) : undefined) ??
336
+ phys.branch ??
337
+ phys.path;
338
+ foreignWorktrees.push({
339
+ name,
340
+ path: phys.path,
341
+ ...(phys.branch !== undefined ? { branch: phys.branch } : {}),
342
+ unregistered,
343
+ unmerged,
344
+ });
345
+ }
346
+ // 7. Classify (pure).
347
+ const report = (0, classify_range_1.classifyRange)({
348
+ commits: facts.commits,
349
+ specs,
350
+ ...(opts.specId !== undefined ? { currentSpecId: opts.specId } : {}),
351
+ foreignWorktrees,
352
+ ...(opts.ack !== undefined ? { ackedShas: opts.ack } : {}),
353
+ baseRef,
354
+ target,
355
+ });
356
+ // 8. Render + decide.
357
+ renderReport(report, out);
358
+ if (report.refused) {
359
+ err('caws prepush: REFUSED. The outgoing range contains commits not');
360
+ err(' attributable to the current slice, or an ERROR-severity foreign');
361
+ err(' worktree. Acknowledge specific commits with --ack <sha> after');
362
+ err(' confirming they belong in this push, or resolve the foreign');
363
+ err(' worktree, then re-run. This is a governed pre-push check; it does');
364
+ err(' NOT run git push.');
365
+ if (report.unexpectedUnacked.length > 0) {
366
+ err(` unexpected (unacknowledged): ${report.unexpectedUnacked.join(', ')}`);
367
+ }
368
+ return 1;
369
+ }
370
+ out('caws prepush: range is cleanly attributable. Safe to git push.');
371
+ return 0;
372
+ }
373
+ //# sourceMappingURL=prepush.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepush.js","sourceRoot":"","sources":["../../../src/shell/commands/prepush.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/scope.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAkEjE"}
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/scope.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAoGjE"}
@@ -50,13 +50,43 @@ function runScopeCommand(opts) {
50
50
  err(`caws scope ${mode}: store composition failed: ${e.message}`);
51
51
  return 2;
52
52
  }
53
- // 3. Binding from cwd
53
+ // 3. Binding — resolved from the TARGET PATH, not just cwd
54
+ // (SCOPE-CHECK-CWD-BINDING-RESOLUTION-001). Passing `targetPath` lets
55
+ // resolveBinding fall back to the path's owning worktree / claiming
56
+ // spec when cwd is the main checkout, so `caws scope check <path>` is
57
+ // cwd-independent and matches what the bound author sees.
54
58
  const bound = (0, resolve_binding_1.resolveBinding)({
55
59
  repoRoot,
56
60
  cwd,
61
+ targetPath: opts.path,
57
62
  registry: snapshot.worktrees,
58
63
  specs: snapshot.specs,
59
64
  });
65
+ // 3a. Refuse-on-conflict: more than one active bound spec claims this path.
66
+ // Authority is ambiguous; we do NOT guess. Emit an actionable refusal
67
+ // that names every claimant, the inspect commands, and the resolution
68
+ // options, then exit non-zero (check) / 0 with the detail (show).
69
+ if (bound.ambiguous !== undefined) {
70
+ const { targetPath, claimants } = bound.ambiguous;
71
+ const cwdClaimant = bound.worktreeName !== undefined
72
+ ? claimants.find((c) => c.worktreeName === bound.worktreeName)
73
+ : undefined;
74
+ err(`caws scope ${mode}: ambiguous binding for "${targetPath}".`);
75
+ err(` ${claimants.length} active bound specs claim this path via scope.in; CAWS will not guess which governs:`);
76
+ for (const c of claimants) {
77
+ const here = cwdClaimant !== undefined && c.specId === cwdClaimant.specId ? ' (current cwd/session)' : '';
78
+ err(` - ${c.specId} (worktree ${c.worktreeName}) via scope.in "${c.matchedScopeInEntry}"${here}`);
79
+ }
80
+ err(' Inspect each claimant:');
81
+ for (const c of claimants) {
82
+ err(` caws specs show ${c.specId}`);
83
+ }
84
+ err(' Resolve by EITHER:');
85
+ err(' (a) narrowing one spec\'s scope.in so only one claims this path, OR');
86
+ err(' (b) routing the edit through the single worktree that should own it');
87
+ err(' and removing the path from the other spec\'s scope.in.');
88
+ return 1;
89
+ }
60
90
  // 4. Require a loaded policy. Without it, the kernel can't evaluate
61
91
  // non_governed_zones / root_passthrough / infra exemptions, and the
62
92
  // rewrite plan requires policy.yaml for any vNext project. This is
@@ -1 +1 @@
1
- {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/shell/commands/scope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/shell/commands/scope.ts"],"names":[],"mappings":"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"}
@@ -10,9 +10,10 @@ interface BaseCommandOptions {
10
10
  }
11
11
  export interface SpecsCreateOptions extends BaseCommandOptions {
12
12
  readonly id: string;
13
- readonly title: string;
14
- readonly mode: string;
15
- readonly riskTier: number | string;
13
+ readonly title?: string;
14
+ readonly mode?: string;
15
+ readonly riskTier?: number | string;
16
+ readonly legacyType?: string;
16
17
  }
17
18
  export declare function runSpecsCreateCommand(opts: SpecsCreateOptions): number;
18
19
  export interface SpecsListOptions extends BaseCommandOptions {
@@ -22,8 +23,30 @@ export interface SpecsListOptions extends BaseCommandOptions {
22
23
  export declare function runSpecsListCommand(opts?: SpecsListOptions): number;
23
24
  export interface SpecsShowOptions extends BaseCommandOptions {
24
25
  readonly id: string;
26
+ /**
27
+ * CAWS-ARCHIVE-AS-TOMBSTONE-001: when true, look up the spec body
28
+ * via the event log + git blob_sha (recoverArchivedSpec). Default
29
+ * false → showSpec walks only the active path. This split makes the
30
+ * archive surface explicit, eliminating the v11.1.x transparent
31
+ * fallback that surfaced archived specs as if they were current.
32
+ */
33
+ readonly archived?: boolean;
25
34
  }
26
35
  export declare function runSpecsShowCommand(opts: SpecsShowOptions): number;
36
+ export interface SpecsRecoverOptions extends BaseCommandOptions {
37
+ readonly id: string;
38
+ /**
39
+ * When set, write the recovered body to this path instead of stdout.
40
+ * Named `outPath` (not `out`) to avoid shadowing
41
+ * BaseCommandOptions.out, which is the stdout-writer callback.
42
+ */
43
+ readonly outPath?: string;
44
+ }
45
+ export declare function runSpecsRecoverCommand(opts: SpecsRecoverOptions): number;
46
+ export interface SpecsActivateOptions extends BaseCommandOptions {
47
+ readonly id: string;
48
+ }
49
+ export declare function runSpecsActivateCommand(opts: SpecsActivateOptions): number;
27
50
  export interface SpecsCloseOptions extends BaseCommandOptions {
28
51
  readonly id: string;
29
52
  readonly resolution: string;
@@ -37,5 +60,23 @@ export interface SpecsArchiveOptions extends BaseCommandOptions {
37
60
  readonly reason?: string;
38
61
  }
39
62
  export declare function runSpecsArchiveCommand(opts: SpecsArchiveOptions): number;
63
+ export interface SpecsRetireDraftOptions extends BaseCommandOptions {
64
+ readonly id: string;
65
+ readonly reason?: string;
66
+ }
67
+ export declare function runSpecsRetireDraftCommand(opts: SpecsRetireDraftOptions): number;
68
+ export interface SpecsMigrateOptions extends BaseCommandOptions {
69
+ readonly from: string;
70
+ readonly apply?: boolean;
71
+ readonly partial?: boolean;
72
+ readonly lifecycleMappingPath?: string;
73
+ readonly json?: boolean;
74
+ }
75
+ export declare function runSpecsMigrateCommand(opts: SpecsMigrateOptions): number;
76
+ export interface SpecsPruneArchiveOptions extends BaseCommandOptions {
77
+ /** Default false → dry-run. Pass true to mutate the filesystem. */
78
+ readonly apply?: boolean;
79
+ }
80
+ export declare function runSpecsPruneArchiveCommand(opts: SpecsPruneArchiveOptions): number;
40
81
  export {};
41
82
  //# sourceMappingURL=specs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/specs.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAoB7E,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAyDD,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CACpC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAmDtE;AAID,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,6CAA6C;IAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,gBAAqB,GAAG,MAAM,CAgCvE;AAID,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAelE;AAID,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CA0CpE;AAID,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAgCxE"}
1
+ {"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/specs.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAoC7E,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AA2FD,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAeD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAsFtE;AAID,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,6CAA6C;IAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,gBAAqB,GAAG,MAAM,CAoCvE;AAID,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAwBlE;AAWD,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAwBxE;AAID,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CA8B1E;AAID,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CA2CpE;AAID,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAiCxE;AAID,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,uBAAuB,GAC5B,MAAM,CAiCR;AA4BD,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAmExE;AAyID,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAqDlF"}