Skip to main content
Beta.16 is a compatibility patch for template hash portability, task archive inputs, and Claude Code statusLine upgrades after beta.15.

Bug Fixes

Template hash portability

Template hash storage now uses POSIX path keys and LF-normalized content hashes. The .trellis/.template-hashes.json file now uses a versioned envelope:
{
  "__version": 2,
  "hashes": {
    ".trellis/scripts/task.py": "<sha256>"
  }
}
Areabeta.16 behavior
Hash keysStored with / separators on every host
Hash inputCRLF content is normalized to LF before SHA256
Legacy flat hash fileDiscarded and regenerated from installed templates
Directory safety checkspath.relative() output is normalized before template/hash lookups
OpenCode templatesCollector stores .opencode/* keys in POSIX form
This fixes Windows checkout cases where backslash hash keys or CRLF line endings made unchanged templates look modified.

task.py archive input contract

task.py archive now accepts the same task inputs as the other task-directory commands.
Input formExample
Bare task namepython3 .trellis/scripts/task.py archive 04-27-example
Relative task pathpython3 .trellis/scripts/task.py archive .trellis/tasks/04-27-example
Absolute task pathpython3 .trellis/scripts/task.py archive /repo/.trellis/tasks/04-27-example
Previously, archive was the only dir-style task command that used slug-only lookup. Passing .trellis/tasks/<slug> failed with Task not found even though other task commands accepted that form.

Existing Claude Code statusLine installs are preserved

Beta.15 stopped installing Claude Code statusLine for new projects. That default is unchanged. The upgrade path is now more conservative:
Casebeta.16 behavior
New projectTrellis does not create .claude/hooks/statusline.py and does not add statusLine to .claude/settings.json
Existing project with .claude/hooks/statusline.pytrellis update preserves the file
Existing project with .claude/settings.json statusLinetrellis update carries that entry into the updated settings file
This means beta.16 no longer treats Claude Code statusLine as a cleanup target. Users who no longer want it can delete the file and settings entry manually.

Shared-hook cleanup still applies to orphan platform files

The non-Claude statusline.py cleanup entries remain hash-verified safe deletes. Those platforms have no statusLine event, so the files were never invoked:
  • .cursor/hooks/statusline.py
  • .codex/hooks/statusline.py
  • .gemini/hooks/statusline.py
  • .qoder/hooks/statusline.py
  • .github/copilot/hooks/statusline.py
  • .codebuddy/hooks/statusline.py
  • .factory/hooks/statusline.py
  • .kiro/hooks/statusline.py

Upgrade

Existing projects:
trellis update
No --migrate flag is required for this patch.