@kiwidata/grimoire 0.1.1

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 (215) hide show
  1. package/.claude-plugin/plugin.json +8 -0
  2. package/AGENTS.md +217 -0
  3. package/README.md +748 -0
  4. package/bin/grimoire.js +2 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +42 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/commands/archive.d.ts +3 -0
  10. package/dist/commands/archive.d.ts.map +1 -0
  11. package/dist/commands/archive.js +22 -0
  12. package/dist/commands/archive.js.map +1 -0
  13. package/dist/commands/branch-check.d.ts +3 -0
  14. package/dist/commands/branch-check.d.ts.map +1 -0
  15. package/dist/commands/branch-check.js +16 -0
  16. package/dist/commands/branch-check.js.map +1 -0
  17. package/dist/commands/check.d.ts +3 -0
  18. package/dist/commands/check.d.ts.map +1 -0
  19. package/dist/commands/check.js +22 -0
  20. package/dist/commands/check.js.map +1 -0
  21. package/dist/commands/ci.d.ts +3 -0
  22. package/dist/commands/ci.d.ts.map +1 -0
  23. package/dist/commands/ci.js +18 -0
  24. package/dist/commands/ci.js.map +1 -0
  25. package/dist/commands/diff.d.ts +3 -0
  26. package/dist/commands/diff.d.ts.map +1 -0
  27. package/dist/commands/diff.js +10 -0
  28. package/dist/commands/diff.js.map +1 -0
  29. package/dist/commands/docs.d.ts +3 -0
  30. package/dist/commands/docs.d.ts.map +1 -0
  31. package/dist/commands/docs.js +11 -0
  32. package/dist/commands/docs.js.map +1 -0
  33. package/dist/commands/health.d.ts +3 -0
  34. package/dist/commands/health.d.ts.map +1 -0
  35. package/dist/commands/health.js +13 -0
  36. package/dist/commands/health.js.map +1 -0
  37. package/dist/commands/init.d.ts +3 -0
  38. package/dist/commands/init.d.ts.map +1 -0
  39. package/dist/commands/init.js +21 -0
  40. package/dist/commands/init.js.map +1 -0
  41. package/dist/commands/list.d.ts +3 -0
  42. package/dist/commands/list.d.ts.map +1 -0
  43. package/dist/commands/list.js +22 -0
  44. package/dist/commands/list.js.map +1 -0
  45. package/dist/commands/log.d.ts +3 -0
  46. package/dist/commands/log.d.ts.map +1 -0
  47. package/dist/commands/log.js +15 -0
  48. package/dist/commands/log.js.map +1 -0
  49. package/dist/commands/map.d.ts +3 -0
  50. package/dist/commands/map.d.ts.map +1 -0
  51. package/dist/commands/map.js +17 -0
  52. package/dist/commands/map.js.map +1 -0
  53. package/dist/commands/pr.d.ts +3 -0
  54. package/dist/commands/pr.d.ts.map +1 -0
  55. package/dist/commands/pr.js +17 -0
  56. package/dist/commands/pr.js.map +1 -0
  57. package/dist/commands/status.d.ts +3 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +12 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/test-quality.d.ts +3 -0
  62. package/dist/commands/test-quality.d.ts.map +1 -0
  63. package/dist/commands/test-quality.js +37 -0
  64. package/dist/commands/test-quality.js.map +1 -0
  65. package/dist/commands/trace.d.ts +3 -0
  66. package/dist/commands/trace.d.ts.map +1 -0
  67. package/dist/commands/trace.js +12 -0
  68. package/dist/commands/trace.js.map +1 -0
  69. package/dist/commands/update.d.ts +3 -0
  70. package/dist/commands/update.d.ts.map +1 -0
  71. package/dist/commands/update.js +22 -0
  72. package/dist/commands/update.js.map +1 -0
  73. package/dist/commands/validate.d.ts +3 -0
  74. package/dist/commands/validate.d.ts.map +1 -0
  75. package/dist/commands/validate.js +17 -0
  76. package/dist/commands/validate.js.map +1 -0
  77. package/dist/core/archive.d.ts +9 -0
  78. package/dist/core/archive.d.ts.map +1 -0
  79. package/dist/core/archive.js +92 -0
  80. package/dist/core/archive.js.map +1 -0
  81. package/dist/core/branch-check.d.ts +27 -0
  82. package/dist/core/branch-check.d.ts.map +1 -0
  83. package/dist/core/branch-check.js +205 -0
  84. package/dist/core/branch-check.js.map +1 -0
  85. package/dist/core/check.d.ts +24 -0
  86. package/dist/core/check.d.ts.map +1 -0
  87. package/dist/core/check.js +372 -0
  88. package/dist/core/check.js.map +1 -0
  89. package/dist/core/ci.d.ts +24 -0
  90. package/dist/core/ci.d.ts.map +1 -0
  91. package/dist/core/ci.js +162 -0
  92. package/dist/core/ci.js.map +1 -0
  93. package/dist/core/detect.d.ts +10 -0
  94. package/dist/core/detect.d.ts.map +1 -0
  95. package/dist/core/detect.js +368 -0
  96. package/dist/core/detect.js.map +1 -0
  97. package/dist/core/diff.d.ts +29 -0
  98. package/dist/core/diff.d.ts.map +1 -0
  99. package/dist/core/diff.js +197 -0
  100. package/dist/core/diff.js.map +1 -0
  101. package/dist/core/doc-style.d.ts +16 -0
  102. package/dist/core/doc-style.d.ts.map +1 -0
  103. package/dist/core/doc-style.js +192 -0
  104. package/dist/core/doc-style.js.map +1 -0
  105. package/dist/core/docs.d.ts +6 -0
  106. package/dist/core/docs.d.ts.map +1 -0
  107. package/dist/core/docs.js +478 -0
  108. package/dist/core/docs.js.map +1 -0
  109. package/dist/core/health.d.ts +7 -0
  110. package/dist/core/health.d.ts.map +1 -0
  111. package/dist/core/health.js +489 -0
  112. package/dist/core/health.js.map +1 -0
  113. package/dist/core/hooks.d.ts +5 -0
  114. package/dist/core/hooks.d.ts.map +1 -0
  115. package/dist/core/hooks.js +168 -0
  116. package/dist/core/hooks.js.map +1 -0
  117. package/dist/core/init.d.ts +9 -0
  118. package/dist/core/init.d.ts.map +1 -0
  119. package/dist/core/init.js +563 -0
  120. package/dist/core/init.js.map +1 -0
  121. package/dist/core/list.d.ts +4 -0
  122. package/dist/core/list.d.ts.map +1 -0
  123. package/dist/core/list.js +170 -0
  124. package/dist/core/list.js.map +1 -0
  125. package/dist/core/log.d.ts +8 -0
  126. package/dist/core/log.d.ts.map +1 -0
  127. package/dist/core/log.js +150 -0
  128. package/dist/core/log.js.map +1 -0
  129. package/dist/core/map.d.ts +9 -0
  130. package/dist/core/map.d.ts.map +1 -0
  131. package/dist/core/map.js +302 -0
  132. package/dist/core/map.js.map +1 -0
  133. package/dist/core/pr.d.ts +9 -0
  134. package/dist/core/pr.d.ts.map +1 -0
  135. package/dist/core/pr.js +273 -0
  136. package/dist/core/pr.js.map +1 -0
  137. package/dist/core/shared-setup.d.ts +52 -0
  138. package/dist/core/shared-setup.d.ts.map +1 -0
  139. package/dist/core/shared-setup.js +221 -0
  140. package/dist/core/shared-setup.js.map +1 -0
  141. package/dist/core/status.d.ts +6 -0
  142. package/dist/core/status.d.ts.map +1 -0
  143. package/dist/core/status.js +114 -0
  144. package/dist/core/status.js.map +1 -0
  145. package/dist/core/test-quality.d.ts +33 -0
  146. package/dist/core/test-quality.d.ts.map +1 -0
  147. package/dist/core/test-quality.js +378 -0
  148. package/dist/core/test-quality.js.map +1 -0
  149. package/dist/core/trace.d.ts +6 -0
  150. package/dist/core/trace.d.ts.map +1 -0
  151. package/dist/core/trace.js +211 -0
  152. package/dist/core/trace.js.map +1 -0
  153. package/dist/core/update.d.ts +10 -0
  154. package/dist/core/update.d.ts.map +1 -0
  155. package/dist/core/update.js +149 -0
  156. package/dist/core/update.js.map +1 -0
  157. package/dist/core/validate.d.ts +20 -0
  158. package/dist/core/validate.d.ts.map +1 -0
  159. package/dist/core/validate.js +275 -0
  160. package/dist/core/validate.js.map +1 -0
  161. package/dist/index.d.ts +19 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +20 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/utils/config.d.ts +61 -0
  166. package/dist/utils/config.d.ts.map +1 -0
  167. package/dist/utils/config.js +172 -0
  168. package/dist/utils/config.js.map +1 -0
  169. package/dist/utils/fs.d.ts +17 -0
  170. package/dist/utils/fs.d.ts.map +1 -0
  171. package/dist/utils/fs.js +38 -0
  172. package/dist/utils/fs.js.map +1 -0
  173. package/dist/utils/paths.d.ts +10 -0
  174. package/dist/utils/paths.d.ts.map +1 -0
  175. package/dist/utils/paths.js +35 -0
  176. package/dist/utils/paths.js.map +1 -0
  177. package/dist/utils/spawn.d.ts +5 -0
  178. package/dist/utils/spawn.d.ts.map +1 -0
  179. package/dist/utils/spawn.js +34 -0
  180. package/dist/utils/spawn.js.map +1 -0
  181. package/package.json +68 -0
  182. package/skills/grimoire-apply/SKILL.md +274 -0
  183. package/skills/grimoire-audit/SKILL.md +129 -0
  184. package/skills/grimoire-branch-guard/SKILL.md +111 -0
  185. package/skills/grimoire-bug/SKILL.md +160 -0
  186. package/skills/grimoire-bug-explore/SKILL.md +242 -0
  187. package/skills/grimoire-bug-report/SKILL.md +237 -0
  188. package/skills/grimoire-bug-session/SKILL.md +222 -0
  189. package/skills/grimoire-bug-triage/SKILL.md +274 -0
  190. package/skills/grimoire-commit/SKILL.md +150 -0
  191. package/skills/grimoire-discover/SKILL.md +297 -0
  192. package/skills/grimoire-draft/SKILL.md +202 -0
  193. package/skills/grimoire-plan/SKILL.md +329 -0
  194. package/skills/grimoire-pr/SKILL.md +134 -0
  195. package/skills/grimoire-pr-review/SKILL.md +240 -0
  196. package/skills/grimoire-refactor/SKILL.md +251 -0
  197. package/skills/grimoire-remove/SKILL.md +112 -0
  198. package/skills/grimoire-review/SKILL.md +247 -0
  199. package/skills/grimoire-verify/SKILL.md +223 -0
  200. package/skills/references/bug-classification.md +154 -0
  201. package/skills/references/build-vs-buy.md +77 -0
  202. package/skills/references/elicitation-personas.md +118 -0
  203. package/skills/references/refactor-register-format.md +88 -0
  204. package/skills/references/refactor-scan-categories.md +102 -0
  205. package/skills/references/schema-format.md +68 -0
  206. package/skills/references/security-compliance.md +110 -0
  207. package/skills/references/testing-contracts.md +93 -0
  208. package/templates/context.yml +110 -0
  209. package/templates/debt-exceptions.yml +61 -0
  210. package/templates/decision.md +50 -0
  211. package/templates/dupignore +93 -0
  212. package/templates/example.feature +24 -0
  213. package/templates/manifest.md +29 -0
  214. package/templates/mapignore +58 -0
  215. package/templates/mapkeys +65 -0
