@spikedpunch/mast 0.2.0 → 0.4.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 (150) hide show
  1. package/MAST_SPEC.md +169 -44
  2. package/README.md +266 -20
  3. package/assets/prime.md +18 -0
  4. package/assets/signals.md +51 -0
  5. package/assets/skill.md +13 -15
  6. package/dist/ast/types.d.ts +137 -1
  7. package/dist/ast/types.d.ts.map +1 -1
  8. package/dist/cli/docs-cmd.d.ts +1 -0
  9. package/dist/cli/docs-cmd.d.ts.map +1 -1
  10. package/dist/cli/docs-cmd.js +2 -1
  11. package/dist/cli/docs-cmd.js.map +1 -1
  12. package/dist/cli/hook-cmd.d.ts +3 -0
  13. package/dist/cli/hook-cmd.d.ts.map +1 -0
  14. package/dist/cli/hook-cmd.js +13 -0
  15. package/dist/cli/hook-cmd.js.map +1 -0
  16. package/dist/cli/hook-state-dir.d.ts +24 -0
  17. package/dist/cli/hook-state-dir.d.ts.map +1 -0
  18. package/dist/cli/hook-state-dir.js +57 -0
  19. package/dist/cli/hook-state-dir.js.map +1 -0
  20. package/dist/cli/hook.d.ts +44 -0
  21. package/dist/cli/hook.d.ts.map +1 -0
  22. package/dist/cli/hook.js +200 -0
  23. package/dist/cli/hook.js.map +1 -0
  24. package/dist/cli/index.js +12 -2
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/installed-artifacts.d.ts +23 -0
  27. package/dist/cli/installed-artifacts.d.ts.map +1 -0
  28. package/dist/cli/installed-artifacts.js +39 -0
  29. package/dist/cli/installed-artifacts.js.map +1 -0
  30. package/dist/cli/prime-cmd.d.ts +17 -0
  31. package/dist/cli/prime-cmd.d.ts.map +1 -0
  32. package/dist/cli/prime-cmd.js +70 -0
  33. package/dist/cli/prime-cmd.js.map +1 -0
  34. package/dist/cli/program.d.ts.map +1 -1
  35. package/dist/cli/program.js +6 -0
  36. package/dist/cli/program.js.map +1 -1
  37. package/dist/cli/query.d.ts +40 -1
  38. package/dist/cli/query.d.ts.map +1 -1
  39. package/dist/cli/query.js +36 -2
  40. package/dist/cli/query.js.map +1 -1
  41. package/dist/cli/search-cmd.d.ts +6 -1
  42. package/dist/cli/search-cmd.d.ts.map +1 -1
  43. package/dist/cli/search-cmd.js +9 -2
  44. package/dist/cli/search-cmd.js.map +1 -1
  45. package/dist/cli/serve.d.ts +6 -1
  46. package/dist/cli/serve.d.ts.map +1 -1
  47. package/dist/cli/serve.js +14 -4
  48. package/dist/cli/serve.js.map +1 -1
  49. package/dist/cli/setup-cmd.d.ts +34 -0
  50. package/dist/cli/setup-cmd.d.ts.map +1 -0
  51. package/dist/cli/setup-cmd.js +205 -0
  52. package/dist/cli/setup-cmd.js.map +1 -0
  53. package/dist/cli/setup-command.d.ts +32 -0
  54. package/dist/cli/setup-command.d.ts.map +1 -0
  55. package/dist/cli/setup-command.js +43 -0
  56. package/dist/cli/setup-command.js.map +1 -0
  57. package/dist/cli/setup-plan.d.ts +52 -0
  58. package/dist/cli/setup-plan.d.ts.map +1 -0
  59. package/dist/cli/setup-plan.js +221 -0
  60. package/dist/cli/setup-plan.js.map +1 -0
  61. package/dist/cli/setup-rules.d.ts +41 -0
  62. package/dist/cli/setup-rules.d.ts.map +1 -0
  63. package/dist/cli/setup-rules.js +76 -0
  64. package/dist/cli/setup-rules.js.map +1 -0
  65. package/dist/cli/setup-static.d.ts +13 -0
  66. package/dist/cli/setup-static.d.ts.map +1 -0
  67. package/dist/cli/setup-static.js +116 -0
  68. package/dist/cli/setup-static.js.map +1 -0
  69. package/dist/cli/skill-install.d.ts +2 -0
  70. package/dist/cli/skill-install.d.ts.map +1 -1
  71. package/dist/cli/skill-install.js +2 -0
  72. package/dist/cli/skill-install.js.map +1 -1
  73. package/dist/cli/status.d.ts +15 -0
  74. package/dist/cli/status.d.ts.map +1 -1
  75. package/dist/cli/status.js +32 -6
  76. package/dist/cli/status.js.map +1 -1
  77. package/dist/cli/upgrade-cmd.d.ts +5 -1
  78. package/dist/cli/upgrade-cmd.d.ts.map +1 -1
  79. package/dist/cli/upgrade-cmd.js +28 -3
  80. package/dist/cli/upgrade-cmd.js.map +1 -1
  81. package/dist/indexer/freshness.d.ts +10 -0
  82. package/dist/indexer/freshness.d.ts.map +1 -1
  83. package/dist/indexer/freshness.js +7 -1
  84. package/dist/indexer/freshness.js.map +1 -1
  85. package/dist/indexer/import-resolver.js +28 -16
  86. package/dist/indexer/import-resolver.js.map +1 -1
  87. package/dist/indexer/index.d.ts +38 -3
  88. package/dist/indexer/index.d.ts.map +1 -1
  89. package/dist/indexer/index.js +47 -4
  90. package/dist/indexer/index.js.map +1 -1
  91. package/dist/indexer/watcher.d.ts +94 -0
  92. package/dist/indexer/watcher.d.ts.map +1 -1
  93. package/dist/indexer/watcher.js +172 -19
  94. package/dist/indexer/watcher.js.map +1 -1
  95. package/dist/mcp/context.d.ts +16 -0
  96. package/dist/mcp/context.d.ts.map +1 -1
  97. package/dist/mcp/freshness-probe.d.ts +82 -0
  98. package/dist/mcp/freshness-probe.d.ts.map +1 -0
  99. package/dist/mcp/freshness-probe.js +111 -0
  100. package/dist/mcp/freshness-probe.js.map +1 -0
  101. package/dist/mcp/instructions.d.ts +7 -0
  102. package/dist/mcp/instructions.d.ts.map +1 -0
  103. package/dist/mcp/instructions.js +10 -0
  104. package/dist/mcp/instructions.js.map +1 -0
  105. package/dist/mcp/server.d.ts +54 -3
  106. package/dist/mcp/server.d.ts.map +1 -1
  107. package/dist/mcp/server.js +79 -4
  108. package/dist/mcp/server.js.map +1 -1
  109. package/dist/mcp/tools/_helpers.d.ts +40 -0
  110. package/dist/mcp/tools/_helpers.d.ts.map +1 -1
  111. package/dist/mcp/tools/_helpers.js +27 -0
  112. package/dist/mcp/tools/_helpers.js.map +1 -1
  113. package/dist/mcp/tools/callers.d.ts.map +1 -1
  114. package/dist/mcp/tools/callers.js +6 -1
  115. package/dist/mcp/tools/callers.js.map +1 -1
  116. package/dist/mcp/tools/dependencies.d.ts.map +1 -1
  117. package/dist/mcp/tools/dependencies.js +2 -1
  118. package/dist/mcp/tools/dependencies.js.map +1 -1
  119. package/dist/mcp/tools/exports.d.ts.map +1 -1
  120. package/dist/mcp/tools/exports.js +2 -1
  121. package/dist/mcp/tools/exports.js.map +1 -1
  122. package/dist/mcp/tools/implementors.d.ts.map +1 -1
  123. package/dist/mcp/tools/implementors.js +2 -1
  124. package/dist/mcp/tools/implementors.js.map +1 -1
  125. package/dist/mcp/tools/project-skeleton.d.ts.map +1 -1
  126. package/dist/mcp/tools/project-skeleton.js +2 -1
  127. package/dist/mcp/tools/project-skeleton.js.map +1 -1
  128. package/dist/mcp/tools/reindex.d.ts.map +1 -1
  129. package/dist/mcp/tools/reindex.js +3 -0
  130. package/dist/mcp/tools/reindex.js.map +1 -1
  131. package/dist/mcp/tools/rename-impact.d.ts.map +1 -1
  132. package/dist/mcp/tools/rename-impact.js +4 -1
  133. package/dist/mcp/tools/rename-impact.js.map +1 -1
  134. package/dist/mcp/tools/search.d.ts.map +1 -1
  135. package/dist/mcp/tools/search.js +13 -2
  136. package/dist/mcp/tools/search.js.map +1 -1
  137. package/dist/mcp/tools/signature.d.ts.map +1 -1
  138. package/dist/mcp/tools/signature.js +2 -1
  139. package/dist/mcp/tools/signature.js.map +1 -1
  140. package/dist/mcp/tools/status.d.ts.map +1 -1
  141. package/dist/mcp/tools/status.js +8 -2
  142. package/dist/mcp/tools/status.js.map +1 -1
  143. package/dist/store/config.d.ts.map +1 -1
  144. package/dist/store/config.js +4 -5
  145. package/dist/store/config.js.map +1 -1
  146. package/dist/store/defaults.d.ts +9 -0
  147. package/dist/store/defaults.d.ts.map +1 -0
  148. package/dist/store/defaults.js +12 -0
  149. package/dist/store/defaults.js.map +1 -0
  150. package/package.json +5 -2
