@mindfoldhq/trellis 0.6.0-beta.2 → 0.6.0-beta.20
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.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 +5 -3
- 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
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a list of `--file` / `--jsonl` specs into the concatenated context
|
|
3
|
+
* string to be embedded in the worker's system prompt.
|
|
4
|
+
*
|
|
5
|
+
* --file <path-or-glob> direct file inclusion (glob expanded via fs.globSync)
|
|
6
|
+
* --jsonl <path> parse a Trellis jsonl manifest where each line is
|
|
7
|
+
* {"file": "<path>", "reason": "<why>"} and include
|
|
8
|
+
* each referenced file (reason becomes part of header)
|
|
9
|
+
*
|
|
10
|
+
* All paths are resolved relative to `cwd` (the spawn caller's cwd).
|
|
11
|
+
* Missing files are skipped with a stderr warning, not fatal.
|
|
12
|
+
* Each block is delimited with a header so the model can attribute content
|
|
13
|
+
* to its source file.
|
|
14
|
+
*/
|
|
15
|
+
import fs from "node:fs";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
const MAX_PER_FILE_BYTES = 1_000_000; // 1MB hard cap per file
|
|
18
|
+
const WARN_PER_FILE_BYTES = 200_000; // stderr warn at 200KB
|
|
19
|
+
const WARN_TOTAL_BYTES = 500_000; // stderr warn when assembled context > 500KB
|
|
20
|
+
/**
|
|
21
|
+
* Path-traversal guard: resolve `target` and `cwd` to realpaths and
|
|
22
|
+
* verify `target` is `cwd` or a descendant. Refuses absolute paths
|
|
23
|
+
* outside cwd, `..`-escapes, and symlinks pointing outside.
|
|
24
|
+
*
|
|
25
|
+
* Returns the resolved realpath, or null if blocked (with stderr warning).
|
|
26
|
+
*/
|
|
27
|
+
function jailedRealpath(target, cwd) {
|
|
28
|
+
const cwdReal = fs.realpathSync(cwd);
|
|
29
|
+
let real;
|
|
30
|
+
try {
|
|
31
|
+
real = fs.realpathSync(target);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Target doesn't exist — fall back to the lexical resolution. The
|
|
35
|
+
// existence check happens later; we just need to ensure the lexical
|
|
36
|
+
// form is inside the jail.
|
|
37
|
+
real = path.resolve(target);
|
|
38
|
+
}
|
|
39
|
+
if (real !== cwdReal && !real.startsWith(cwdReal + path.sep)) {
|
|
40
|
+
process.stderr.write(`[channel spawn] context path escapes cwd, refusing: ${path.relative(cwd, target) || target}\n`);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return real;
|
|
44
|
+
}
|
|
45
|
+
/** Strip control characters that would break header lines in the system prompt. */
|
|
46
|
+
function safeHeader(s) {
|
|
47
|
+
// eslint-disable-next-line no-control-regex
|
|
48
|
+
return s.replace(/[\r\n\x00-\x08\x0b-\x1f\x7f]/g, " ");
|
|
49
|
+
}
|
|
50
|
+
export function assembleContext(cwd, files = [], jsonls = []) {
|
|
51
|
+
const blocks = [];
|
|
52
|
+
const manifestPaths = [];
|
|
53
|
+
for (const spec of files) {
|
|
54
|
+
for (const resolved of expandGlob(cwd, spec)) {
|
|
55
|
+
const jailed = jailedRealpath(resolved, cwd);
|
|
56
|
+
if (!jailed)
|
|
57
|
+
continue;
|
|
58
|
+
const block = readFileBlock(jailed, cwd, "file");
|
|
59
|
+
if (block)
|
|
60
|
+
blocks.push(block);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const jsonlPath of jsonls) {
|
|
64
|
+
const jailedJsonl = jailedRealpath(path.resolve(cwd, jsonlPath), cwd);
|
|
65
|
+
if (!jailedJsonl)
|
|
66
|
+
continue;
|
|
67
|
+
if (!fs.existsSync(jailedJsonl)) {
|
|
68
|
+
process.stderr.write(`[channel spawn] --jsonl: file not found, skipping: ${jsonlPath}\n`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Record the manifest path BEFORE consuming entries, so the spawned
|
|
72
|
+
// event reflects "user passed this manifest" even if it's empty.
|
|
73
|
+
manifestPaths.push(path.relative(cwd, jailedJsonl) || jsonlPath);
|
|
74
|
+
// Stream the manifest line-by-line instead of `readFileSync + split`,
|
|
75
|
+
// so a giant jsonl file doesn't double-allocate the string into memory.
|
|
76
|
+
for (const line of iterFileLines(jailedJsonl)) {
|
|
77
|
+
const t = line.trim();
|
|
78
|
+
if (!t)
|
|
79
|
+
continue;
|
|
80
|
+
let obj;
|
|
81
|
+
try {
|
|
82
|
+
obj = JSON.parse(t);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
process.stderr.write(`[channel spawn] --jsonl: skipping unparseable line in ${jsonlPath}\n`);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (obj._example !== undefined)
|
|
89
|
+
continue;
|
|
90
|
+
if (!obj.file)
|
|
91
|
+
continue;
|
|
92
|
+
const jailed = jailedRealpath(path.resolve(cwd, obj.file), cwd);
|
|
93
|
+
if (!jailed)
|
|
94
|
+
continue;
|
|
95
|
+
const block = readFileBlock(jailed, cwd, "jsonl", obj.reason);
|
|
96
|
+
if (block)
|
|
97
|
+
blocks.push(block);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (blocks.length === 0) {
|
|
101
|
+
return { prompt: "", paths: [], manifests: manifestPaths };
|
|
102
|
+
}
|
|
103
|
+
// Use Buffer.byteLength so multi-byte (CJK / emoji etc.) content isn't
|
|
104
|
+
// undercounted vs. its on-the-wire size. The user is paying tokens by
|
|
105
|
+
// bytes, not characters.
|
|
106
|
+
const totalBytes = blocks.reduce((n, b) => n + Buffer.byteLength(b.content, "utf-8"), 0);
|
|
107
|
+
if (totalBytes > WARN_TOTAL_BYTES) {
|
|
108
|
+
process.stderr.write(`[channel spawn] warning: context is ${Math.round(totalBytes / 1024)}KB across ${blocks.length} files — large system prompt may exceed model context\n`);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
prompt: blocks.map(formatBlock).join("\n\n---\n\n"),
|
|
112
|
+
paths: blocks.map((b) => b.path),
|
|
113
|
+
manifests: manifestPaths,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Stream a UTF-8 file line by line without loading the whole file as one
|
|
118
|
+
* giant string. Yields each line (without trailing `\n`). Crashes /
|
|
119
|
+
* non-UTF8 content fall back gracefully.
|
|
120
|
+
*/
|
|
121
|
+
function* iterFileLines(filePath) {
|
|
122
|
+
const fd = fs.openSync(filePath, "r");
|
|
123
|
+
try {
|
|
124
|
+
const buf = Buffer.allocUnsafe(64 * 1024);
|
|
125
|
+
let carry = "";
|
|
126
|
+
while (true) {
|
|
127
|
+
const n = fs.readSync(fd, buf, 0, buf.length, null);
|
|
128
|
+
if (n <= 0)
|
|
129
|
+
break;
|
|
130
|
+
const chunk = carry + buf.subarray(0, n).toString("utf-8");
|
|
131
|
+
const lines = chunk.split("\n");
|
|
132
|
+
carry = lines.pop() ?? "";
|
|
133
|
+
for (const line of lines)
|
|
134
|
+
yield line;
|
|
135
|
+
}
|
|
136
|
+
if (carry.length > 0)
|
|
137
|
+
yield carry;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
try {
|
|
141
|
+
fs.closeSync(fd);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// ignore
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Minimal glob matcher. Supports:
|
|
150
|
+
* foo/bar.md — literal path
|
|
151
|
+
* foo/* .md — single segment wildcard within a directory
|
|
152
|
+
* foo/** /*.md — recursive subtree
|
|
153
|
+
* foo/** /*.md — recursive subtree
|
|
154
|
+
*
|
|
155
|
+
* Doesn't aim for full POSIX semantics — `?`, `{a,b}`, character classes etc.
|
|
156
|
+
* are out of scope for MVP. Quoting passes the literal pattern from shell.
|
|
157
|
+
*/
|
|
158
|
+
function expandGlob(cwd, spec) {
|
|
159
|
+
if (!/[*?[]/.test(spec)) {
|
|
160
|
+
return [path.resolve(cwd, spec)];
|
|
161
|
+
}
|
|
162
|
+
// Split into static prefix + glob segments
|
|
163
|
+
const segments = spec.split(/[\\/]/).filter(Boolean);
|
|
164
|
+
let baseDir = cwd;
|
|
165
|
+
let i = 0;
|
|
166
|
+
while (i < segments.length && !/[*?[]/.test(segments[i])) {
|
|
167
|
+
baseDir = path.resolve(baseDir, segments[i]);
|
|
168
|
+
i++;
|
|
169
|
+
}
|
|
170
|
+
const globSegs = segments.slice(i);
|
|
171
|
+
if (globSegs.length === 0)
|
|
172
|
+
return [path.resolve(cwd, spec)];
|
|
173
|
+
if (!fs.existsSync(baseDir)) {
|
|
174
|
+
process.stderr.write(`[channel spawn] --file: glob base not found: ${path.relative(cwd, baseDir)}\n`);
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
const matches = [];
|
|
178
|
+
walkGlob(baseDir, globSegs, matches);
|
|
179
|
+
if (matches.length === 0) {
|
|
180
|
+
process.stderr.write(`[channel spawn] --file: glob matched no files: ${spec}\n`);
|
|
181
|
+
}
|
|
182
|
+
return matches;
|
|
183
|
+
}
|
|
184
|
+
function walkGlob(dir, segs, out) {
|
|
185
|
+
if (segs.length === 0)
|
|
186
|
+
return;
|
|
187
|
+
const [head, ...rest] = segs;
|
|
188
|
+
let entries;
|
|
189
|
+
try {
|
|
190
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (head === "**") {
|
|
196
|
+
// ** matches zero or more directories.
|
|
197
|
+
// Zero case: try matching `rest` from current dir.
|
|
198
|
+
if (rest.length > 0)
|
|
199
|
+
walkGlob(dir, rest, out);
|
|
200
|
+
// Recurse into subdirs with ** still in front.
|
|
201
|
+
for (const e of entries) {
|
|
202
|
+
if (e.isDirectory()) {
|
|
203
|
+
walkGlob(path.join(dir, e.name), segs, out);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const re = segmentToRegex(head);
|
|
209
|
+
for (const e of entries) {
|
|
210
|
+
if (!re.test(e.name))
|
|
211
|
+
continue;
|
|
212
|
+
const child = path.join(dir, e.name);
|
|
213
|
+
if (rest.length === 0) {
|
|
214
|
+
if (e.isFile())
|
|
215
|
+
out.push(child);
|
|
216
|
+
}
|
|
217
|
+
else if (e.isDirectory()) {
|
|
218
|
+
walkGlob(child, rest, out);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function segmentToRegex(seg) {
|
|
223
|
+
let re = "^";
|
|
224
|
+
for (const ch of seg) {
|
|
225
|
+
if (ch === "*")
|
|
226
|
+
re += "[^/]*";
|
|
227
|
+
else if (ch === "?")
|
|
228
|
+
re += "[^/]";
|
|
229
|
+
else if (".+()|^$\\{}[]".includes(ch))
|
|
230
|
+
re += "\\" + ch;
|
|
231
|
+
else
|
|
232
|
+
re += ch;
|
|
233
|
+
}
|
|
234
|
+
return new RegExp(re + "$");
|
|
235
|
+
}
|
|
236
|
+
function readFileBlock(absPath, cwd, source, reason) {
|
|
237
|
+
if (!fs.existsSync(absPath)) {
|
|
238
|
+
process.stderr.write(`[channel spawn] --${source}: file not found, skipping: ${path.relative(cwd, absPath)}\n`);
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
// lstat first: if it's a symlink, the realpath inside jailedRealpath
|
|
242
|
+
// has already verified the target stays inside cwd. Defense-in-depth:
|
|
243
|
+
// explicitly note symlinks so we never read through one we didn't
|
|
244
|
+
// realpath-check.
|
|
245
|
+
let lstat;
|
|
246
|
+
try {
|
|
247
|
+
lstat = fs.lstatSync(absPath);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
if (lstat.isSymbolicLink()) {
|
|
253
|
+
// Should be impossible — jailedRealpath replaced absPath with the
|
|
254
|
+
// resolved realpath. Be defensive anyway.
|
|
255
|
+
process.stderr.write(`[channel spawn] --${source}: refusing unresolved symlink: ${path.relative(cwd, absPath)}\n`);
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
let stat;
|
|
259
|
+
try {
|
|
260
|
+
stat = fs.statSync(absPath);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
if (!stat.isFile())
|
|
266
|
+
return null;
|
|
267
|
+
if (stat.size > MAX_PER_FILE_BYTES) {
|
|
268
|
+
process.stderr.write(`[channel spawn] --${source}: file too large (${Math.round(stat.size / 1024)}KB > ${MAX_PER_FILE_BYTES / 1024}KB cap), skipping: ${path.relative(cwd, absPath)}\n`);
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
if (stat.size > WARN_PER_FILE_BYTES) {
|
|
272
|
+
process.stderr.write(`[channel spawn] warning: large file (${Math.round(stat.size / 1024)}KB) included: ${path.relative(cwd, absPath)}\n`);
|
|
273
|
+
}
|
|
274
|
+
const content = fs.readFileSync(absPath, "utf-8");
|
|
275
|
+
return {
|
|
276
|
+
path: path.relative(cwd, absPath),
|
|
277
|
+
source,
|
|
278
|
+
reason,
|
|
279
|
+
content,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function formatBlock(b) {
|
|
283
|
+
const safePath = safeHeader(b.path);
|
|
284
|
+
const safeReason = b.reason ? safeHeader(b.reason) : undefined;
|
|
285
|
+
const header = b.source === "jsonl" && safeReason
|
|
286
|
+
? `# Context: ${safePath}\n# Reason: ${safeReason}`
|
|
287
|
+
: `# Context: ${safePath}`;
|
|
288
|
+
return `${header}\n\n${b.content.trimEnd()}`;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=context-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-loader.js","sourceRoot":"","sources":["../../../src/commands/channel/context-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ContextMutateCliOptions {
|
|
2
|
+
as?: string;
|
|
3
|
+
scope?: string;
|
|
4
|
+
thread?: string;
|
|
5
|
+
file?: string[];
|
|
6
|
+
raw?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface ContextListCliOptions {
|
|
9
|
+
scope?: string;
|
|
10
|
+
thread?: string;
|
|
11
|
+
raw?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function channelContextAdd(channelName: string, opts: ContextMutateCliOptions): Promise<void>;
|
|
14
|
+
export declare function channelContextDelete(channelName: string, opts: ContextMutateCliOptions): Promise<void>;
|
|
15
|
+
export declare function channelContextList(channelName: string, opts: ContextListCliOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/context.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,uBAAuB;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { addChannelContext, addThreadContext, buildContextEntries, deleteChannelContext, deleteThreadContext, listChannelContext, listThreadContext, } from "@mindfoldhq/trellis-core/channel";
|
|
2
|
+
import { parseChannelScope } from "./store/schema.js";
|
|
3
|
+
export async function channelContextAdd(channelName, opts) {
|
|
4
|
+
const context = buildContextEntries(opts.file, opts.raw);
|
|
5
|
+
if (!context) {
|
|
6
|
+
throw new Error("Provide at least one --file <abs-path> or --raw <text>");
|
|
7
|
+
}
|
|
8
|
+
const scope = parseChannelScope(opts.scope);
|
|
9
|
+
const event = opts.thread
|
|
10
|
+
? await addThreadContext({
|
|
11
|
+
channel: channelName,
|
|
12
|
+
by: opts.as ?? "main",
|
|
13
|
+
thread: opts.thread,
|
|
14
|
+
context,
|
|
15
|
+
...(scope !== undefined ? { scope } : {}),
|
|
16
|
+
origin: "cli",
|
|
17
|
+
})
|
|
18
|
+
: await addChannelContext({
|
|
19
|
+
channel: channelName,
|
|
20
|
+
by: opts.as ?? "main",
|
|
21
|
+
context,
|
|
22
|
+
...(scope !== undefined ? { scope } : {}),
|
|
23
|
+
origin: "cli",
|
|
24
|
+
});
|
|
25
|
+
console.log(JSON.stringify(event));
|
|
26
|
+
}
|
|
27
|
+
export async function channelContextDelete(channelName, opts) {
|
|
28
|
+
const context = buildContextEntries(opts.file, opts.raw);
|
|
29
|
+
if (!context) {
|
|
30
|
+
throw new Error("Provide at least one --file <abs-path> or --raw <text>");
|
|
31
|
+
}
|
|
32
|
+
const scope = parseChannelScope(opts.scope);
|
|
33
|
+
const event = opts.thread
|
|
34
|
+
? await deleteThreadContext({
|
|
35
|
+
channel: channelName,
|
|
36
|
+
by: opts.as ?? "main",
|
|
37
|
+
thread: opts.thread,
|
|
38
|
+
context,
|
|
39
|
+
...(scope !== undefined ? { scope } : {}),
|
|
40
|
+
origin: "cli",
|
|
41
|
+
})
|
|
42
|
+
: await deleteChannelContext({
|
|
43
|
+
channel: channelName,
|
|
44
|
+
by: opts.as ?? "main",
|
|
45
|
+
context,
|
|
46
|
+
...(scope !== undefined ? { scope } : {}),
|
|
47
|
+
origin: "cli",
|
|
48
|
+
});
|
|
49
|
+
console.log(JSON.stringify(event));
|
|
50
|
+
}
|
|
51
|
+
export async function channelContextList(channelName, opts) {
|
|
52
|
+
const scope = parseChannelScope(opts.scope);
|
|
53
|
+
const entries = opts.thread
|
|
54
|
+
? await listThreadContext({
|
|
55
|
+
channel: channelName,
|
|
56
|
+
thread: opts.thread,
|
|
57
|
+
...(scope !== undefined ? { scope } : {}),
|
|
58
|
+
})
|
|
59
|
+
: await listChannelContext({
|
|
60
|
+
channel: channelName,
|
|
61
|
+
...(scope !== undefined ? { scope } : {}),
|
|
62
|
+
});
|
|
63
|
+
if (opts.raw) {
|
|
64
|
+
for (const entry of entries)
|
|
65
|
+
console.log(JSON.stringify(entry));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (entries.length === 0) {
|
|
69
|
+
console.log("(no context)");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
if (entry.type === "file") {
|
|
74
|
+
console.log(`file ${entry.path}`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const oneLine = entry.text.replace(/\s+/g, " ").trim();
|
|
78
|
+
const display = oneLine.length > 200 ? `${oneLine.slice(0, 200)}…` : oneLine;
|
|
79
|
+
console.log(`raw ${display}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/commands/channel/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface CreateOptions {
|
|
2
|
+
task?: string;
|
|
3
|
+
project?: string;
|
|
4
|
+
labels?: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
scope?: string;
|
|
7
|
+
type?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
/** New canonical flag list. */
|
|
10
|
+
contextFile?: string[];
|
|
11
|
+
contextRaw?: string[];
|
|
12
|
+
/** Legacy aliases accepted while users migrate scripts. */
|
|
13
|
+
linkedContextFile?: string[];
|
|
14
|
+
linkedContextRaw?: string[];
|
|
15
|
+
by?: string;
|
|
16
|
+
force?: boolean;
|
|
17
|
+
ephemeral?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Optional mode marker for callers like `channel run` that produce
|
|
20
|
+
* one-shot channels. Stored as `meta.trellis.createMode` so the
|
|
21
|
+
* channel event keeps an `origin: "cli"` write entrypoint while still
|
|
22
|
+
* exposing the mode for downstream consumers.
|
|
23
|
+
*/
|
|
24
|
+
origin?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function createChannel(name: string, opts: CreateOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { buildContextEntries, createChannel as coreCreateChannel, resolveChannelRef, } from "@mindfoldhq/trellis-core/channel";
|
|
2
|
+
import { parseChannelScope, parseChannelType, parseCsv, } from "./store/schema.js";
|
|
3
|
+
export async function createChannel(name, opts) {
|
|
4
|
+
const scope = parseChannelScope(opts.scope) ?? "project";
|
|
5
|
+
const channelType = parseChannelType(opts.type);
|
|
6
|
+
const context = buildContextEntries([...(opts.contextFile ?? []), ...(opts.linkedContextFile ?? [])], [...(opts.contextRaw ?? []), ...(opts.linkedContextRaw ?? [])]);
|
|
7
|
+
const labels = parseCsv(opts.labels);
|
|
8
|
+
const createMode = opts.origin;
|
|
9
|
+
const event = await coreCreateChannel({
|
|
10
|
+
channel: name,
|
|
11
|
+
by: opts.by ?? "main",
|
|
12
|
+
scope,
|
|
13
|
+
type: channelType,
|
|
14
|
+
...(opts.cwd ? { cwd: opts.cwd } : {}),
|
|
15
|
+
...(opts.task ? { task: opts.task } : {}),
|
|
16
|
+
...(opts.project ? { project: opts.project } : {}),
|
|
17
|
+
...(labels ? { labels } : {}),
|
|
18
|
+
...(opts.description ? { description: opts.description } : {}),
|
|
19
|
+
...(context ? { context } : {}),
|
|
20
|
+
...(opts.ephemeral ? { ephemeral: true } : {}),
|
|
21
|
+
...(opts.force ? { force: true } : {}),
|
|
22
|
+
origin: "cli",
|
|
23
|
+
...(createMode ? { meta: { trellis: { createMode } } } : {}),
|
|
24
|
+
});
|
|
25
|
+
console.log(`Created channel '${name}' (${channelType}) at ${channelDirFromEvent(name, event.scope, opts.cwd)}`);
|
|
26
|
+
if (opts.ephemeral) {
|
|
27
|
+
process.stderr.write("ephemeral channel is hidden from `channel list`; use `channel list --all` or `channel prune --ephemeral`\n");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function channelDirFromEvent(name, scope, cwd) {
|
|
31
|
+
const ref = resolveChannelRef({
|
|
32
|
+
channel: name,
|
|
33
|
+
scope,
|
|
34
|
+
forCreate: true,
|
|
35
|
+
...(cwd !== undefined ? { cwd } : {}),
|
|
36
|
+
});
|
|
37
|
+
return ref.dir;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-only command: feed a recorded stream-json / wire trace into the
|
|
3
|
+
* matching adapter and print the resulting channel events as JSON lines.
|
|
4
|
+
*
|
|
5
|
+
* Not user-facing; used during adapter development to verify against
|
|
6
|
+
* real-CLI fixtures (see research/probes/).
|
|
7
|
+
*
|
|
8
|
+
* NOTE: codex traces only contain inbound lines (server → us). For probe
|
|
9
|
+
* fixtures recorded by codex-probe.mjs, outbound request ids are not in the
|
|
10
|
+
* trace; we pre-seed the ctx with the ids the probe used (1 for initialize,
|
|
11
|
+
* 2 for thread/start, 3 for turn/start) so id-matching works.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseTrace(adapter: "claude" | "codex", file: string): void;
|
|
14
|
+
//# sourceMappingURL=dev-parse-trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-parse-trace.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/dev-parse-trace.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA6B1E"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { parseClaudeLine } from "./adapters/claude.js";
|
|
3
|
+
import { createCodexCtx, parseCodexLine } from "./adapters/codex.js";
|
|
4
|
+
/**
|
|
5
|
+
* Dev-only command: feed a recorded stream-json / wire trace into the
|
|
6
|
+
* matching adapter and print the resulting channel events as JSON lines.
|
|
7
|
+
*
|
|
8
|
+
* Not user-facing; used during adapter development to verify against
|
|
9
|
+
* real-CLI fixtures (see research/probes/).
|
|
10
|
+
*
|
|
11
|
+
* NOTE: codex traces only contain inbound lines (server → us). For probe
|
|
12
|
+
* fixtures recorded by codex-probe.mjs, outbound request ids are not in the
|
|
13
|
+
* trace; we pre-seed the ctx with the ids the probe used (1 for initialize,
|
|
14
|
+
* 2 for thread/start, 3 for turn/start) so id-matching works.
|
|
15
|
+
*/
|
|
16
|
+
export function parseTrace(adapter, file) {
|
|
17
|
+
const raw = fs.readFileSync(file, "utf-8");
|
|
18
|
+
const lines = raw.split("\n");
|
|
19
|
+
let lineNo = 0;
|
|
20
|
+
if (adapter === "claude") {
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
lineNo++;
|
|
23
|
+
if (!line.trim())
|
|
24
|
+
continue;
|
|
25
|
+
const result = parseClaudeLine(line);
|
|
26
|
+
printResult(lineNo, result);
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// adapter === "codex"
|
|
31
|
+
const ctx = createCodexCtx();
|
|
32
|
+
// Pre-seed pending so the recorded responses (id=1,2,3) match.
|
|
33
|
+
ctx.pending.set(1, "initialize");
|
|
34
|
+
ctx.pending.set(2, "thread/start");
|
|
35
|
+
ctx.pending.set(3, "turn/start");
|
|
36
|
+
ctx.nextId = 4;
|
|
37
|
+
for (const line of lines) {
|
|
38
|
+
lineNo++;
|
|
39
|
+
if (!line.trim())
|
|
40
|
+
continue;
|
|
41
|
+
const result = parseCodexLine(line, ctx);
|
|
42
|
+
printResult(lineNo, result);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function printResult(lineNo, result) {
|
|
46
|
+
for (const ev of result.events) {
|
|
47
|
+
console.log(JSON.stringify({ line: lineNo, ...ev }));
|
|
48
|
+
}
|
|
49
|
+
if (result.side) {
|
|
50
|
+
const { reply, resolved, ...persist } = result.side;
|
|
51
|
+
if (Object.keys(persist).length > 0) {
|
|
52
|
+
console.log(JSON.stringify({ line: lineNo, kind: "<side-effect>", ...persist }));
|
|
53
|
+
}
|
|
54
|
+
if (reply && reply.length > 0) {
|
|
55
|
+
for (const r of reply) {
|
|
56
|
+
console.log(JSON.stringify({
|
|
57
|
+
line: lineNo,
|
|
58
|
+
kind: "<outbound>",
|
|
59
|
+
text: r.trim(),
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (resolved && resolved.length > 0) {
|
|
64
|
+
for (const r of resolved) {
|
|
65
|
+
console.log(JSON.stringify({ line: lineNo, kind: "<rpc-resolved>", ...r }));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=dev-parse-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-parse-trace.js","sourceRoot":"","sources":["../../../src/commands/channel/dev-parse-trace.ts"],"names":[],"mappings":"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"}
|