@@ -0,0 +1,211 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { join, relative } from "node:path";
3
+ import chalk from "chalk";
4
+ import { simpleGit } from "simple-git";
5
+ import { findProjectRoot } from "../utils/paths.js";
6
+ export async function traceFile(target, options) {
7
+ const root = await findProjectRoot();
8
+ // Parse target: could be "file.ts", "file.ts:42", or "file.ts:10-20"
9
+ const { file, line } = parseTarget(target);
10
+ const relFile = relative(root, join(process.cwd(), file));
11
+ // Step 1: Get commits that touched this file/line
12
+ const commits = await getCommits(root, relFile, line);
13
+ if (commits.length === 0) {
14
+ console.log(chalk.dim(`No git history found for ${relFile}`));
15
+ return;
16
+ }
17
+ // Step 2: Extract change IDs from commit trailers
18
+ const changeIds = new Set();
19
+ for (const c of commits) {
20
+ if (c.changeId)
21
+ changeIds.add(c.changeId);
22
+ }
23
+ // Step 3: Look up change details from archive and active changes
24
+ const changes = await lookupChanges(root, changeIds);
25
+ const result = { file: relFile, line, commits, changes };
26
+ if (options.json) {
27
+ console.log(JSON.stringify(result, null, 2));
28
+ return;
29
+ }
30
+ // Pretty output
31
+ console.log(chalk.bold(`\nTrace: ${relFile}${line ? `:${line}` : ""}\n`));
32
+ // Show commits
33
+ console.log(chalk.bold.underline("Commits\n"));
34
+ for (const c of commits.slice(0, 20)) {
35
+ const changeTag = c.changeId
36
+ ? chalk.cyan(` [${c.changeId}]`)
37
+ : "";
38
+ console.log(` ${chalk.dim(c.hash.slice(0, 8))} ${chalk.dim(c.date)} ${c.subject}${changeTag}`);
39
+ }
40
+ if (commits.length > 20) {
41
+ console.log(chalk.dim(` ... and ${commits.length - 20} more`));
42
+ }
43
+ // Show linked changes
44
+ if (changes.length > 0) {
45
+ console.log(chalk.bold.underline("\nLinked Changes\n"));
46
+ for (const ch of changes) {
47
+ const status = ch.archived
48
+ ? chalk.green("archived")
49
+ : chalk.yellow("active");
50
+ console.log(` ${chalk.cyan(ch.changeId)} ${chalk.dim(ch.date)} ${status}`);
51
+ console.log(` ${ch.summary}`);
52
+ if (ch.why) {
53
+ console.log(` ${chalk.dim("Why:")} ${ch.why}`);
54
+ }
55
+ if (ch.features.length > 0) {
56
+ console.log(` ${chalk.dim("Features:")} ${ch.features.join(", ")}`);
57
+ }
58
+ if (ch.decisions.length > 0) {
59
+ console.log(` ${chalk.dim("Decisions:")} ${ch.decisions.join(", ")}`);
60
+ }
61
+ console.log();
62
+ }
63
+ }
64
+ else if (changeIds.size === 0) {
65
+ console.log(chalk.dim("\nNo grimoire change IDs found in commit trailers.\nCommits without a Change: trailer are not linked to grimoire changes.\n"));
66
+ }
67
+ }
68
+ function parseTarget(target) {
69
+ // Match file.ts:42 or file.ts:10-20 (use start line)
70
+ const match = target.match(/^(.+):(\d+)(?:-\d+)?$/);
71
+ if (match) {
72
+ return { file: match[1], line: parseInt(match[2], 10) };
73
+ }
74
+ return { file: target };
75
+ }
76
+ async function getCommits(root, relFile, line) {
77
+ const commits = [];
78
+ const git = simpleGit(root);
79
+ try {
80
+ // Use git log with trailer parsing
81
+ // Format: hash|date|author|subject|trailers
82
+ const args = [
83
+ "log",
84
+ "--format=%H%x1f%as%x1f%an%x1f%s%x1f%(trailers:key=Change,valueonly,separator=%x00)",
85
+ "--follow",
86
+ ];
87
+ if (line) {
88
+ args.push(`-L${line},${line}:${relFile}`);
89
+ // -L doesn't support --follow, remove it
90
+ args.splice(args.indexOf("--follow"), 1);
91
+ }
92
+ else {
93
+ args.push("--", relFile);
94
+ }
95
+ const stdout = await git.raw(args);
96
+ for (const rawLine of stdout.trim().split("\n")) {
97
+ if (!rawLine)
98
+ continue;
99
+ // For -L format, git outputs diff lines too — only parse our format lines
100
+ const parts = rawLine.split("\x1f");
101
+ if (parts.length < 4)
102
+ continue;
103
+ if (!/^[0-9a-f]{40}$/.test(parts[0]))
104
+ continue;
105
+ const [hash, date, author, subject, ...trailerParts] = parts;
106
+ const changeTrailer = trailerParts.join("").trim();
107
+ commits.push({
108
+ hash,
109
+ date,
110
+ author,
111
+ subject,
112
+ changeId: changeTrailer || undefined,
113
+ });
114
+ }
115
+ }
116
+ catch {
117
+ // git log failed — likely not a git repo or file has no history
118
+ }
119
+ // Deduplicate (git -L can produce dupes)
120
+ const seen = new Set();
121
+ return commits.filter((c) => {
122
+ if (seen.has(c.hash))
123
+ return false;
124
+ seen.add(c.hash);
125
+ return true;
126
+ });
127
+ }
128
+ async function lookupChanges(root, changeIds) {
129
+ const changes = [];
130
+ for (const changeId of changeIds) {
131
+ // Check archive first
132
+ const archiveEntry = await findInArchive(root, changeId);
133
+ if (archiveEntry) {
134
+ changes.push(archiveEntry);
135
+ continue;
136
+ }
137
+ // Check active changes
138
+ const activeEntry = await findInActive(root, changeId);
139
+ if (activeEntry) {
140
+ changes.push(activeEntry);
141
+ }
142
+ }
143
+ // Sort by date, newest first
144
+ changes.sort((a, b) => b.date.localeCompare(a.date));
145
+ return changes;
146
+ }
147
+ async function findInArchive(root, changeId) {
148
+ const archiveDir = join(root, ".grimoire", "archive");
149
+ let dirs;
150
+ try {
151
+ const entries = await readdir(archiveDir);
152
+ dirs = entries.filter((d) => d.endsWith(`-${changeId}`));
153
+ }
154
+ catch {
155
+ return null;
156
+ }
157
+ if (dirs.length === 0)
158
+ return null;
159
+ const dir = dirs[0];
160
+ const match = dir.match(/^(\d{4}-\d{2}-\d{2})-/);
161
+ const date = match ? match[1] : "";
162
+ const manifestPath = join(archiveDir, dir, "manifest.md");
163
+ try {
164
+ const manifest = await readFile(manifestPath, "utf-8");
165
+ const parsed = parseManifest(manifest);
166
+ return {
167
+ changeId,
168
+ date,
169
+ archived: true,
170
+ ...parsed,
171
+ };
172
+ }
173
+ catch {
174
+ return { changeId, date, summary: "(manifest not readable)", why: "", features: [], decisions: [], archived: true };
175
+ }
176
+ }
177
+ async function findInActive(root, changeId) {
178
+ const manifestPath = join(root, ".grimoire", "changes", changeId, "manifest.md");
179
+ try {
180
+ const manifest = await readFile(manifestPath, "utf-8");
181
+ const parsed = parseManifest(manifest);
182
+ return {
183
+ changeId,
184
+ date: "(active)",
185
+ archived: false,
186
+ ...parsed,
187
+ };
188
+ }
189
+ catch {
190
+ return null;
191
+ }
192
+ }
193
+ function parseManifest(content) {
194
+ const titleMatch = content.match(/^#\s+Change:\s*(.+)$/m);
195
+ const summary = titleMatch ? titleMatch[1].trim() : "(no summary)";
196
+ const whyMatch = content.match(/^##\s+Why\s*\n([\s\S]*?)(?=^##|\Z)/m);
197
+ const why = whyMatch ? whyMatch[1].trim() : "";
198
+ const features = [];
199
+ const featurePattern = /\*\*(?:ADDED|MODIFIED|REMOVED)\*\*\s+`([^`]+\.feature)`/g;
200
+ let m;
201
+ while ((m = featurePattern.exec(content)) !== null) {
202
+ features.push(m[1]);
203
+ }
204
+ const decisions = [];
205
+ const decisionPattern = /\*\*(?:ADDED|MODIFIED|SUPERSEDED)\*\*\s+`(\d{4}-[^`]+\.md)`/g;
206
+ while ((m = decisionPattern.exec(content)) !== null) {
207
+ decisions.push(m[1]);
208
+ }
209
+ return { summary, why, features, decisions };
210
+ }
211
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/core/trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA+BpD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,OAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IAErC,qEAAqE;IACrE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,kDAAkD;IAClD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAEtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,kDAAkD;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,QAAQ;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,iEAAiE;IACjE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAErD,MAAM,MAAM,GAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAEtE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1E,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ;YAC1B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;YAChC,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,SAAS,EAAE,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ;gBACxB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CACjE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxD,CAAC;YACJ,CAAC;YACD,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1D,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,6HAA6H,CAC9H,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,qDAAqD;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACpD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,IAAY,EACZ,OAAe,EACf,IAAa;IAEb,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,CAAC;QACH,mCAAmC;QACnC,4CAA4C;QAC5C,MAAM,IAAI,GAAG;YACX,KAAK;YACL,oFAAoF;YACpF,UAAU;SACX,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;YAC1C,yCAAyC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,0EAA0E;YAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;YAE/C,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,GAAG,KAAK,CAAC;YAC7D,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAEnD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,IAAI;gBACJ,MAAM;gBACN,OAAO;gBACP,QAAQ,EAAE,aAAa,IAAI,SAAS;aACrC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,yCAAyC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,SAAsB;IAEtB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,sBAAsB;QACtB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,uBAAuB;QACvB,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,QAAgB;IAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEtD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO;YACL,QAAQ;YACR,IAAI;YACJ,QAAQ,EAAE,IAAI;YACd,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACtH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAY,EACZ,QAAgB;IAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEjF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO;YACL,QAAQ;YACR,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,KAAK;YACf,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IAMpC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IAEnE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,qCAAqC,CACtC,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,cAAc,GAAG,0DAA0D,CAAC;IAClF,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,8DAA8D,CAAC;IACvF,OAAO,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface UpdateOptions {
2
+ skipAgents: boolean;
3
+ skipSkills: boolean;
4
+ skipHooks: boolean;
5
+ skipTemplates: boolean;
6
+ forceTemplates: boolean;
7
+ skipConfig: boolean;
8
+ }
9
+ export declare function updateProject(projectPath: string, options: UpdateOptions): Promise<void>;
10
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAuDf"}
@@ -0,0 +1,149 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { join, dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { parse as yamlParse, stringify as yamlStringify } from "yaml";
5
+ import chalk from "chalk";
6
+ import { fileExists } from "../utils/fs.js";
7
+ import { loadConfig, CURRENT_CONFIG_VERSION } from "../utils/config.js";
8
+ import { upsertAgentsFile, installSkillFiles, installTemplates, ensureDirectories, generateAgentFiles, detectAgentFiles, SKILL_NAMES, } from "./shared-setup.js";
9
+ import { setupHooks } from "./hooks.js";
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const PACKAGE_ROOT = join(__dirname, "..", "..");
12
+ export async function updateProject(projectPath, options) {
13
+ const root = join(process.cwd(), projectPath);
14
+ // Verify this is a grimoire project
15
+ if (!(await fileExists(join(root, ".grimoire")))) {
16
+ throw new Error("No .grimoire/ directory found. Run grimoire init first.");
17
+ }
18
+ console.log(chalk.bold("Updating grimoire...\n"));
19
+ // 1. Migrate config if needed
20
+ if (!options.skipConfig) {
21
+ await migrateConfig(root);
22
+ }
23
+ // 2. Ensure all directories exist
24
+ await ensureDirectories(root);
25
+ // 3. Update templates (create missing, optionally force-overwrite)
26
+ if (!options.skipTemplates) {
27
+ await installTemplates(root, PACKAGE_ROOT, options.forceTemplates);
28
+ }
29
+ // 4. Update AGENTS.md
30
+ if (!options.skipAgents) {
31
+ await updateAgentsFile(root);
32
+ }
33
+ // 5. Determine agents from config (fallback to auto-detect for legacy projects)
34
+ const config = await loadConfig(root);
35
+ const configAgents = config.project.agents ?? [];
36
+ const agents = configAgents.length > 0 ? configAgents : await detectAgentFiles(root);
37
+ const instructionAgents = agents.filter((a) => ["cursor", "copilot"].includes(a));
38
+ const skillAgents = agents.filter((a) => ["claude", "opencode", "codex"].includes(a));
39
+ // 6. Update agent-specific instruction files (cursor, copilot)
40
+ if (!options.skipAgents && instructionAgents.length > 0) {
41
+ await generateAgentFiles(root, PACKAGE_ROOT, instructionAgents, "updated");
42
+ }
43
+ // 7. Update skills (install to every selected agent's skill dir)
44
+ if (!options.skipSkills) {
45
+ const targets = skillAgents.length > 0 ? skillAgents : ["claude"];
46
+ await updateSkills(root, targets);
47
+ }
48
+ // 8. Update hooks
49
+ if (!options.skipHooks) {
50
+ await setupHooks(root);
51
+ }
52
+ // 9. Write version stamp
53
+ await writeVersionStamp(root);
54
+ console.log(`\n${chalk.bold.green("Done!")} Grimoire updated.`);
55
+ }
56
+ async function updateAgentsFile(root) {
57
+ const config = await loadConfig(root);
58
+ const caveman = config.project.caveman ?? "none";
59
+ await upsertAgentsFile(root, PACKAGE_ROOT, "updated", caveman);
60
+ }
61
+ async function updateSkills(root, agents) {
62
+ await installSkillFiles(root, PACKAGE_ROOT, SKILL_NAMES, "updated", agents);
63
+ }
64
+ /**
65
+ * Migrate config.yaml to the current schema version.
66
+ * Additive only — never removes user keys.
67
+ */
68
+ async function migrateConfig(root) {
69
+ const configPath = join(root, ".grimoire", "config.yaml");
70
+ if (!(await fileExists(configPath))) {
71
+ console.log(` ${chalk.yellow("skipped")} config migration (no config.yaml)`);
72
+ return;
73
+ }
74
+ const content = await readFile(configPath, "utf-8");
75
+ let raw;
76
+ try {
77
+ raw = yamlParse(content) ?? {};
78
+ }
79
+ catch {
80
+ console.log(` ${chalk.yellow("skipped")} config migration (invalid YAML)`);
81
+ return;
82
+ }
83
+ const currentVersion = Number(raw.version ?? 1);
84
+ if (currentVersion >= CURRENT_CONFIG_VERSION) {
85
+ return; // already up to date
86
+ }
87
+ // Apply migrations in order
88
+ for (const migration of MIGRATIONS) {
89
+ if (currentVersion <= migration.from) {
90
+ migration.apply(raw);
91
+ }
92
+ }
93
+ raw.version = CURRENT_CONFIG_VERSION;
94
+ await writeFile(configPath, yamlStringify(raw));
95
+ console.log(` ${chalk.blue("migrated")} config.yaml (v${currentVersion} → v${CURRENT_CONFIG_VERSION})`);
96
+ }
97
+ function ensureChecks(raw, required) {
98
+ if (!Array.isArray(raw.checks))
99
+ return;
100
+ const checks = raw.checks;
101
+ for (const check of required) {
102
+ if (!checks.includes(check)) {
103
+ checks.push(check);
104
+ }
105
+ }
106
+ }
107
+ function upgradeFlatlLlm(raw) {
108
+ if (!raw.llm || typeof raw.llm !== "object")
109
+ return;
110
+ const llm = raw.llm;
111
+ if (!llm.thinking && llm.command) {
112
+ const cmd = String(llm.command);
113
+ llm.thinking = { command: cmd };
114
+ llm.coding = { command: cmd };
115
+ delete llm.command;
116
+ }
117
+ }
118
+ const MIGRATIONS = [
119
+ {
120
+ from: 1,
121
+ to: 2,
122
+ apply: (raw) => {
123
+ if (!raw.project || typeof raw.project !== "object") {
124
+ raw.project = {};
125
+ }
126
+ const project = raw.project;
127
+ if (!project.caveman) {
128
+ project.caveman = "lite";
129
+ }
130
+ ensureChecks(raw, ["dep_audit", "secrets", "best_practices"]);
131
+ upgradeFlatlLlm(raw);
132
+ },
133
+ },
134
+ ];
135
+ /**
136
+ * Write a version stamp so future updates know what version was last installed.
137
+ */
138
+ async function writeVersionStamp(root) {
139
+ try {
140
+ const pkgJson = await readFile(join(PACKAGE_ROOT, "package.json"), "utf-8");
141
+ const pkg = JSON.parse(pkgJson);
142
+ const stampPath = join(root, ".grimoire", ".version");
143
+ await writeFile(stampPath, pkg.version + "\n");
144
+ }
145
+ catch {
146
+ // Non-critical — don't fail the update
147
+ }
148
+ }
149
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface ValidateOptions {
2
+ strict: boolean;
3
+ json: boolean;
4
+ }
5
+ export interface ValidationResult {
6
+ file: string;
7
+ errors: string[];
8
+ warnings: string[];
9
+ }
10
+ export interface ValidateResult {
11
+ results: ValidationResult[];
12
+ errorCount: number;
13
+ warnCount: number;
14
+ }
15
+ export declare function validateChange(changeId: string | undefined, options: ValidateOptions): Promise<ValidateResult>;
16
+ export declare function validateFeatureFile(filePath: string, content: string, strict: boolean): ValidationResult;
17
+ export declare function validateDecisionFile(filePath: string, content: string, strict: boolean): ValidationResult;
18
+ export declare function validateManifest(filePath: string, content: string, strict: boolean): ValidationResult;
19
+ export {};
20
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAcA,UAAU,eAAe;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAmEzB;AAyFD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,gBAAgB,CAuElB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,gBAAgB,CA4ClB;AASD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,gBAAgB,CA4ClB"}