--migrate required.
New Features
1. Joiner onboarding task
trellis init now dispatches on two filesystem flags:
.trellis/ | .trellis/.developer | Generated task |
|---|---|---|
| missing | n/a | 00-bootstrap-guidelines (creator, unchanged) |
| present | missing | 00-join-<slug> (new: joiner flow) |
| present | present | none (same-dev re-init) |
.trellis/.developer is the per-checkout signal because it’s listed in .trellis/.gitignore and therefore absent on fresh clones. .trellis/workspace/<name>/ cannot serve this role — it’s committed to git.
The joiner task is auto-set as the current task, so the new developer’s first /trellis:continue lands on an onboarding PRD covering four topics: Trellis workflow, runtime mechanics (SessionStart hook, <workflow-state> injection, trellis-implement / trellis-check sub-agents, per-task jsonl manifests), project spec (.trellis/spec/), and assigned-work lookup via task.py list --assignee <name>.
2. AI-facing bootstrap / joiner PRDs
Both onboarding PRDs are now addressed to the AI, not the developer. Opening line:Ask AI:, Read workflow.md) to AI-side instructions (Explain, Summarize X for them, If archive is empty, skip — don't invent examples). Each PRD ends with a “Suggested opening line” template used verbatim on first response.
3. Polyrepo detection
detectMonorepo() gains a 7th parser that scans up to 2 levels deep for sibling .git directories or worktree gitlinks. Fires only when all 6 workspace parsers miss and no submodules are declared — workspace configs (pnpm-workspace.yaml, Cargo workspaces, etc.) take precedence.
DetectedPackagegainsisGitRepo: boolean(mutually exclusive withisSubmodule)writeMonorepoConfigemitsgit: trueto bridge to the runtime schema already consumed byget_git_packages()inconfig.py--monorepofailure prints a 7-marker checklist + manualconfig.yamlexample instead of a one-line error- Init confirm prompt labels polyrepo packages with
(git repo) config.yamltemplate documents thegit: truefield
Workflow Tightening (all platforms)
4. Task-creation trigger words
workflow.md [workflow-state:no_task] + shared-hooks/inject-workflow-state.py + OpenCode plugin now list explicit trigger words that require a task:
- Chinese:
重构/抽成/独立/分发/拆出来/搞一个/做成/接入/集成 - English:
refactor/rewrite/extract/productize/publish/build X/design Y
5. Research delegation
common/skills/brainstorm.md adds a “Delegate to trellis-research sub-agent” section with anti-pattern:
Inline WebFetch/WebSearch (3+ calls) in the main session is an anti-pattern. Correct pattern: spawntrellis-researchsub-agent via Task tool. Sub-agent writes findings to{TASK_DIR}/research/<topic>.md; returns path + one-line summary.
workflow.md [workflow-state:in_progress] renames the flow description from generic verbs (implement → check → update) to concrete agent types (trellis-implement → trellis-check → trellis-update-spec → finish).
Qoder UX Fix
6. Session-boundary commands split out of the skill matcher
Before beta.9, all Qoder Trellis entry points — includingfinish-work and continue — lived as .qoder/skills/trellis-*/SKILL.md. Invocation was nondeterministic (depended on the skill matcher scoring user phrasing against each skill’s description).
Now session-boundary commands are Qoder Custom Commands:
.qoder/commands/trellis-finish-work.md(YAML frontmatter:name,description).qoder/commands/trellis-continue.md
/trellis-finish-work / /trellis-continue (exact match).
Auto-trigger workflows (brainstorm, before-dev, check, update-spec, break-loop) remain as .qoder/skills/trellis-<name>/SKILL.md.
Infra change in configurators/shared.ts:
- New
wrapWithCommandFrontmatter(filePath, content)helper - New
COMMAND_DESCRIPTIONSregistry (short, imperative, distinct fromSKILL_DESCRIPTIONSprose for the matcher) collectBothTemplatestakes an optionalwrapCmdcallback
Internal Cleanup
7. task.json schema unification
New shared factory in packages/cli/src/utils/task-json.ts:
.trellis/scripts/common/task_store.py cmd_create. Now used by:
init.ts getBootstrapTaskJson(bootstrap task writer)update.tsmigration-task block
cmd_create was canonicalized, but the two TypeScript writers kept their own divergent shapes.
Side effects:
- Migration tasks no longer emit legacy
current_phase: 0/next_action: [...](dead since Multi-Agent Pipeline removal) - Bootstrap task checklist moved from structured
subtasks: [{name, status}]in task.json to markdown- [ ]items in prd.md.task.json.subtasksis nowstring[](child task dir names) across all tasks.
8. Orphan file cleanup
Hash-verifiedsafe-file-delete entries in the manifest:
| Path | Reason | Hashes |
|---|---|---|
.trellis/scripts/common/phase.py | Multi-Agent Pipeline era orphan; not imported in 0.5 | 1 |
.trellis/scripts/create_bootstrap.py | Legacy 4th task.json writer, replaced by init.ts getBootstrapTaskJson in 0.4 | 3 (covers 0.3+ users) |
TaskDataTypedDict (common/types.py): dropscurrent_phase: intandnext_action: list[dict]fieldsscript-conventions.mdspec: removesphase.py/create_bootstrap.py/multi_agent/from directory trees
9. Orphan markdown templates removed
packages/cli/src/templates/markdown/spec/: removed 5 orphan .md files never imported by markdown/index.ts:
spec/backend/index.mdspec/backend/directory-structure.mdspec/backend/script-conventions.mdspec/guides/code-reuse-thinking-guide.mdspec/guides/cross-platform-thinking-guide.md
dist/ as dead weight (~35 KB) but never landed on user disks (paired .md.txt stubs are what the configurator writes). No migration entry needed. Resolves a duplication bug present since early 0.1.x.
Upgrade
- All platforms:
workflow.md+ shared hooks auto-sync the trigger-words + research-delegation changes. Hash-matched auto-update;Modified by youprompt if customized. - Qoder: old
.qoder/skills/trellis-{finish-work,continue}/SKILL.mdhash-verified auto-delete; new.qoder/commands/trellis-{finish-work,continue}.mdwritten by the configure step. - Python scripts:
phase.py+create_bootstrap.pyhash-verified auto-delete from.trellis/scripts/. - Existing tasks: untouched. Python readers (
task.py,get_context.py) treat missing canonical fields asNone. Newly-created bootstrap / migration tasks from beta.9 onward produce the canonical shape.
npm install -g @mindfoldhq/trellis@beta