@cluesmith/codev 3.3.5 → 3.3.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 (231) hide show
  1. package/dashboard-dist/assets/{index-r3bZzLmX.css → index-BjcqV9Vv.css} +1 -1
  2. package/dashboard-dist/assets/{index-BuflRUi6.js → index-b7GnZV2i.js} +55 -55
  3. package/dashboard-dist/assets/index-b7GnZV2i.js.map +1 -0
  4. package/dashboard-dist/index.html +2 -2
  5. package/dist/agent-farm/cli.d.ts.map +1 -1
  6. package/dist/agent-farm/cli.js +50 -17
  7. package/dist/agent-farm/cli.js.map +1 -1
  8. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  9. package/dist/agent-farm/commands/architect.js +5 -1
  10. package/dist/agent-farm/commands/architect.js.map +1 -1
  11. package/dist/agent-farm/commands/attach.d.ts +1 -1
  12. package/dist/agent-farm/commands/attach.d.ts.map +1 -1
  13. package/dist/agent-farm/commands/cleanup.d.ts +1 -1
  14. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
  15. package/dist/agent-farm/commands/cleanup.js +2 -1
  16. package/dist/agent-farm/commands/cleanup.js.map +1 -1
  17. package/dist/agent-farm/commands/decisions.d.ts +25 -0
  18. package/dist/agent-farm/commands/decisions.d.ts.map +1 -0
  19. package/dist/agent-farm/commands/decisions.js +54 -0
  20. package/dist/agent-farm/commands/decisions.js.map +1 -0
  21. package/dist/agent-farm/commands/ide.d.ts +32 -3
  22. package/dist/agent-farm/commands/ide.d.ts.map +1 -1
  23. package/dist/agent-farm/commands/ide.js +180 -19
  24. package/dist/agent-farm/commands/ide.js.map +1 -1
  25. package/dist/agent-farm/commands/reset/context.d.ts +4 -2
  26. package/dist/agent-farm/commands/reset/context.d.ts.map +1 -1
  27. package/dist/agent-farm/commands/reset/context.js +12 -4
  28. package/dist/agent-farm/commands/reset/context.js.map +1 -1
  29. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  30. package/dist/agent-farm/commands/send.js +13 -18
  31. package/dist/agent-farm/commands/send.js.map +1 -1
  32. package/dist/agent-farm/commands/spawn-worktree.d.ts +7 -0
  33. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  34. package/dist/agent-farm/commands/spawn-worktree.js +51 -18
  35. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  36. package/dist/agent-farm/commands/spawn.d.ts +17 -0
  37. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  38. package/dist/agent-farm/commands/spawn.js +41 -19
  39. package/dist/agent-farm/commands/spawn.js.map +1 -1
  40. package/dist/agent-farm/lib/builder-lookup.d.ts +3 -2
  41. package/dist/agent-farm/lib/builder-lookup.d.ts.map +1 -1
  42. package/dist/agent-farm/lib/builder-lookup.js +24 -9
  43. package/dist/agent-farm/lib/builder-lookup.js.map +1 -1
  44. package/dist/agent-farm/lib/ide-extensions.d.ts +82 -0
  45. package/dist/agent-farm/lib/ide-extensions.d.ts.map +1 -0
  46. package/dist/agent-farm/lib/ide-extensions.js +179 -0
  47. package/dist/agent-farm/lib/ide-extensions.js.map +1 -0
  48. package/dist/agent-farm/lib/ide-record.d.ts +6 -1
  49. package/dist/agent-farm/lib/ide-record.d.ts.map +1 -1
  50. package/dist/agent-farm/lib/ide-record.js +8 -1
  51. package/dist/agent-farm/lib/ide-record.js.map +1 -1
  52. package/dist/agent-farm/lib/ide-version.d.ts +97 -0
  53. package/dist/agent-farm/lib/ide-version.d.ts.map +1 -0
  54. package/dist/agent-farm/lib/ide-version.js +224 -0
  55. package/dist/agent-farm/lib/ide-version.js.map +1 -0
  56. package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -1
  57. package/dist/agent-farm/lib/tunnel-client.js +7 -3
  58. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  59. package/dist/agent-farm/servers/agent-state/broadcast.d.ts +19 -0
  60. package/dist/agent-farm/servers/agent-state/broadcast.d.ts.map +1 -0
  61. package/dist/agent-farm/servers/agent-state/broadcast.js +30 -0
  62. package/dist/agent-farm/servers/agent-state/broadcast.js.map +1 -0
  63. package/dist/agent-farm/servers/agent-state/identity.d.ts +50 -0
  64. package/dist/agent-farm/servers/agent-state/identity.d.ts.map +1 -0
  65. package/dist/agent-farm/servers/agent-state/identity.js +120 -0
  66. package/dist/agent-farm/servers/agent-state/identity.js.map +1 -0
  67. package/dist/agent-farm/servers/agent-state/liveness.d.ts +107 -0
  68. package/dist/agent-farm/servers/agent-state/liveness.d.ts.map +1 -0
  69. package/dist/agent-farm/servers/agent-state/liveness.js +224 -0
  70. package/dist/agent-farm/servers/agent-state/liveness.js.map +1 -0
  71. package/dist/agent-farm/servers/agent-state/route.d.ts +38 -0
  72. package/dist/agent-farm/servers/agent-state/route.d.ts.map +1 -0
  73. package/dist/agent-farm/servers/agent-state/route.js +170 -0
  74. package/dist/agent-farm/servers/agent-state/route.js.map +1 -0
  75. package/dist/agent-farm/servers/agent-state/serve.d.ts +31 -0
  76. package/dist/agent-farm/servers/agent-state/serve.d.ts.map +1 -0
  77. package/dist/agent-farm/servers/agent-state/serve.js +49 -0
  78. package/dist/agent-farm/servers/agent-state/serve.js.map +1 -0
  79. package/dist/agent-farm/servers/agent-state/store.d.ts +76 -0
  80. package/dist/agent-farm/servers/agent-state/store.d.ts.map +1 -0
  81. package/dist/agent-farm/servers/agent-state/store.js +157 -0
  82. package/dist/agent-farm/servers/agent-state/store.js.map +1 -0
  83. package/dist/agent-farm/servers/decisions/parse.d.ts.map +1 -1
  84. package/dist/agent-farm/servers/decisions/parse.js +45 -15
  85. package/dist/agent-farm/servers/decisions/parse.js.map +1 -1
  86. package/dist/agent-farm/servers/decisions/stamp.d.ts +6 -2
  87. package/dist/agent-farm/servers/decisions/stamp.d.ts.map +1 -1
  88. package/dist/agent-farm/servers/decisions/stamp.js +53 -29
  89. package/dist/agent-farm/servers/decisions/stamp.js.map +1 -1
  90. package/dist/agent-farm/servers/decisions/template.d.ts +2 -0
  91. package/dist/agent-farm/servers/decisions/template.d.ts.map +1 -0
  92. package/dist/agent-farm/servers/decisions/template.js +15 -0
  93. package/dist/agent-farm/servers/decisions/template.js.map +1 -0
  94. package/dist/agent-farm/servers/ide-server.d.ts +28 -8
  95. package/dist/agent-farm/servers/ide-server.d.ts.map +1 -1
  96. package/dist/agent-farm/servers/ide-server.js +147 -50
  97. package/dist/agent-farm/servers/ide-server.js.map +1 -1
  98. package/dist/agent-farm/servers/overview.d.ts +27 -1
  99. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  100. package/dist/agent-farm/servers/overview.js +184 -31
  101. package/dist/agent-farm/servers/overview.js.map +1 -1
  102. package/dist/agent-farm/servers/tower-instances.d.ts +14 -1
  103. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  104. package/dist/agent-farm/servers/tower-instances.js +51 -9
  105. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  106. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  107. package/dist/agent-farm/servers/tower-routes.js +50 -9
  108. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  109. package/dist/agent-farm/servers/tower-server.js +35 -1
  110. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  111. package/dist/agent-farm/servers/tower-terminals.d.ts +25 -0
  112. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  113. package/dist/agent-farm/servers/tower-terminals.js +128 -4
  114. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  115. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
  116. package/dist/agent-farm/servers/tower-utils.js +18 -5
  117. package/dist/agent-farm/servers/tower-utils.js.map +1 -1
  118. package/dist/agent-farm/utils/builder-worktree-identity.d.ts +39 -0
  119. package/dist/agent-farm/utils/builder-worktree-identity.d.ts.map +1 -0
  120. package/dist/agent-farm/utils/builder-worktree-identity.js +42 -0
  121. package/dist/agent-farm/utils/builder-worktree-identity.js.map +1 -0
  122. package/dist/agent-farm/utils/harness.d.ts +71 -0
  123. package/dist/agent-farm/utils/harness.d.ts.map +1 -1
  124. package/dist/agent-farm/utils/harness.js +153 -0
  125. package/dist/agent-farm/utils/harness.js.map +1 -1
  126. package/dist/agent-farm/utils/lifecycle-reporter.d.ts +79 -0
  127. package/dist/agent-farm/utils/lifecycle-reporter.d.ts.map +1 -0
  128. package/dist/agent-farm/utils/lifecycle-reporter.js +347 -0
  129. package/dist/agent-farm/utils/lifecycle-reporter.js.map +1 -0
  130. package/dist/cli.d.ts.map +1 -1
  131. package/dist/cli.js +17 -0
  132. package/dist/cli.js.map +1 -1
  133. package/dist/commands/adopt.d.ts +16 -2
  134. package/dist/commands/adopt.d.ts.map +1 -1
  135. package/dist/commands/adopt.js +67 -23
  136. package/dist/commands/adopt.js.map +1 -1
  137. package/dist/commands/bootstrap-docs.d.ts +132 -0
  138. package/dist/commands/bootstrap-docs.d.ts.map +1 -0
  139. package/dist/commands/bootstrap-docs.js +725 -0
  140. package/dist/commands/bootstrap-docs.js.map +1 -0
  141. package/dist/commands/consult/index.d.ts.map +1 -1
  142. package/dist/commands/consult/index.js +14 -1
  143. package/dist/commands/consult/index.js.map +1 -1
  144. package/dist/commands/consult/tree-tripwire.d.ts +2 -75
  145. package/dist/commands/consult/tree-tripwire.d.ts.map +1 -1
  146. package/dist/commands/consult/tree-tripwire.js +7 -184
  147. package/dist/commands/consult/tree-tripwire.js.map +1 -1
  148. package/dist/commands/doctor.d.ts.map +1 -1
  149. package/dist/commands/doctor.js +36 -4
  150. package/dist/commands/doctor.js.map +1 -1
  151. package/dist/commands/porch/state.d.ts +0 -4
  152. package/dist/commands/porch/state.d.ts.map +1 -1
  153. package/dist/commands/porch/state.js +23 -10
  154. package/dist/commands/porch/state.js.map +1 -1
  155. package/dist/commands/update.d.ts +5 -1
  156. package/dist/commands/update.d.ts.map +1 -1
  157. package/dist/commands/update.js +73 -18
  158. package/dist/commands/update.js.map +1 -1
  159. package/dist/lib/agent-env.d.ts +22 -1
  160. package/dist/lib/agent-env.d.ts.map +1 -1
  161. package/dist/lib/agent-env.js +27 -1
  162. package/dist/lib/agent-env.js.map +1 -1
  163. package/dist/lib/agent-process.d.ts +23 -0
  164. package/dist/lib/agent-process.d.ts.map +1 -0
  165. package/dist/lib/agent-process.js +24 -0
  166. package/dist/lib/agent-process.js.map +1 -0
  167. package/dist/lib/forge-contracts.d.ts +9 -3
  168. package/dist/lib/forge-contracts.d.ts.map +1 -1
  169. package/dist/lib/forge-contracts.js.map +1 -1
  170. package/dist/lib/forge.d.ts +8 -5
  171. package/dist/lib/forge.d.ts.map +1 -1
  172. package/dist/lib/forge.js +57 -1
  173. package/dist/lib/forge.js.map +1 -1
  174. package/dist/lib/github.d.ts.map +1 -1
  175. package/dist/lib/github.js +38 -0
  176. package/dist/lib/github.js.map +1 -1
  177. package/dist/lib/governance-bootstrap.d.ts +155 -0
  178. package/dist/lib/governance-bootstrap.d.ts.map +1 -0
  179. package/dist/lib/governance-bootstrap.js +469 -0
  180. package/dist/lib/governance-bootstrap.js.map +1 -0
  181. package/dist/lib/issue-id.d.ts +34 -0
  182. package/dist/lib/issue-id.d.ts.map +1 -0
  183. package/dist/lib/issue-id.js +61 -0
  184. package/dist/lib/issue-id.js.map +1 -0
  185. package/dist/lib/scaffold.d.ts +4 -0
  186. package/dist/lib/scaffold.d.ts.map +1 -1
  187. package/dist/lib/scaffold.js +29 -5
  188. package/dist/lib/scaffold.js.map +1 -1
  189. package/dist/lib/shipped-skill-hashes.d.ts +10 -0
  190. package/dist/lib/shipped-skill-hashes.d.ts.map +1 -0
  191. package/dist/lib/shipped-skill-hashes.js +197 -0
  192. package/dist/lib/shipped-skill-hashes.js.map +1 -0
  193. package/dist/lib/skill-refresh.d.ts +90 -0
  194. package/dist/lib/skill-refresh.d.ts.map +1 -0
  195. package/dist/lib/skill-refresh.js +267 -0
  196. package/dist/lib/skill-refresh.js.map +1 -0
  197. package/dist/lib/tree-snapshot.d.ts +172 -0
  198. package/dist/lib/tree-snapshot.d.ts.map +1 -0
  199. package/dist/lib/tree-snapshot.js +393 -0
  200. package/dist/lib/tree-snapshot.js.map +1 -0
  201. package/dist/terminal/pty-session.d.ts +5 -0
  202. package/dist/terminal/pty-session.d.ts.map +1 -1
  203. package/dist/terminal/pty-session.js +7 -0
  204. package/dist/terminal/pty-session.js.map +1 -1
  205. package/ide-extension/codev-vscode.vsix +0 -0
  206. package/ide-extension/manifest.json +7 -0
  207. package/package.json +8 -6
  208. package/scripts/forge/jira/_lib.sh +113 -0
  209. package/scripts/forge/jira/auth-status.sh +29 -0
  210. package/scripts/forge/jira/issue-comment.sh +23 -0
  211. package/scripts/forge/jira/issue-list.sh +32 -0
  212. package/scripts/forge/jira/issue-search.sh +40 -0
  213. package/scripts/forge/jira/issue-view.sh +41 -0
  214. package/scripts/forge/jira/recently-closed.sh +81 -0
  215. package/scripts/forge/jira/user-identity.sh +18 -0
  216. package/skeleton/.claude/skills/afx/SKILL.md +36 -0
  217. package/skeleton/.claude/skills/codev/SKILL.md +18 -2
  218. package/skeleton/.claude/skills/update-arch-docs/SKILL.md +28 -2
  219. package/skeleton/.codex/skills/afx/SKILL.md +36 -0
  220. package/skeleton/.codex/skills/codev/SKILL.md +18 -2
  221. package/skeleton/.codex/skills/update-arch-docs/SKILL.md +28 -2
  222. package/skeleton/resources/commands/agent-farm.md +112 -0
  223. package/skeleton/resources/commands/codev.md +47 -0
  224. package/skeleton/resources/commands/overview.md +1 -0
  225. package/skeleton/resources/decision-protocol.md +215 -0
  226. package/skeleton/resources/workflow-reference.md +12 -0
  227. package/skeleton/roles/architect.md +6 -0
  228. package/skeleton/templates/bootstrap-docs-prompt.md +16 -0
  229. package/skeleton/templates/bootstrap-docs-review-prompt.md +19 -0
  230. package/skeleton/templates/cheatsheet.md +1 -0
  231. package/dashboard-dist/assets/index-BuflRUi6.js.map +0 -1