@@ -0,0 +1,221 @@
1
+ import { z } from 'zod';
2
+ import { isMastCommand } from './setup-command.js';
3
+ /** Seconds, in all three harnesses. Session start builds the primer; search must stay cheap. */
4
+ const SESSION_START_TIMEOUT = 30;
5
+ const SEARCH_TIMEOUT = 5;
6
+ /**
7
+ * The hooks each harness gets. The Claude session-start group has no matcher on purpose:
8
+ * that matches every source, including `compact`. VS Code has no search hook because its
9
+ * docs say matchers are ignored (it would run on every tool call) and the search tool's
10
+ * name is undocumented.
11
+ */
12
+ export const HOOK_DEFS = {
13
+ claude: [
14
+ { event: 'session-start', nativeEvent: 'SessionStart', timeout: SESSION_START_TIMEOUT },
15
+ { event: 'search', nativeEvent: 'PreToolUse', matcher: 'Grep|Glob', timeout: SEARCH_TIMEOUT },
16
+ ],
17
+ cursor: [
18
+ { event: 'session-start', nativeEvent: 'sessionStart', timeout: SESSION_START_TIMEOUT },
19
+ { event: 'search', nativeEvent: 'postToolUse', matcher: 'Grep', timeout: SEARCH_TIMEOUT },
20
+ ],
21
+ vscode: [{ event: 'session-start', nativeEvent: 'SessionStart', timeout: SESSION_START_TIMEOUT }],
22
+ };
23
+ // Zod is used to validate, not to rebuild: a parsed loose object puts its known keys
24
+ // first, which would reorder a user's file. `passThrough` validates and hands back the
25
+ // original value, so key order survives and only mast's entries are edited.
26
+ const rootShape = z.looseObject({ hooks: z.looseObject({}).optional() });
27
+ const handlerShape = z.looseObject({ command: z.string().optional() });
28
+ const groupShape = z.looseObject({ matcher: z.string().optional(), hooks: z.array(handlerShape) });
29
+ const flatEntryShape = z.looseObject({ command: z.string().optional() });
30
+ function passThrough(schema) {
31
+ return z.custom((value) => schema.safeParse(value).success);
32
+ }
33
+ function readTyped(schema, value, where) {
34
+ const result = schema.safeParse(value);
35
+ if (!result.success) {
36
+ const found = result.error.issues
37
+ .slice(0, 3)
38
+ .map((issue) => `${[where, ...issue.path.map(String)].join('.')}: ${issue.message}`);
39
+ return { ok: false, problem: `unexpected structure (${found.join('; ')})` };
40
+ }
41
+ return { ok: true, data: structuredClone(passThrough(schema).parse(value)) };
42
+ }
43
+ function readRoot(existing) {
44
+ return existing === null ? { ok: true, data: {} } : readTyped(rootShape, existing, 'file');
45
+ }
46
+ const fail = (problem) => ({ ok: false, problem });
47
+ function hooksOf(root) {
48
+ const hooks = root.hooks ?? {};
49
+ root.hooks = hooks;
50
+ return hooks;
51
+ }
52
+ /**
53
+ * Claude Code: `hooks.<Event>` is a list of groups, each `{matcher?, hooks: [handler]}`.
54
+ * Within a group only mast's handler is touched; a group mast empties is removed, a group
55
+ * with other handlers keeps them.
56
+ */
57
+ export function planClaude(existing, mode) {
58
+ const rootRead = readRoot(existing);
59
+ if (!rootRead.ok)
60
+ return fail(rootRead.problem);
61
+ const root = rootRead.data;
62
+ const items = [];
63
+ let removedCount = 0;
64
+ let changed = false;
65
+ for (const def of HOOK_DEFS.claude) {
66
+ const rawGroups = root.hooks?.[def.nativeEvent];
67
+ const read = rawGroups === undefined ? null : readTyped(z.array(groupShape), rawGroups, `hooks.${def.nativeEvent}`);
68
+ if (read !== null && !read.ok)
69
+ return fail(read.problem);
70
+ let groups = read === null ? [] : read.data;
71
+ const isMast = (command) => isMastCommand(command, 'claude', def.event);
72
+ const touched = new Set();
73
+ if (mode.kind === 'remove') {
74
+ for (const group of groups) {
75
+ const kept = group.hooks.filter((h) => !isMast(h.command));
76
+ if (kept.length === group.hooks.length)
77
+ continue;
78
+ removedCount += group.hooks.length - kept.length;
79
+ group.hooks = kept;
80
+ touched.add(group);
81
+ }
82
+ if (touched.size === 0)
83
+ continue;
84
+ groups = groups.filter((g) => !touched.has(g) || g.hooks.length > 0);
85
+ changed = true;
86
+ if (groups.length === 0)
87
+ delete hooksOf(root)[def.nativeEvent];
88
+ else
89
+ hooksOf(root)[def.nativeEvent] = groups;
90
+ continue;
91
+ }
92
+ const command = mode.commands[def.event];
93
+ if (command === undefined)
94
+ continue;
95
+ const handler = { type: 'command', command, timeout: def.timeout };
96
+ const found = groups.flatMap((group) => group.hooks.filter((h) => isMast(h.command)).map((h) => ({ group, h })));
97
+ const first = found[0];
98
+ const duplicates = found.slice(1);
99
+ const fresh = () => ({ ...(def.matcher === undefined ? {} : { matcher: def.matcher }), hooks: [{ ...handler }] });
100
+ let state = 'current';
101
+ if (first === undefined) {
102
+ groups.push(fresh());
103
+ state = 'missing';
104
+ }
105
+ else {
106
+ const sameHandler = first.h['type'] === handler.type && first.h.command === command && first.h['timeout'] === handler.timeout;
107
+ if (!sameHandler || first.group.matcher !== def.matcher) {
108
+ state = 'outdated';
109
+ const ownsGroup = first.group.hooks.every((h) => isMast(h.command));
110
+ if (ownsGroup || first.group.matcher === def.matcher) {
111
+ Object.assign(first.h, handler);
112
+ if (ownsGroup) {
113
+ if (def.matcher === undefined)
114
+ delete first.group.matcher;
115
+ else
116
+ first.group.matcher = def.matcher;
117
+ }
118
+ }
119
+ else {
120
+ // The group's matcher also scopes someone else's handler, so it cannot be edited.
121
+ first.group.hooks = first.group.hooks.filter((h) => h !== first.h);
122
+ touched.add(first.group);
123
+ groups.push(fresh());
124
+ }
125
+ }
126
+ }
127
+ for (const dup of duplicates) {
128
+ dup.group.hooks = dup.group.hooks.filter((h) => h !== dup.h);
129
+ touched.add(dup.group);
130
+ state = 'outdated';
131
+ }
132
+ groups = groups.filter((g) => !touched.has(g) || g.hooks.length > 0);
133
+ items.push({ label: def.nativeEvent, state });
134
+ if (state !== 'current') {
135
+ changed = true;
136
+ hooksOf(root)[def.nativeEvent] = groups;
137
+ }
138
+ }
139
+ return { ok: true, next: root, changed, items, removedCount };
140
+ }
141
+ /** Cursor (`hooks.json`) and VS Code (`mast.json`): `hooks.<event>` is a flat list of entries. */
142
+ function planFlat(harness, existing, mode) {
143
+ const rootRead = readRoot(existing);
144
+ if (!rootRead.ok)
145
+ return fail(rootRead.problem);
146
+ const root = rootRead.data;
147
+ const items = [];
148
+ let removedCount = 0;
149
+ let changed = false;
150
+ if (mode.kind === 'install' && harness === 'cursor' && !('version' in root)) {
151
+ root['version'] = 1;
152
+ items.push({ label: 'version', state: 'missing' });
153
+ changed = true;
154
+ }
155
+ for (const def of HOOK_DEFS[harness]) {
156
+ const rawEntries = root.hooks?.[def.nativeEvent];
157
+ const read = rawEntries === undefined ? null : readTyped(z.array(flatEntryShape), rawEntries, `hooks.${def.nativeEvent}`);
158
+ if (read !== null && !read.ok)
159
+ return fail(read.problem);
160
+ const entries = read === null ? [] : read.data;
161
+ const isMast = (e) => isMastCommand(e.command, harness, def.event);
162
+ if (mode.kind === 'remove') {
163
+ const kept = entries.filter((e) => !isMast(e));
164
+ if (kept.length === entries.length)
165
+ continue;
166
+ removedCount += entries.length - kept.length;
167
+ changed = true;
168
+ if (kept.length === 0)
169
+ delete hooksOf(root)[def.nativeEvent];
170
+ else
171
+ hooksOf(root)[def.nativeEvent] = kept;
172
+ continue;
173
+ }
174
+ const command = mode.commands[def.event];
175
+ if (command === undefined)
176
+ continue;
177
+ const wanted = harness === 'cursor'
178
+ ? { command, type: 'command', ...(def.matcher === undefined ? {} : { matcher: def.matcher }), timeout: def.timeout }
179
+ : { type: 'command', command, timeout: def.timeout };
180
+ const found = entries.filter(isMast);
181
+ const first = found[0];
182
+ let state = 'current';
183
+ let next = entries;
184
+ if (first === undefined) {
185
+ next = [...entries, wanted];
186
+ state = 'missing';
187
+ }
188
+ else {
189
+ const same = Object.entries(wanted).every(([key, value]) => first[key] === value) && 'matcher' in first === 'matcher' in wanted;
190
+ if (!same) {
191
+ Object.assign(first, wanted);
192
+ if (!('matcher' in wanted))
193
+ delete first['matcher'];
194
+ state = 'outdated';
195
+ }
196
+ if (found.length > 1) {
197
+ next = entries.filter((e) => e === first || !isMast(e));
198
+ state = 'outdated';
199
+ }
200
+ }
201
+ items.push({ label: def.nativeEvent, state });
202
+ if (state !== 'current') {
203
+ changed = true;
204
+ hooksOf(root)[def.nativeEvent] = next;
205
+ }
206
+ }
207
+ // mast.json belongs to mast outright: once its last entry goes, so does the file.
208
+ const hooksLeft = root.hooks === undefined ? 0 : Object.keys(root.hooks).length;
209
+ if (harness === 'vscode' && removedCount > 0 && Object.keys(root).length === 1 && hooksLeft === 0) {
210
+ return { ok: true, next: null, changed, items, removedCount };
211
+ }
212
+ return { ok: true, next: root, changed, items, removedCount };
213
+ }
214
+ export const planCursor = (existing, mode) => planFlat('cursor', existing, mode);
215
+ export const planVscode = (existing, mode) => planFlat('vscode', existing, mode);
216
+ export function planFor(harness, existing, mode) {
217
+ if (harness === 'claude')
218
+ return planClaude(existing, mode);
219
+ return harness === 'cursor' ? planCursor(existing, mode) : planVscode(existing, mode);
220
+ }
221
+ //# sourceMappingURL=setup-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-plan.js","sourceRoot":"","sources":["../../src/cli/setup-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The static channel of `mast setup` (ADR 017 sections 2 and 6): rules files that carry the
3
+ * short skill text. Everything here is pure; reading and writing happen in `setup-cmd.ts`.
4
+ */
5
+ export type TextState = 'missing' | 'outdated' | 'current';
6
+ export interface TextPlan {
7
+ /** Install-mode state of the file or block as found. Meaningless in remove mode. */
8
+ readonly state: TextState;
9
+ /** False means nothing may be written. */
10
+ readonly changed: boolean;
11
+ /** The next file content, or null when the file should be deleted. */
12
+ readonly next: string | null;
13
+ }
14
+ export type OwnedRulesHarness = 'cursor' | 'windsurf';
15
+ /**
16
+ * Cursor: project rules are `.mdc` files in `.cursor/rules`, and `alwaysApply: true`
17
+ * applies the rule to every chat (Cursor's rules docs). Windsurf: `trigger: always_on`
18
+ * (Windsurf's rules docs). Both are read from the vendors' docs, not exercised in the tool.
19
+ */
20
+ export declare function renderOwnedRules(harness: OwnedRulesHarness, skillText: string): string;
21
+ /**
22
+ * A file mast owns outright. There is no marker to tell mast's file from someone else's
23
+ * with the same name: `.mdc` frontmatter has no room for a comment line, so the whole file
24
+ * is treated as mast's because of its name (`mast.mdc`, `mast.md`). Someone who hand-writes
25
+ * a file at that exact path gets it overwritten; the name is the claim.
26
+ */
27
+ export declare function planOwnedFile(existing: string | null, wanted: string, remove: boolean): TextPlan;
28
+ /** The marked block inside a file mast does not own (Zed's rules file). */
29
+ export declare function planMarkedBlock(existing: string, skillText: string, remove: boolean): TextPlan;
30
+ /**
31
+ * Files Zed reads project rules from, first existing one wins. This list is from memory of
32
+ * Zed's docs (zed.dev/docs/ai/instructions) and has NOT been verified against them:
33
+ * re-check the names and their order before relying on it.
34
+ */
35
+ export declare const ZED_RULES_FILES: readonly string[];
36
+ export declare function firstExisting(files: readonly string[], exists: (file: string) => boolean): string | null;
37
+ export declare const cursorRulesPath: (root: string) => string;
38
+ export declare const windsurfRulesPaths: (root: string) => readonly string[];
39
+ /** `.devin/rules` when a `.devin` directory exists (Windsurf's docs now redirect to Devin), else `.windsurf/rules`. */
40
+ export declare function chooseWindsurfRulesPath(root: string, devinDirExists: boolean): string;
41
+ //# sourceMappingURL=setup-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-rules.d.ts","sourceRoot":"","sources":["../../src/cli/setup-rules.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAKtD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMtF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAKhG;AAgBD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAM9F;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAG5C,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI,CAExG;AAED,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MAAoD,CAAC;AAEpG,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,SAAS,MAAM,EAGhE,CAAC;AAEF,uHAAuH;AACvH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,MAAM,CAGrF"}
@@ -0,0 +1,76 @@
1
+ import { join } from 'node:path';
2
+ import { BEGIN_MARKER, END_MARKER, spliceSkillBlock } from './skill-install.js';
3
+ const CURSOR_DESCRIPTION = 'Use mast (AST code search) before grep or reading files';
4
+ const OWNED_NOTICE = '<!-- Managed by `mast setup`; edits here are overwritten. Remove with `mast setup <harness> --remove`. -->';
5
+ /**
6
+ * Cursor: project rules are `.mdc` files in `.cursor/rules`, and `alwaysApply: true`
7
+ * applies the rule to every chat (Cursor's rules docs). Windsurf: `trigger: always_on`
8
+ * (Windsurf's rules docs). Both are read from the vendors' docs, not exercised in the tool.
9
+ */
10
+ export function renderOwnedRules(harness, skillText) {
11
+ const frontmatter = harness === 'cursor'
12
+ ? `---\ndescription: ${CURSOR_DESCRIPTION}\nalwaysApply: true\n---\n`
13
+ : '---\ntrigger: always_on\n---\n';
14
+ return `${frontmatter}\n${OWNED_NOTICE}\n\n${skillText.trimEnd()}\n`;
15
+ }
16
+ /**
17
+ * A file mast owns outright. There is no marker to tell mast's file from someone else's
18
+ * with the same name: `.mdc` frontmatter has no room for a comment line, so the whole file
19
+ * is treated as mast's because of its name (`mast.mdc`, `mast.md`). Someone who hand-writes
20
+ * a file at that exact path gets it overwritten; the name is the claim.
21
+ */
22
+ export function planOwnedFile(existing, wanted, remove) {
23
+ if (remove)
24
+ return { state: 'current', changed: existing !== null, next: null };
25
+ if (existing === null)
26
+ return { state: 'missing', changed: true, next: wanted };
27
+ if (existing === wanted)
28
+ return { state: 'current', changed: false, next: wanted };
29
+ return { state: 'outdated', changed: true, next: wanted };
30
+ }
31
+ const hasBlock = (text) => {
32
+ const begin = text.indexOf(BEGIN_MARKER);
33
+ return begin !== -1 && text.indexOf(END_MARKER) > begin;
34
+ };
35
+ function withoutBlock(text) {
36
+ const begin = text.indexOf(BEGIN_MARKER);
37
+ const before = text.slice(0, begin).trimEnd();
38
+ // Only blank lines are dropped after the block: leading spaces on the next line are content.
39
+ const after = text.slice(text.indexOf(END_MARKER) + END_MARKER.length).replace(/^(?:[ \t]*\r?\n)+/, '');
40
+ if (before === '')
41
+ return after;
42
+ return after === '' ? `${before}\n` : `${before}\n\n${after}`;
43
+ }
44
+ /** The marked block inside a file mast does not own (Zed's rules file). */
45
+ export function planMarkedBlock(existing, skillText, remove) {
46
+ const present = hasBlock(existing);
47
+ if (remove)
48
+ return { state: 'current', changed: present, next: present ? withoutBlock(existing) : existing };
49
+ const next = spliceSkillBlock(existing, skillText);
50
+ if (!present)
51
+ return { state: 'missing', changed: true, next };
52
+ return next === existing ? { state: 'current', changed: false, next } : { state: 'outdated', changed: true, next };
53
+ }
54
+ /**
55
+ * Files Zed reads project rules from, first existing one wins. This list is from memory of
56
+ * Zed's docs (zed.dev/docs/ai/instructions) and has NOT been verified against them:
57
+ * re-check the names and their order before relying on it.
58
+ */
59
+ export const ZED_RULES_FILES = [
60
+ '.rules', '.cursorrules', '.windsurfrules', '.clinerules', '.github/copilot-instructions.md',
61
+ 'AGENT.md', 'AGENTS.md', 'CLAUDE.md', 'GEMINI.md',
62
+ ];
63
+ export function firstExisting(files, exists) {
64
+ return files.find(exists) ?? null;
65
+ }
66
+ export const cursorRulesPath = (root) => join(root, '.cursor', 'rules', 'mast.mdc');
67
+ export const windsurfRulesPaths = (root) => [
68
+ join(root, '.devin', 'rules', 'mast.md'),
69
+ join(root, '.windsurf', 'rules', 'mast.md'),
70
+ ];
71
+ /** `.devin/rules` when a `.devin` directory exists (Windsurf's docs now redirect to Devin), else `.windsurf/rules`. */
72
+ export function chooseWindsurfRulesPath(root, devinDirExists) {
73
+ const [devin, windsurf] = windsurfRulesPaths(root);
74
+ return (devinDirExists ? devin : windsurf) ?? join(root, '.windsurf', 'rules', 'mast.md');
75
+ }
76
+ //# sourceMappingURL=setup-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-rules.js","sourceRoot":"","sources":["../../src/cli/setup-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { SetupEnv, SetupIo, SetupOptions } from './setup-cmd.js';
2
+ /**
3
+ * The static channel of `mast setup` (ADR 017 sections 2 and 6): rules files, for harnesses
4
+ * with no usable hook system and, for Cursor, alongside its hooks. The planners are pure
5
+ * (`setup-rules.ts`); this file is the shell around them, with every read and write injected.
6
+ */
7
+ export type StaticHarness = 'windsurf' | 'zed' | 'desktop';
8
+ export declare const STATIC_HARNESSES: readonly StaticHarness[];
9
+ /** Cursor's `.cursor/rules/mast.mdc`, project scope only. */
10
+ export declare function runCursorRules(opts: SetupOptions, env: SetupEnv, io: SetupIo): number;
11
+ /** Returns the process exit code: 0 done, 1 refused or failed. */
12
+ export declare function runStaticSetup(harness: StaticHarness, opts: SetupOptions, env: SetupEnv, io: SetupIo): number;
13
+ //# sourceMappingURL=setup-static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-static.d.ts","sourceRoot":"","sources":["../../src/cli/setup-static.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMtE;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AAC3D,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAAmC,CAAC;AAiDzF,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,CAOrF;AA4CD,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,CAY7G"}
@@ -0,0 +1,116 @@
1
+ import { join } from 'node:path';
2
+ import { chooseWindsurfRulesPath, cursorRulesPath, firstExisting, planMarkedBlock, planOwnedFile, renderOwnedRules, windsurfRulesPaths, ZED_RULES_FILES, } from './setup-rules.js';
3
+ export const STATIC_HARNESSES = ['windsurf', 'zed', 'desktop'];
4
+ const HARNESS_NAMES = {
5
+ windsurf: 'Windsurf',
6
+ zed: 'Zed',
7
+ desktop: 'Claude Desktop',
8
+ };
9
+ /** One output line for the file, in stage 4's vocabulary, and the write that goes with it. */
10
+ function applyTextTarget(io, path, plan, flags, showContent) {
11
+ if (flags.check) {
12
+ if (plan.state === 'current' && !plan.changed) {
13
+ io.out(`${path}: already up to date`);
14
+ return 0;
15
+ }
16
+ io.out(`${path}: ${plan.state === 'missing' ? 'not installed' : 'out of date'}`);
17
+ return 1;
18
+ }
19
+ const status = flags.remove
20
+ ? plan.changed ? 'removed' : 'not installed'
21
+ : !plan.changed ? 'already up to date' : plan.state === 'missing' ? 'installed' : 'updated';
22
+ if (flags.dryRun) {
23
+ io.out(`${path}: ${status} (dry run, nothing written)`);
24
+ if (plan.changed && showContent)
25
+ io.out(plan.next === null ? '(the file would be deleted)' : plan.next.trimEnd());
26
+ return 0;
27
+ }
28
+ if (plan.changed) {
29
+ if (plan.next === null)
30
+ io.removeFile(path);
31
+ else
32
+ io.writeFileAtomic(path, plan.next);
33
+ }
34
+ io.out(`${path}: ${status}`);
35
+ return 0;
36
+ }
37
+ function runOwnedFile(io, path, wanted, flags) {
38
+ return applyTextTarget(io, path, planOwnedFile(io.readFile(path), wanted, flags.remove), flags, true);
39
+ }
40
+ function guarded(io, where, work) {
41
+ try {
42
+ return work();
43
+ }
44
+ catch (error) {
45
+ io.err(`mast setup: ${where}: ${error instanceof Error ? error.message : String(error)}`);
46
+ return 1;
47
+ }
48
+ }
49
+ /** Cursor's `.cursor/rules/mast.mdc`, project scope only. */
50
+ export function runCursorRules(opts, env, io) {
51
+ if (opts.global) {
52
+ if (!opts.remove)
53
+ io.out('Note: Cursor has no user-level rules file, so --global handled the hooks only.');
54
+ return 0;
55
+ }
56
+ const path = cursorRulesPath(opts.projectRoot);
57
+ return guarded(io, path, () => runOwnedFile(io, path, renderOwnedRules('cursor', env.skillText), opts));
58
+ }
59
+ function runWindsurf(opts, env, io) {
60
+ const chosen = chooseWindsurfRulesPath(opts.projectRoot, io.directoryExists(join(opts.projectRoot, '.devin')));
61
+ if (!opts.remove)
62
+ return runOwnedFile(io, chosen, renderOwnedRules('windsurf', env.skillText), opts);
63
+ // Removal sweeps both locations: the `.devin` directory may have appeared after install.
64
+ const present = windsurfRulesPaths(opts.projectRoot).filter((p) => io.readFile(p) !== null);
65
+ if (present.length === 0)
66
+ return runOwnedFile(io, chosen, '', opts);
67
+ return Math.max(...present.map((p) => runOwnedFile(io, p, '', opts)));
68
+ }
69
+ function runZed(opts, env, io) {
70
+ const exists = (rel) => io.fileExists(join(opts.projectRoot, rel));
71
+ if (opts.remove) {
72
+ // Every candidate is swept, not just the first: the block may sit in a file that is no
73
+ // longer the first one Zed reads, because someone created `.rules` after install.
74
+ let touched = 0;
75
+ let code = 0;
76
+ for (const rel of ZED_RULES_FILES.filter(exists)) {
77
+ const path = join(opts.projectRoot, rel);
78
+ const plan = planMarkedBlock(io.readFile(path) ?? '', env.skillText, true);
79
+ if (!plan.changed)
80
+ continue;
81
+ touched += 1;
82
+ code = Math.max(code, applyTextTarget(io, path, plan, opts, false));
83
+ }
84
+ if (touched === 0)
85
+ io.out(`${opts.projectRoot}: not installed (no mast block in any Zed rules file)`);
86
+ return code;
87
+ }
88
+ const rel = firstExisting(ZED_RULES_FILES, exists);
89
+ if (rel === null) {
90
+ if (opts.check) {
91
+ io.out(`${opts.projectRoot}: not installed (no Zed rules file found)`);
92
+ }
93
+ else {
94
+ io.err(`mast setup: no Zed rules file found in ${opts.projectRoot}. mast does not create one, because a rules file is a prompt you curate. ` +
95
+ 'Create .rules and run `mast setup zed` again.');
96
+ }
97
+ return 1;
98
+ }
99
+ const path = join(opts.projectRoot, rel);
100
+ return applyTextTarget(io, path, planMarkedBlock(io.readFile(path) ?? '', env.skillText, false), opts, false);
101
+ }
102
+ /** Returns the process exit code: 0 done, 1 refused or failed. */
103
+ export function runStaticSetup(harness, opts, env, io) {
104
+ if (harness === 'desktop') {
105
+ io.out(`${HARNESS_NAMES[harness]} has no hook system mast can use, so only static instructions apply.`);
106
+ io.out('Its only channel is the instructions string `mast serve` sends in the MCP handshake. That needs no setup, and nothing was written.');
107
+ return 0;
108
+ }
109
+ io.out(`${HARNESS_NAMES[harness]} has no hook system mast can use, so only static instructions are installed.`);
110
+ if (opts.global) {
111
+ io.err(`mast setup: no user-level rules file is supported for ${harness}. Run without --global, from the project root.`);
112
+ return 1;
113
+ }
114
+ return guarded(io, opts.projectRoot, () => (harness === 'windsurf' ? runWindsurf(opts, env, io) : runZed(opts, env, io)));
115
+ }
116
+ //# sourceMappingURL=setup-static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-static.js","sourceRoot":"","sources":["../../src/cli/setup-static.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,8 @@ export interface SkillTarget {
22
22
  /** The agent this file configures, for the confirmation line. */
