@pennixrv/trellis 0.6.38 → 0.6.40

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.
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.6.39",
3
+ "description": "Restores active-task visibility and adds direct completion guidance for analysis-only tasks.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "**Fixes:**\n- Projects one unique developer-owned resumable task as read-only workflow context when no session pointer exists.\n- Analysis-only research, audit, and design tasks can complete declared evidence work directly from planning and archive without entering implementation.",
7
+ "migrations": [],
8
+ "notes": "No project migration is required. Existing projects can run the normal trellis update flow."
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.6.40",
3
+ "description": "Restores active-task visibility when a session pointer is unavailable.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "**Fix:**\n- Projects one unique developer-owned resumable task as read-only workflow context when no Trellis session pointer exists.",
7
+ "migrations": [],
8
+ "notes": "No project migration is required. Existing projects can run the normal trellis update flow."
9
+ }
@@ -24,6 +24,7 @@ Shows the Phase Index (Plan / Execute / Finish) with routing + skill mapping.
24
24
 
25
25
  `get_context.py` shows the active task's `status` field. Route by `status` + artifact presence. This command replaces the user needing to remember the Trellis flow; it does not itself approve implementation.
26
26
 
27
+ - `status=planning` + `task.json.meta.delivery_mode = "analysis_only"` → complete the PRD's bounded evidence work, verify its acceptance criteria and no-change boundary, then commit task artifacts and archive directly. Do not run `task.py start`; a protected-target change requires a separate change-bearing task.
27
28
  - `status=planning` + no `prd.md` → **1.1** (load `trellis-brainstorm`)
28
29
  - `status=planning` + `prd.md` only → decide whether the task is lightweight or complex. Lightweight can move to **1.4** review; complex returns to **1.1** to add `design.md` + `implement.md`.
29
30
  - `status=planning` + complex artifacts complete + sub-agent jsonl not curated (empty, or only a legacy `_example` placeholder row) → **1.3**
@@ -2,6 +2,8 @@
2
2
 
3
3
  Wrap up the current session: archive the active task (and any other completed-but-unarchived tasks the user wants to clean up) and record the session journal. Code commits are NOT done here — those happen in workflow Phase 3.4 before you invoke this command.
4
4
 
5
+ For an eligible `task.json.meta.delivery_mode = "analysis_only"` task, reach this command directly from planning only after its PRD-defined evidence, acceptance criteria, and no-change boundary have been verified and its task artifacts have been committed. Do not run `task.py start`; a protected-target change needs a separate change-bearing task.
6
+
5
7
  ## Step 1: Survey current state
6
8
 
