@mindfoldhq/trellis 0.6.0-beta.2 → 0.6.0-beta.21
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/README.md +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +58 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/channel/adapters/claude.d.ts +29 -0
- package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
- package/dist/commands/channel/adapters/claude.js +203 -0
- package/dist/commands/channel/adapters/claude.js.map +1 -0
- package/dist/commands/channel/adapters/codex.d.ts +85 -0
- package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
- package/dist/commands/channel/adapters/codex.js +505 -0
- package/dist/commands/channel/adapters/codex.js.map +1 -0
- package/dist/commands/channel/adapters/index.d.ts +84 -0
- package/dist/commands/channel/adapters/index.d.ts.map +1 -0
- package/dist/commands/channel/adapters/index.js +115 -0
- package/dist/commands/channel/adapters/index.js.map +1 -0
- package/dist/commands/channel/adapters/types.d.ts +33 -0
- package/dist/commands/channel/adapters/types.d.ts.map +1 -0
- package/dist/commands/channel/adapters/types.js +2 -0
- package/dist/commands/channel/adapters/types.js.map +1 -0
- package/dist/commands/channel/agent-loader.d.ts +32 -0
- package/dist/commands/channel/agent-loader.d.ts.map +1 -0
- package/dist/commands/channel/agent-loader.js +154 -0
- package/dist/commands/channel/agent-loader.js.map +1 -0
- package/dist/commands/channel/context-loader.d.ts +26 -0
- package/dist/commands/channel/context-loader.d.ts.map +1 -0
- package/dist/commands/channel/context-loader.js +290 -0
- package/dist/commands/channel/context-loader.js.map +1 -0
- package/dist/commands/channel/context.d.ts +16 -0
- package/dist/commands/channel/context.d.ts.map +1 -0
- package/dist/commands/channel/context.js +83 -0
- package/dist/commands/channel/context.js.map +1 -0
- package/dist/commands/channel/create.d.ts +27 -0
- package/dist/commands/channel/create.d.ts.map +1 -0
- package/dist/commands/channel/create.js +39 -0
- package/dist/commands/channel/create.js.map +1 -0
- package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
- package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
- package/dist/commands/channel/dev-parse-trace.js +70 -0
- package/dist/commands/channel/dev-parse-trace.js.map +1 -0
- package/dist/commands/channel/guard.d.ts +150 -0
- package/dist/commands/channel/guard.d.ts.map +1 -0
- package/dist/commands/channel/guard.js +474 -0
- package/dist/commands/channel/guard.js.map +1 -0
- package/dist/commands/channel/index.d.ts +3 -0
- package/dist/commands/channel/index.d.ts.map +1 -0
- package/dist/commands/channel/index.js +531 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/channel/interrupt.d.ts +10 -0
- package/dist/commands/channel/interrupt.d.ts.map +1 -0
- package/dist/commands/channel/interrupt.js +22 -0
- package/dist/commands/channel/interrupt.js.map +1 -0
- package/dist/commands/channel/kill.d.ts +7 -0
- package/dist/commands/channel/kill.d.ts.map +1 -0
- package/dist/commands/channel/kill.js +121 -0
- package/dist/commands/channel/kill.js.map +1 -0
- package/dist/commands/channel/list.d.ts +17 -0
- package/dist/commands/channel/list.d.ts.map +1 -0
- package/dist/commands/channel/list.js +233 -0
- package/dist/commands/channel/list.js.map +1 -0
- package/dist/commands/channel/messages.d.ts +15 -0
- package/dist/commands/channel/messages.d.ts.map +1 -0
- package/dist/commands/channel/messages.js +245 -0
- package/dist/commands/channel/messages.js.map +1 -0
- package/dist/commands/channel/rm.d.ts +27 -0
- package/dist/commands/channel/rm.d.ts.map +1 -0
- package/dist/commands/channel/rm.js +216 -0
- package/dist/commands/channel/rm.js.map +1 -0
- package/dist/commands/channel/run.d.ts +30 -0
- package/dist/commands/channel/run.d.ts.map +1 -0
- package/dist/commands/channel/run.js +130 -0
- package/dist/commands/channel/run.js.map +1 -0
- package/dist/commands/channel/send.d.ts +11 -0
- package/dist/commands/channel/send.d.ts.map +1 -0
- package/dist/commands/channel/send.js +24 -0
- package/dist/commands/channel/send.js.map +1 -0
- package/dist/commands/channel/spawn.d.ts +40 -0
- package/dist/commands/channel/spawn.d.ts.map +1 -0
- package/dist/commands/channel/spawn.js +244 -0
- package/dist/commands/channel/spawn.js.map +1 -0
- package/dist/commands/channel/store/events.d.ts +39 -0
- package/dist/commands/channel/store/events.d.ts.map +1 -0
- package/dist/commands/channel/store/events.js +87 -0
- package/dist/commands/channel/store/events.js.map +1 -0
- package/dist/commands/channel/store/filter.d.ts +3 -0
- package/dist/commands/channel/store/filter.d.ts.map +1 -0
- package/dist/commands/channel/store/filter.js +2 -0
- package/dist/commands/channel/store/filter.js.map +1 -0
- package/dist/commands/channel/store/lock.d.ts +23 -0
- package/dist/commands/channel/store/lock.d.ts.map +1 -0
- package/dist/commands/channel/store/lock.js +99 -0
- package/dist/commands/channel/store/lock.js.map +1 -0
- package/dist/commands/channel/store/paths.d.ts +63 -0
- package/dist/commands/channel/store/paths.d.ts.map +1 -0
- package/dist/commands/channel/store/paths.js +246 -0
- package/dist/commands/channel/store/paths.js.map +1 -0
- package/dist/commands/channel/store/schema.d.ts +27 -0
- package/dist/commands/channel/store/schema.d.ts.map +1 -0
- package/dist/commands/channel/store/schema.js +34 -0
- package/dist/commands/channel/store/schema.js.map +1 -0
- package/dist/commands/channel/store/thread-state.d.ts +5 -0
- package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
- package/dist/commands/channel/store/thread-state.js +16 -0
- package/dist/commands/channel/store/thread-state.js.map +1 -0
- package/dist/commands/channel/store/watch.d.ts +19 -0
- package/dist/commands/channel/store/watch.d.ts.map +1 -0
- package/dist/commands/channel/store/watch.js +146 -0
- package/dist/commands/channel/store/watch.js.map +1 -0
- package/dist/commands/channel/supervisor/idle.d.ts +46 -0
- package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/idle.js +72 -0
- package/dist/commands/channel/supervisor/idle.js.map +1 -0
- package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
- package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/inbox.js +160 -0
- package/dist/commands/channel/supervisor/inbox.js.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts +68 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.js +146 -0
- package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
- package/dist/commands/channel/supervisor/stdout.d.ts +51 -0
- package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/stdout.js +121 -0
- package/dist/commands/channel/supervisor/stdout.js.map +1 -0
- package/dist/commands/channel/supervisor/turns.d.ts +31 -0
- package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/turns.js +45 -0
- package/dist/commands/channel/supervisor/turns.js.map +1 -0
- package/dist/commands/channel/supervisor/warning.d.ts +48 -0
- package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/warning.js +77 -0
- package/dist/commands/channel/supervisor/warning.js.map +1 -0
- package/dist/commands/channel/supervisor.d.ts +59 -0
- package/dist/commands/channel/supervisor.d.ts.map +1 -0
- package/dist/commands/channel/supervisor.js +344 -0
- package/dist/commands/channel/supervisor.js.map +1 -0
- package/dist/commands/channel/text-body.d.ts +13 -0
- package/dist/commands/channel/text-body.d.ts.map +1 -0
- package/dist/commands/channel/text-body.js +47 -0
- package/dist/commands/channel/text-body.js.map +1 -0
- package/dist/commands/channel/threads.d.ts +39 -0
- package/dist/commands/channel/threads.d.ts.map +1 -0
- package/dist/commands/channel/threads.js +106 -0
- package/dist/commands/channel/threads.js.map +1 -0
- package/dist/commands/channel/title.d.ts +12 -0
- package/dist/commands/channel/title.d.ts.map +1 -0
- package/dist/commands/channel/title.js +24 -0
- package/dist/commands/channel/title.js.map +1 -0
- package/dist/commands/channel/wait.d.ts +17 -0
- package/dist/commands/channel/wait.d.ts.map +1 -0
- package/dist/commands/channel/wait.js +75 -0
- package/dist/commands/channel/wait.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +97 -42
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mem.d.ts +13 -117
- package/dist/commands/mem.d.ts.map +1 -1
- package/dist/commands/mem.js +168 -1074
- package/dist/commands/mem.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +28 -2
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +31 -111
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upgrade.d.ts +28 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +84 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workflow.d.ts +35 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +219 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/configurators/claude.d.ts.map +1 -1
- package/dist/configurators/claude.js +1 -0
- package/dist/configurators/claude.js.map +1 -1
- package/dist/configurators/codex.d.ts.map +1 -1
- package/dist/configurators/codex.js +5 -3
- package/dist/configurators/codex.js.map +1 -1
- package/dist/configurators/shared.js +4 -4
- package/dist/configurators/shared.js.map +1 -1
- package/dist/configurators/workflow.d.ts +8 -0
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +3 -2
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/migrations/manifests/0.5.10.json +9 -0
- package/dist/migrations/manifests/0.5.11.json +16 -0
- package/dist/migrations/manifests/0.5.12.json +9 -0
- package/dist/migrations/manifests/0.5.13.json +9 -0
- package/dist/migrations/manifests/0.5.14.json +9 -0
- package/dist/migrations/manifests/0.5.15.json +9 -0
- package/dist/migrations/manifests/0.5.16.json +9 -0
- package/dist/migrations/manifests/0.5.17.json +9 -0
- package/dist/migrations/manifests/0.5.18.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.17.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.18.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.19.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.20.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.21.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
- package/dist/templates/claude/agents/trellis-check.md +13 -7
- package/dist/templates/claude/agents/trellis-implement.md +8 -7
- package/dist/templates/claude/settings.json +4 -4
- package/dist/templates/codebuddy/agents/trellis-check.md +13 -7
- package/dist/templates/codebuddy/agents/trellis-implement.md +8 -7
- package/dist/templates/codebuddy/settings.json +4 -4
- package/dist/templates/codex/agents/trellis-check.toml +4 -4
- package/dist/templates/codex/agents/trellis-implement.toml +4 -4
- package/dist/templates/codex/config.toml +9 -16
- package/dist/templates/codex/hooks/session-start.py +205 -119
- package/dist/templates/codex/hooks.json +2 -2
- package/dist/templates/codex/skills/before-dev/SKILL.md +12 -6
- package/dist/templates/codex/skills/brainstorm/SKILL.md +69 -457
- package/dist/templates/codex/skills/check/SKILL.md +86 -18
- package/dist/templates/codex/skills/start/SKILL.md +33 -323
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +7 -4
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +1 -1
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +3 -2
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +5 -5
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +1 -1
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +35 -6
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +5 -4
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/SKILL.md +41 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/mcp-setup.md +90 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/repository-analysis.md +59 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-task-planning.md +61 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-writing.md +70 -0
- package/dist/templates/common/commands/continue.md +6 -5
- package/dist/templates/common/commands/start.md +9 -6
- package/dist/templates/common/skills/before-dev.md +12 -6
- package/dist/templates/common/skills/brainstorm.md +68 -504
- package/dist/templates/common/skills/check.md +7 -1
- package/dist/templates/copilot/hooks/session-start.py +219 -101
- package/dist/templates/copilot/hooks.json +2 -2
- package/dist/templates/copilot/prompts/before-dev.prompt.md +12 -6
- package/dist/templates/copilot/prompts/brainstorm.prompt.md +69 -457
- package/dist/templates/copilot/prompts/check.prompt.md +86 -18
- package/dist/templates/copilot/prompts/parallel.prompt.md +16 -8
- package/dist/templates/copilot/prompts/start.prompt.md +33 -367
- package/dist/templates/cursor/agents/trellis-check.md +13 -7
- package/dist/templates/cursor/agents/trellis-implement.md +8 -7
- package/dist/templates/cursor/hooks.json +1 -7
- package/dist/templates/droid/droids/trellis-check.md +13 -7
- package/dist/templates/droid/droids/trellis-implement.md +8 -7
- package/dist/templates/droid/settings.json +4 -4
- package/dist/templates/gemini/agents/trellis-check.md +11 -5
- package/dist/templates/gemini/agents/trellis-implement.md +7 -6
- package/dist/templates/gemini/settings.json +2 -2
- package/dist/templates/kiro/agents/trellis-check.json +1 -1
- package/dist/templates/kiro/agents/trellis-implement.json +1 -1
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +127 -9
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +171 -6
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +333 -43
- package/dist/templates/markdown/spec/guides/index.md.txt +18 -0
- package/dist/templates/opencode/agents/trellis-check.md +13 -7
- package/dist/templates/opencode/agents/trellis-implement.md +9 -8
- package/dist/templates/opencode/lib/session-utils.js +212 -123
- package/dist/templates/opencode/lib/trellis-context.js +73 -11
- package/dist/templates/opencode/plugins/inject-subagent-context.js +131 -29
- package/dist/templates/opencode/plugins/inject-workflow-state.js +9 -5
- package/dist/templates/opencode/plugins/session-start.js +9 -1
- package/dist/templates/pi/agents/trellis-check.md +5 -4
- package/dist/templates/pi/agents/trellis-implement.md +5 -4
- package/dist/templates/pi/extensions/trellis/index.ts.txt +1357 -754
- package/dist/templates/qoder/agents/trellis-check.md +11 -5
- package/dist/templates/qoder/agents/trellis-implement.md +7 -6
- package/dist/templates/qoder/settings.json +4 -4
- package/dist/templates/shared-hooks/index.d.ts.map +1 -1
- package/dist/templates/shared-hooks/index.js +0 -1
- package/dist/templates/shared-hooks/index.js.map +1 -1
- package/dist/templates/shared-hooks/inject-subagent-context.py +36 -14
- package/dist/templates/shared-hooks/inject-workflow-state.py +40 -42
- package/dist/templates/shared-hooks/session-start.py +222 -171
- package/dist/templates/trellis/config.yaml +38 -0
- package/dist/templates/trellis/index.d.ts +1 -0
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +2 -0
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/add_session.py +50 -24
- package/dist/templates/trellis/scripts/common/config.py +57 -1
- package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
- package/dist/templates/trellis/scripts/common/session_context.py +384 -137
- package/dist/templates/trellis/scripts/common/task_context.py +3 -3
- package/dist/templates/trellis/scripts/common/task_store.py +161 -15
- package/dist/templates/trellis/scripts/common/workflow_phase.py +7 -10
- package/dist/templates/trellis/scripts/task.py +3 -3
- package/dist/templates/trellis/workflow.md +119 -98
- package/dist/utils/cwd-guard.d.ts +38 -0
- package/dist/utils/cwd-guard.d.ts.map +1 -0
- package/dist/utils/cwd-guard.js +62 -0
- package/dist/utils/cwd-guard.js.map +1 -0
- package/dist/utils/file-writer.d.ts +13 -0
- package/dist/utils/file-writer.d.ts.map +1 -1
- package/dist/utils/file-writer.js +59 -1
- package/dist/utils/file-writer.js.map +1 -1
- package/dist/utils/manifest-prune.d.ts +61 -0
- package/dist/utils/manifest-prune.d.ts.map +1 -0
- package/dist/utils/manifest-prune.js +136 -0
- package/dist/utils/manifest-prune.js.map +1 -0
- package/dist/utils/task-json.d.ts +9 -42
- package/dist/utils/task-json.d.ts.map +1 -1
- package/dist/utils/task-json.js +8 -45
- package/dist/utils/task-json.js.map +1 -1
- package/dist/utils/template-hash.d.ts +32 -6
- package/dist/utils/template-hash.d.ts.map +1 -1
- package/dist/utils/template-hash.js +53 -31
- package/dist/utils/template-hash.js.map +1 -1
- package/dist/utils/uninstall-scrubbers.d.ts +1 -0
- package/dist/utils/uninstall-scrubbers.d.ts.map +1 -1
- package/dist/utils/uninstall-scrubbers.js +21 -0
- package/dist/utils/uninstall-scrubbers.js.map +1 -1
- package/dist/utils/workflow-resolver.d.ts +86 -0
- package/dist/utils/workflow-resolver.d.ts.map +1 -0
- package/dist/utils/workflow-resolver.js +265 -0
- package/dist/utils/workflow-resolver.js.map +1 -0
- package/package.json +9 -8
|
@@ -68,19 +68,31 @@ def _normalize_windows_shell_path(path_str: str) -> str:
|
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
FIRST_REPLY_NOTICE = """<first-reply-notice>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Then continue directly with the user's request. This notice is one-shot: do not repeat it after the first assistant reply in the same session.
|
|
71
|
+
First visible reply: say once in Chinese that Trellis SessionStart context is loaded, then answer directly.
|
|
72
|
+
This notice is one-shot: do not repeat it after the first assistant reply in the same session.
|
|
74
73
|
</first-reply-notice>"""
|
|
75
74
|
|
|
76
|
-
#
|
|
77
|
-
#
|
|
75
|
+
# Force UTF-8 on stdin/stdout/stderr on Windows. Default codepage there is
|
|
76
|
+
# cp936 / cp1252 / etc. — non-ASCII content (Chinese task names, prd snippets)
|
|
77
|
+
# both in stdin (hook payload from host CLI) and stdout (our emitted blocks)
|
|
78
|
+
# raises UnicodeDecodeError / UnicodeEncodeError. Equivalent to `python -X utf8`
|
|
79
|
+
# but applied per-stream so we don't depend on host CLI's command wiring.
|
|
78
80
|
if sys.platform.startswith("win"):
|
|
79
81
|
import io as _io
|
|
80
|
-
|
|
81
|
-
sys
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
for _stream_name in ("stdin", "stdout", "stderr"):
|
|
83
|
+
_stream = getattr(sys, _stream_name, None)
|
|
84
|
+
if _stream is None:
|
|
85
|
+
continue
|
|
86
|
+
if hasattr(_stream, "reconfigure"):
|
|
87
|
+
try:
|
|
88
|
+
_stream.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr]
|
|
89
|
+
except Exception:
|
|
90
|
+
pass
|
|
91
|
+
elif hasattr(_stream, "detach"):
|
|
92
|
+
try:
|
|
93
|
+
setattr(sys, _stream_name, _io.TextIOWrapper(_stream.detach(), encoding="utf-8", errors="replace"))
|
|
94
|
+
except Exception:
|
|
95
|
+
pass
|
|
84
96
|
|
|
85
97
|
|
|
86
98
|
|
|
@@ -136,6 +148,41 @@ def read_file(path: Path, fallback: str = "") -> str:
|
|
|
136
148
|
return fallback
|
|
137
149
|
|
|
138
150
|
|
|
151
|
+
def _repo_relative(repo_root: Path, path: Path) -> str:
|
|
152
|
+
try:
|
|
153
|
+
return path.relative_to(repo_root).as_posix()
|
|
154
|
+
except ValueError:
|
|
155
|
+
return str(path)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _run_git(repo_root: Path, args: list[str]) -> str:
|
|
159
|
+
try:
|
|
160
|
+
result = subprocess.run(
|
|
161
|
+
["git", *args],
|
|
162
|
+
capture_output=True,
|
|
163
|
+
text=True,
|
|
164
|
+
encoding="utf-8",
|
|
165
|
+
errors="replace",
|
|
166
|
+
timeout=3,
|
|
167
|
+
cwd=str(repo_root),
|
|
168
|
+
)
|
|
169
|
+
except (subprocess.TimeoutExpired, FileNotFoundError, PermissionError):
|
|
170
|
+
return ""
|
|
171
|
+
if result.returncode != 0:
|
|
172
|
+
return ""
|
|
173
|
+
return result.stdout.strip()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _format_git_state(repo_root: Path) -> str:
|
|
177
|
+
branch = _run_git(repo_root, ["branch", "--show-current"]) or "(detached)"
|
|
178
|
+
dirty_lines = [
|
|
179
|
+
line for line in _run_git(repo_root, ["status", "--porcelain"]).splitlines()
|
|
180
|
+
if line.strip()
|
|
181
|
+
]
|
|
182
|
+
dirty_text = "clean" if not dirty_lines else f"dirty {len(dirty_lines)} paths"
|
|
183
|
+
return f"Git: branch {branch}; {dirty_text}."
|
|
184
|
+
|
|
185
|
+
|
|
139
186
|
def _detect_platform(input_data: dict) -> str | None:
|
|
140
187
|
if isinstance(input_data.get("cursor_version"), str):
|
|
141
188
|
return "cursor"
|
|
@@ -274,44 +321,26 @@ def _resolve_task_dir(trellis_dir: Path, task_ref: str) -> Path:
|
|
|
274
321
|
|
|
275
322
|
|
|
276
323
|
def _get_task_status(trellis_dir: Path, input_data: dict) -> str:
|
|
277
|
-
"""
|
|
278
|
-
|
|
279
|
-
Returns a block with three fields:
|
|
280
|
-
- Status: current state
|
|
281
|
-
- Task: task identifier (when applicable)
|
|
282
|
-
- Next-Action: explicit skill/command/tool call the AI should invoke
|
|
283
|
-
"""
|
|
324
|
+
"""Return compact active-task status, artifact presence, and next action."""
|
|
284
325
|
active = _resolve_active_task(trellis_dir, input_data)
|
|
285
326
|
|
|
286
|
-
# Case 1: No active task — waiting for user to describe intent
|
|
287
327
|
if not active.task_path:
|
|
288
328
|
return (
|
|
289
329
|
"Status: NO ACTIVE TASK\n"
|
|
290
|
-
|
|
291
|
-
"
|
|
292
|
-
"
|
|
293
|
-
"Research reminder: for research-heavy tasks (comparing tools, reading external docs, "
|
|
294
|
-
"cross-platform surveys), spawn `trellis-research` sub-agents via the Task tool — "
|
|
295
|
-
"they persist findings to `{TASK_DIR}/research/*.md` and keep main context clean. "
|
|
296
|
-
"Do NOT do 10+ inline WebFetch/WebSearch in the main conversation.\n"
|
|
297
|
-
"User override (per-turn escape hatch): if the user's first message explicitly opts "
|
|
298
|
-
"out of the workflow (\"跳过 trellis\" / \"别走流程\" / \"小修一下\" / \"直接改\" / "
|
|
299
|
-
"\"skip trellis\" / \"no task\" / \"just do it\"), honor it for this turn — "
|
|
300
|
-
"acknowledge briefly and proceed without creating a task. Per-turn only."
|
|
330
|
+
"Next-Action: Classify the current turn before creating any Trellis task. "
|
|
331
|
+
"Simple conversation / small task asks only whether this turn should create a Trellis task. "
|
|
332
|
+
"Complex task asks whether task creation and planning are allowed."
|
|
301
333
|
)
|
|
302
334
|
|
|
303
|
-
# Case 2: Stale pointer — task dir was deleted
|
|
304
335
|
task_ref = active.task_path
|
|
305
336
|
task_dir = _resolve_task_dir(trellis_dir, task_ref)
|
|
306
337
|
if active.stale or not task_dir.is_dir():
|
|
307
338
|
return (
|
|
308
339
|
f"Status: STALE POINTER\nTask: {task_ref}\n"
|
|
309
|
-
f"Source: {active.source}\n"
|
|
310
340
|
f"Next-Action: Run `python3 ./.trellis/scripts/task.py finish` to clear the stale pointer, "
|
|
311
341
|
"then ask the user what to work on next."
|
|
312
342
|
)
|
|
313
343
|
|
|
314
|
-
# Read task.json
|
|
315
344
|
task_json_path = task_dir / "task.json"
|
|
316
345
|
task_data = {}
|
|
317
346
|
if task_json_path.is_file():
|
|
@@ -322,62 +351,65 @@ def _get_task_status(trellis_dir: Path, input_data: dict) -> str:
|
|
|
322
351
|
|
|
323
352
|
task_title = task_data.get("title", task_ref)
|
|
324
353
|
task_status = task_data.get("status", "unknown")
|
|
354
|
+
artifact_names = ("prd.md", "design.md", "implement.md", "implement.jsonl", "check.jsonl")
|
|
355
|
+
present = [name for name in artifact_names if (task_dir / name).is_file()]
|
|
356
|
+
if (task_dir / "research").is_dir():
|
|
357
|
+
present.append("research/")
|
|
358
|
+
present_line = ", ".join(present) if present else "(none)"
|
|
325
359
|
|
|
326
|
-
# Case 3: Task completed — time to archive
|
|
327
360
|
if task_status == "completed":
|
|
328
361
|
return (
|
|
329
362
|
f"Status: COMPLETED\nTask: {task_title}\n"
|
|
330
|
-
f"
|
|
331
|
-
|
|
332
|
-
f"then archive with `python3 ./.trellis/scripts/task.py archive {task_dir.name}`."
|
|
363
|
+
f"Present: {present_line}\n"
|
|
364
|
+
"Next-Action: Run `/trellis:finish-work`. If the working tree is dirty, return to Phase 3.4 first."
|
|
333
365
|
)
|
|
334
366
|
|
|
335
367
|
has_prd = (task_dir / "prd.md").is_file()
|
|
368
|
+
has_design = (task_dir / "design.md").is_file()
|
|
369
|
+
has_implement_plan = (task_dir / "implement.md").is_file()
|
|
370
|
+
implement_jsonl = task_dir / "implement.jsonl"
|
|
371
|
+
check_jsonl = task_dir / "check.jsonl"
|
|
372
|
+
jsonl_ready = (
|
|
373
|
+
(not implement_jsonl.is_file() or _has_curated_jsonl_entry(implement_jsonl))
|
|
374
|
+
and (not check_jsonl.is_file() or _has_curated_jsonl_entry(check_jsonl))
|
|
375
|
+
)
|
|
336
376
|
|
|
337
|
-
|
|
338
|
-
if not has_prd:
|
|
377
|
+
if task_status == "planning" and not has_prd:
|
|
339
378
|
return (
|
|
340
379
|
f"Status: PLANNING\nTask: {task_title}\n"
|
|
341
|
-
f"
|
|
342
|
-
"Next-Action: Load
|
|
343
|
-
"and produce prd.md in the task directory.\n"
|
|
344
|
-
"Research reminder: when the task needs external research (tool comparison, docs, "
|
|
345
|
-
"conventions survey), spawn `trellis-research` sub-agents — don't WebFetch/WebSearch "
|
|
346
|
-
"inline in the main session. Findings go to `{task_dir}/research/*.md`; PRD only links to them."
|
|
380
|
+
f"Present: {present_line}\n"
|
|
381
|
+
"Next-Action: Load `trellis-brainstorm` and write `prd.md`. Stay in planning."
|
|
347
382
|
)
|
|
348
383
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
384
|
+
if task_status == "planning":
|
|
385
|
+
missing_complex = [
|
|
386
|
+
name for name, exists in (
|
|
387
|
+
("design.md", has_design),
|
|
388
|
+
("implement.md", has_implement_plan),
|
|
389
|
+
)
|
|
390
|
+
if not exists
|
|
391
|
+
]
|
|
392
|
+
next_bits: list[str] = []
|
|
393
|
+
if missing_complex:
|
|
394
|
+
next_bits.append(
|
|
395
|
+
"Lightweight task can request start review with PRD-only; "
|
|
396
|
+
f"complex task must add {', '.join(missing_complex)} before start"
|
|
397
|
+
)
|
|
398
|
+
else:
|
|
399
|
+
next_bits.append("Planning artifacts are present; ask for review before `task.py start`")
|
|
400
|
+
if not jsonl_ready:
|
|
401
|
+
next_bits.append("curate `implement.jsonl` and `check.jsonl` before sub-agent mode start")
|
|
352
402
|
return (
|
|
353
|
-
f"Status: PLANNING
|
|
354
|
-
f"
|
|
355
|
-
"Next-Action:
|
|
356
|
-
"the Phase 2 sub-agents will need. Only spec paths (`.trellis/spec/**/*.md`) and research "
|
|
357
|
-
"files (`{TASK_DIR}/research/*.md`) — no code paths. Run "
|
|
358
|
-
"`python3 ./.trellis/scripts/get_context.py --mode packages` to list available specs, "
|
|
359
|
-
"then edit the jsonl files or use `python3 ./.trellis/scripts/task.py add-context`. "
|
|
360
|
-
"See `.trellis/workflow.md` Phase 1.3 for details."
|
|
403
|
+
f"Status: PLANNING\nTask: {task_title}\n"
|
|
404
|
+
f"Present: {present_line}\n"
|
|
405
|
+
f"Next-Action: {'; '.join(next_bits)}. Do not enter implementation until the user confirms start."
|
|
361
406
|
)
|
|
362
407
|
|
|
363
|
-
# Case 5: PRD + curated jsonl (or agent-less platform with no jsonl) — enter Execute phase
|
|
364
408
|
return (
|
|
365
|
-
f"Status:
|
|
366
|
-
f"
|
|
367
|
-
"Next
|
|
368
|
-
"
|
|
369
|
-
"After implementation, dispatch `trellis-check` per Phase 2.2 before reporting completion.\n"
|
|
370
|
-
"Sub-agent roster: `trellis-implement` (writes code), `trellis-check` (verifies + self-fixes), "
|
|
371
|
-
"`trellis-research` (persists findings to `research/*.md` — use when you'd otherwise do "
|
|
372
|
-
"multiple WebFetch/WebSearch inline).\n"
|
|
373
|
-
"Sub-agent self-exemption: if you are reading this as a `trellis-implement` or "
|
|
374
|
-
"`trellis-check` sub-agent (your own role / agent name reflects that), this dispatch "
|
|
375
|
-
"instruction does NOT apply to you — you are already the dispatched sub-agent. "
|
|
376
|
-
"Implement / check directly without spawning another sub-agent of the same kind.\n"
|
|
377
|
-
"User override (per-turn escape hatch): if the user's CURRENT message explicitly tells the "
|
|
378
|
-
"main session to handle it directly (\"你直接改\" / \"别派 sub-agent\" / \"main session 写就行\" / "
|
|
379
|
-
"\"do it inline\" / \"不用 sub-agent\"), honor it for this turn and edit code directly. "
|
|
380
|
-
"Per-turn only; do NOT invent an override the user did not say."
|
|
409
|
+
f"Status: {str(task_status).upper()}\nTask: {task_title}\n"
|
|
410
|
+
f"Present: {present_line}\n"
|
|
411
|
+
"Next-Action: Follow the matching per-turn workflow-state. "
|
|
412
|
+
"Implementation/check context order is jsonl entries -> `prd.md` -> `design.md if present` -> `implement.md if present`."
|
|
381
413
|
)
|
|
382
414
|
|
|
383
415
|
|
|
@@ -530,6 +562,97 @@ def _resolve_spec_scope(
|
|
|
530
562
|
return None # Unknown scope type: full scan
|
|
531
563
|
|
|
532
564
|
|
|
565
|
+
def _collect_spec_index_paths(trellis_dir: Path, allowed_pkgs: set | None) -> list[str]:
|
|
566
|
+
paths: list[str] = []
|
|
567
|
+
guides_index = trellis_dir / "spec" / "guides" / "index.md"
|
|
568
|
+
if guides_index.is_file():
|
|
569
|
+
paths.append(".trellis/spec/guides/index.md")
|
|
570
|
+
|
|
571
|
+
spec_dir = trellis_dir / "spec"
|
|
572
|
+
if not spec_dir.is_dir():
|
|
573
|
+
return paths
|
|
574
|
+
|
|
575
|
+
for sub in sorted(spec_dir.iterdir()):
|
|
576
|
+
if not sub.is_dir() or sub.name.startswith(".") or sub.name == "guides":
|
|
577
|
+
continue
|
|
578
|
+
|
|
579
|
+
index_file = sub / "index.md"
|
|
580
|
+
if index_file.is_file():
|
|
581
|
+
paths.append(f".trellis/spec/{sub.name}/index.md")
|
|
582
|
+
continue
|
|
583
|
+
|
|
584
|
+
if allowed_pkgs is not None and sub.name not in allowed_pkgs:
|
|
585
|
+
continue
|
|
586
|
+
for nested in sorted(sub.iterdir()):
|
|
587
|
+
if not nested.is_dir():
|
|
588
|
+
continue
|
|
589
|
+
nested_index = nested / "index.md"
|
|
590
|
+
if nested_index.is_file():
|
|
591
|
+
paths.append(f".trellis/spec/{sub.name}/{nested.name}/index.md")
|
|
592
|
+
|
|
593
|
+
return paths
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
def _build_compact_current_state(
|
|
597
|
+
trellis_dir: Path,
|
|
598
|
+
input_data: dict,
|
|
599
|
+
spec_index_paths: list[str],
|
|
600
|
+
) -> str:
|
|
601
|
+
repo_root = trellis_dir.parent
|
|
602
|
+
lines: list[str] = []
|
|
603
|
+
|
|
604
|
+
try:
|
|
605
|
+
from common.paths import get_active_journal_file, get_developer, get_tasks_dir, count_lines # type: ignore[import-not-found]
|
|
606
|
+
from common.tasks import iter_active_tasks # type: ignore[import-not-found]
|
|
607
|
+
except Exception:
|
|
608
|
+
get_active_journal_file = None # type: ignore[assignment]
|
|
609
|
+
get_developer = None # type: ignore[assignment]
|
|
610
|
+
get_tasks_dir = None # type: ignore[assignment]
|
|
611
|
+
count_lines = None # type: ignore[assignment]
|
|
612
|
+
iter_active_tasks = None # type: ignore[assignment]
|
|
613
|
+
|
|
614
|
+
developer = get_developer(repo_root) if get_developer else None
|
|
615
|
+
lines.append(f"Developer: {developer or '(not initialized)'}")
|
|
616
|
+
lines.append(_format_git_state(repo_root))
|
|
617
|
+
|
|
618
|
+
active = _resolve_active_task(trellis_dir, input_data)
|
|
619
|
+
if active.task_path:
|
|
620
|
+
task_dir = _resolve_task_dir(trellis_dir, active.task_path)
|
|
621
|
+
status = "unknown"
|
|
622
|
+
task_json = task_dir / "task.json"
|
|
623
|
+
if task_json.is_file():
|
|
624
|
+
try:
|
|
625
|
+
data = json.loads(task_json.read_text(encoding="utf-8"))
|
|
626
|
+
if isinstance(data, dict):
|
|
627
|
+
status = str(data.get("status") or "unknown")
|
|
628
|
+
except (json.JSONDecodeError, OSError):
|
|
629
|
+
pass
|
|
630
|
+
lines.append(f"Current task: {_repo_relative(repo_root, task_dir)}; status={status}.")
|
|
631
|
+
else:
|
|
632
|
+
lines.append("Current task: none.")
|
|
633
|
+
|
|
634
|
+
if get_tasks_dir and iter_active_tasks:
|
|
635
|
+
try:
|
|
636
|
+
task_count = sum(1 for _ in iter_active_tasks(get_tasks_dir(repo_root)))
|
|
637
|
+
lines.append(
|
|
638
|
+
f"Active tasks: {task_count} total. Use `python3 ./.trellis/scripts/task.py list --mine` only if needed."
|
|
639
|
+
)
|
|
640
|
+
except Exception:
|
|
641
|
+
pass
|
|
642
|
+
|
|
643
|
+
if get_active_journal_file and count_lines:
|
|
644
|
+
journal = get_active_journal_file(repo_root)
|
|
645
|
+
if journal:
|
|
646
|
+
lines.append(
|
|
647
|
+
f"Journal: {_repo_relative(repo_root, journal)}, {count_lines(journal)} / 2000 lines."
|
|
648
|
+
)
|
|
649
|
+
|
|
650
|
+
if spec_index_paths:
|
|
651
|
+
lines.append(f"Spec indexes: {len(spec_index_paths)} available.")
|
|
652
|
+
|
|
653
|
+
return "\n".join(lines)
|
|
654
|
+
|
|
655
|
+
|
|
533
656
|
def _extract_range(content: str, start_header: str, end_header: str) -> str:
|
|
534
657
|
"""Extract lines starting at `## start_header` up to (but excluding) `## end_header`.
|
|
535
658
|
|
|
@@ -570,51 +693,25 @@ def _strip_breadcrumb_tag_blocks(content: str) -> str:
|
|
|
570
693
|
payload already covers the full step bodies, so re-inlining the
|
|
571
694
|
breadcrumbs here would just duplicate context.
|
|
572
695
|
"""
|
|
573
|
-
|
|
696
|
+
stripped = _BREADCRUMB_TAG_RE.sub("", content)
|
|
697
|
+
stripped = re.sub(r"<!--.*?-->", "", stripped, flags=re.DOTALL)
|
|
698
|
+
stripped = re.sub(r"^\[(?!/?workflow-state:)/?[^\]\n]+\]\s*\n?", "", stripped, flags=re.MULTILINE)
|
|
699
|
+
return re.sub(r"\n{3,}", "\n\n", stripped).strip()
|
|
574
700
|
|
|
575
701
|
|
|
576
702
|
def _build_workflow_overview(workflow_path: Path) -> str:
|
|
577
|
-
"""Inject the
|
|
578
|
-
|
|
579
|
-
Contents:
|
|
580
|
-
1. Section index (all `## ` headings — navigation)
|
|
581
|
-
2. Phase Index section (rules, skill routing table, anti-rationalization table)
|
|
582
|
-
3. Phase 1/2/3 step-level details (the actual how-to for each step)
|
|
583
|
-
|
|
584
|
-
The meta sections (Core Principles / Trellis System / Customizing
|
|
585
|
-
Trellis) are NOT injected — Core Principles is short prose the AI can
|
|
586
|
-
Read on demand; Trellis System lists reference commands duplicated in
|
|
587
|
-
step bodies; Customizing Trellis is for forks. Workflow-state breadcrumb
|
|
588
|
-
tag blocks (which now live inside Phase Index since v0.5.0-rc.0) are
|
|
589
|
-
stripped from the extracted range — they're consumed by the
|
|
590
|
-
UserPromptSubmit hook, not the session-start preamble.
|
|
591
|
-
|
|
592
|
-
Total budget: Phase Index ~2 KB + Phase 1/2/3 ~7 KB = ~9 KB.
|
|
593
|
-
"""
|
|
703
|
+
"""Inject only the compact Phase Index summary for SessionStart."""
|
|
594
704
|
content = read_file(workflow_path)
|
|
595
705
|
if not content:
|
|
596
706
|
return "No workflow.md found"
|
|
597
707
|
|
|
598
708
|
out_lines = [
|
|
599
|
-
"# Development Workflow
|
|
600
|
-
"Full guide: .trellis/workflow.md
|
|
709
|
+
"# Development Workflow - Session Summary",
|
|
710
|
+
"Full guide: .trellis/workflow.md. Step detail: `python3 ./.trellis/scripts/get_context.py --mode phase --step <X.Y>`.",
|
|
601
711
|
"",
|
|
602
|
-
"## Table of Contents",
|
|
603
712
|
]
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
out_lines.append(line)
|
|
607
|
-
out_lines += ["", "---", ""]
|
|
608
|
-
|
|
609
|
-
# Extract Phase Index through the end of Phase 3 (before "Customizing
|
|
610
|
-
# Trellis" — the docs-for-forks footer added in v0.5.0-rc.0). Since
|
|
611
|
-
# sections appear in order Phase Index → Phase 1 → Phase 2 → Phase 3 →
|
|
612
|
-
# Customizing Trellis, a single range grab captures all four. The
|
|
613
|
-
# breadcrumb tag blocks now embedded inside Phase Index are stripped so
|
|
614
|
-
# they don't duplicate the per-turn UserPromptSubmit injection.
|
|
615
|
-
phases = _extract_range(
|
|
616
|
-
content, "Phase Index", "Customizing Trellis (for forks)"
|
|
617
|
-
)
|
|
713
|
+
|
|
714
|
+
phases = _extract_range(content, "Phase Index", "Phase 1: Plan")
|
|
618
715
|
if phases:
|
|
619
716
|
out_lines.append(_strip_breadcrumb_tag_blocks(phases).rstrip())
|
|
620
717
|
|
|
@@ -665,9 +762,10 @@ def main():
|
|
|
665
762
|
|
|
666
763
|
output = StringIO()
|
|
667
764
|
|
|
765
|
+
spec_index_paths = _collect_spec_index_paths(trellis_dir, allowed_pkgs)
|
|
766
|
+
|
|
668
767
|
output.write("""<session-context>
|
|
669
|
-
|
|
670
|
-
Read and follow all instructions below carefully.
|
|
768
|
+
Trellis compact SessionStart context. Use it to orient the session; load details on demand.
|
|
671
769
|
</session-context>
|
|
672
770
|
|
|
673
771
|
""")
|
|
@@ -680,72 +778,23 @@ Read and follow all instructions below carefully.
|
|
|
680
778
|
output.write(f"<migration-warning>\n{legacy_warning}\n</migration-warning>\n\n")
|
|
681
779
|
|
|
682
780
|
output.write("<current-state>\n")
|
|
683
|
-
|
|
684
|
-
output.write(run_script(context_script, context_key))
|
|
781
|
+
output.write(_build_compact_current_state(trellis_dir, hook_input, spec_index_paths))
|
|
685
782
|
output.write("\n</current-state>\n\n")
|
|
686
783
|
|
|
687
|
-
output.write("<workflow>\n")
|
|
784
|
+
output.write("<trellis-workflow>\n")
|
|
688
785
|
output.write(_build_workflow_overview(trellis_dir / "workflow.md"))
|
|
689
|
-
output.write("\n</workflow>\n\n")
|
|
786
|
+
output.write("\n</trellis-workflow>\n\n")
|
|
690
787
|
|
|
691
788
|
output.write("<guidelines>\n")
|
|
692
789
|
output.write(
|
|
693
|
-
"
|
|
694
|
-
"
|
|
695
|
-
"
|
|
696
|
-
"- If you're spawning an implement/check sub-agent, context is injected "
|
|
697
|
-
"or loaded by the sub-agent via `{task}/implement.jsonl` / `check.jsonl`. "
|
|
698
|
-
"You do NOT need to read these indexes yourself.\n"
|
|
699
|
-
"- For agent-capable platforms, the default is to dispatch "
|
|
700
|
-
"`trellis-implement` and `trellis-check` (so JSONL context is loaded by "
|
|
701
|
-
"the sub-agents) rather than editing code in the main session. "
|
|
702
|
-
"Honor a per-turn user override only if the user's current message "
|
|
703
|
-
"explicitly opts out (see <task-status> below for override phrases).\n"
|
|
704
|
-
"- Sub-agent self-exemption: if you are reading this as a `trellis-implement` "
|
|
705
|
-
"or `trellis-check` sub-agent, the \"dispatch trellis-implement / trellis-check\" "
|
|
706
|
-
"rule above does NOT apply to you — you are already the dispatched sub-agent. "
|
|
707
|
-
"Do NOT spawn another sub-agent of the same kind; implement / check directly.\n\n"
|
|
790
|
+
"Task context order for implementation/check: jsonl entries -> `prd.md` -> "
|
|
791
|
+
"`design.md if present` -> `implement.md if present`. Missing optional artifacts "
|
|
792
|
+
"are skipped for lightweight tasks.\n\n"
|
|
708
793
|
)
|
|
709
794
|
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
output.write("## guides (inlined — cross-package thinking guides)\n")
|
|
714
|
-
output.write(read_file(guides_index))
|
|
715
|
-
output.write("\n\n")
|
|
716
|
-
|
|
717
|
-
# Other spec indexes — paths only (main agent reads on demand;
|
|
718
|
-
# sub-agents get their specific specs via jsonl injection)
|
|
719
|
-
paths: list[str] = []
|
|
720
|
-
spec_dir = trellis_dir / "spec"
|
|
721
|
-
if spec_dir.is_dir():
|
|
722
|
-
for sub in sorted(spec_dir.iterdir()):
|
|
723
|
-
if not sub.is_dir() or sub.name.startswith("."):
|
|
724
|
-
continue
|
|
725
|
-
if sub.name == "guides":
|
|
726
|
-
continue # already inlined above
|
|
727
|
-
|
|
728
|
-
index_file = sub / "index.md"
|
|
729
|
-
if index_file.is_file():
|
|
730
|
-
# Flat spec dir (single-repo layer like spec/backend/)
|
|
731
|
-
paths.append(f".trellis/spec/{sub.name}/index.md")
|
|
732
|
-
else:
|
|
733
|
-
# Nested package dirs (monorepo: spec/<pkg>/<layer>/index.md)
|
|
734
|
-
# Apply scope filter
|
|
735
|
-
if allowed_pkgs is not None and sub.name not in allowed_pkgs:
|
|
736
|
-
continue
|
|
737
|
-
for nested in sorted(sub.iterdir()):
|
|
738
|
-
if not nested.is_dir():
|
|
739
|
-
continue
|
|
740
|
-
nested_index = nested / "index.md"
|
|
741
|
-
if nested_index.is_file():
|
|
742
|
-
paths.append(
|
|
743
|
-
f".trellis/spec/{sub.name}/{nested.name}/index.md"
|
|
744
|
-
)
|
|
745
|
-
|
|
746
|
-
if paths:
|
|
747
|
-
output.write("## Available spec indexes (read on demand)\n")
|
|
748
|
-
for p in paths:
|
|
795
|
+
if spec_index_paths:
|
|
796
|
+
output.write("## Available indexes (read on demand)\n")
|
|
797
|
+
for p in spec_index_paths:
|
|
749
798
|
output.write(f"- {p}\n")
|
|
750
799
|
output.write("\n")
|
|
751
800
|
|
|
@@ -760,16 +809,18 @@ Read and follow all instructions below carefully.
|
|
|
760
809
|
output.write(f"<task-status>\n{task_status}\n</task-status>\n\n")
|
|
761
810
|
|
|
762
811
|
output.write("""<ready>
|
|
763
|
-
Context loaded.
|
|
764
|
-
When the user sends the first message, follow <task-status> and the workflow guide.
|
|
765
|
-
If a task is READY, execute its Next required action without asking whether to continue.
|
|
812
|
+
Context loaded. Follow <task-status>. Load workflow/spec/task details only when needed.
|
|
766
813
|
</ready>""")
|
|
767
814
|
|
|
815
|
+
context_text = output.getvalue()
|
|
768
816
|
result = {
|
|
817
|
+
# Claude Code / Qoder / CodeBuddy / Droid / Gemini / Copilot format
|
|
769
818
|
"hookSpecificOutput": {
|
|
770
819
|
"hookEventName": "SessionStart",
|
|
771
|
-
"additionalContext":
|
|
772
|
-
}
|
|
820
|
+
"additionalContext": context_text,
|
|
821
|
+
},
|
|
822
|
+
# Cursor sessionStart format (top-level snake_case per Cursor docs)
|
|
823
|
+
"additional_context": context_text,
|
|
773
824
|
}
|
|
774
825
|
|
|
775
826
|
# Output JSON - stdout is already configured for UTF-8
|
|
@@ -14,6 +14,24 @@ session_commit_message: "chore: record journal"
|
|
|
14
14
|
# Maximum lines per journal file before rotating to a new one
|
|
15
15
|
max_journal_lines: 2000
|
|
16
16
|
|
|
17
|
+
#-------------------------------------------------------------------------------
|
|
18
|
+
# Session Auto-Commit
|
|
19
|
+
#-------------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
# Auto-commit behavior for session journal + task archive operations.
|
|
22
|
+
# - true (default): scripts auto-stage and auto-commit journal / task changes
|
|
23
|
+
# after add_session.py / task.py archive runs.
|
|
24
|
+
# - false: scripts do not touch git. Files (journal-*.md, task archive moves)
|
|
25
|
+
# are still written to disk; you decide whether to git add / commit.
|
|
26
|
+
#
|
|
27
|
+
# Use `false` if your project's .gitignore intentionally excludes `.trellis/`
|
|
28
|
+
# and you want session data kept local-only, or if you prefer to review
|
|
29
|
+
# staged changes manually before each commit.
|
|
30
|
+
#
|
|
31
|
+
# Accepts: true / false / yes / no / 1 / 0 / on / off (case-insensitive).
|
|
32
|
+
#
|
|
33
|
+
# session_auto_commit: true
|
|
34
|
+
|
|
17
35
|
#-------------------------------------------------------------------------------
|
|
18
36
|
# Task Lifecycle Hooks
|
|
19
37
|
#-------------------------------------------------------------------------------
|
|
@@ -58,6 +76,26 @@ max_journal_lines: 2000
|
|
|
58
76
|
# Default package used when --package is not specified.
|
|
59
77
|
# default_package: frontend
|
|
60
78
|
|
|
79
|
+
#-------------------------------------------------------------------------------
|
|
80
|
+
# Channel worker OOM guard
|
|
81
|
+
#-------------------------------------------------------------------------------
|
|
82
|
+
# Default safeguards for `trellis channel spawn` workers. The guard runs
|
|
83
|
+
# at spawn time (cleans expired idle workers, then enforces the live-worker
|
|
84
|
+
# budget) and inside each supervisor (self-terminates a worker that stays
|
|
85
|
+
# continuously idle past `idle_timeout`).
|
|
86
|
+
#
|
|
87
|
+
# Precedence: CLI flag > env var (TRELLIS_CHANNEL_WORKER_IDLE_TIMEOUT /
|
|
88
|
+
# TRELLIS_CHANNEL_MAX_LIVE_WORKERS) > this config > built-in default.
|
|
89
|
+
#
|
|
90
|
+
# `idle_timeout: 0` disables idle cleanup (workers can sit idle forever
|
|
91
|
+
# unless explicitly killed or given `--timeout`).
|
|
92
|
+
# `max_live_workers: 0` disables the spawn-time budget check.
|
|
93
|
+
#
|
|
94
|
+
channel:
|
|
95
|
+
worker_guard:
|
|
96
|
+
idle_timeout: 5m
|
|
97
|
+
max_live_workers: 6
|
|
98
|
+
|
|
61
99
|
#-------------------------------------------------------------------------------
|
|
62
100
|
# Codex (dispatch behavior)
|
|
63
101
|
#-------------------------------------------------------------------------------
|
|
@@ -36,6 +36,7 @@ export declare const commonSessionContext: string;
|
|
|
36
36
|
export declare const commonPackagesContext: string;
|
|
37
37
|
export declare const commonWorkflowPhase: string;
|
|
38
38
|
export declare const commonTrellisConfig: string;
|
|
39
|
+
export declare const commonSafeCommit: string;
|
|
39
40
|
export declare const getDeveloperScript: string;
|
|
40
41
|
export declare const initDeveloperScript: string;
|
|
41
42
|
export declare const taskScript: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAG9E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AAGvE,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAE/D;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqCnD"}
|
|
@@ -46,6 +46,7 @@ export const commonSessionContext = readTemplate("scripts/common/session_context
|
|
|
46
46
|
export const commonPackagesContext = readTemplate("scripts/common/packages_context.py");
|
|
47
47
|
export const commonWorkflowPhase = readTemplate("scripts/common/workflow_phase.py");
|
|
48
48
|
export const commonTrellisConfig = readTemplate("scripts/common/trellis_config.py");
|
|
49
|
+
export const commonSafeCommit = readTemplate("scripts/common/safe_commit.py");
|
|
49
50
|
// Python scripts - main
|
|
50
51
|
export const getDeveloperScript = readTemplate("scripts/get_developer.py");
|
|
51
52
|
export const initDeveloperScript = readTemplate("scripts/init_developer.py");
|
|
@@ -84,6 +85,7 @@ export function getAllScripts() {
|
|
|
84
85
|
scripts.set("common/packages_context.py", commonPackagesContext);
|
|
85
86
|
scripts.set("common/workflow_phase.py", commonWorkflowPhase);
|
|
86
87
|
scripts.set("common/trellis_config.py", commonTrellisConfig);
|
|
88
|
+
scripts.set("common/safe_commit.py", commonSafeCommit);
|
|
87
89
|
// Main
|
|
88
90
|
scripts.set("get_developer.py", getDeveloperScript);
|
|
89
91
|
scripts.set("init_developer.py", initDeveloperScript);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,YAAY,CAAC,YAAoB;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAE/D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,gCAAgC,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,mCAAmC,CACpC,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAC/C,oCAAoC,CACrC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,kCAAkC,CACnC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,kCAAkC,CACnC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"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"}
|