@mindfoldhq/trellis 0.5.0-rc.0 → 0.5.0-rc.2

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 (48) hide show
  1. package/dist/cli/index.d.ts.map +1 -1
  2. package/dist/cli/index.js +21 -0
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/commands/uninstall.d.ts +27 -0
  5. package/dist/commands/uninstall.d.ts.map +1 -0
  6. package/dist/commands/uninstall.js +313 -0
  7. package/dist/commands/uninstall.js.map +1 -0
  8. package/dist/commands/update.d.ts.map +1 -1
  9. package/dist/commands/update.js +5 -0
  10. package/dist/commands/update.js.map +1 -1
  11. package/dist/configurators/claude.d.ts.map +1 -1
  12. package/dist/configurators/claude.js +2 -2
  13. package/dist/configurators/claude.js.map +1 -1
  14. package/dist/configurators/codex.d.ts.map +1 -1
  15. package/dist/configurators/codex.js +5 -5
  16. package/dist/configurators/codex.js.map +1 -1
  17. package/dist/configurators/copilot.d.ts.map +1 -1
  18. package/dist/configurators/copilot.js +6 -4
  19. package/dist/configurators/copilot.js.map +1 -1
  20. package/dist/configurators/index.d.ts.map +1 -1
  21. package/dist/configurators/index.js +14 -4
  22. package/dist/configurators/index.js.map +1 -1
  23. package/dist/configurators/opencode.d.ts.map +1 -1
  24. package/dist/configurators/opencode.js +2 -2
  25. package/dist/configurators/opencode.js.map +1 -1
  26. package/dist/configurators/pi.d.ts.map +1 -1
  27. package/dist/configurators/pi.js +2 -2
  28. package/dist/configurators/pi.js.map +1 -1
  29. package/dist/configurators/shared.d.ts +12 -0
  30. package/dist/configurators/shared.d.ts.map +1 -1
  31. package/dist/configurators/shared.js +94 -24
  32. package/dist/configurators/shared.js.map +1 -1
  33. package/dist/configurators/workflow.d.ts.map +1 -1
  34. package/dist/configurators/workflow.js +3 -2
  35. package/dist/configurators/workflow.js.map +1 -1
  36. package/dist/migrations/manifests/0.5.0-rc.1.json +9 -0
  37. package/dist/migrations/manifests/0.5.0-rc.2.json +9 -0
  38. package/dist/templates/extract.d.ts.map +1 -1
  39. package/dist/templates/extract.js +4 -1
  40. package/dist/templates/extract.js.map +1 -1
  41. package/dist/templates/opencode/agents/trellis-research.md +68 -68
  42. package/dist/templates/opencode/lib/session-utils.js +432 -0
  43. package/dist/templates/opencode/plugins/session-start.js +60 -531
  44. package/dist/utils/uninstall-scrubbers.d.ts +65 -0
  45. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
  46. package/dist/utils/uninstall-scrubbers.js +320 -0
  47. package/dist/utils/uninstall-scrubbers.js.map +1 -0
  48. package/package.json +1 -1
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Scrubbers for structured config files during `trellis uninstall`.
3
+ *
4
+ * Each scrubber takes the file content (and any context it needs) and returns
5
+ * `{ content, fullyEmpty }`:
6
+ * - `content` is the post-scrub text to write back if the file should remain.
7
+ * - `fullyEmpty` is true when, after stripping every trellis-managed value,
8
+ * nothing meaningful is left. The caller deletes the file in that case.
9
+ *
10
+ * Manifest path matching (for hooks.json scrubbers) uses substring containment
11
+ * on the resolved `command` string. The leading `python3 ` / `python ` prefix
12
+ * does not matter — we just look for the manifest-relative file path.
13
+ */
14
+ /**
15
+ * Test whether a hook command string references any of the given manifest paths.
16
+ *
17
+ * Trellis-emitted hook commands always have the shape
18
+ * `<python-cmd> <manifest-path>`
19
+ * so the trailing whitespace-delimited token is the script path. We compare
20
+ * that last token (with surrounding quotes stripped) against the manifest
21
+ * delete-set. This is intentionally stricter than substring matching: a
22
+ * user-added hook whose body merely mentions a deleted path inside an `echo`
23
+ * or comment argument (`echo "see .claude/hooks/session-start.py"`) does NOT
24
+ * match, because the trailing token is `inspiration"` (or similar) — not the
25
+ * path. We also accept absolute-path variants like
26
+ * `/Users/me/proj/.claude/hooks/session-start.py` via `endsWith("/" + p)`.
27
+ */
28
+ function commandMatchesDeletedPath(command, deletedPaths) {
29
+ const trimmed = command.trim();
30
+ if (trimmed.length === 0)
31
+ return false;
32
+ const tokens = trimmed.split(/\s+/);
33
+ const lastToken = tokens[tokens.length - 1].replace(/^["']|["']$/g, "");
34
+ if (lastToken.length === 0)
35
+ return false;
36
+ for (const p of deletedPaths) {
37
+ if (lastToken === p || lastToken.endsWith("/" + p)) {
38
+ return true;
39
+ }
40
+ }
41
+ return false;
42
+ }
43
+ /**
44
+ * Read the `command` (or fallback `bash` / `powershell`) string out of an
45
+ * arbitrary hook entry. Copilot's flat schema uses `bash` + `powershell`
46
+ * instead of `command` for some events.
47
+ */
48
+ function getEntryCommand(entry) {
49
+ if (entry === null || typeof entry !== "object") {
50
+ return null;
51
+ }
52
+ const obj = entry;
53
+ if (typeof obj.command === "string")
54
+ return obj.command;
55
+ if (typeof obj.bash === "string")
56
+ return obj.bash;
57
+ if (typeof obj.powershell === "string")
58
+ return obj.powershell;
59
+ return null;
60
+ }
61
+ /**
62
+ * Scrub a hooks-shaped settings JSON file.
63
+ *
64
+ * `mode = "nested"` → `hooks.{Event}.[ {matcher?, hooks: [ {command,...} ]} ]`
65
+ * `mode = "flat"` → `hooks.{Event}.[ {command,...} ]`
66
+ *
67
+ * Strips every entry whose command references a path in `deletedPaths`,
68
+ * then bottom-up cleans empty containers (matcher block, event array, hooks
69
+ * object). Any user-defined keys outside `hooks` (e.g. `env`, `model`,
70
+ * `permissions`, `version`) are preserved verbatim.
71
+ */
72
+ export function scrubHooksJson(content, deletedPaths, mode) {
73
+ let parsed;
74
+ try {
75
+ parsed = JSON.parse(content);
76
+ }
77
+ catch {
78
+ // Malformed JSON — leave it untouched, caller will skip.
79
+ return { content, fullyEmpty: false };
80
+ }
81
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
82
+ return { content, fullyEmpty: false };
83
+ }
84
+ const root = parsed;
85
+ const hooks = root.hooks;
86
+ if (hooks === undefined) {
87
+ // No hooks block — nothing to scrub. Treat as fully empty only if the
88
+ // entire file has no other keys.
89
+ const fullyEmpty = Object.keys(root).length === 0;
90
+ return { content: JSON.stringify(root, null, 2) + "\n", fullyEmpty };
91
+ }
92
+ if (hooks === null || typeof hooks !== "object" || Array.isArray(hooks)) {
93
+ // hooks is some unexpected shape — leave it alone.
94
+ return { content, fullyEmpty: false };
95
+ }
96
+ const hooksObj = hooks;
97
+ for (const eventName of Object.keys(hooksObj)) {
98
+ const eventArr = hooksObj[eventName];
99
+ if (!Array.isArray(eventArr))
100
+ continue;
101
+ const filteredEvent = [];
102
+ for (const entry of eventArr) {
103
+ if (mode === "flat") {
104
+ const cmd = getEntryCommand(entry);
105
+ if (cmd !== null && commandMatchesDeletedPath(cmd, deletedPaths)) {
106
+ continue; // drop trellis entry
107
+ }
108
+ filteredEvent.push(entry);
109
+ }
110
+ else {
111
+ // nested: entry is { matcher?, hooks: [...] }
112
+ if (entry === null || typeof entry !== "object") {
113
+ filteredEvent.push(entry);
114
+ continue;
115
+ }
116
+ const matcherBlock = entry;
117
+ const inner = matcherBlock.hooks;
118
+ if (!Array.isArray(inner)) {
119
+ filteredEvent.push(entry);
120
+ continue;
121
+ }
122
+ const filteredInner = inner.filter((sub) => {
123
+ const cmd = getEntryCommand(sub);
124
+ return !(cmd !== null && commandMatchesDeletedPath(cmd, deletedPaths));
125
+ });
126
+ if (filteredInner.length === 0) {
127
+ // Whole matcher block is now empty → drop the block.
128
+ continue;
129
+ }
130
+ // Reconstruct the block with the filtered inner list.
131
+ const rebuilt = { ...matcherBlock };
132
+ rebuilt.hooks = filteredInner;
133
+ filteredEvent.push(rebuilt);
134
+ }
135
+ }
136
+ if (filteredEvent.length === 0) {
137
+ // Drop the whole event array.
138
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
139
+ delete hooksObj[eventName];
140
+ }
141
+ else {
142
+ hooksObj[eventName] = filteredEvent;
143
+ }
144
+ }
145
+ // If hooks is empty → drop the key.
146
+ if (Object.keys(hooksObj).length === 0) {
147
+ delete root.hooks;
148
+ }
149
+ else {
150
+ root.hooks = hooksObj;
151
+ }
152
+ const fullyEmpty = Object.keys(root).length === 0;
153
+ return {
154
+ content: JSON.stringify(root, null, 2) + "\n",
155
+ fullyEmpty,
156
+ };
157
+ }
158
+ /**
159
+ * Scrub `.opencode/package.json`:
160
+ * - remove `dependencies["@opencode-ai/plugin"]`
161
+ * - if `dependencies` ends up empty → drop the field
162
+ * - fully empty when nothing is left in the object
163
+ */
164
+ export function scrubOpencodePackageJson(content) {
165
+ let parsed;
166
+ try {
167
+ parsed = JSON.parse(content);
168
+ }
169
+ catch {
170
+ return { content, fullyEmpty: false };
171
+ }
172
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
173
+ return { content, fullyEmpty: false };
174
+ }
175
+ const root = parsed;
176
+ const deps = root.dependencies;
177
+ if (deps !== null && typeof deps === "object" && !Array.isArray(deps)) {
178
+ const depsObj = deps;
179
+ if ("@opencode-ai/plugin" in depsObj) {
180
+ delete depsObj["@opencode-ai/plugin"];
181
+ }
182
+ if (Object.keys(depsObj).length === 0) {
183
+ delete root.dependencies;
184
+ }
185
+ else {
186
+ root.dependencies = depsObj;
187
+ }
188
+ }
189
+ const fullyEmpty = Object.keys(root).length === 0;
190
+ return {
191
+ content: JSON.stringify(root, null, 2) + "\n",
192
+ fullyEmpty,
193
+ };
194
+ }
195
+ /**
196
+ * Trellis-specific values written by the Pi configurator.
197
+ *
198
+ * The `extensions`/`skills`/`prompts` arrays are paths relative to `.pi/`. We
199
+ * remove the exact entries that the Pi configurator emits.
200
+ */
201
+ const PI_TRELLIS_EXTENSION = "./extensions/trellis/index.ts";
202
+ const PI_TRELLIS_SKILLS = "./skills";
203
+ const PI_TRELLIS_PROMPTS = "./prompts";
204
+ function isTrellisPiEntry(value, target) {
205
+ return typeof value === "string" && value === target;
206
+ }
207
+ /**
208
+ * Scrub `.pi/settings.json`:
209
+ * - drop `enableSkillCommands` (trellis-flagged)
210
+ * - remove trellis entries from `extensions`/`skills`/`prompts` arrays
211
+ * - drop arrays that become empty
212
+ */
213
+ export function scrubPiSettings(content) {
214
+ let parsed;
215
+ try {
216
+ parsed = JSON.parse(content);
217
+ }
218
+ catch {
219
+ return { content, fullyEmpty: false };
220
+ }
221
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
222
+ return { content, fullyEmpty: false };
223
+ }
224
+ const root = parsed;
225
+ if ("enableSkillCommands" in root) {
226
+ delete root.enableSkillCommands;
227
+ }
228
+ const arrayCleanups = [
229
+ ["extensions", PI_TRELLIS_EXTENSION],
230
+ ["skills", PI_TRELLIS_SKILLS],
231
+ ["prompts", PI_TRELLIS_PROMPTS],
232
+ ];
233
+ for (const [key, target] of arrayCleanups) {
234
+ const arr = root[key];
235
+ if (!Array.isArray(arr))
236
+ continue;
237
+ const filtered = arr.filter((v) => !isTrellisPiEntry(v, target));
238
+ if (filtered.length === 0) {
239
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
240
+ delete root[key];
241
+ }
242
+ else {
243
+ root[key] = filtered;
244
+ }
245
+ }
246
+ const fullyEmpty = Object.keys(root).length === 0;
247
+ return {
248
+ content: JSON.stringify(root, null, 2) + "\n",
249
+ fullyEmpty,
250
+ };
251
+ }
252
+ /**
253
+ * Scrub `.codex/config.toml`.
254
+ *
255
+ * The current trellis-emitted file has two distinct chunks:
256
+ * 1. The line `project_doc_fallback_filenames = ["AGENTS.md"]`
257
+ * 2. A multi-line comment block that begins with the marker
258
+ * `# NOTE: Trellis's SessionStart + UserPromptSubmit hooks require opt-in.`
259
+ * and continues through `# be injected into Codex sessions.`
260
+ *
261
+ * Plus the leading "Project-scoped Codex defaults" header comments.
262
+ *
263
+ * Strategy: line-based removal. We strip:
264
+ * - the `project_doc_fallback_filenames = ...` line
265
+ * - any line that is *only* a comment introduced by trellis (the entire file
266
+ * as shipped is comments + that one assignment)
267
+ * - blank lines that surrounded those removals
268
+ *
269
+ * If the user added their own non-trellis lines, they are preserved as-is.
270
+ * "Fully empty" = post-scrub content has no non-whitespace characters.
271
+ */
272
+ export function scrubCodexConfigToml(content) {
273
+ const trellisCommentMarkers = [
274
+ "Project-scoped Codex defaults for Trellis workflows.",
275
+ "Codex loads this after ~/.codex/config.toml when you work in this project.",
276
+ "Keep AGENTS.md as the primary project instruction file.",
277
+ "NOTE: Trellis's SessionStart + UserPromptSubmit hooks require opt-in.",
278
+ "Add the following to your USER-level config at ~/.codex/config.toml",
279
+ "(not this project file — features.* must be enabled globally):",
280
+ "[features]",
281
+ "codex_hooks = true",
282
+ "Without this flag, hooks.json is ignored and Trellis context won't",
283
+ "be injected into Codex sessions.",
284
+ ];
285
+ // A comment line is "trellis-known" if its content (after `#` and spaces)
286
+ // matches one of the known marker strings exactly OR is an empty `#` line.
287
+ function isTrellisCommentLine(line) {
288
+ const trimmed = line.trim();
289
+ if (!trimmed.startsWith("#"))
290
+ return false;
291
+ const inner = trimmed.replace(/^#+\s?/, "").trim();
292
+ if (inner.length === 0)
293
+ return true; // bare `#` line inside trellis block
294
+ return trellisCommentMarkers.some((m) => inner === m);
295
+ }
296
+ function isTrellisAssignment(line) {
297
+ return /^\s*project_doc_fallback_filenames\s*=/.test(line);
298
+ }
299
+ const out = [];
300
+ let prevWasBlank = true; // start-of-file counts as blank for collapsing
301
+ for (const rawLine of content.split(/\r?\n/)) {
302
+ if (isTrellisAssignment(rawLine) || isTrellisCommentLine(rawLine)) {
303
+ continue; // drop
304
+ }
305
+ const isBlank = rawLine.trim().length === 0;
306
+ if (isBlank && prevWasBlank) {
307
+ continue; // collapse runs of blanks created by removals
308
+ }
309
+ out.push(rawLine);
310
+ prevWasBlank = isBlank;
311
+ }
312
+ // Trim trailing blank lines.
313
+ while (out.length > 0 && out[out.length - 1].trim().length === 0) {
314
+ out.pop();
315
+ }
316
+ const result = out.length > 0 ? out.join("\n") + "\n" : "";
317
+ const fullyEmpty = result.trim().length === 0;
318
+ return { content: result, fullyEmpty };
319
+ }
320
+ //# sourceMappingURL=uninstall-scrubbers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-scrubbers.js","sourceRoot":"","sources":["../../src/utils/uninstall-scrubbers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;;;;;;;;;;;GAaG;AACH,SAAS,yBAAyB,CAChC,OAAe,EACf,YAA+B;IAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACxD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAClD,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,UAAU,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,YAA+B,EAC/B,IAAuB;IAEvB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;QACzD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,sEAAsE;QACtE,iCAAiC;QACjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,mDAAmD;QACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,KAAgC,CAAC;IAElD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEvC,MAAM,aAAa,GAAc,EAAE,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,GAAG,KAAK,IAAI,IAAI,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC;oBACjE,SAAS,CAAC,qBAAqB;gBACjC,CAAC;gBACD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAChD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBACD,MAAM,YAAY,GAAG,KAAgC,CAAC;gBACtD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;oBACjC,OAAO,CAAC,CACN,GAAG,KAAK,IAAI,IAAI,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,CAC7D,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,qDAAqD;oBACrD,SAAS;gBACX,CAAC;gBAED,sDAAsD;gBACtD,MAAM,OAAO,GAA4B,EAAE,GAAG,YAAY,EAAE,CAAC;gBAC7D,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,8BAA8B;YAC9B,gEAAgE;YAChE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC;QACtC,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;IAE/B,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,OAAO,GAAG,IAA+B,CAAC;QAChD,IAAI,qBAAqB,IAAI,OAAO,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AAC7D,MAAM,iBAAiB,GAAG,UAAU,CAAC;AACrC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAEvC,SAAS,gBAAgB,CAAC,KAAc,EAAE,MAAc;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,MAAiC,CAAC;IAE/C,IAAI,qBAAqB,IAAI,IAAI,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,MAAM,aAAa,GAAuB;QACxC,CAAC,YAAY,EAAE,oBAAoB,CAAC;QACpC,CAAC,QAAQ,EAAE,iBAAiB,CAAC;QAC7B,CAAC,SAAS,EAAE,kBAAkB,CAAC;KAChC,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,gEAAgE;YAChE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,qBAAqB,GAAG;QAC5B,sDAAsD;QACtD,4EAA4E;QAC5E,yDAAyD;QACzD,uEAAuE;QACvE,qEAAqE;QACrE,gEAAgE;QAChE,YAAY;QACZ,oBAAoB;QACpB,oEAAoE;QACpE,kCAAkC;KACnC,CAAC;IAEF,0EAA0E;IAC1E,2EAA2E;IAC3E,SAAS,oBAAoB,CAAC,IAAY;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,qCAAqC;QAC1E,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,SAAS,mBAAmB,CAAC,IAAY;QACvC,OAAO,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,+CAA+C;IAExE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAI,mBAAmB,CAAC,OAAO,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,SAAS,CAAC,OAAO;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;YAC5B,SAAS,CAAC,8CAA8C;QAC1D,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,YAAY,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,6BAA6B;IAC7B,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindfoldhq/trellis",
3
- "version": "0.5.0-rc.0",
3
+ "version": "0.5.0-rc.2",
4
4
  "description": "AI capabilities grow like ivy — Trellis provides the structure to guide them along a disciplined path",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",