@@ -0,0 +1,469 @@
1
+ /**
2
+ * Governance-doc bootstrap: the deterministic half (Spec 1797).
3
+ *
4
+ * `codev bootstrap-docs` hands the drafting of the four governance files to an agent, but
5
+ * every judgement that must be repeatable lives here, as pure functions:
6
+ *
7
+ * - which files are still untouched starters (and so may be rewritten),
8
+ * - whether the project holds anything to document at all,
9
+ * - whether a draft respects the hot-tier cap and points its map at real cold sections.
10
+ *
11
+ * The hot-cap and map rules are the same ones `hot-tier.test.ts` enforces on our own files;
12
+ * that test imports them from here so there is one definition.
13
+ */
14
+ import * as fs from 'node:fs';
15
+ import * as path from 'node:path';
16
+ import { execFileSync } from 'node:child_process';
17
+ import { HOT_TIER_FILES, COLD_TIER_FILES } from './scaffold.js';
18
+ import { isIgnored, readRootIgnore } from './tree-snapshot.js';
19
+ export const GOVERNANCE_FILES = [
20
+ { name: HOT_TIER_FILES[0], kind: 'hot', starter: HOT_TIER_FILES[0], coldDoc: COLD_TIER_FILES[0].dest },
21
+ { name: HOT_TIER_FILES[1], kind: 'hot', starter: HOT_TIER_FILES[1], coldDoc: COLD_TIER_FILES[1].dest },
22
+ { name: COLD_TIER_FILES[0].dest, kind: 'cold', starter: COLD_TIER_FILES[0].src },
23
+ { name: COLD_TIER_FILES[1].dest, kind: 'cold', starter: COLD_TIER_FILES[1].src },
24
+ ];
25
+ /**
26
+ * Earlier shipped starter texts, keyed by destination file name.
27
+ *
28
+ * The cold starters gained their `<!-- STARTER: … -->` comment in 9fa9c2316; before that
29
+ * (8ef441cc2, and the inline constants it replaced) they were the same lines without the
30
+ * comment. The hot starters have had a single version since 1a8c63b27.
31
+ */
32
+ const EARLIER_STARTERS = {
33
+ 'arch.md': [
34
+ '# Architecture\n\n' +
35
+ 'This document evolves as the project grows. Update it during the review phase of any work that introduces or changes architectural patterns.\n\n' +
36
+ '_No architecture documented yet._\n',
37
+ ],
38
+ 'lessons-learned.md': [
39
+ '# Lessons Learned\n\n' +
40
+ "Durable engineering wisdom captured across the project's work. Update it during the review phase of any work that surfaces a generally-applicable pattern, gotcha, or constraint.\n\n" +
41
+ '_No lessons captured yet._\n',
42
+ ],
43
+ };
44
+ /**
45
+ * Every starter text ever shipped for `file`: the current skeleton starter first.
46
+ *
47
+ * Throws when the current starter is absent: with no starters every file would classify
48
+ * as curated, and a mis-resolved templates directory would pass for a legitimate no-op.
49
+ */
50
+ export function knownStarterTexts(file, templatesDir) {
51
+ const current = path.join(templatesDir, file.starter);
52
+ if (!fs.existsSync(current)) {
53
+ throw new Error(`Governance starter not found: ${current}`);
54
+ }
55
+ return [fs.readFileSync(current, 'utf-8'), ...(EARLIER_STARTERS[file.name] ?? [])];
56
+ }
57
+ // A `- <…>` slot; a bullet that opens with a markdown autolink (`- <https://…>`) is content.
58
+ const SLOT_LINE = /^- <(?!(?:https?|mailto):)[^>]+>/;
59
+ const NOTHING_YET_LINE = /^_No .+ yet\._$/;
60
+ /**
61
+ * A line that only a starter carries: a `- <…>` slot, `_No … yet._`, or `STARTER:` text.
62
+ * Surrounding whitespace is ignored, so re-indenting or padding a marker does not hide it
63
+ * from the validator.
64
+ */
65
+ export function isStarterMarker(line) {
66
+ const trimmed = line.trim();
67
+ return SLOT_LINE.test(trimmed) || NOTHING_YET_LINE.test(trimmed) || trimmed.includes('STARTER:');
68
+ }
69
+ function toLines(content) {
70
+ return content.replace(/\r\n/g, '\n').split('\n');
71
+ }
72
+ /**
73
+ * Classify a governance file as an untouched starter (`placeholder`, eligible for the
74
+ * bootstrap to rewrite) or anything else (`curated`).
75
+ *
76
+ * Placeholder iff some ONE starter version contains every non-blank line verbatim, and at
77
+ * least one starter marker survives. Lines are compared exactly (only CRLF is normalised,
78
+ * so an autocrlf checkout is not misread); a line mixed in from another version, an edited
79
+ * slot, an added line, or a starter with every marker deleted all mean someone touched it,
80
+ * and every doubt resolves to `curated`.
81
+ */
82
+ export function classifyGovernanceFile(content, starters) {
83
+ if (content === null)
84
+ return 'missing';
85
+ const lines = toLines(content).filter(line => line.trim() !== '');
86
+ if (!lines.some(isStarterMarker))
87
+ return 'curated';
88
+ const fromOneStarter = starters.some(starter => {
89
+ const starterLines = new Set(toLines(starter));
90
+ return lines.every(line => starterLines.has(line));
91
+ });
92
+ if (fromOneStarter)
93
+ return 'placeholder';
94
+ return 'curated';
95
+ }
96
+ /**
97
+ * The first directory on the way to `relPath` (relative to `root`, the file itself
98
+ * excluded) that exists but is not a real directory, described for a report (`a symlinked
99
+ * codev/`), else undefined. A missing directory is not irregular: it is simply created.
100
+ */
101
+ export function irregularAncestor(root, relPath) {
102
+ const parts = relPath.split(/[\\/]/).slice(0, -1);
103
+ let current = '';
104
+ for (const part of parts) {
105
+ current = current === '' ? part : `${current}/${part}`;
106
+ let stat;
107
+ try {
108
+ stat = fs.lstatSync(path.join(root, current));
109
+ }
110
+ catch {
111
+ return undefined;
112
+ }
113
+ if (stat.isSymbolicLink())
114
+ return `a symlinked ${current}/`;
115
+ if (!stat.isDirectory())
116
+ return `${current}, which is not a directory`;
117
+ }
118
+ return undefined;
119
+ }
120
+ /**
121
+ * What a governance path is when it is not a regular file (`a symlink`, `not a regular
122
+ * file`), else undefined. Read with lstat, never through the link: change detection hashes
123
+ * a symlink by its target, so a write through the link would go unseen.
124
+ */
125
+ export function governancePathKind(root, file) {
126
+ // A symlinked `codev/` or `codev/resources/` would carry every write, and every read,
127
+ // outside the project just as surely as a symlinked file.
128
+ const ancestor = irregularAncestor(root, path.join('codev', 'resources', file.name));
129
+ if (ancestor !== undefined)
130
+ return `inside ${ancestor}`;
131
+ let stat;
132
+ try {
133
+ stat = fs.lstatSync(path.join(root, 'codev', 'resources', file.name));
134
+ }
135
+ catch {
136
+ return undefined;
137
+ }
138
+ if (stat.isSymbolicLink())
139
+ return 'a symlink';
140
+ if (!stat.isFile())
141
+ return 'not a regular file';
142
+ return undefined;
143
+ }
144
+ /**
145
+ * Read and classify one governance file of the project at `root`. A symlink or any other
146
+ * non-regular path is `curated`: it is never rewritten, whatever it points at.
147
+ */
148
+ export function classifyProjectFile(root, file, templatesDir) {
149
+ const starters = knownStarterTexts(file, templatesDir);
150
+ const filePath = path.join(root, 'codev', 'resources', file.name);
151
+ if (governancePathKind(root, file) !== undefined)
152
+ return 'curated';
153
+ let content = null;
154
+ if (fs.existsSync(filePath))
155
+ content = fs.readFileSync(filePath, 'utf-8');
156
+ return classifyGovernanceFile(content, starters);
157
+ }
158
+ /**
159
+ * Classify all four governance files of the project at `root`.
160
+ *
161
+ * A hot map is built from its cold doc's sections; with the cold doc missing there is
162
+ * nothing to build it from, so that hot placeholder is held back until `codev update`
163
+ * restores the cold starter.
164
+ */
165
+ export function classifyProjectGovernance(root, templatesDir) {
166
+ const statuses = GOVERNANCE_FILES.map(file => {
167
+ const status = { file, class: classifyProjectFile(root, file, templatesDir) };
168
+ const pathKind = governancePathKind(root, file);
169
+ if (pathKind !== undefined)
170
+ status.pathKind = pathKind;
171
+ return status;
172
+ });
173
+ for (const status of statuses) {
174
+ if (status.class !== 'placeholder' || !status.file.coldDoc)
175
+ continue;
176
+ const cold = statuses.find(other => other.file.name === status.file.coldDoc);
177
+ if (cold?.class === 'missing')
178
+ status.heldBack = `${status.file.coldDoc} is missing`;
179
+ }
180
+ return statuses;
181
+ }
182
+ /** The files a bootstrap pass may rewrite: untouched starters that are not held back. */
183
+ export function bootstrapEligibleFiles(statuses) {
184
+ return statuses.filter(status => status.class === 'placeholder' && !status.heldBack).map(status => status.file);
185
+ }
186
+ /**
187
+ * Whether `codev bootstrap-docs` has work to do at `root`: some governance file is still an
188
+ * eligible starter and the project holds something to document. Adopt and update use this
189
+ * to decide whether to offer or mention the pass.
190
+ */
191
+ export function shouldOfferBootstrap(root, templatesDir) {
192
+ let statuses;
193
+ try {
194
+ statuses = classifyProjectGovernance(root, templatesDir);
195
+ }
196
+ catch {
197
+ // A starter missing from the installed package: `codev bootstrap-docs` reports that
198
+ // loudly; an offer or a hint must not fail adopt or update over it.
199
+ return false;
200
+ }
201
+ if (bootstrapEligibleFiles(statuses).length === 0)
202
+ return false;
203
+ return isNonEmptyRepo(root);
204
+ }
205
+ // =============================================================================
206
+ // Non-empty repository
207
+ // =============================================================================
208
+ /** Top-level directories and root files Codev itself generates; they are not the project. */
209
+ const CODEV_GENERATED_DIRS = ['codev', '.codev', '.claude', '.codex'];
210
+ const CODEV_GENERATED_FILES = ['CLAUDE.md', 'AGENTS.md', '.gitignore'];
211
+ function isCodevGenerated(relPath) {
212
+ const normalized = relPath.split(path.sep).join('/');
213
+ const first = normalized.split('/')[0];
214
+ if (CODEV_GENERATED_DIRS.includes(first))
215
+ return true;
216
+ if (CODEV_GENERATED_FILES.includes(normalized))
217
+ return true;
218
+ return normalized.endsWith('.codev-new');
219
+ }
220
+ function isGitWorkTree(root) {
221
+ try {
222
+ const out = execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
223
+ cwd: root,
224
+ encoding: 'utf-8',
225
+ stdio: ['ignore', 'pipe', 'pipe'],
226
+ });
227
+ return out.trim() === 'true';
228
+ }
229
+ catch {
230
+ return false;
231
+ }
232
+ }
233
+ /**
234
+ * Whether the project at `root` holds anything beyond what Codev generated.
235
+ *
236
+ * In a git work tree: any tracked or untracked-but-not-ignored path (submodule gitlinks
237
+ * included) outside the Codev-generated set. Outside git: a filesystem walk honouring the
238
+ * root `.gitignore` and the same exclusions.
239
+ */
240
+ export function isNonEmptyRepo(root) {
241
+ if (isGitWorkTree(root)) {
242
+ try {
243
+ const out = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard', '-z'], {
244
+ cwd: root,
245
+ encoding: 'utf-8',
246
+ stdio: ['ignore', 'pipe', 'pipe'],
247
+ maxBuffer: 256 * 1024 * 1024,
248
+ });
249
+ return out.split('\0').some(rel => rel !== '' && !isCodevGenerated(rel));
250
+ }
251
+ catch {
252
+ // git present but unable to list (corrupt index, huge tree): judge from the filesystem.
253
+ }
254
+ }
255
+ return walkFindsProjectFile(root, readRootIgnore(root));
256
+ }
257
+ function walkFindsProjectFile(root, rules, dir = '') {
258
+ let entries;
259
+ try {
260
+ entries = fs.readdirSync(path.join(root, dir), { withFileTypes: true });
261
+ }
262
+ catch {
263
+ // An unreadable directory holds nothing we can see; keep walking the rest.
264
+ return false;
265
+ }
266
+ for (const entry of entries) {
267
+ const rel = dir === '' ? entry.name : `${dir}/${entry.name}`;
268
+ if (entry.name === '.git' || isCodevGenerated(rel))
269
+ continue;
270
+ if (isIgnored(rel, entry.isDirectory(), rules))
271
+ continue;
272
+ if (entry.isDirectory()) {
273
+ if (walkFindsProjectFile(root, rules, rel))
274
+ return true;
275
+ }
276
+ else {
277
+ return true;
278
+ }
279
+ }
280
+ return false;
281
+ }
282
+ // =============================================================================
283
+ // Hot cap and map rules (shared with hot-tier.test.ts)
284
+ // =============================================================================
285
+ export const HOT_CAP_LINES = 35;
286
+ export const HOT_CAP_ENTRIES = 10;
287
+ export const HOT_CAP_MAP_TOPICS = 12;
288
+ /** `- ` entries under the `## <headingPrefix>…` section, up to the next `## `. */
289
+ /**
290
+ * Whether a `## ` heading text is the section `name` itself: exactly `name`, or `name`
291
+ * followed by a parenthetical (`Critical facts (consult before deciding)`). Unlike a
292
+ * prefix test, `Critical facts appendix` is not `Critical facts`.
293
+ */
294
+ export function isSectionHeading(heading, name) {
295
+ return heading === name || heading.startsWith(`${name} (`);
296
+ }
297
+ /**
298
+ * Bullets under every `## ` heading starting with `headingPrefix`, or with `exact`, under
299
+ * the section `headingPrefix` names exactly (`isSectionHeading`).
300
+ */
301
+ export function bulletsUnder(content, headingPrefix, exact = false) {
302
+ let inSection = false;
303
+ const bullets = [];
304
+ for (const line of toLines(content)) {
305
+ if (line.startsWith('## ')) {
306
+ if (exact) {
307
+ inSection = isSectionHeading(line.slice(3).trim(), headingPrefix);
308
+ }
309
+ else {
310
+ inSection = line.startsWith(`## ${headingPrefix}`);
311
+ }
312
+ }
313
+ else if (inSection && line.startsWith('- ')) {
314
+ bullets.push(line);
315
+ }
316
+ }
317
+ return bullets;
318
+ }
319
+ /** Top-level `## ` heading texts of a markdown doc. */
320
+ export function topLevelHeadings(content) {
321
+ return toLines(content)
322
+ .filter(line => line.startsWith('## '))
323
+ .map(line => line.slice(3).trim());
324
+ }
325
+ /** Separators between a map topic and its `consult when…` guidance, em dash first. */
326
+ const MAP_SEPARATORS = [' — ', ' – ', ' - '];
327
+ /** The topic each map entry points at: its text before the `consult when…` guidance. */
328
+ export function mapTopics(content, headingPrefix = 'Map', exact = false) {
329
+ return bulletsUnder(content, headingPrefix, exact).map(line => {
330
+ const entry = line.slice(2);
331
+ const cuts = MAP_SEPARATORS.map(sep => entry.indexOf(sep)).filter(index => index >= 0);
332
+ if (cuts.length === 0)
333
+ return entry.trim();
334
+ return entry.slice(0, Math.min(...cuts)).trim();
335
+ });
336
+ }
337
+ /**
338
+ * The cold-doc headings a map topic names: an exact heading, or one it is a word-boundary
339
+ * prefix of (so `Critical` names `Critical (Prevent Major Failures)`). An exact match wins,
340
+ * so `Data` still names `## Data` alone when `## Data Flow` also exists. A valid topic
341
+ * names exactly one.
342
+ */
343
+ export function sectionsNamedBy(topic, headings) {
344
+ if (headings.includes(topic))
345
+ return [topic];
346
+ return headings.filter(heading => heading.startsWith(`${topic} `));
347
+ }
348
+ /** Lines that count toward the hot cap: everything outside HTML comments. */
349
+ export function nonCommentLineCount(content) {
350
+ // A comment occupying whole lines removes those lines entirely (not one blank in their
351
+ // place); an inline comment only removes itself.
352
+ const body = content
353
+ .replace(/\r\n/g, '\n')
354
+ .replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*(?:\n|$)/gm, '')
355
+ .replace(/<!--[\s\S]*?-->/g, '');
356
+ const lines = body.split('\n');
357
+ if (lines[lines.length - 1] === '')
358
+ lines.pop();
359
+ return lines.length;
360
+ }
361
+ function leftoverMarkers(content) {
362
+ return toLines(content)
363
+ .filter(isStarterMarker)
364
+ .map(line => ({ kind: 'leftover-marker', message: `starter text left in place: ${line.trim()}` }));
365
+ }
366
+ /** The `## Critical …` section name for a hot file kind. */
367
+ function entriesHeading(file) {
368
+ if (file.name === 'lessons-critical.md')
369
+ return 'Critical lessons';
370
+ return 'Critical facts';
371
+ }
372
+ /**
373
+ * The lines of a hot starter's guidance comment a bootstrapped draft must keep: every line
374
+ * of the starter's first HTML comment except the one carrying the `STARTER:` sentence.
375
+ */
376
+ export function guidanceCommentLines(starter) {
377
+ const lines = toLines(starter).map(line => line.trim());
378
+ const start = lines.findIndex(line => line.startsWith('<!--'));
379
+ if (start === -1)
380
+ return [];
381
+ const end = lines.findIndex((line, i) => i >= start && line.includes('-->'));
382
+ const comment = lines.slice(start, end === -1 ? lines.length : end + 1);
383
+ return comment.filter(line => line !== '' && !line.includes('STARTER:'));
384
+ }
385
+ /**
386
+ * Check a drafted hot file: no starter text, both sections present and non-empty, the cap
387
+ * (per section, comment lines excluded), and every map topic naming exactly one real cold
388
+ * section. Given the file's starter, also check the draft kept the starter's guidance
389
+ * comment (the cap and displacement rules for whoever edits the file next).
390
+ */
391
+ export function validateHotFile(content, coldContent, file, starter) {
392
+ const violations = leftoverMarkers(content);
393
+ if (starter !== undefined) {
394
+ // Where the closing `-->` lands (own line, or the end of the last kept line) is free.
395
+ const unclosed = (line) => line.trim().replace(/\s*-->$/, '');
396
+ const kept = new Set(toLines(content).map(unclosed));
397
+ const dropped = guidanceCommentLines(starter).filter(line => !kept.has(unclosed(line)));
398
+ if (dropped.length > 0) {
399
+ violations.push({ kind: 'missing-guidance', message: `the starter's guidance comment was dropped or edited: ${dropped[0]}` });
400
+ }
401
+ }
402
+ const heading = entriesHeading(file);
403
+ const mapHeading = `Map of ${file.coldDoc}`;
404
+ const hasEntries = topLevelHeadings(content).some(h => isSectionHeading(h, heading));
405
+ const hasMap = topLevelHeadings(content).some(h => isSectionHeading(h, mapHeading));
406
+ if (!hasEntries)
407
+ violations.push({ kind: 'missing-section', message: `missing "## ${heading}" section` });
408
+ if (!hasMap)
409
+ violations.push({ kind: 'missing-section', message: `missing "## Map of ${file.coldDoc}" section` });
410
+ // Count only the required sections, so a similarly named extra section ("## Critical
411
+ // notes", "## Mapping") can neither fill an empty one nor dodge the caps.
412
+ const entries = bulletsUnder(content, heading, true).length;
413
+ const topics = mapTopics(content, mapHeading, true);
414
+ // A heading with nothing under it is a draft that was never filled in, not a pass.
415
+ if (hasEntries && entries === 0) {
416
+ violations.push({ kind: 'empty-section', message: `"## ${heading}" has no entries` });
417
+ }
418
+ if (hasMap && topics.length === 0) {
419
+ violations.push({ kind: 'empty-section', message: `"## Map of ${file.coldDoc}" has no entries` });
420
+ }
421
+ if (entries > HOT_CAP_ENTRIES) {
422
+ violations.push({ kind: 'too-many-entries', message: `${entries} entries under "${heading}" (cap ${HOT_CAP_ENTRIES})` });
423
+ }
424
+ if (topics.length > HOT_CAP_MAP_TOPICS) {
425
+ violations.push({ kind: 'too-many-map-topics', message: `${topics.length} map entries (cap ${HOT_CAP_MAP_TOPICS})` });
426
+ }
427
+ const lines = nonCommentLineCount(content);
428
+ if (lines > HOT_CAP_LINES) {
429
+ violations.push({ kind: 'too-many-lines', message: `${lines} lines outside comments (cap ${HOT_CAP_LINES})` });
430
+ }
431
+ const headings = topLevelHeadings(coldContent);
432
+ const mapped = new Set();
433
+ for (const topic of topics) {
434
+ const named = sectionsNamedBy(topic, headings);
435
+ if (named.length === 0) {
436
+ violations.push({ kind: 'unknown-map-section', message: `map entry "${topic}" names no "## " section of ${file.coldDoc}` });
437
+ }
438
+ else if (named.length > 1) {
439
+ violations.push({ kind: 'ambiguous-map-section', message: `map entry "${topic}" matches several sections of ${file.coldDoc}: ${named.join(', ')}` });
440
+ }
441
+ else {
442
+ mapped.add(named[0]);
443
+ }
444
+ }
445
+ const unmappedSections = headings.filter(h => !mapped.has(h));
446
+ if (headings.length <= HOT_CAP_MAP_TOPICS) {
447
+ for (const section of unmappedSections) {
448
+ violations.push({ kind: 'unmapped-section', message: `${file.coldDoc} section "${section}" is missing from the map` });
449
+ }
450
+ }
451
+ return { violations, unmappedSections };
452
+ }
453
+ /**
454
+ * Check a drafted cold file: no starter text, and — for a file the bootstrap itself wrote —
455
+ * between 1 and 12 top-level sections, so its hot map has something to cover and can cover
456
+ * all of it.
457
+ */
458
+ export function validateColdFile(content, writtenByBootstrap) {
459
+ const violations = leftoverMarkers(content);
460
+ const sections = topLevelHeadings(content).length;
461
+ if (writtenByBootstrap && sections === 0) {
462
+ violations.push({ kind: 'empty-section', message: 'no top-level "## " sections for a hot map to point at' });
463
+ }
464
+ if (writtenByBootstrap && sections > HOT_CAP_MAP_TOPICS) {
465
+ violations.push({ kind: 'too-many-cold-sections', message: `${sections} top-level sections (keep to ${HOT_CAP_MAP_TOPICS} so the map can cover them)` });
466
+ }
467
+ return violations;
468
+ }
469
+ //# sourceMappingURL=governance-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-bootstrap.js","sourceRoot":"","sources":["../../src/lib/governance-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAmB,MAAM,oBAAoB,CAAC;AAkBhF,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;IACtG,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;IACtG,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;IAChF,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;CACjF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,gBAAgB,GAA6B;IACjD,SAAS,EAAE;QACT,oBAAoB;YAClB,kJAAkJ;YAClJ,qCAAqC;KACxC;IACD,oBAAoB,EAAE;QACpB,uBAAuB;YACrB,uLAAuL;YACvL,8BAA8B;KACjC;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAoB,EAAE,YAAoB;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC;AAQD,6FAA6F;AAC7F,MAAM,SAAS,GAAG,kCAAkC,CAAC;AACrD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsB,EAAE,QAAkB;IAC/E,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnD,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,IAAI,cAAc;QAAE,OAAO,aAAa,CAAC;IACzC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAe;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;QACvD,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,eAAe,OAAO,GAAG,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,GAAG,OAAO,4BAA4B,CAAC;IACzE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAoB;IACnE,sFAAsF;IACtF,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,UAAU,QAAQ,EAAE,CAAC;IACxD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,WAAW,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,oBAAoB,CAAC;IAChD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAoB,EAAE,YAAoB;IAC1F,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACnE,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1E,OAAO,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,YAAoB;IAC1E,MAAM,QAAQ,GAAuB,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC/D,MAAM,MAAM,GAAqB,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;QAChG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;YAAE,SAAS;QACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC;IACvF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,sBAAsB,CAAC,QAAqC;IAC1E,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,YAAoB;IACrE,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC;QACH,QAAQ,GAAG,yBAAyB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,oFAAoF;QACpF,oEAAoE;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,6FAA6F;AAC7F,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtE,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAEvE,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,qBAAqB,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;YACtE,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE;gBAChG,GAAG,EAAE,IAAI;gBACT,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;aAC7B,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,wFAAwF;QAC1F,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,KAAmB,EAAE,GAAG,GAAG,EAAE;IACvE,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC;YAAE,SAAS;QAC7D,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC;YAAE,SAAS;QACzD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,uDAAuD;AACvD,gFAAgF;AAEhF,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,kFAAkF;AAClF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAY;IAC5D,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,aAAqB,EAAE,KAAK,GAAG,KAAK;IAChF,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,KAAK,EAAE,CAAC;gBACV,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,OAAO,CAAC;SACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SACtC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,sFAAsF;AACtF,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE7C,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,aAAa,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK;IAC7E,OAAO,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,QAAkB;IAC/D,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,uFAAuF;IACvF,iDAAiD;IACjD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,wCAAwC,EAAE,EAAE,CAAC;SACrD,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAChD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AA+BD,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,OAAO,CAAC,OAAO,CAAC;SACpB,MAAM,CAAC,eAAe,CAAC;SACvB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,iBAA0B,EAAE,OAAO,EAAE,+BAA+B,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,4DAA4D;AAC5D,SAAS,cAAc,CAAC,IAAoB;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB;QAAE,OAAO,kBAAkB,CAAC;IACnE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,WAAmB,EACnB,IAAoB,EACpB,OAAgB;IAEhB,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,sFAAsF;QACtF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,yDAAyD,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChI,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,UAAU;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,OAAO,WAAW,EAAE,CAAC,CAAC;IAC1G,IAAI,CAAC,MAAM;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,sBAAsB,IAAI,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC;IAElH,qFAAqF;IACrF,0EAA0E;IAC1E,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACpD,mFAAmF;IACnF,IAAI,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,OAAO,kBAAkB,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC,OAAO,kBAAkB,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,OAAO,GAAG,eAAe,EAAE,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,OAAO,mBAAmB,OAAO,UAAU,eAAe,GAAG,EAAE,CAAC,CAAC;IAC3H,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,qBAAqB,kBAAkB,GAAG,EAAE,CAAC,CAAC;IACxH,CAAC;IACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,KAAK,gCAAgC,aAAa,GAAG,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,KAAK,+BAA+B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9H,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,cAAc,KAAK,iCAAiC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACvJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;QAC1C,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,OAAO,2BAA2B,EAAE,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,kBAA2B;IAC3E,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAClD,IAAI,kBAAkB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACzC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,kBAAkB,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC;QACxD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,GAAG,QAAQ,gCAAgC,kBAAkB,6BAA6B,EAAE,CAAC,CAAC;IAC3J,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Issue identifiers (#1740): bare numbers (GitHub, GitLab, Gitea) or tracker
3
+ * keys (Jira, Linear): `ENG-123`.
4
+ *
5
+ * The key grammar is Jira's project-key rule (a letter, then letters, digits or
6
+ * underscores), a dash, then digits. It is a superset of Linear's team keys.
7
+ * This is the one home for it on the codev side; the VS Code extension carries
8
+ * a twinned copy (apps/vscode/src/issue-id.ts) that must stay in sync.
9
+ */
10
+ /** Regex source for an issue key, unanchored, for embedding in larger patterns. */
11
+ export declare const ISSUE_KEY_SOURCE = "[A-Za-z][A-Za-z0-9_]*-\\d+";
12
+ /** The canonical (upper-case) spelling of a key: what spawn records and artifacts are named by. */
13
+ export declare const CANONICAL_KEY_SOURCE = "[A-Z][A-Z0-9_]*-\\d+";
14
+ /** True for a tracker key such as `ENG-123` (any case); false for a bare number. */
15
+ export declare function isIssueKey(value: string): boolean;
16
+ /**
17
+ * Canonical spelling of an issue id: keys upper-cased (trackers spell them that
18
+ * way, and worktrees, branches and porch state are keyed by the exact string),
19
+ * everything else unchanged.
20
+ */
21
+ export declare function canonicalIssueId(value: string): string;
22
+ /**
23
+ * Parse a CLI issue argument: a positive integer, or a key (canonicalized).
24
+ * Returns undefined for anything else.
25
+ */
26
+ export declare function parseIssueArg(value: string): number | string | undefined;
27
+ /**
28
+ * Whether two issue ids name the same issue: keys compare case-insensitively,
29
+ * so a builder recorded as `eng-123` before canonicalization still matches.
30
+ */
31
+ export declare function sameIssueId(a: number | string | undefined, b: number | string | undefined): boolean;
32
+ /** How an issue id reads in prose: `#42` for a number, `ENG-123` for a key (never `#ENG-123`). */
33
+ export declare function issueRef(id: number | string): string;
34
+ //# sourceMappingURL=issue-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-id.d.ts","sourceRoot":"","sources":["../../src/lib/issue-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,mGAAmG;AACnG,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAI3D,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CASxE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAGnG;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIpD"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Issue identifiers (#1740): bare numbers (GitHub, GitLab, Gitea) or tracker
3
+ * keys (Jira, Linear): `ENG-123`.
4
+ *
5
+ * The key grammar is Jira's project-key rule (a letter, then letters, digits or
6
+ * underscores), a dash, then digits. It is a superset of Linear's team keys.
7
+ * This is the one home for it on the codev side; the VS Code extension carries
8
+ * a twinned copy (apps/vscode/src/issue-id.ts) that must stay in sync.
9
+ */
10
+ /** Regex source for an issue key, unanchored, for embedding in larger patterns. */
11
+ export const ISSUE_KEY_SOURCE = '[A-Za-z][A-Za-z0-9_]*-\\d+';
12
+ /** The canonical (upper-case) spelling of a key: what spawn records and artifacts are named by. */
13
+ export const CANONICAL_KEY_SOURCE = '[A-Z][A-Z0-9_]*-\\d+';
14
+ const ISSUE_KEY = new RegExp(`^${ISSUE_KEY_SOURCE}$`);
15
+ /** True for a tracker key such as `ENG-123` (any case); false for a bare number. */
16
+ export function isIssueKey(value) {
17
+ return ISSUE_KEY.test(value);
18
+ }
19
+ /**
20
+ * Canonical spelling of an issue id: keys upper-cased (trackers spell them that
21
+ * way, and worktrees, branches and porch state are keyed by the exact string),
22
+ * everything else unchanged.
23
+ */
24
+ export function canonicalIssueId(value) {
25
+ if (isIssueKey(value))
26
+ return value.toUpperCase();
27
+ return value;
28
+ }
29
+ /**
30
+ * Parse a CLI issue argument: a positive integer, or a key (canonicalized).
31
+ * Returns undefined for anything else.
32
+ */
33
+ export function parseIssueArg(value) {
34
+ const trimmed = value.trim();
35
+ if (/^\d+$/.test(trimmed)) {
36
+ const parsed = parseInt(trimmed, 10);
37
+ if (parsed > 0)
38
+ return parsed;
39
+ return undefined;
40
+ }
41
+ if (isIssueKey(trimmed))
42
+ return trimmed.toUpperCase();
43
+ return undefined;
44
+ }
45
+ /**
46
+ * Whether two issue ids name the same issue: keys compare case-insensitively,
47
+ * so a builder recorded as `eng-123` before canonicalization still matches.
48
+ */
49
+ export function sameIssueId(a, b) {
50
+ if (a === undefined || b === undefined)
51
+ return false;
52
+ return String(a).toUpperCase() === String(b).toUpperCase();
53
+ }
54
+ /** How an issue id reads in prose: `#42` for a number, `ENG-123` for a key (never `#ENG-123`). */
55
+ export function issueRef(id) {
56
+ const text = String(id);
57
+ if (isIssueKey(text))
58
+ return canonicalIssueId(text);
59
+ return `#${text}`;
60
+ }
61
+ //# sourceMappingURL=issue-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-id.js","sourceRoot":"","sources":["../../src/lib/issue-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAE7D,mGAAmG;AACnG,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEtD,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,CAA8B,EAAE,CAA8B;IACxF,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,EAAmB;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -83,10 +83,14 @@ export declare const COLD_TIER_FILES: readonly [{
83
83
  export declare function copyColdTierDefaults(targetDir: string, skeletonDir: string, options?: CopyResourceTemplatesOptions): CopyResourceTemplatesResult;
84
84
  interface CopyRootFilesOptions {
85
85
  handleConflicts?: boolean;
86
+ /** Report what would be copied or conflict, writing nothing. */
87
+ dryRun?: boolean;
86
88
  }
87
89
  interface CopyRootFilesResult {
88
90
  copied: string[];
89
91
  conflicts: string[];
92
+ /** Root files left alone because the path to write is a symlink or otherwise irregular. */
93
+ notRegular: string[];
90
94
  }
91
95
  /**
92
96
  * Copy root files (CLAUDE.md, AGENTS.md) with project name substitution
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"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"}