@mindfoldhq/trellis 0.6.0-beta.11 → 0.6.0-beta.12

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 (74) hide show
  1. package/dist/commands/channel/create.d.ts +5 -0
  2. package/dist/commands/channel/create.d.ts.map +1 -1
  3. package/dist/commands/channel/create.js +19 -15
  4. package/dist/commands/channel/create.js.map +1 -1
  5. package/dist/commands/channel/index.d.ts.map +1 -1
  6. package/dist/commands/channel/index.js +90 -9
  7. package/dist/commands/channel/index.js.map +1 -1
  8. package/dist/commands/channel/kill.d.ts +1 -0
  9. package/dist/commands/channel/kill.d.ts.map +1 -1
  10. package/dist/commands/channel/kill.js +16 -13
  11. package/dist/commands/channel/kill.js.map +1 -1
  12. package/dist/commands/channel/list.d.ts +1 -0
  13. package/dist/commands/channel/list.d.ts.map +1 -1
  14. package/dist/commands/channel/list.js +18 -6
  15. package/dist/commands/channel/list.js.map +1 -1
  16. package/dist/commands/channel/messages.d.ts +3 -0
  17. package/dist/commands/channel/messages.d.ts.map +1 -1
  18. package/dist/commands/channel/messages.js +88 -58
  19. package/dist/commands/channel/messages.js.map +1 -1
  20. package/dist/commands/channel/rm.d.ts +2 -0
  21. package/dist/commands/channel/rm.d.ts.map +1 -1
  22. package/dist/commands/channel/rm.js +15 -5
  23. package/dist/commands/channel/rm.js.map +1 -1
  24. package/dist/commands/channel/run.js +1 -1
  25. package/dist/commands/channel/run.js.map +1 -1
  26. package/dist/commands/channel/send.d.ts +2 -0
  27. package/dist/commands/channel/send.d.ts.map +1 -1
  28. package/dist/commands/channel/send.js +9 -10
  29. package/dist/commands/channel/send.js.map +1 -1
  30. package/dist/commands/channel/spawn.d.ts +1 -0
  31. package/dist/commands/channel/spawn.d.ts.map +1 -1
  32. package/dist/commands/channel/spawn.js +14 -11
  33. package/dist/commands/channel/spawn.js.map +1 -1
  34. package/dist/commands/channel/store/events.d.ts +61 -6
  35. package/dist/commands/channel/store/events.d.ts.map +1 -1
  36. package/dist/commands/channel/store/events.js +53 -9
  37. package/dist/commands/channel/store/events.js.map +1 -1
  38. package/dist/commands/channel/store/filter.d.ts +33 -0
  39. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  40. package/dist/commands/channel/store/filter.js +63 -0
  41. package/dist/commands/channel/store/filter.js.map +1 -0
  42. package/dist/commands/channel/store/paths.d.ts +7 -0
  43. package/dist/commands/channel/store/paths.d.ts.map +1 -1
  44. package/dist/commands/channel/store/paths.js +76 -17
  45. package/dist/commands/channel/store/paths.js.map +1 -1
  46. package/dist/commands/channel/store/schema.d.ts +36 -0
  47. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  48. package/dist/commands/channel/store/schema.js +91 -0
  49. package/dist/commands/channel/store/schema.js.map +1 -0
  50. package/dist/commands/channel/store/thread-state.d.ts +19 -0
  51. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  52. package/dist/commands/channel/store/thread-state.js +81 -0
  53. package/dist/commands/channel/store/thread-state.js.map +1 -0
  54. package/dist/commands/channel/store/watch.d.ts +4 -21
  55. package/dist/commands/channel/store/watch.d.ts.map +1 -1
  56. package/dist/commands/channel/store/watch.js +8 -54
  57. package/dist/commands/channel/store/watch.js.map +1 -1
  58. package/dist/commands/channel/supervisor.d.ts +1 -1
  59. package/dist/commands/channel/supervisor.d.ts.map +1 -1
  60. package/dist/commands/channel/supervisor.js +11 -10
  61. package/dist/commands/channel/supervisor.js.map +1 -1
  62. package/dist/commands/channel/threads.d.ts +28 -0
  63. package/dist/commands/channel/threads.d.ts.map +1 -0
  64. package/dist/commands/channel/threads.js +96 -0
  65. package/dist/commands/channel/threads.js.map +1 -0
  66. package/dist/commands/channel/wait.d.ts +3 -0
  67. package/dist/commands/channel/wait.d.ts.map +1 -1
  68. package/dist/commands/channel/wait.js +9 -8
  69. package/dist/commands/channel/wait.js.map +1 -1
  70. package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
  71. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +128 -9
  72. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +62 -0
  73. package/dist/templates/markdown/spec/guides/index.md.txt +18 -0
  74. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,9 @@ export interface WaitOptions {
5
5
  kind?: string;
6
6
  tag?: string;
7
7
  to?: string;
8
+ scope?: string;
9
+ thread?: string;
10
+ action?: string;
8
11
  includeProgress?: boolean;
9
12
  /** Wait until every agent in --from has produced a matching event. */
10
13
  all?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/wait.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAID,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBvE"}
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/wait.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAID,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBvE"}
@@ -1,15 +1,13 @@
1
1
  import { parseChannelKind } from "./store/events.js";
2
- import { selectExistingChannelProject } from "./store/paths.js";
2
+ import { resolveExistingChannelRef } from "./store/paths.js";
3
+ import { normalizeThreadKey, parseCsv, parseChannelScope, parseThreadAction, } from "./store/schema.js";
3
4
  import { watchEvents } from "./store/watch.js";
4
5
  const TIMEOUT_EXIT_CODE = 124;
5
6
  export async function channelWait(channelName, opts) {
6
- selectExistingChannelProject(channelName);
7
- const fromList = opts.from
8
- ? opts.from
9
- .split(",")
10
- .map((s) => s.trim())
11
- .filter(Boolean)
12
- : undefined;
7
+ const ref = resolveExistingChannelRef(channelName, {
8
+ scope: parseChannelScope(opts.scope),
9
+ });
10
+ const fromList = parseCsv(opts.from);
13
11
  if (opts.all && (!fromList || fromList.length === 0)) {
14
12
  throw new Error("--all requires --from <a,b,...>");
15
13
  }
@@ -19,6 +17,8 @@ export async function channelWait(channelName, opts) {
19
17
  kind: parseChannelKind(opts.kind),
20
18
  tag: opts.tag,
21
19
  to: opts.to ?? opts.as, // default: broadcasts to me + explicit-to-me
20
+ thread: opts.thread ? normalizeThreadKey(opts.thread) : undefined,
21
+ action: opts.action ? parseThreadAction(opts.action) : undefined,
22
22
  includeProgress: opts.includeProgress,
23
23
  };
24
24
  const abort = new AbortController();
@@ -31,6 +31,7 @@ export async function channelWait(channelName, opts) {
31
31
  try {
32
32
  for await (const ev of watchEvents(channelName, filter, {
33
33
  signal: abort.signal,
34
+ project: ref.project,
34
35
  })) {
35
36
  console.log(JSON.stringify(ev));
36
37
  if (!pending)
@@ -1 +1 @@
1
- {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/commands/channel/wait.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/commands/channel/wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.6.0-beta.12",
3
+ "description": "Beta patch: add thread channels, project/global channel scope, linked context, and shared channel event filtering.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "**Enhancements:**\n- feat(channel): add `trellis channel create --type thread`, `trellis channel post`, `trellis channel threads`, and `trellis channel thread` for durable thread channels.\n- feat(channel): add `--scope project|global` resolution across channel create, send, wait, spawn, messages, list, kill, rm, and prune.\n- feat(channel): add channel and thread `description` plus `linkedContext` fields via `--linked-context-file` and `--linked-context-raw`.",
7
+ "migrations": [],
8
+ "notes": "Run `trellis update` to pull in thread channel commands and project/global scope support. No migration required because existing channel paths and project files remain valid."
9
+ }
@@ -58,6 +58,30 @@ grep -r "keyword" .
58
58
 
59
59
  **Good**: Single source of truth, import everywhere
60
60
 
61
+ ### Pattern 4: Repeated Payload Field Extraction
62
+
63
+ **Bad**: Multiple consumers cast the same JSON/event fields locally:
64
+
65
+ ```typescript
66
+ const description = (ev as { description?: string }).description;
67
+ const linkedContext = (ev as { linkedContext?: LinkedContextEntry[] })
68
+ .linkedContext;
69
+ ```
70
+
71
+ This is duplicated contract logic even when the code is only two lines. Each
72
+ consumer now has its own definition of what a valid payload means.
73
+
74
+ **Good**: Put the decoder, type guard, or projection next to the data owner:
75
+
76
+ ```typescript
77
+ if (isThreadEvent(ev)) {
78
+ renderThreadEvent(ev);
79
+ }
80
+ ```
81
+
82
+ **Rule**: If the same untyped payload field is read in 2+ places, create a
83
+ shared type guard / normalizer / projection before adding a third reader.
84
+
61
85
  ---
62
86
 
63
87
  ## When to Abstract
@@ -82,6 +106,74 @@ When you've made similar changes to multiple files:
82
106
  2. **Search**: Run grep to find any missed
83
107
  3. **Consider**: Should this be abstracted?
84
108
 
109
+ ### Reducers Should Use Exhaustive Structure
110
+
111
+ When state is derived from action-like values (`action`, `kind`, `status`,
112
+ `phase`), prefer a reducer with one `switch` over scattered `if/else` updates.
113
+
114
+ ```typescript
115
+ // BAD - action-specific state transitions are hard to audit
116
+ if (action === "opened") { ... }
117
+ else if (action === "comment") { ... }
118
+ else if (action === "status") { ... }
119
+
120
+ // GOOD - one reducer owns the transition table
121
+ switch (event.action) {
122
+ case "opened":
123
+ ...
124
+ return;
125
+ case "comment":
126
+ ...
127
+ return;
128
+ }
129
+ ```
130
+
131
+ This matters when the event log is the source of truth. A reducer is the
132
+ documented replay model; display code and commands should not duplicate pieces
133
+ of that replay model.
134
+
135
+ ---
136
+
137
+ ## Checklist Before Commit
138
+
139
+ - [ ] Searched for existing similar code
140
+ - [ ] No copy-pasted logic that should be shared
141
+ - [ ] No repeated untyped payload field extraction outside a shared decoder
142
+ - [ ] Constants defined in one place
143
+ - [ ] Similar patterns follow same structure
144
+ - [ ] Reducer/action transitions live in one reducer or command dispatcher
145
+
146
+ ---
147
+
148
+ ## Gotcha: Python if/elif/else Exhaustive Check
149
+
150
+ **Problem**: Python's if/elif/else chains have no compile-time exhaustive check. When you add a new value to a `Literal` type (e.g., `Platform`), existing if/elif/else chains silently fall through to `else` with wrong defaults.
151
+
152
+ **Symptom**: New platform works partially — some methods return Claude defaults instead of platform-specific values. No error is raised.
153
+
154
+ **Example** (`cli_adapter.py`):
155
+ ```python
156
+ # BAD: "gemini" falls through to else, returns "claude"
157
+ @property
158
+ def cli_name(self) -> str:
159
+ if self.platform == "opencode":
160
+ return "opencode"
161
+ else:
162
+ return "claude" # gemini silently gets "claude"!
163
+
164
+ # GOOD: explicit branch for every platform
165
+ @property
166
+ def cli_name(self) -> str:
167
+ if self.platform == "opencode":
168
+ return "opencode"
169
+ elif self.platform == "gemini":
170
+ return "gemini"
171
+ else:
172
+ return "claude"
173
+ ```
174
+
175
+ **Prevention**: When adding a new value to a Python `Literal` type, search for ALL if/elif/else chains that switch on that type and add explicit branches. Don't rely on `else` being correct for new values.
176
+
85
177
  ---
86
178
 
87
179
  ## Gotcha: Asymmetric Mechanisms Producing Same Output
@@ -90,16 +182,43 @@ When you've made similar changes to multiple files:
90
182
 
91
183
  **Symptom**: Init works perfectly, but update creates files at wrong paths or misses files entirely.
92
184
 
93
- **Prevention checklist**:
94
- - [ ] When migrating directory structures, search for ALL code paths that reference the old structure
95
- - [ ] If one path is auto-derived (glob/copy) and another is manually listed, the manual one needs updating
96
- - [ ] Add a regression test that compares outputs from both mechanisms
185
+ **Prevention**:
186
+ - **Best**: Eliminate the asymmetry have the manual path call the automatic one (e.g., `collectTemplateFiles()` calls `getAllScripts()` instead of maintaining its own list)
187
+ - **If asymmetry is unavoidable**: Add a regression test that compares outputs from both mechanisms
188
+ - When migrating directory structures, search for ALL code paths that reference the old structure
189
+
190
+ **Real example**: `trellis update` had a manual `files.set()` list for 11 scripts that `getAllScripts()` already tracked. Fix: replaced the manual list with a `for..of getAllScripts()` loop. See `update.ts` refactor in v0.4.0-beta.3.
97
191
 
98
192
  ---
99
193
 
100
- ## Checklist Before Commit
194
+ ## Template File Registration (Trellis-specific)
101
195
 
102
- - [ ] Searched for existing similar code
103
- - [ ] No copy-pasted logic that should be shared
104
- - [ ] Constants defined in one place
105
- - [ ] Similar patterns follow same structure
196
+ When adding new files to `src/templates/trellis/scripts/`:
197
+
198
+ **Single registration point**: `src/templates/trellis/index.ts`
199
+
200
+ 1. Add `export const xxxScript = readTemplate("scripts/path/file.py");`
201
+ 2. Add to `getAllScripts()` Map
202
+
203
+ That's it. `commands/update.ts` uses `getAllScripts()` directly — no manual sync needed.
204
+
205
+ **Why this matters**: Without registration in `getAllScripts()`, `trellis update` won't sync the file to user projects. Bug fixes and features won't propagate.
206
+
207
+ **History**: Before v0.4.0-beta.3, `update.ts` had its own hand-maintained file list that frequently fell out of sync with `getAllScripts()`. This caused 11 Python files to be silently skipped during `trellis update`. The fix was to eliminate the duplicate list and use `getAllScripts()` as the single source of truth.
208
+
209
+ ### Quick Checklist for New Scripts
210
+
211
+ ```bash
212
+ # After adding a new .py file, verify it's in getAllScripts():
213
+ grep -l "newFileName" src/templates/trellis/index.ts # Should match
214
+ ```
215
+
216
+ ### Template Sync Convention
217
+
218
+ `.trellis/scripts/` (dogfooded) and `packages/cli/src/templates/trellis/scripts/` (template) must stay identical. After editing `.trellis/scripts/`, always sync:
219
+
220
+ ```bash
221
+ rsync -av --delete --exclude='__pycache__' .trellis/scripts/ packages/cli/src/templates/trellis/scripts/
222
+ ```
223
+
224
+ **Gotcha**: Running rsync with wrong source/destination paths can create nested garbage directories (e.g., `.trellis/scripts/packages/cli/...`). Always double-check paths before running.
@@ -71,6 +71,35 @@ For each boundary:
71
71
 
72
72
  **Good**: Each layer only knows its neighbors
73
73
 
74
+ ### Mistake 4: Every Consumer Parses The Same Payload
75
+
76
+ **Bad**: A command reads JSONL events and casts fields inline:
77
+
78
+ ```typescript
79
+ const thread = (ev as { thread?: string }).thread;
80
+ const labels = (ev as { labels?: string[] }).labels;
81
+ ```
82
+
83
+ This looks local, but it means every consumer owns a private version of the
84
+ event contract. The next field change will update one command and miss another.
85
+
86
+ **Good**: Decode once at the event boundary, then export typed projections:
87
+
88
+ ```typescript
89
+ if (!isThreadEvent(ev)) return false;
90
+ return ev.thread === filter.thread;
91
+ ```
92
+
93
+ **Rule**: For append-only logs, JSON streams, RPC payloads, or config files,
94
+ create one owner for:
95
+
96
+ - event / payload type definitions
97
+ - type guards and normalization from `unknown`
98
+ - metadata projections used by UI commands
99
+ - reducers that replay state from the source of truth
100
+
101
+ Rendering code may format fields, but it must not redefine the payload contract.
102
+
74
103
  ---
75
104
 
76
105
  ## Checklist for Cross-Layer Features
@@ -87,6 +116,10 @@ After implementation:
87
116
  - [ ] Tested with edge cases (null, empty, invalid)
88
117
  - [ ] Verified error handling at each boundary
89
118
  - [ ] Checked data survives round-trip
119
+ - [ ] Checked that consumers import shared decoders / projections instead of
120
+ casting payload fields locally
121
+ - [ ] Checked that derived state points back to the source event identifier
122
+ (`seq`, `id`, `version`) instead of inventing a second cursor
90
123
 
91
124
  ---
92
125
 
@@ -195,3 +228,32 @@ Create detailed flow docs when:
195
228
  - Multiple teams are involved
196
229
  - Data format is complex
197
230
  - Feature has caused bugs before
231
+
232
+ ---
233
+
234
+ ## Event Log / Projection Boundary
235
+
236
+ Append-only logs are cross-layer contracts. A single event travels through:
237
+
238
+ ```
239
+ CLI input → event writer → events.jsonl → reader → filter → reducer → display
240
+ ```
241
+
242
+ ### Checklist: After Adding A New Event Kind Or Field
243
+
244
+ - [ ] Add the event kind to the central event taxonomy
245
+ - [ ] Add a typed event variant or type guard at the event layer
246
+ - [ ] Add normalization helpers for array/object fields that come from
247
+ user input or JSON
248
+ - [ ] Keep `seq` / `id` assignment in the event writer only
249
+ - [ ] Make filters and reducers consume the typed event guard, not local casts
250
+ - [ ] Make display code consume reducer output or typed events, not raw JSON
251
+ - [ ] Add at least one regression that proves history replay and live filtering
252
+ use the same filter model
253
+
254
+ **Real-world example**: Thread channels added `kind: "thread"`, `description`,
255
+ `linkedContext`, labels, and `lastSeq`. The first implementation replayed state
256
+ correctly, but several commands still re-parsed event payload fields with local
257
+ casts. The fix was to make `store/events.ts` own `ThreadChannelEvent`,
258
+ `isThreadEvent`, and `metadataFromCreateEvent`, while `store/thread-state.ts`
259
+ became the only replay reducer.
@@ -34,6 +34,8 @@ These guides help you **ask the right questions before coding**.
34
34
  - [ ] Data format changes between layers
35
35
  - [ ] Multiple consumers need the same data
36
36
  - [ ] You're not sure where to put some logic
37
+ - [ ] You are adding an event kind, JSONL record, RPC payload, or config field
38
+ - [ ] UI / command code starts casting raw payload fields directly
37
39
 
38
40
  → Read [Cross-Layer Thinking Guide](./cross-layer-thinking-guide.md)
39
41
 
@@ -44,9 +46,25 @@ These guides help you **ask the right questions before coding**.
44
46
  - [ ] You're adding a new field to multiple places
45
47
  - [ ] **You're modifying any constant or config**
46
48
  - [ ] **You're creating a new utility/helper function** ← Search first!
49
+ - [ ] Two files read the same untyped payload field with local casts
50
+ - [ ] Multiple branches update the same derived state from `kind` / `action`
47
51
 
48
52
  → Read [Code Reuse Thinking Guide](./code-reuse-thinking-guide.md)
49
53
 
54
+ ### When Verifying AI Cross-Review Results
55
+
56
+ - [ ] Reviewer claims "user input can be malicious" → Check the actual data source (internal manifest? user config? external API?)
57
+ - [ ] Reviewer flags "missing validation" → Is the data from a trusted internal source?
58
+ - [ ] Reviewer says "behavior change" → Read the code comments — is it intentional design?
59
+ - [ ] Reviewer identifies a "bug" in test → Mentally delete the feature being tested — does the test still pass? If yes → tautological test
60
+
61
+ **Common AI reviewer false-positive patterns**:
62
+ 1. **Trust boundary confusion**: Treating internal data (bundled JSON manifests) as untrusted external input
63
+ 2. **Ignoring design comments**: Flagging intentional behavior documented in code comments as bugs
64
+ 3. **Variable misreading**: Not tracing a variable to its actual definition (e.g., Map keyed by path vs name)
65
+
66
+ **Verification rule**: Every CRITICAL/WARNING finding must be verified against the actual code before prioritizing. Budget ~35% false-positive rate for AI reviews.
67
+
50
68
  ---
51
69
 
52
70
  ## Pre-Modification Rule (CRITICAL)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindfoldhq/trellis",
3
- "version": "0.6.0-beta.11",
3
+ "version": "0.6.0-beta.12",
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",