23
23
  readonly agent: string;
24
24
  }
25
+ /** The files `--install` is willing to write into, relative to the project root. */
26
+ export declare const SKILL_TARGET_FILES: readonly string[];
25
27
  /** Agent config files that exist in this project. Never invents one. */
26
28
  export declare function detectSkillTargets(projectRoot: string): readonly SkillTarget[];
27
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"skill-install.d.ts","sourceRoot":"","sources":["../../src/cli/skill-install.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,YAAY,mGAA8F,CAAC;AACxH,eAAO,MAAM,UAAU,4BAA4B,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAUD,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAI9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAW5E;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,SAAS,cAAc,EAAE,CAQ3B"}
1
+ {"version":3,"file":"skill-install.d.ts","sourceRoot":"","sources":["../../src/cli/skill-install.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,YAAY,mGAA8F,CAAC;AACxH,eAAO,MAAM,UAAU,4BAA4B,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAUD,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAkC,CAAC;AAEnF,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAI9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAW5E;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,SAAS,cAAc,EAAE,CAQ3B"}
@@ -23,6 +23,8 @@ const CANDIDATES = [
23
23
  { file: '.windsurfrules', agent: 'Windsurf' },
24
24
  { file: '.github/copilot-instructions.md', agent: 'GitHub Copilot' },
25
25
  ];
26
+ /** The files `--install` is willing to write into, relative to the project root. */
27
+ export const SKILL_TARGET_FILES = CANDIDATES.map((c) => c.file);
26
28
  /** Agent config files that exist in this project. Never invents one. */
27
29
  export function detectSkillTargets(projectRoot) {
28
30
  return CANDIDATES
@@ -1 +1 @@
1
- {"version":3,"file":"skill-install.js","sourceRoot":"","sources":["../../src/cli/skill-install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-install.js","sourceRoot":"","sources":["../../src/cli/skill-install.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,16 @@
1
1
  import type { Command } from 'commander';
2
+ import type { StaleBreakdown } from '../ast/types.js';
2
3
  export interface StatusReport {
3
4
  readonly state_dir: string;
5
+ /**
6
+ * The tree this report was measured against.
7
+ *
8
+ * Reported because `state_dir` alone does not identify it, and the two are
9
+ * independently settable: a relative `--state-dir` resolves against the path
10
+ * argument, so it is entirely possible to read one project's index while
11
+ * asking about another project's files (D048).
12
+ */
13
+ readonly project_root: string;
4
14
  /** False when nothing has ever been indexed at `state_dir`. */
5
15
  readonly initialised: boolean;
6
16
  readonly schema_version: string;
@@ -9,6 +19,11 @@ export interface StatusReport {
9
19
  readonly chunk_count: number | null;
10
20
  /** `null` when there is no index — a stale count against nothing is meaningless. */
11
21
  readonly stale_files: number | null;
22
+ /**
23
+ * `stale_files` split into the three categories it sums. `null` on the same
24
+ * condition, and for the same reason.
25
+ */
26
+ readonly stale_breakdown: StaleBreakdown | null;
12
27
  readonly parse_errors: number | null;
13
28
  readonly write_errors: number | null;
14
29
  readonly index_fresh: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,oFAAoF;IACpF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,YAAY,CAAC,CA+CvB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkD5D"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,oFAAoF;IACpF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,cAAc,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,YAAY,CAAC,CAuDvB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqE5D"}