7
9
  ```bash
@@ -36,6 +36,7 @@ Index files list the specific guideline docs to read when you actually start cod
36
36
  ## Step 4: Decide next action
37
37
  From Step 1 you know the current task and status. Check the task directory:
38
38
 
39
+ - **Active task with `task.json.meta.delivery_mode = "analysis_only"`** → keep `planning`, complete the PRD's bounded evidence work, then verify the no-change boundary, commit task artifacts, and archive directly. Do not run `task.py start`; any protected-target change needs a separate change-bearing task.
39
40
  - **Active task status `planning` + no `prd.md`** → Phase 1.1. Load the `trellis-brainstorm` skill.
40
41
  - **Active task status `planning` + `prd.md` exists** → stay in Phase 1. Lightweight tasks can be PRD-only; complex tasks need `design.md` + `implement.md`. Load the relevant Phase 1 step detail before `task.py start`.
41
42
  - **Active task status `in_progress`** → Phase 2 step 2.1. Load the step detail:
@@ -8,6 +8,12 @@ For every non-trivial task, the user must respond at least once after the initia
8
8
 
9
9
  While any user-owned product, scope, UX, compatibility, risk, or acceptance decision remains unresolved, end the turn with exactly one highest-value question. Do not edit product code, dispatch implementation, or run `task.py start`.
10
10
 
11
+ ## Analysis-Only Exception
12
+
13
+ When `task.json.meta.delivery_mode = "analysis_only"` exactly and the PRD names a bounded evidence deliverable plus a no-change boundary for product source, runtime configuration, deployment, credentials, and external systems, task-creation consent authorizes that evidence work. Do not require a second planning approval or run `task.py start`: perform the declared research, audit, or design work while status remains `planning`, record the evidence, verify acceptance criteria and the boundary, commit task artifacts, and archive directly. If the evidence recommends a protected-target change, record it and create a separate change-bearing task before doing it.
14
+
15
+ All other tasks follow the planning and implementation approval gates below.
16
+
11
17
  ## Non-Negotiable Evidence Rule
12
18
 
13
19
  If a question can be answered by exploring the codebase, explore the codebase instead.
@@ -377,6 +377,8 @@ export class TrellisContext {
377
377
  * 2. If no context key is available and exactly one session runtime file
378
378
  * exists locally, use it (`_resolveSingleSessionFallback`). Refuses to
379
379
  * guess when 0 or ≥2 files exist so multi-window isolation holds.
380
+ * 3. If no session file exists, expose one resumable task assigned to the
381
+ * current developer as a read-only unbound projection.
380
382
  */
381
383
  getActiveTask(platformInput = null) {
382
384
  const contextKey = this.getContextKey(platformInput)
@@ -399,6 +401,11 @@ export class TrellisContext {
399
401
  return fallback
400
402
  }
401
403
 
404
+ const unbound = this._resolveUnboundTask()
405
+ if (unbound) {
406
+ return unbound
407
+ }
408
+
402
409
  return { taskPath: null, source: "none", stale: false }
403
410
  }
404
411
 
@@ -440,6 +447,49 @@ export class TrellisContext {
440
447
  }
441
448
  }
442
449
 
450
+ _resolveUnboundTask() {
451
+ const sessionsDir = join(this.directory, ".trellis", ".runtime", "sessions")
452
+ if (existsSync(sessionsDir)) {
453
+ let sessionFiles
454
+ try {
455
+ sessionFiles = readdirSync(sessionsDir).filter(name => name.endsWith(".json"))
456
+ } catch {
457
+ return null
458
+ }
459
+ if (sessionFiles.length > 0) return null
460
+ }
461
+
462
+ const developer = (process.env.TRELLIS_DEVELOPER || "").trim() || (() => {
463
+ try {
464
+ const content = readFileSync(join(this.directory, ".trellis", ".developer"), "utf-8")
465
+ return content.split(/\r?\n/).find(line => line.startsWith("name="))?.slice(5).trim() || ""
466
+ } catch {
467
+ return ""
468
+ }
469
+ })()
470
+ if (!developer) return null
471
+
472
+ const tasksDir = join(this.directory, ".trellis", "tasks")
473
+ let taskNames
474
+ try {
475
+ taskNames = readdirSync(tasksDir).filter(name => name !== "archive")
476
+ } catch {
477
+ return null
478
+ }
479
+
480
+ const candidates = taskNames.flatMap(name => {
481
+ try {
482
+ const data = JSON.parse(readFileSync(join(tasksDir, name, "task.json"), "utf-8"))
483
+ if (data.assignee !== developer || !["planning", "in_progress", "review"].includes(data.status)) return []
484
+ return [`.trellis/tasks/${name}`]
485
+ } catch {
486
+ return []
487
+ }
488
+ })
489
+ if (candidates.length !== 1) return null
490
+ return { taskPath: candidates[0], source: "unbound", stale: false }
491
+ }
492
+
443
493
  getCurrentTask(platformInput = null) {
444
494
  return this.getActiveTask(platformInput).taskPath
445
495
  }
@@ -156,6 +156,7 @@ function getActiveTask(ctx, platformInput = null) {
156
156
  const status = typeof data.status === "string" ? data.status : ""
157
157
  if (!status) return null
158
158
  const id = data.id || taskRef.split("/").pop()
159
+ if (active.source === "unbound") return { id, status: "unbound_task", source: active.source }
159
160
  return { id, status, source: active.source }
160
161
  } catch {
161
162
  return null
@@ -192,6 +192,8 @@ def get_active_task(
192
192
  status = data.get("status", "")
193
193
  if not isinstance(status, str) or not status:
194
194
  return task_dir.name, "task_error", active.source
195
+ if active.source_type == "unbound":
196
+ return task_id, "unbound_task", active.source
195
197
  return task_id, status, active.source
196
198
 
197
199
 
@@ -678,6 +678,10 @@ def resolve_active_task(
678
678
  if fallback is not None:
679
679
  return fallback
680
680
 
681
+ unbound = _resolve_unbound_task(repo_root)
682
+ if unbound is not None:
683
+ return unbound
684
+
681
685
  return ActiveTask(None, "none", context_key)
682
686
 
683
687
 
@@ -706,6 +710,31 @@ def _resolve_single_session_fallback(repo_root: Path) -> ActiveTask | None:
706
710
  return _active_from_ref(task_ref, repo_root, "session-fallback", fallback_key)
707
711
 
708
712
 
713
+ def _resolve_unbound_task(repo_root: Path) -> ActiveTask | None:
714
+ """Expose one developer-owned task when no session pointer exists."""
715
+ sessions_dir = _runtime_sessions_dir(repo_root)
716
+ if sessions_dir.is_dir() and any(sessions_dir.glob("*.json")):
717
+ return None
718
+
719
+ from .paths import get_developer, get_tasks_dir
720
+ from .tasks import iter_active_tasks
721
+
722
+ developer = get_developer(repo_root)
723
+ if not developer:
724
+ return None
725
+
726
+ candidates = [
727
+ task
728
+ for task in iter_active_tasks(get_tasks_dir(repo_root))
729
+ if task.assignee == developer and task.status in {"planning", "in_progress", "review"}
730
+ ]
731
+ if len(candidates) != 1:
732
+ return None
733
+
734
+ task_path = candidates[0].directory.relative_to(repo_root).as_posix()
735
+ return ActiveTask(task_path, "unbound", None)
736
+
737
+
709
738
  def _utc_now() -> str:
710
739
  return datetime.now(timezone.utc).replace(microsecond=0).isoformat().replace("+00:00", "Z")
711
740
 
@@ -308,6 +308,11 @@ def cmd_finish(args: argparse.Namespace) -> int:
308
308
  print(colored("No current task set", Colors.YELLOW))
309
309
  return 0
310
310
 
311
+ if active.source_type == "unbound":
312
+ print(colored("Task exists but no direct session is bound; run task.py start first", Colors.YELLOW))
313
+ print(f"Task: {current}")
314
+ return 0
315
+
311
316
  try:
312
317
  assert_task_mutation_allowed(repo_root, repo_root / current)
313
318
  except (OwnershipError, OSError) as exc:
@@ -64,6 +64,7 @@ python3 ./.trellis/scripts/task.py validate <name>
64
64
  python3 ./.trellis/scripts/task.py set-branch <name> <branch>
65
65
  python3 ./.trellis/scripts/task.py set-base-branch <name> <branch> # PR target
66
66
  python3 ./.trellis/scripts/task.py set-scope <name> <scope>
67
+ python3 ./.trellis/scripts/task.py set-meta <name> delivery_mode analysis_only
67
68
 
68
69
  # Hierarchy (parent/child)
69
70
  python3 ./.trellis/scripts/task.py add-subtask <parent> <child>
@@ -121,6 +122,7 @@ python3 ./.trellis/scripts/get_context.py --mode phase --step <X.Y> # detailed
121
122
 
122
123
  TAG ↔ PHASE scoping:
123
124
  [workflow-state:no_task] → no active task; before Phase 1
125
+ [workflow-state:unbound_task] → one developer-owned task exists without a session pointer
124
126
  [workflow-state:task_error] → active task record is unreadable; repair it before continuing
125
127
  [workflow-state:planning] → all of Phase 1 (status='planning')
126
128
  [workflow-state:planning-inline] → Codex inline variant of Phase 1
@@ -158,6 +160,12 @@ Phase 3: Finish → verify, update spec, commit, and wrap up
158
160
  - Complex task: ask whether you may create a Trellis task and enter planning. If the user says no, do not do broad inline implementation; explain, clarify scope, or suggest a smaller split.
159
161
  - User approval to create a task is not approval to start implementation. Planning still happens first.
160
162
 
163
+ ### Analysis-only tasks
164
+
165
+ An analysis-only task is eligible only when `task.json.meta.delivery_mode = "analysis_only"` exactly and its `prd.md` names the evidence deliverable plus a no-change boundary for product source, runtime configuration, deployment, credentials, and external systems. Task creation consent authorizes that bounded evidence work, not protected-target changes.
166
+
167
+ Keep an eligible analysis-only task in `planning`: write its research, audit, or design evidence; verify its acceptance criteria and boundary; commit task artifacts; then archive directly. Do not run `task.py start`, configure implementation context, or wait for a second implementation approval. If the evidence recommends a protected-target change, record the recommendation and create a separate change-bearing task before doing it.
168
+
161
169
  ### Planning Artifacts
162
170
 
163
171
  - `prd.md` — requirements, constraints, and acceptance criteria. Do not put technical design or execution checklists here.
@@ -182,6 +190,12 @@ Simple conversation / small task: ask only whether this turn should create a Tre
182
190
  Complex task: ask the user if you can create a Trellis task and enter the planning phase. If the user says no, explain, clarify scope, or suggest a smaller split.
183
191
  [/workflow-state:no_task]
184
192
 
193
+ <!-- Per-turn breadcrumb: shown when one resumable task exists without a direct session binding. -->
194
+
195
+ [workflow-state:unbound_task]
196
+ An existing task is assigned to the current developer, but this shell has no direct Trellis session binding. Do not create a duplicate task. Continue reading and working from the existing task artifacts; before any lifecycle write or closure, run the native `task.py start <task>` command once a direct session identity is available. Never edit `.trellis/.runtime/sessions/` manually.
197
+ [/workflow-state:unbound_task]
198
+
185
199
  <!-- Per-turn breadcrumb: shown when the active task record cannot be read. -->
186
200
 
187
201
  [workflow-state:task_error]
@@ -194,14 +208,15 @@ Preserve existing task fields and artifacts. If the correct status cannot be det
194
208
  - 1.0 Create task `[required · once]` (only after task-creation consent)
195
209
  - 1.1 Requirement exploration `[required · repeatable]` (`prd.md`; complex tasks also need `design.md` + `implement.md`)
196
210
  - 1.2 Research `[optional · repeatable]`
197
- - 1.3 Configure context `[required · once]` — Claude Code, Cursor, OpenCode, Codex, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Snow, Reasonix, Grok, Kimi Code (sub-agent-dispatch platforms only; inline platforms skip)
198
- - 1.4 Activate task `[required · once]` (review gate, then `task.py start`; status → in_progress)
211
+ - 1.3 Configure context `[required · once]` — Claude Code, Cursor, OpenCode, Codex, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Snow, Reasonix, Grok, Kimi Code (sub-agent-dispatch platforms only; inline and eligible analysis-only tasks skip)
212
+ - 1.4 Activate task `[required · once]` (change-bearing tasks only: review gate, then `task.py start`; status → in_progress)
199
213
  - 1.5 Completion criteria
200
214
 
201
215
  <!-- Per-turn breadcrumb: shown throughout Phase 1 (status='planning') -->
202
216
 
203
217
  [workflow-state:planning]
204
218
  Load `trellis-brainstorm`; stay in planning.
219
+ If `task.json.meta.delivery_mode = "analysis_only"` exactly, complete the declared evidence work now. Do not wait for a start review or run `task.py start`; when the PRD boundary and acceptance evidence pass, commit task artifacts and archive directly. A protected-target recommendation requires a separate change-bearing task.
205
220
  Lightweight: `prd.md` can be enough. Complex: finish `prd.md`, `design.md`, and `implement.md`; ask for review before `task.py start`.
206
221
  Multi-deliverable scope: consider a parent task plus independently verifiable child tasks; dependencies must be written in child artifacts, not implied by tree position.
207
222
  Sub-agent mode: curate `implement.jsonl` and `check.jsonl` as spec/research manifests before start.
@@ -215,6 +230,7 @@ Sub-agent mode: curate `implement.jsonl` and `check.jsonl` as spec/research mani
215
230
 
216
231
  [workflow-state:planning-inline]
217
232
  Load `trellis-brainstorm`; stay in planning.
233
+ If `task.json.meta.delivery_mode = "analysis_only"` exactly, complete the declared evidence work now. Do not wait for a start review or run `task.py start`; when the PRD boundary and acceptance evidence pass, commit task artifacts and archive directly. A protected-target recommendation requires a separate change-bearing task.
218
234
  Lightweight: `prd.md` can be enough. Complex: finish `prd.md`, `design.md`, and `implement.md`; ask for review before `task.py start`.
219
235
  Multi-deliverable scope: consider a parent task plus independently verifiable child tasks; dependencies must be written in child artifacts, not implied by tree position.
220
236
  Inline mode: skip jsonl curation; Phase 2 reads artifacts/specs via `trellis-before-dev`.
@@ -286,6 +302,7 @@ When a user request matches one of these intents inside an active task, route fi
286
302
  [Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Snow, Reasonix, Trae, Grok, Kimi Code]
287
303
 
288
304
  - Planning or unclear requirements -> `trellis-brainstorm`.
305
+ - Explicit eligible `analysis_only` -> complete evidence in planning, then commit artifacts and archive directly.
289
306
  - `in_progress` implementation/check -> dispatch `trellis-implement` / `trellis-check`.
290
307
  - Repeated debugging -> `trellis-break-loop`; spec updates -> `trellis-update-spec`.
291
308
 
@@ -294,6 +311,7 @@ When a user request matches one of these intents inside an active task, route fi
294
311
  [codex-inline, Kilo, Antigravity, Devin, DeepSeek Harness]
295
312
 
296
313
  - Planning or unclear requirements -> `trellis-brainstorm`.
314
+ - Explicit eligible `analysis_only` -> complete evidence in planning, then commit artifacts and archive directly.
297
315
  - Before editing -> `trellis-before-dev`; after editing -> `trellis-check`.
298
316
  - Repeated debugging -> `trellis-break-loop`; spec updates -> `trellis-update-spec`.
299
317
 
@@ -301,7 +319,8 @@ When a user request matches one of these intents inside an active task, route fi
301
319
 
302
320
  ### Guardrails
303
321
 
304
- - Task creation approval is not implementation approval; implementation waits for `task.py start` after artifact review.
322
+ - Only an eligible `task.json.meta.delivery_mode = "analysis_only"` task may complete while `planning`; it may write evidence artifacts, but any protected-target change requires a separate change-bearing task.
323
+ - Task creation approval is not implementation approval; change-bearing implementation waits for `task.py start` after artifact review.
305
324
  - PRD-only is valid for lightweight tasks; complex tasks need `design.md` + `implement.md`.
306
325
  - Planning must be persisted to task artifacts; checks must run before reporting completion.
307
326
 
@@ -336,12 +355,16 @@ After this command succeeds, the per-turn breadcrumb auto-switches to `[workflow
336
355
 
337
356
  Run only `create` here — do not also run `start`. `start` flips status to `in_progress`, which switches the breadcrumb to the implementation phase before planning artifacts are reviewed. Save `start` for step 1.4.
338
357
 
358
+ For an evidence-only task, set `task.json.meta.delivery_mode = "analysis_only"` at creation or with `task.py set-meta`. Its PRD must name the evidence deliverable and exclude protected-target changes before the task proceeds.
359
+
339
360
  Skip when `python3 ./.trellis/scripts/task.py current --source` already points to a task.
340
361
 
341
362
  #### 1.1 Requirement exploration `[required · repeatable]`
342
363
 
343
364
  Load the `trellis-brainstorm` skill and explore requirements interactively with the user per the skill's guidance.
344
365
 
366
+ For an eligible analysis-only task, converge the PRD boundary, then perform the declared research, audit, or design work in this phase. It does not need a start review or `task.py start`; after acceptance evidence is recorded, continue directly to Phase 3.3.
367
+
345
368
  The brainstorm skill will guide you to:
346
369
  - Ask one question at a time
347
370
  - Prefer researching over asking the user
@@ -391,6 +414,8 @@ Brainstorm and research can interleave freely — pause to research a technical
391
414
 
392
415
  #### 1.3 Configure context `[required · once]`
393
416
 
417
+ Eligible analysis-only tasks skip this step because they never enter Phase 2 or dispatch implementation/check agents.
418
+
394
419
  [Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Snow, Reasonix, Trae, Grok, Kimi Code]
395
420
 
396
421
  Curate `implement.jsonl` and `check.jsonl` so the Phase 2 sub-agents get the right spec/research context. These files were seeded on `task create` with a single self-describing `_example` line; your job here is to fill in real entries.
@@ -446,6 +471,8 @@ Skip this step. Context is loaded directly by the `trellis-before-dev` skill in
446
471
 
447
472
  #### 1.4 Activate task `[required · once]`
448
473
 
474
+ This step applies only to change-bearing tasks. An eligible analysis-only task stays in `planning` and, after its evidence work is complete, continues directly to Phase 3.3 without running `task.py start`.
475
+
449
476
  After artifact review, flip the task status to `in_progress`:
450
477
 
451
478
  ```bash
@@ -463,15 +490,16 @@ If `task.py start` errors with a session-identity message (no context key from h
463
490
  | Condition | Required |
464
491
  |------|:---:|
465
492
  | `prd.md` exists | ✅ |
466
- | User confirms task should enter implementation | ✅ |
467
- | `task.py start` has been run (status = in_progress) | ✅ |
493
+ | Change-bearing task: user confirms implementation | ✅ |
494
+ | Change-bearing task: `task.py start` has been run (status = in_progress) | ✅ |
495
+ | Analysis-only task: exact metadata, named evidence deliverable, recorded acceptance evidence, and protected targets unchanged | ✅ |
468
496
  | `research/` has artifacts (complex tasks) | recommended |
469
497
  | `design.md` exists (complex tasks) | ✅ |
470
498
  | `implement.md` exists (complex tasks) | ✅ |
471
499
 
472
500
  [Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Snow, Reasonix, Trae, Grok, Kimi Code]
473
501
 
474
- | `implement.jsonl` and `check.jsonl` each contain at least one real curated entry (seed row does not count) | ✅ |
502
+ | Change-bearing task: `implement.jsonl` and `check.jsonl` each contain at least one real curated entry (seed row does not count) | ✅ |
475
503
 
476
504
  [/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Snow, Reasonix, Trae, Grok, Kimi Code]
477
505
 
@@ -579,6 +607,8 @@ If issues are found → fix → re-check, until green.
579
607
 
580
608
  Goal: ensure code quality, capture lessons, record the work.
581
609
 
610
+ **Analysis-only completion route**: after the evidence work in Phase 1, verify the PRD acceptance criteria and no-change boundary, then continue with 3.3 and 3.4 for task artifacts only before `/trellis:finish-work`. Do not run Phase 2 or `task.py start`.
611
+
582
612
  #### 3.2 Debug retrospective `[on demand]`
583
613
 
584
614
  If this task involved repeated debugging (the same issue was fixed multiple times), load the `trellis-break-loop` skill to:
@@ -671,6 +701,7 @@ All tag blocks live in the `## Phase Index` section above, immediately after eac
671
701
  | Scope | Corresponding tag |
672
702
  |---|---|
673
703
  | No active task (before Phase 1) | `[workflow-state:no_task]` (after the Phase Index ASCII art) |
704
+ | One developer-owned task without a session binding | `[workflow-state:unbound_task]` (bind before lifecycle writes) |
674
705
  | Active task record unreadable | `[workflow-state:task_error]` (repair the existing task before continuing) |
675
706
  | All of Phase 1 (task created → ready for implementation) | `[workflow-state:planning]` (after Phase 1 summary) |
676
707
  | Codex inline Phase 1 | `[workflow-state:planning-inline]` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pennixrv/trellis",
3
- "version": "0.6.38",
3
+ "version": "0.6.40",
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",
@@ -34,7 +34,7 @@
34
34
  "inquirer": "^9.3.7",
35
35
  "undici": "^6.21.0",
36
36
  "zod": "^4.4.2",
37
- "@pennixrv/trellis-core": "0.6.38"
37
+ "@pennixrv/trellis-core": "0.6.40"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@eslint/js": "^9.18.0",