@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.
- package/dist/migrations/manifests/0.6.39.json +9 -0
- package/dist/migrations/manifests/0.6.40.json +9 -0
- package/dist/templates/common/commands/continue.md +1 -0
- package/dist/templates/common/commands/finish-work.md +2 -0
- package/dist/templates/common/commands/start.md +1 -0
- package/dist/templates/common/skills/brainstorm.md +6 -0
- package/dist/templates/opencode/lib/trellis-context.js +50 -0
- package/dist/templates/opencode/plugins/inject-workflow-state.js +1 -0
- package/dist/templates/shared-hooks/inject-workflow-state.py +2 -0
- package/dist/templates/trellis/scripts/common/active_task.py +29 -0
- package/dist/templates/trellis/scripts/task.py +5 -0
- package/dist/templates/trellis/workflow.md +37 -6
- package/package.json +2 -2
|
@@ -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
|
|
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
|
-
-
|
|
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
|
-
|
|
|
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.
|
|
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.
|
|
37
|
+
"@pennixrv/trellis-core": "0.6.40"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@eslint/js": "^9.18.0",
|