@kynetic-ai/spec 0.1.0

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 (278) hide show
  1. package/README.md +263 -0
  2. package/dist/acp/client.d.ts +159 -0
  3. package/dist/acp/client.d.ts.map +1 -0
  4. package/dist/acp/client.js +255 -0
  5. package/dist/acp/client.js.map +1 -0
  6. package/dist/acp/framing.d.ts +119 -0
  7. package/dist/acp/framing.d.ts.map +1 -0
  8. package/dist/acp/framing.js +302 -0
  9. package/dist/acp/framing.js.map +1 -0
  10. package/dist/acp/index.d.ts +14 -0
  11. package/dist/acp/index.d.ts.map +1 -0
  12. package/dist/acp/index.js +13 -0
  13. package/dist/acp/index.js.map +1 -0
  14. package/dist/acp/types.d.ts +89 -0
  15. package/dist/acp/types.d.ts.map +1 -0
  16. package/dist/acp/types.js +99 -0
  17. package/dist/acp/types.js.map +1 -0
  18. package/dist/agents/adapters.d.ts +55 -0
  19. package/dist/agents/adapters.d.ts.map +1 -0
  20. package/dist/agents/adapters.js +84 -0
  21. package/dist/agents/adapters.js.map +1 -0
  22. package/dist/agents/index.d.ts +8 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +10 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/spawner.d.ts +53 -0
  27. package/dist/agents/spawner.d.ts.map +1 -0
  28. package/dist/agents/spawner.js +83 -0
  29. package/dist/agents/spawner.js.map +1 -0
  30. package/dist/cli/batch.d.ts +82 -0
  31. package/dist/cli/batch.d.ts.map +1 -0
  32. package/dist/cli/batch.js +162 -0
  33. package/dist/cli/batch.js.map +1 -0
  34. package/dist/cli/commands/clone-for-testing.d.ts +6 -0
  35. package/dist/cli/commands/clone-for-testing.d.ts.map +1 -0
  36. package/dist/cli/commands/clone-for-testing.js +176 -0
  37. package/dist/cli/commands/clone-for-testing.js.map +1 -0
  38. package/dist/cli/commands/derive.d.ts +6 -0
  39. package/dist/cli/commands/derive.d.ts.map +1 -0
  40. package/dist/cli/commands/derive.js +450 -0
  41. package/dist/cli/commands/derive.js.map +1 -0
  42. package/dist/cli/commands/help.d.ts +6 -0
  43. package/dist/cli/commands/help.d.ts.map +1 -0
  44. package/dist/cli/commands/help.js +196 -0
  45. package/dist/cli/commands/help.js.map +1 -0
  46. package/dist/cli/commands/inbox.d.ts +6 -0
  47. package/dist/cli/commands/inbox.d.ts.map +1 -0
  48. package/dist/cli/commands/inbox.js +235 -0
  49. package/dist/cli/commands/inbox.js.map +1 -0
  50. package/dist/cli/commands/index.d.ts +20 -0
  51. package/dist/cli/commands/index.d.ts.map +1 -0
  52. package/dist/cli/commands/index.js +21 -0
  53. package/dist/cli/commands/index.js.map +1 -0
  54. package/dist/cli/commands/init.d.ts +6 -0
  55. package/dist/cli/commands/init.d.ts.map +1 -0
  56. package/dist/cli/commands/init.js +245 -0
  57. package/dist/cli/commands/init.js.map +1 -0
  58. package/dist/cli/commands/item.d.ts +6 -0
  59. package/dist/cli/commands/item.d.ts.map +1 -0
  60. package/dist/cli/commands/item.js +1311 -0
  61. package/dist/cli/commands/item.js.map +1 -0
  62. package/dist/cli/commands/link.d.ts +6 -0
  63. package/dist/cli/commands/link.d.ts.map +1 -0
  64. package/dist/cli/commands/link.js +288 -0
  65. package/dist/cli/commands/link.js.map +1 -0
  66. package/dist/cli/commands/log.d.ts +16 -0
  67. package/dist/cli/commands/log.d.ts.map +1 -0
  68. package/dist/cli/commands/log.js +291 -0
  69. package/dist/cli/commands/log.js.map +1 -0
  70. package/dist/cli/commands/meta.d.ts +15 -0
  71. package/dist/cli/commands/meta.d.ts.map +1 -0
  72. package/dist/cli/commands/meta.js +1378 -0
  73. package/dist/cli/commands/meta.js.map +1 -0
  74. package/dist/cli/commands/module.d.ts +6 -0
  75. package/dist/cli/commands/module.d.ts.map +1 -0
  76. package/dist/cli/commands/module.js +102 -0
  77. package/dist/cli/commands/module.js.map +1 -0
  78. package/dist/cli/commands/ralph.d.ts +9 -0
  79. package/dist/cli/commands/ralph.d.ts.map +1 -0
  80. package/dist/cli/commands/ralph.js +465 -0
  81. package/dist/cli/commands/ralph.js.map +1 -0
  82. package/dist/cli/commands/search.d.ts +6 -0
  83. package/dist/cli/commands/search.d.ts.map +1 -0
  84. package/dist/cli/commands/search.js +134 -0
  85. package/dist/cli/commands/search.js.map +1 -0
  86. package/dist/cli/commands/session.d.ts +164 -0
  87. package/dist/cli/commands/session.d.ts.map +1 -0
  88. package/dist/cli/commands/session.js +745 -0
  89. package/dist/cli/commands/session.js.map +1 -0
  90. package/dist/cli/commands/setup.d.ts +26 -0
  91. package/dist/cli/commands/setup.d.ts.map +1 -0
  92. package/dist/cli/commands/setup.js +586 -0
  93. package/dist/cli/commands/setup.js.map +1 -0
  94. package/dist/cli/commands/shadow.d.ts +6 -0
  95. package/dist/cli/commands/shadow.d.ts.map +1 -0
  96. package/dist/cli/commands/shadow.js +299 -0
  97. package/dist/cli/commands/shadow.js.map +1 -0
  98. package/dist/cli/commands/task.d.ts +6 -0
  99. package/dist/cli/commands/task.d.ts.map +1 -0
  100. package/dist/cli/commands/task.js +1514 -0
  101. package/dist/cli/commands/task.js.map +1 -0
  102. package/dist/cli/commands/tasks.d.ts +6 -0
  103. package/dist/cli/commands/tasks.d.ts.map +1 -0
  104. package/dist/cli/commands/tasks.js +347 -0
  105. package/dist/cli/commands/tasks.js.map +1 -0
  106. package/dist/cli/commands/trait.d.ts +10 -0
  107. package/dist/cli/commands/trait.d.ts.map +1 -0
  108. package/dist/cli/commands/trait.js +295 -0
  109. package/dist/cli/commands/trait.js.map +1 -0
  110. package/dist/cli/commands/validate.d.ts +6 -0
  111. package/dist/cli/commands/validate.d.ts.map +1 -0
  112. package/dist/cli/commands/validate.js +626 -0
  113. package/dist/cli/commands/validate.js.map +1 -0
  114. package/dist/cli/exit-codes.d.ts +62 -0
  115. package/dist/cli/exit-codes.d.ts.map +1 -0
  116. package/dist/cli/exit-codes.js +65 -0
  117. package/dist/cli/exit-codes.js.map +1 -0
  118. package/dist/cli/help/content.d.ts +35 -0
  119. package/dist/cli/help/content.d.ts.map +1 -0
  120. package/dist/cli/help/content.js +312 -0
  121. package/dist/cli/help/content.js.map +1 -0
  122. package/dist/cli/index.d.ts +5 -0
  123. package/dist/cli/index.d.ts.map +1 -0
  124. package/dist/cli/index.js +85 -0
  125. package/dist/cli/index.js.map +1 -0
  126. package/dist/cli/introspection.d.ts +87 -0
  127. package/dist/cli/introspection.d.ts.map +1 -0
  128. package/dist/cli/introspection.js +127 -0
  129. package/dist/cli/introspection.js.map +1 -0
  130. package/dist/cli/output.d.ts +56 -0
  131. package/dist/cli/output.d.ts.map +1 -0
  132. package/dist/cli/output.js +467 -0
  133. package/dist/cli/output.js.map +1 -0
  134. package/dist/cli/suggest.d.ts +16 -0
  135. package/dist/cli/suggest.d.ts.map +1 -0
  136. package/dist/cli/suggest.js +72 -0
  137. package/dist/cli/suggest.js.map +1 -0
  138. package/dist/index.d.ts +3 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +5 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/parser/alignment.d.ts +113 -0
  143. package/dist/parser/alignment.d.ts.map +1 -0
  144. package/dist/parser/alignment.js +261 -0
  145. package/dist/parser/alignment.js.map +1 -0
  146. package/dist/parser/assess.d.ts +81 -0
  147. package/dist/parser/assess.d.ts.map +1 -0
  148. package/dist/parser/assess.js +197 -0
  149. package/dist/parser/assess.js.map +1 -0
  150. package/dist/parser/convention-validation.d.ts +48 -0
  151. package/dist/parser/convention-validation.d.ts.map +1 -0
  152. package/dist/parser/convention-validation.js +167 -0
  153. package/dist/parser/convention-validation.js.map +1 -0
  154. package/dist/parser/fix.d.ts +38 -0
  155. package/dist/parser/fix.d.ts.map +1 -0
  156. package/dist/parser/fix.js +185 -0
  157. package/dist/parser/fix.js.map +1 -0
  158. package/dist/parser/index.d.ts +12 -0
  159. package/dist/parser/index.d.ts.map +1 -0
  160. package/dist/parser/index.js +13 -0
  161. package/dist/parser/index.js.map +1 -0
  162. package/dist/parser/items.d.ts +138 -0
  163. package/dist/parser/items.d.ts.map +1 -0
  164. package/dist/parser/items.js +321 -0
  165. package/dist/parser/items.js.map +1 -0
  166. package/dist/parser/meta.d.ts +120 -0
  167. package/dist/parser/meta.d.ts.map +1 -0
  168. package/dist/parser/meta.js +441 -0
  169. package/dist/parser/meta.js.map +1 -0
  170. package/dist/parser/refs.d.ts +185 -0
  171. package/dist/parser/refs.d.ts.map +1 -0
  172. package/dist/parser/refs.js +404 -0
  173. package/dist/parser/refs.js.map +1 -0
  174. package/dist/parser/shadow.d.ts +253 -0
  175. package/dist/parser/shadow.d.ts.map +1 -0
  176. package/dist/parser/shadow.js +1053 -0
  177. package/dist/parser/shadow.js.map +1 -0
  178. package/dist/parser/traits.d.ts +72 -0
  179. package/dist/parser/traits.d.ts.map +1 -0
  180. package/dist/parser/traits.js +120 -0
  181. package/dist/parser/traits.js.map +1 -0
  182. package/dist/parser/validate.d.ts +89 -0
  183. package/dist/parser/validate.d.ts.map +1 -0
  184. package/dist/parser/validate.js +817 -0
  185. package/dist/parser/validate.js.map +1 -0
  186. package/dist/parser/yaml.d.ts +326 -0
  187. package/dist/parser/yaml.d.ts.map +1 -0
  188. package/dist/parser/yaml.js +1383 -0
  189. package/dist/parser/yaml.js.map +1 -0
  190. package/dist/ralph/cli-renderer.d.ts +20 -0
  191. package/dist/ralph/cli-renderer.d.ts.map +1 -0
  192. package/dist/ralph/cli-renderer.js +179 -0
  193. package/dist/ralph/cli-renderer.js.map +1 -0
  194. package/dist/ralph/events.d.ts +65 -0
  195. package/dist/ralph/events.d.ts.map +1 -0
  196. package/dist/ralph/events.js +397 -0
  197. package/dist/ralph/events.js.map +1 -0
  198. package/dist/ralph/index.d.ts +8 -0
  199. package/dist/ralph/index.d.ts.map +1 -0
  200. package/dist/ralph/index.js +10 -0
  201. package/dist/ralph/index.js.map +1 -0
  202. package/dist/schema/common.d.ts +46 -0
  203. package/dist/schema/common.d.ts.map +1 -0
  204. package/dist/schema/common.js +71 -0
  205. package/dist/schema/common.js.map +1 -0
  206. package/dist/schema/inbox.d.ts +90 -0
  207. package/dist/schema/inbox.d.ts.map +1 -0
  208. package/dist/schema/inbox.js +30 -0
  209. package/dist/schema/inbox.js.map +1 -0
  210. package/dist/schema/index.d.ts +6 -0
  211. package/dist/schema/index.d.ts.map +1 -0
  212. package/dist/schema/index.js +7 -0
  213. package/dist/schema/index.js.map +1 -0
  214. package/dist/schema/meta.d.ts +762 -0
  215. package/dist/schema/meta.d.ts.map +1 -0
  216. package/dist/schema/meta.js +144 -0
  217. package/dist/schema/meta.js.map +1 -0
  218. package/dist/schema/spec.d.ts +912 -0
  219. package/dist/schema/spec.d.ts.map +1 -0
  220. package/dist/schema/spec.js +104 -0
  221. package/dist/schema/spec.js.map +1 -0
  222. package/dist/schema/task.d.ts +664 -0
  223. package/dist/schema/task.d.ts.map +1 -0
  224. package/dist/schema/task.js +130 -0
  225. package/dist/schema/task.js.map +1 -0
  226. package/dist/sessions/index.d.ts +11 -0
  227. package/dist/sessions/index.d.ts.map +1 -0
  228. package/dist/sessions/index.js +13 -0
  229. package/dist/sessions/index.js.map +1 -0
  230. package/dist/sessions/store.d.ts +144 -0
  231. package/dist/sessions/store.d.ts.map +1 -0
  232. package/dist/sessions/store.js +325 -0
  233. package/dist/sessions/store.js.map +1 -0
  234. package/dist/sessions/types.d.ts +157 -0
  235. package/dist/sessions/types.d.ts.map +1 -0
  236. package/dist/sessions/types.js +90 -0
  237. package/dist/sessions/types.js.map +1 -0
  238. package/dist/strings/errors.d.ts +420 -0
  239. package/dist/strings/errors.d.ts.map +1 -0
  240. package/dist/strings/errors.js +282 -0
  241. package/dist/strings/errors.js.map +1 -0
  242. package/dist/strings/guidance.d.ts +65 -0
  243. package/dist/strings/guidance.d.ts.map +1 -0
  244. package/dist/strings/guidance.js +66 -0
  245. package/dist/strings/guidance.js.map +1 -0
  246. package/dist/strings/index.d.ts +12 -0
  247. package/dist/strings/index.d.ts.map +1 -0
  248. package/dist/strings/index.js +12 -0
  249. package/dist/strings/index.js.map +1 -0
  250. package/dist/strings/labels.d.ts +74 -0
  251. package/dist/strings/labels.d.ts.map +1 -0
  252. package/dist/strings/labels.js +75 -0
  253. package/dist/strings/labels.js.map +1 -0
  254. package/dist/strings/validation.d.ts +126 -0
  255. package/dist/strings/validation.d.ts.map +1 -0
  256. package/dist/strings/validation.js +135 -0
  257. package/dist/strings/validation.js.map +1 -0
  258. package/dist/utils/commit.d.ts +23 -0
  259. package/dist/utils/commit.d.ts.map +1 -0
  260. package/dist/utils/commit.js +67 -0
  261. package/dist/utils/commit.js.map +1 -0
  262. package/dist/utils/git.d.ts +57 -0
  263. package/dist/utils/git.d.ts.map +1 -0
  264. package/dist/utils/git.js +192 -0
  265. package/dist/utils/git.js.map +1 -0
  266. package/dist/utils/grep.d.ts +28 -0
  267. package/dist/utils/grep.d.ts.map +1 -0
  268. package/dist/utils/grep.js +86 -0
  269. package/dist/utils/grep.js.map +1 -0
  270. package/dist/utils/index.d.ts +8 -0
  271. package/dist/utils/index.d.ts.map +1 -0
  272. package/dist/utils/index.js +6 -0
  273. package/dist/utils/index.js.map +1 -0
  274. package/dist/utils/time.d.ts +18 -0
  275. package/dist/utils/time.d.ts.map +1 -0
  276. package/dist/utils/time.js +61 -0
  277. package/dist/utils/time.js.map +1 -0
  278. package/package.json +62 -0
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Reference resolution system for @references.
3
+ *
4
+ * Handles resolution of @slug and @ulid references to actual items,
5
+ * with proper error handling for not-found and ambiguous cases.
6
+ */
7
+ // ============================================================
8
+ // REFERENCE INDEX
9
+ // ============================================================
10
+ /**
11
+ * Index for efficient reference resolution.
12
+ * Build once when loading the spec, then resolve many times.
13
+ * AC: @agent-definitions ac-agent-3
14
+ */
15
+ export class ReferenceIndex {
16
+ /** slug → ULID mapping */
17
+ slugIndex = new Map();
18
+ /** ULID → item mapping */
19
+ ulidIndex = new Map();
20
+ /** All ULIDs for prefix matching */
21
+ allUlids = [];
22
+ /**
23
+ * Build index from loaded items and meta items
24
+ * AC: @agent-definitions ac-agent-3
25
+ */
26
+ constructor(tasks, items, metaItems = []) {
27
+ // Index tasks
28
+ for (const task of tasks) {
29
+ this.indexItem(task);
30
+ }
31
+ // Index spec items
32
+ for (const item of items) {
33
+ this.indexItem(item);
34
+ }
35
+ // Index meta items (agents, workflows, conventions, observations)
36
+ // AC: @agent-definitions ac-agent-3
37
+ for (const metaItem of metaItems) {
38
+ this.indexMetaItem(metaItem);
39
+ }
40
+ // Sort ULIDs for consistent ordering
41
+ this.allUlids.sort();
42
+ }
43
+ indexItem(item) {
44
+ const ulid = item._ulid;
45
+ // Index by ULID
46
+ this.ulidIndex.set(ulid, item);
47
+ this.allUlids.push(ulid);
48
+ // Index by slugs
49
+ for (const slug of item.slugs) {
50
+ const existing = this.slugIndex.get(slug);
51
+ if (existing) {
52
+ existing.push(ulid);
53
+ }
54
+ else {
55
+ this.slugIndex.set(slug, [ulid]);
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Index a meta item (agent, workflow, convention, observation)
61
+ * Meta items use 'id' field as their slug
62
+ * AC: @agent-definitions ac-agent-3
63
+ */
64
+ indexMetaItem(item) {
65
+ const ulid = item._ulid;
66
+ // Index by ULID
67
+ this.ulidIndex.set(ulid, item);
68
+ this.allUlids.push(ulid);
69
+ // Index by id (acts like a slug for meta items)
70
+ const metaItem = item;
71
+ if (metaItem.id) {
72
+ const existing = this.slugIndex.get(metaItem.id);
73
+ if (existing) {
74
+ existing.push(ulid);
75
+ }
76
+ else {
77
+ this.slugIndex.set(metaItem.id, [ulid]);
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Resolve a reference to an item.
83
+ *
84
+ * Resolution order:
85
+ * 1. Exact slug match
86
+ * 2. Full ULID match
87
+ * 3. ULID prefix match (must be unique)
88
+ */
89
+ resolve(ref) {
90
+ // Strip @ prefix if present
91
+ const cleanRef = ref.startsWith('@') ? ref.slice(1) : ref;
92
+ const cleanRefLower = cleanRef.toLowerCase();
93
+ // 1. Try slug match first
94
+ const slugMatches = this.slugIndex.get(cleanRef);
95
+ if (slugMatches) {
96
+ if (slugMatches.length > 1) {
97
+ return {
98
+ ok: false,
99
+ error: 'duplicate_slug',
100
+ ref,
101
+ candidates: slugMatches,
102
+ };
103
+ }
104
+ const ulid = slugMatches[0];
105
+ const item = this.ulidIndex.get(ulid);
106
+ return { ok: true, ulid, item, matchType: 'slug' };
107
+ }
108
+ // 2. Try full ULID match
109
+ const exactMatch = this.ulidIndex.get(cleanRef.toUpperCase());
110
+ if (exactMatch) {
111
+ return {
112
+ ok: true,
113
+ ulid: exactMatch._ulid,
114
+ item: exactMatch,
115
+ matchType: 'ulid-full',
116
+ };
117
+ }
118
+ // 3. Try ULID prefix match
119
+ const prefixMatches = this.allUlids.filter(ulid => ulid.toLowerCase().startsWith(cleanRefLower));
120
+ if (prefixMatches.length === 0) {
121
+ return { ok: false, error: 'not_found', ref };
122
+ }
123
+ if (prefixMatches.length > 1) {
124
+ return {
125
+ ok: false,
126
+ error: 'ambiguous',
127
+ ref,
128
+ candidates: prefixMatches,
129
+ };
130
+ }
131
+ const ulid = prefixMatches[0];
132
+ const item = this.ulidIndex.get(ulid);
133
+ return { ok: true, ulid, item, matchType: 'ulid-prefix' };
134
+ }
135
+ /**
136
+ * Get an item by exact ULID (no resolution, direct lookup)
137
+ */
138
+ getByUlid(ulid) {
139
+ return this.ulidIndex.get(ulid);
140
+ }
141
+ /**
142
+ * Get the minimum unique prefix for a ULID.
143
+ * Returns the shortest prefix that uniquely identifies this ULID
144
+ * among all indexed items.
145
+ *
146
+ * @param ulid The full ULID to shorten
147
+ * @param minLength Minimum prefix length (default 8)
148
+ * @returns Shortest unique prefix
149
+ */
150
+ shortUlid(ulid, minLength = 8) {
151
+ // Start with minimum length
152
+ let length = minLength;
153
+ while (length < ulid.length) {
154
+ const prefix = ulid.slice(0, length);
155
+ const matches = this.allUlids.filter(u => u.toUpperCase().startsWith(prefix.toUpperCase()));
156
+ if (matches.length === 1) {
157
+ return prefix;
158
+ }
159
+ length++;
160
+ }
161
+ // Return full ULID if no shorter unique prefix found
162
+ return ulid;
163
+ }
164
+ /**
165
+ * Get all indexed ULIDs
166
+ */
167
+ getAllUlids() {
168
+ return [...this.allUlids];
169
+ }
170
+ /**
171
+ * Get all slugs and their mappings
172
+ */
173
+ getAllSlugs() {
174
+ return new Map(this.slugIndex);
175
+ }
176
+ /**
177
+ * Check if a slug exists
178
+ */
179
+ hasSlug(slug) {
180
+ return this.slugIndex.has(slug);
181
+ }
182
+ /**
183
+ * Get count of indexed items
184
+ */
185
+ get size() {
186
+ return this.ulidIndex.size;
187
+ }
188
+ }
189
+ // ============================================================
190
+ // VALIDATION
191
+ // ============================================================
192
+ /**
193
+ * Fields that contain references
194
+ * AC: @agent-definitions ac-agent-3 - added_by for agent references
195
+ * AC: @workflow-definitions ac-workflow-3 - meta_ref for workflow references
196
+ * AC: @traits-field ac-1 - traits field contains refs to trait-type items
197
+ */
198
+ const REF_FIELDS = [
199
+ 'depends_on',
200
+ 'blocked_by',
201
+ 'implements',
202
+ 'relates_to',
203
+ 'tests',
204
+ 'supersedes',
205
+ 'spec_ref',
206
+ 'context',
207
+ 'added_by', // Agent reference
208
+ 'author', // Agent reference
209
+ 'resolved_by', // Agent reference
210
+ 'workflow_ref', // Workflow reference
211
+ 'meta_ref', // Meta reference (workflow, agent, convention)
212
+ 'traits', // Trait references (AC: @traits-field ac-1)
213
+ ];
214
+ /**
215
+ * Check if an item is deprecated
216
+ */
217
+ function isDeprecated(item) {
218
+ const obj = item;
219
+ // Check for deprecated_in field (truthy value means deprecated)
220
+ if ('deprecated_in' in obj && obj.deprecated_in) {
221
+ return true;
222
+ }
223
+ // Check for maturity: deprecated status
224
+ if ('status' in obj && obj.status && typeof obj.status === 'object') {
225
+ const status = obj.status;
226
+ if ('maturity' in status && status.maturity === 'deprecated') {
227
+ return true;
228
+ }
229
+ }
230
+ // Also check top-level maturity field (some items may have it there)
231
+ if ('maturity' in obj && obj.maturity === 'deprecated') {
232
+ return true;
233
+ }
234
+ return false;
235
+ }
236
+ /**
237
+ * Extract all references from an item
238
+ * AC: @agent-definitions ac-agent-3 - also checks nested notes for author refs
239
+ */
240
+ function extractRefs(item) {
241
+ const refs = [];
242
+ const obj = item;
243
+ for (const field of REF_FIELDS) {
244
+ const value = obj[field];
245
+ if (typeof value === 'string' && value.startsWith('@')) {
246
+ refs.push({ field, ref: value });
247
+ }
248
+ else if (Array.isArray(value)) {
249
+ for (const v of value) {
250
+ if (typeof v === 'string' && v.startsWith('@')) {
251
+ refs.push({ field, ref: v });
252
+ }
253
+ }
254
+ }
255
+ }
256
+ // Check nested notes for author references
257
+ // AC: @agent-definitions ac-agent-3
258
+ if ('notes' in obj && Array.isArray(obj.notes)) {
259
+ for (const note of obj.notes) {
260
+ if (note && typeof note === 'object' && 'author' in note) {
261
+ const author = note.author;
262
+ if (typeof author === 'string' && author.startsWith('@')) {
263
+ refs.push({ field: 'notes[].author', ref: author });
264
+ }
265
+ }
266
+ }
267
+ }
268
+ // Check nested todos for added_by references
269
+ if ('todos' in obj && Array.isArray(obj.todos)) {
270
+ for (const todo of obj.todos) {
271
+ if (todo && typeof todo === 'object' && 'added_by' in todo) {
272
+ const addedBy = todo.added_by;
273
+ if (typeof addedBy === 'string' && addedBy.startsWith('@')) {
274
+ refs.push({ field: 'todos[].added_by', ref: addedBy });
275
+ }
276
+ }
277
+ }
278
+ }
279
+ return refs;
280
+ }
281
+ /**
282
+ * Validate all references in the spec.
283
+ * Returns list of validation errors and warnings.
284
+ */
285
+ export function validateRefs(index, tasks, items) {
286
+ const errors = [];
287
+ const warnings = [];
288
+ const allItems = [...tasks, ...items];
289
+ for (const item of allItems) {
290
+ const refs = extractRefs(item);
291
+ const sourceFile = item._sourceFile;
292
+ // Track traits for duplicate detection (AC: @traits-field ac-5)
293
+ const seenTraits = new Set();
294
+ for (const { field, ref } of refs) {
295
+ const result = index.resolve(ref);
296
+ if (!result.ok) {
297
+ let message;
298
+ switch (result.error) {
299
+ case 'not_found':
300
+ message = `Reference "${ref}" not found`;
301
+ break;
302
+ case 'ambiguous':
303
+ message = `Reference "${ref}" is ambiguous, matches: ${result.candidates.join(', ')}`;
304
+ break;
305
+ case 'duplicate_slug':
306
+ message = `Slug "${ref}" maps to multiple items: ${result.candidates.join(', ')}`;
307
+ break;
308
+ }
309
+ errors.push({
310
+ ref,
311
+ sourceFile,
312
+ sourceUlid: item._ulid,
313
+ field,
314
+ error: result.error,
315
+ message,
316
+ });
317
+ }
318
+ else {
319
+ // Check if resolved target is deprecated
320
+ if (isDeprecated(result.item)) {
321
+ const targetTitle = result.item.title || result.ulid;
322
+ warnings.push({
323
+ ref,
324
+ sourceFile,
325
+ sourceUlid: item._ulid,
326
+ field,
327
+ warning: 'deprecated_target',
328
+ message: `Reference "${ref}" points to deprecated item: ${targetTitle}`,
329
+ });
330
+ }
331
+ // AC: @traits-field ac-3 - traits ref must point to trait-type item
332
+ if (field === 'traits') {
333
+ const targetItem = result.item;
334
+ if (targetItem.type !== 'trait') {
335
+ errors.push({
336
+ ref,
337
+ sourceFile,
338
+ sourceUlid: item._ulid,
339
+ field,
340
+ error: 'not_found', // Reuse error type
341
+ message: `Trait reference "${ref}" points to non-trait item (type: ${targetItem.type || 'unknown'})`,
342
+ });
343
+ }
344
+ // AC: @traits-field ac-5 - warn on duplicate traits
345
+ if (seenTraits.has(result.ulid)) {
346
+ const targetTitle = result.item.title || result.ulid;
347
+ warnings.push({
348
+ ref,
349
+ sourceFile,
350
+ sourceUlid: item._ulid,
351
+ field,
352
+ warning: 'deprecated_target', // Reuse warning type for now
353
+ message: `Duplicate trait reference "${ref}" (${targetTitle})`,
354
+ });
355
+ }
356
+ seenTraits.add(result.ulid);
357
+ }
358
+ }
359
+ }
360
+ }
361
+ return { errors, warnings };
362
+ }
363
+ /**
364
+ * Find duplicate slugs in the index.
365
+ * Returns map of slug → ULIDs for slugs with multiple items.
366
+ */
367
+ export function findDuplicateSlugs(index) {
368
+ const duplicates = new Map();
369
+ for (const [slug, ulids] of index.getAllSlugs()) {
370
+ if (ulids.length > 1) {
371
+ duplicates.set(slug, ulids);
372
+ }
373
+ }
374
+ return duplicates;
375
+ }
376
+ /**
377
+ * Check if proposed slugs are unique (don't conflict with existing items).
378
+ *
379
+ * @param index The reference index to check against
380
+ * @param slugs Array of proposed slugs to check
381
+ * @param excludeUlid Optional ULID to exclude from conflict check (for updates)
382
+ * @returns Success if all slugs are available, or conflict info if one exists
383
+ */
384
+ export function checkSlugUniqueness(index, slugs, excludeUlid) {
385
+ const allSlugs = index.getAllSlugs();
386
+ for (const slug of slugs) {
387
+ const existingUlids = allSlugs.get(slug);
388
+ if (existingUlids) {
389
+ // Filter out the item being updated (if provided)
390
+ const conflictingUlids = excludeUlid
391
+ ? existingUlids.filter(ulid => ulid !== excludeUlid)
392
+ : existingUlids;
393
+ if (conflictingUlids.length > 0) {
394
+ return {
395
+ ok: false,
396
+ slug,
397
+ existingUlid: conflictingUlids[0],
398
+ };
399
+ }
400
+ }
401
+ }
402
+ return { ok: true };
403
+ }
404
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/parser/refs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8FH,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACzB,0BAA0B;IAClB,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEhD,0BAA0B;IAClB,SAAS,GAAG,IAAI,GAAG,EAA0C,CAAC;IAEtE,oCAAoC;IAC5B,QAAQ,GAAa,EAAE,CAAC;IAEhC;;;OAGG;IACH,YACE,KAAmB,EACnB,KAAuB,EACvB,YAA8B,EAAE;QAEhC,cAAc;QACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,kEAAkE;QAClE,oCAAoC;QACpC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAEO,SAAS,CAAC,IAAmB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QAExB,gBAAgB;QAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzB,iBAAiB;QACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,IAAoB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QAExB,gBAAgB;QAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzB,gDAAgD;QAChD,MAAM,QAAQ,GAAG,IAAuB,CAAC;QACzC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,GAAW;QACjB,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1D,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE7C,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,gBAAgB;oBACvB,GAAG;oBACH,UAAU,EAAE,WAAW;iBACxB,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,yBAAyB;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,UAAU,CAAC,KAAK;gBACtB,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,WAAW;aACvB,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAChD,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAC7C,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;QAChD,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW;gBAClB,GAAG;gBACH,UAAU,EAAE,aAAa;aAC1B,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACvC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,IAAY,EAAE,SAAS,GAAG,CAAC;QACnC,4BAA4B;QAC5B,IAAI,MAAM,GAAG,SAAS,CAAC;QAEvB,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CACjD,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,MAAM,EAAE,CAAC;QACX,CAAC;QAED,qDAAqD;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF;AAED,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,GAAG;IACjB,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,OAAO;IACP,YAAY;IACZ,UAAU;IACV,SAAS;IACT,UAAU,EAAE,kBAAkB;IAC9B,QAAQ,EAAE,kBAAkB;IAC5B,aAAa,EAAE,kBAAkB;IACjC,cAAc,EAAE,qBAAqB;IACrC,UAAU,EAAE,+CAA+C;IAC3D,QAAQ,EAAE,4CAA4C;CACvD,CAAC;AAEF;;GAEG;AACH,SAAS,YAAY,CAAC,IAAoC;IACxD,MAAM,GAAG,GAAG,IAA0C,CAAC;IAEvD,gEAAgE;IAChE,IAAI,eAAe,IAAI,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wCAAwC;IACxC,IAAI,QAAQ,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAiC,CAAC;QACrD,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,IAAI,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAmB;IACtC,MAAM,IAAI,GAA0C,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,IAA0C,CAAC;IAEvD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,oCAAoC;IACpC,IAAI,OAAO,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACzD,MAAM,MAAM,GAAI,IAA4B,CAAC,MAAM,CAAC;gBACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAI,IAA8B,CAAC,QAAQ,CAAC;gBACzD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3D,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAqB,EACrB,KAAmB,EACnB,KAAuB;IAEvB,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAAoB,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC;IAEvD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAI,IAAoC,CAAC,WAAW,CAAC;QAErE,gEAAgE;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAElC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,OAAe,CAAC;gBAEpB,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;oBACrB,KAAK,WAAW;wBACd,OAAO,GAAG,cAAc,GAAG,aAAa,CAAC;wBACzC,MAAM;oBACR,KAAK,WAAW;wBACd,OAAO,GAAG,cAAc,GAAG,4BAA4B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACtF,MAAM;oBACR,KAAK,gBAAgB;wBACnB,OAAO,GAAG,SAAS,GAAG,6BAA6B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClF,MAAM;gBACV,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG;oBACH,UAAU;oBACV,UAAU,EAAE,IAAI,CAAC,KAAK;oBACtB,KAAK;oBACL,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,yCAAyC;gBACzC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9B,MAAM,WAAW,GAAI,MAAM,CAAC,IAA2B,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC;oBAC7E,QAAQ,CAAC,IAAI,CAAC;wBACZ,GAAG;wBACH,UAAU;wBACV,UAAU,EAAE,IAAI,CAAC,KAAK;wBACtB,KAAK;wBACL,OAAO,EAAE,mBAAmB;wBAC5B,OAAO,EAAE,cAAc,GAAG,gCAAgC,WAAW,EAAE;qBACxE,CAAC,CAAC;gBACL,CAAC;gBAED,oEAAoE;gBACpE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACvB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAyB,CAAC;oBACpD,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAChC,MAAM,CAAC,IAAI,CAAC;4BACV,GAAG;4BACH,UAAU;4BACV,UAAU,EAAE,IAAI,CAAC,KAAK;4BACtB,KAAK;4BACL,KAAK,EAAE,WAAW,EAAE,mBAAmB;4BACvC,OAAO,EAAE,oBAAoB,GAAG,qCAAqC,UAAU,CAAC,IAAI,IAAI,SAAS,GAAG;yBACrG,CAAC,CAAC;oBACL,CAAC;oBAED,oDAAoD;oBACpD,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChC,MAAM,WAAW,GAAI,MAAM,CAAC,IAA2B,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC;wBAC7E,QAAQ,CAAC,IAAI,CAAC;4BACZ,GAAG;4BACH,UAAU;4BACV,UAAU,EAAE,IAAI,CAAC,KAAK;4BACtB,KAAK;4BACL,OAAO,EAAE,mBAAmB,EAAE,6BAA6B;4BAC3D,OAAO,EAAE,8BAA8B,GAAG,MAAM,WAAW,GAAG;yBAC/D,CAAC,CAAC;oBACL,CAAC;oBACD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAqB;IACtD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE/C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAqBD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAqB,EACrB,KAAe,EACf,WAAoB;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,aAAa,EAAE,CAAC;YAClB,kDAAkD;YAClD,MAAM,gBAAgB,GAAG,WAAW;gBAClC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC;gBACpD,CAAC,CAAC,aAAa,CAAC;YAElB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,IAAI;oBACJ,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC;iBAClC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Shadow branch utilities for transparent spec/task state tracking.
3
+ *
4
+ * Shadow branch concept:
5
+ * - Orphan branch (kspec-meta) stores kspec state
6
+ * - .kspec/ directory is a git worktree pointing to shadow branch
7
+ * - Main branch gitignores .kspec/
8
+ * - All kspec read/write operations target .kspec/
9
+ * - Changes auto-commit to shadow branch
10
+ */
11
+ export declare function setVerboseModeGetter(getter: () => boolean): void;
12
+ /**
13
+ * Shadow branch configuration
14
+ */
15
+ export interface ShadowConfig {
16
+ /** Whether shadow branch is enabled/detected */
17
+ enabled: boolean;
18
+ /** Path to .kspec/ worktree directory */
19
+ worktreeDir: string;
20
+ /** Shadow branch name (default: kspec-meta) */
21
+ branchName: string;
22
+ /** Project root (where .kspec/ lives) */
23
+ projectRoot: string;
24
+ }
25
+ /**
26
+ * Shadow branch status
27
+ */
28
+ export interface ShadowStatus {
29
+ exists: boolean;
30
+ healthy: boolean;
31
+ branchExists: boolean;
32
+ worktreeExists: boolean;
33
+ worktreeLinked: boolean;
34
+ error?: string;
35
+ }
36
+ /**
37
+ * Error types for shadow branch issues
38
+ */
39
+ export declare class ShadowError extends Error {
40
+ code: 'NOT_INITIALIZED' | 'WORKTREE_DISCONNECTED' | 'DIRECTORY_MISSING' | 'GIT_ERROR' | 'RUNNING_FROM_SHADOW';
41
+ suggestion: string;
42
+ constructor(message: string, code: 'NOT_INITIALIZED' | 'WORKTREE_DISCONNECTED' | 'DIRECTORY_MISSING' | 'GIT_ERROR' | 'RUNNING_FROM_SHADOW', suggestion: string);
43
+ }
44
+ /**
45
+ * Default shadow branch name
46
+ */
47
+ export declare const SHADOW_BRANCH_NAME = "kspec-meta";
48
+ /**
49
+ * Default shadow worktree directory
50
+ */
51
+ export declare const SHADOW_WORKTREE_DIR = ".kspec";
52
+ /**
53
+ * Check if debug mode is enabled.
54
+ * Debug mode can be enabled via:
55
+ * - KSPEC_DEBUG=1 environment variable
56
+ * - Verbose flag (passed from CLI --debug-shadow option)
57
+ *
58
+ * When enabled, shadow branch operations output detailed information.
59
+ */
60
+ export declare function isDebugMode(verboseFlag?: boolean): boolean;
61
+ /**
62
+ * Check if we're in a git repository
63
+ */
64
+ export declare function isGitRepo(dir: string): Promise<boolean>;
65
+ /**
66
+ * Get the git root directory
67
+ */
68
+ export declare function getGitRoot(dir: string): string | null;
69
+ /**
70
+ * Check if a branch exists
71
+ */
72
+ export declare function branchExists(dir: string, branchName: string): Promise<boolean>;
73
+ /**
74
+ * Check if a directory is a valid git worktree
75
+ */
76
+ export declare function isValidWorktree(worktreeDir: string): Promise<boolean>;
77
+ /**
78
+ * Detect if running from inside the shadow worktree directory.
79
+ * Returns the main project root if detected, null otherwise.
80
+ *
81
+ * Detection logic:
82
+ * 1. Check if .git is a file (worktrees have .git files, not directories)
83
+ * 2. Read the gitdir reference from the .git file
84
+ * 3. Check if it points to a worktree for .kspec (pattern: <project>/.git/worktrees/-kspec)
85
+ */
86
+ export declare function detectRunningFromShadowWorktree(cwd: string): Promise<string | null>;
87
+ /**
88
+ * Detect shadow branch configuration from a directory.
89
+ * Returns shadow config if .kspec/ exists and is valid.
90
+ */
91
+ export declare function detectShadow(startDir: string): Promise<ShadowConfig | null>;
92
+ /**
93
+ * Get detailed shadow branch status
94
+ */
95
+ export declare function getShadowStatus(projectRoot: string): Promise<ShadowStatus>;
96
+ /**
97
+ * Create an appropriate ShadowError based on status
98
+ */
99
+ export declare function createShadowError(status: ShadowStatus): ShadowError;
100
+ /**
101
+ * Auto-commit changes to shadow branch.
102
+ * Called after write operations when shadow is enabled.
103
+ *
104
+ * @param worktreeDir Path to .kspec/ directory
105
+ * @param message Commit message
106
+ * @param verbose Enable debug output (defaults to KSPEC_DEBUG env var)
107
+ * @returns true if commit succeeded, false if nothing to commit
108
+ */
109
+ export declare function shadowAutoCommit(worktreeDir: string, message: string, verbose?: boolean): Promise<boolean>;
110
+ /**
111
+ * Generate commit message for a kspec operation.
112
+ */
113
+ export declare function generateCommitMessage(operation: string, ref?: string, detail?: string): string;
114
+ /**
115
+ * Resolve a path relative to shadow worktree if enabled.
116
+ * Falls back to original path if shadow is not enabled.
117
+ */
118
+ export declare function resolveShadowPath(originalPath: string, shadowConfig: ShadowConfig | null, projectRoot: string): string;
119
+ /**
120
+ * Commit changes to shadow branch if enabled.
121
+ * This is the primary interface for CLI commands to trigger auto-commit.
122
+ *
123
+ * @param shadowConfig Shadow configuration (from KspecContext.shadow)
124
+ * @param operation Operation type (e.g., 'task-start', 'task-complete')
125
+ * @param ref Reference slug or ULID (optional)
126
+ * @param detail Additional detail for commit message (optional)
127
+ * @param verbose Enable debug output (defaults to KSPEC_DEBUG env var)
128
+ * @returns true if committed, false if shadow not enabled or nothing to commit
129
+ */
130
+ export declare function commitIfShadow(shadowConfig: ShadowConfig | null, operation: string, ref?: string, detail?: string, verbose?: boolean): Promise<boolean>;
131
+ /**
132
+ * Check if shadow is required but not available, and throw appropriate error.
133
+ * Use this at the start of commands that require shadow mode.
134
+ *
135
+ * @param shadowConfig Shadow configuration from context
136
+ * @param projectRoot Project root for status check
137
+ * @throws ShadowError if shadow is not properly configured
138
+ */
139
+ export declare function requireShadow(shadowConfig: ShadowConfig | null, projectRoot: string): Promise<void>;
140
+ /**
141
+ * Format a ShadowError for display in CLI.
142
+ * Returns a user-friendly message with suggestion.
143
+ */
144
+ export declare function formatShadowError(error: ShadowError): string;
145
+ /**
146
+ * Result from shadow initialization
147
+ */
148
+ export interface ShadowInitResult {
149
+ success: boolean;
150
+ branchCreated: boolean;
151
+ worktreeCreated: boolean;
152
+ gitignoreUpdated: boolean;
153
+ initialCommit: boolean;
154
+ alreadyExists: boolean;
155
+ /** Whether shadow was created from existing remote branch */
156
+ createdFromRemote: boolean;
157
+ /** Whether new branch was pushed to remote to establish tracking */
158
+ pushedToRemote: boolean;
159
+ error?: string;
160
+ }
161
+ /**
162
+ * Options for shadow initialization
163
+ */
164
+ export interface ShadowInitOptions {
165
+ /** Project name for manifest */
166
+ projectName?: string;
167
+ /** Force reinitialize even if exists */
168
+ force?: boolean;
169
+ }
170
+ /**
171
+ * Check if a remote exists (default: origin)
172
+ */
173
+ export declare function hasRemote(projectRoot: string, remoteName?: string): Promise<boolean>;
174
+ /**
175
+ * Check if a branch exists on a remote
176
+ */
177
+ export declare function remoteBranchExists(projectRoot: string, branchName: string, remoteName?: string): Promise<boolean>;
178
+ /**
179
+ * Fetch from remote to ensure refs are up to date.
180
+ * Returns true if fetch succeeded, false otherwise.
181
+ */
182
+ export declare function fetchRemote(projectRoot: string, remoteName?: string): Promise<boolean>;
183
+ /**
184
+ * Push shadow branch to remote with tracking.
185
+ * Returns true if push succeeded, false otherwise.
186
+ */
187
+ export declare function pushShadowBranch(worktreeDir: string, remoteName?: string): Promise<boolean>;
188
+ /**
189
+ * Check if shadow branch has remote tracking configured.
190
+ * AC-4: Used to determine whether sync should be attempted.
191
+ */
192
+ export declare function hasRemoteTracking(worktreeDir: string): Promise<boolean>;
193
+ /**
194
+ * Ensure shadow branch has remote tracking configured.
195
+ * AC-8: If shadow has no tracking but main branch has origin remote,
196
+ * automatically configure tracking to origin/kspec-meta.
197
+ *
198
+ * @param worktreeDir Path to .kspec/ worktree
199
+ * @param projectRoot Git repository root
200
+ * @returns true if tracking is now configured (was already or just set up)
201
+ */
202
+ export declare function ensureRemoteTracking(worktreeDir: string, projectRoot: string): Promise<boolean>;
203
+ /**
204
+ * Result from a sync operation
205
+ */
206
+ export interface ShadowSyncResult {
207
+ success: boolean;
208
+ pulled: boolean;
209
+ pushed: boolean;
210
+ hadConflict: boolean;
211
+ error?: string;
212
+ }
213
+ /**
214
+ * Fire-and-forget push to remote.
215
+ * AC-1: Called after each auto-commit when tracking is configured.
216
+ * AC-8: Automatically sets up tracking if main branch has remote.
217
+ * Silently ignores errors - the local commit succeeded regardless.
218
+ *
219
+ * @param worktreeDir Path to .kspec/ worktree
220
+ * @param verbose Enable debug output
221
+ */
222
+ export declare function shadowPushAsync(worktreeDir: string, verbose?: boolean): Promise<void>;
223
+ /**
224
+ * Pull remote changes to shadow branch.
225
+ * AC-2: Called at session start to sync before operations.
226
+ * AC-6: Uses --ff-only first, falls back to --rebase.
227
+ * AC-3: On conflict, returns failure with suggestion.
228
+ * AC-8: Automatically sets up tracking if main branch has remote.
229
+ */
230
+ export declare function shadowPull(worktreeDir: string): Promise<ShadowSyncResult>;
231
+ /**
232
+ * Full sync operation: pull then push.
233
+ * Used by session start and explicit sync commands.
234
+ */
235
+ export declare function shadowSync(worktreeDir: string): Promise<ShadowSyncResult>;
236
+ /**
237
+ * Initialize shadow branch and worktree.
238
+ * Creates orphan branch, worktree, updates gitignore, and creates initial structure.
239
+ *
240
+ * @param projectRoot Git repository root
241
+ * @param options Initialization options
242
+ * @returns Result indicating what was created
243
+ */
244
+ export declare function initializeShadow(projectRoot: string, options?: ShadowInitOptions): Promise<ShadowInitResult>;
245
+ /**
246
+ * Repair a broken shadow branch setup.
247
+ * Handles cases where worktree is disconnected or directory is missing.
248
+ *
249
+ * @param projectRoot Git repository root
250
+ * @returns Result indicating what was repaired
251
+ */
252
+ export declare function repairShadow(projectRoot: string): Promise<ShadowInitResult>;
253
+ //# sourceMappingURL=shadow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../src/parser/shadow.ts"],"names":[],"mappings":"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"}