@mindfoldhq/trellis 0.5.8 → 0.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/migrations/manifests/0.5.10.json +9 -0
- package/dist/migrations/manifests/0.5.7.json +1 -1
- package/dist/migrations/manifests/0.5.9.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.0.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.2.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/templates/pi/extensions/trellis/index.ts.txt +179 -4
- package/dist/templates/pi/settings.json +9 -0
- package/dist/templates/shared-hooks/inject-workflow-state.py +38 -8
- package/dist/templates/trellis/config.yaml +8 -6
- 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 +44 -24
- package/dist/templates/trellis/scripts/common/safe_commit.py +229 -0
- package/dist/templates/trellis/scripts/common/task_store.py +34 -5
- package/dist/templates/trellis/scripts/common/workflow_phase.py +19 -7
- package/dist/templates/trellis/workflow.md +27 -27
- 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/package.json +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.5.10",
|
|
3
|
+
"description": "Patch: prevent runaway `git add -f .trellis/` on gitignored projects + Pi platform workflow-state injection + Pi pi-subagents project isolation.",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**Bug Fixes:**\n- fix(scripts): `add_session.py` and `task.py archive` no longer print a generic `git add .trellis && git commit` fallback when the repo's `.gitignore` excludes `.trellis/`. They now stage only specific Trellis-owned paths (journal, index.md, active task dir, archive subtree) and auto-retry with `git add -f -- <specific-paths>` only on `ignored by` stderr. The warning text explicitly states `Do NOT use \\`git add -f .trellis/\\``, naming `.trellis/.backup-*`, `.trellis/worktrees/`, `.trellis/.template-hashes.json`, `.trellis/.runtime/`, `.trellis/.cache/` as the subpaths users should ignore individually instead. Helper centralized in `templates/trellis/scripts/common/safe_commit.py`.\n- fix(pi): Pi extension now injects `<workflow-state>` breadcrumb on every `input` and `before_agent_start` event, plus a `<session-overview>` block sourced from `.trellis/scripts/get_context.py`. The `subagent` tool registration carries a `promptSnippet` with the `Active task: <path>` dispatch protocol. Pi sessions previously skipped the `task.py create → brainstorm → implement → check` flow because the AI saw no workflow guidance after session start. Closes #249.\n- fix(pi): Project-level `packages[\"npm:pi-subagents\"]` override added to `.pi/settings.json` so a globally-installed `npm:pi-subagents` cannot inject `extensions / skills / prompts / themes` into the current Trellis project. `scrubPiSettings` reverses the override on `trellis uninstall`. Closes #246.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Patch on top of 0.5.9. Run `trellis update` (no `--migrate` needed). All three fixes auto-apply on next session."
|
|
9
|
+
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
{
|
|
10
10
|
"file": ".trellis/config.yaml",
|
|
11
11
|
"sentinel": "codex:",
|
|
12
|
-
"sectionHeading": "Codex (
|
|
12
|
+
"sectionHeading": "Codex (dispatch behavior)"
|
|
13
13
|
}
|
|
14
14
|
],
|
|
15
15
|
"notes": "Patch on top of 0.5.6. Run `trellis update` (no `--migrate` needed). Codex users get the new `dispatch_mode` knob (default unchanged), hardened sub-agent role files, plus the previously-init-only `trellis-start` skill on the update path. Kiro users get an agent JSON that Kiro CLI no longer rejects. Codex 0.129+ users should run `/hooks` once after upgrading Codex to approve the Trellis `UserPromptSubmit` hook."
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.5.9",
|
|
3
|
+
"description": "Patch: codex dispatch defaults to inline + workflow.md namespaced into codex-inline / codex-sub-agent.",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**Bug Fixes:**\n- fix(codex): default `codex.dispatch_mode` flipped from `sub-agent` to `inline`. Codex sub-agents run with `fork_turns=\"none\"` isolation and can't inherit the parent session's task context, so they exit silently or recursively dispatch. Inline keeps the main Codex agent in charge so context isn't lost. Set `codex.dispatch_mode: sub-agent` in `.trellis/config.yaml` to opt back into the legacy dispatch flow. Invalid values fall back to inline.\n- fix(workflow): namespace `--platform codex` into virtual platforms `codex-inline` / `codex-sub-agent` so `workflow.md` `[Platform A, B, ...]` blocks render the correct guidance per mode. `inject-workflow-state.py` emits a `<codex-mode>` banner in the per-turn UserPromptSubmit prompt so Codex knows which mode it is in, and `[workflow-state:STATUS-inline]` blocks now drive the breadcrumb path for inline mode.\n\n**Internal:**\n- chore(manifests): restore `0.6.0-beta.0.json` on main. The version was published from `feat/v0.6.0-beta` but its manifest never landed on main, breaking adjacent-version update chains for users who hop between stable and beta lines.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Patch on top of 0.5.8. Run `trellis update` (no `--migrate` needed). Existing Codex projects keep working: if you previously uncommented `dispatch_mode: sub-agent`, that opt-in still routes to the legacy dispatch flow; if the line is commented (the default), behavior switches to inline."
|
|
9
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.6.0-beta.0",
|
|
3
|
+
"description": "First 0.6 beta. Adds `trellis mem`: search past Claude Code / Codex / OpenCode sessions by keyword, read the turns around each match, and dump full conversations.",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**New feature: `trellis mem`**\n- `trellis mem` searches past Claude Code / Codex / OpenCode sessions by keyword and reads the turns around each match. Five subcommands wired through commander as a passthrough group: `projects`, `list`, `search`, `context`, `extract`. Strips hook injections, AGENTS.md preambles, and tool-call noise so search hits reflect real dialogue. Handles compaction (Claude `isCompactSummary` + Codex `compacted` events). Adds zod ^4 as a runtime dep.\n- 84 unit tests added on top of the integrated POC source: 11 pure helpers (Tier 1, 44 cases), 3 platform parsers with inline fixtures (Tier 2, 24 cases), 5 subcommand integration smoke (Tier 3, 16 cases). mem.ts statement coverage 81.89% / function 89.04% / line 87.93%.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"configSectionsAdded": [
|
|
9
|
+
{
|
|
10
|
+
"file": ".trellis/config.yaml",
|
|
11
|
+
"sentinel": "codex:",
|
|
12
|
+
"sectionHeading": "Codex (sub-agent dispatch behavior)"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"notes": "First public 0.6 beta. Install: `npm install -g @mindfoldhq/trellis@beta`. The `trellis mem` command is opt-in (only fires when invoked). Codex 0.129+ users should run `/hooks` once to approve the Trellis `UserPromptSubmit` hook."
|
|
16
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.6.0-beta.1",
|
|
3
|
+
"description": "Beta patch: same Codex dispatch fix as 0.5.9 — defaults to inline + workflow.md namespaced into codex-inline / codex-sub-agent.",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**Bug Fixes:** (mirrors 0.5.9)\n- fix(codex): default `codex.dispatch_mode` flipped from `sub-agent` to `inline`. Codex sub-agents run with `fork_turns=\"none\"` isolation and can't inherit the parent session's task context, so they exit silently or recursively dispatch. Inline keeps the main Codex agent in charge so context isn't lost. Set `codex.dispatch_mode: sub-agent` in `.trellis/config.yaml` to opt back into the legacy dispatch flow. Invalid values fall back to inline.\n- fix(workflow): namespace `--platform codex` into virtual platforms `codex-inline` / `codex-sub-agent` so `workflow.md` `[Platform A, B, ...]` blocks render the correct guidance per mode. `inject-workflow-state.py` emits a `<codex-mode>` banner in the per-turn UserPromptSubmit prompt so Codex knows which mode it is in, and `[workflow-state:STATUS-inline]` blocks now drive the breadcrumb path for inline mode.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Beta patch on top of 0.6.0-beta.0. Run `trellis update` (no `--migrate` needed). Behavior change matches 0.5.9 — if you previously uncommented `dispatch_mode: sub-agent`, that opt-in still routes to the legacy dispatch flow; if commented (the default), behavior switches to inline."
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.6.0-beta.2",
|
|
3
|
+
"description": "Beta patch: tl mem list/search --since now respects cross-day session activity (interval-overlap filter).",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**Bug Fixes:**\n- fix(mem): `tl mem list / search --since X` was dropping sessions whose first event fell before the window even when the session stayed active inside it. A 29 MB Claude session that started 5/7 and was still being written 5/8 returned 0 matches under `--since 2026-05-08` despite containing 19 occurrences of the searched keyword written that day. Root cause: `claudeListSessions` and `codexListSessions` filtered by `created` only (single-point `inRange`); `opencodeListSessions` used `updated`-first which masked the bug there but was also strictly wrong for the `--until` direction. Fix: `inRangeOverlap(start, end, f)` keeps a session iff its `[created, updated]` interval overlaps `[f.since, f.until]`. Three list sites switched over; the early `tsFromName` short-circuit in codex was a misoptimization that re-introduced the cross-day bug, so it is removed.\n- chore(spec): internal Trellis spec drift cleanup — `script-conventions.md` drops removed `task_context.py init-context`; `workflow-state-contract.md` writer-table line numbers refreshed; `directory-structure.md` configurators / utils / commands trees aligned with current code; `docs-site/advanced/architecture.mdx` corrected the false `.trellis/.current-task` fallback claim (EN + ZH lockstep). User-facing artifact unchanged; only `.trellis/spec/*` docs.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Beta patch on top of 0.6.0-beta.1. Run `trellis update` (no `--migrate` needed). Behavior change: `tl mem list / search --since X` now returns sessions that were active inside the window even if they started before it (this was the documented intent). Codex perf trade-off: every session now does `readJsonlFirst` since the filename-ts short-circuit is gone — acceptable; a future patch may add a one-sided `--until`-only fast prune that does not reintroduce the bug."
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.6.0-beta.3",
|
|
3
|
+
"description": "Beta patch: tl mem --phase brainstorm slicing, 5-9x perf, OpenCode SQLite reader for 1.2+ users.",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**Enhancements:**\n- feat(mem): `tl mem extract <id> --phase brainstorm|implement|all` slices a session into discussion vs implementation parts. Multi-task sessions get `--- task: <slug> ---` separators. Claude and Codex supported; OpenCode falls back to full dialogue.\n- perf(mem): 5-9× faster. `mem list` 3.5s → 0.67s, `mem list --platform codex` 3.2s → 0.33s, `mem extract --phase brainstorm` 5.8s → 0.73s.\n\n**Bug Fixes:**\n- fix(mem): OpenCode 1.2+ users no longer see 0 sessions. OpenCode 1.2 moved storage to SQLite; the old JSON-directory reader has been replaced. OpenCode 1.1.x is no longer supported.\n- fix(mem): `--phase` parser handles `$(... --slug NAME)` substitution, multiple `task.py` invocations per Bash command, and `task.py start` quoted in commit-message heredocs.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Beta patch on top of 0.6.0-beta.2. Run `trellis update` (no `--migrate` needed). New dependency `better-sqlite3` for OpenCode — standard `npm install` handles it via prebuilt binaries; if the native binding fails, `tl mem` still works on other platforms."
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.6.0-beta.4",
|
|
3
|
+
"description": "Reverts better-sqlite3 dependency added in 0.6.0-beta.3.",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**Bug Fixes:**\n- fix(mem): `better-sqlite3` dependency removed. Reverts the OpenCode SQLite reader added in 0.6.0-beta.3. Fixes `npm install -g @mindfoldhq/trellis@beta` failure when the prebuilt binary download fails and no local C toolchain is available.\n- fix(mem): OpenCode platform degraded — `tl mem list / search / extract` on platform `opencode` returns empty + a one-shot stderr warning. Claude and Codex paths unchanged.",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Beta patch on top of 0.6.0-beta.3. Run `trellis update`."
|
|
9
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
2
2
|
import { createHash, randomBytes } from "node:crypto";
|
|
3
3
|
import { delimiter, dirname, join, resolve } from "node:path";
|
|
4
|
-
import { spawn } from "node:child_process";
|
|
4
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
5
5
|
|
|
6
6
|
type JsonObject = Record<string, unknown>;
|
|
7
7
|
type TextContent = { type: "text"; text: string };
|
|
@@ -632,6 +632,166 @@ function buildTrellisContext(
|
|
|
632
632
|
].join("\n");
|
|
633
633
|
}
|
|
634
634
|
|
|
635
|
+
// ---------------------------------------------------------------------------
|
|
636
|
+
// Workflow-state breadcrumb (TypeScript port of the shared workflow-state
|
|
637
|
+
// hook used by class-1 platforms).
|
|
638
|
+
//
|
|
639
|
+
// Pi is extension-backed and MUST NOT receive Python hook scripts under .pi/.
|
|
640
|
+
// We therefore parse `.trellis/workflow.md` `[workflow-state:STATUS]...
|
|
641
|
+
// [/workflow-state:STATUS]` blocks directly in TypeScript and emit the
|
|
642
|
+
// per-turn `<workflow-state>` breadcrumb in `before_agent_start` and `input`.
|
|
643
|
+
// Tag regex mirrors the shared parser so the breadcrumb body stays
|
|
644
|
+
// byte-identical with hook-driven platforms.
|
|
645
|
+
// ---------------------------------------------------------------------------
|
|
646
|
+
|
|
647
|
+
const WORKFLOW_STATE_TAG_RE =
|
|
648
|
+
/\[workflow-state:([A-Za-z0-9_-]+)\]\s*\n([\s\S]*?)\n\s*\[\/workflow-state:\1\]/g;
|
|
649
|
+
|
|
650
|
+
function loadWorkflowBreadcrumbs(projectRoot: string): Record<string, string> {
|
|
651
|
+
const workflow = readText(join(projectRoot, ".trellis", "workflow.md"));
|
|
652
|
+
if (!workflow) return {};
|
|
653
|
+
const result: Record<string, string> = {};
|
|
654
|
+
for (const match of workflow.matchAll(WORKFLOW_STATE_TAG_RE)) {
|
|
655
|
+
const status = match[1] ?? "";
|
|
656
|
+
const body = (match[2] ?? "").trim();
|
|
657
|
+
if (status && body) result[status] = body;
|
|
658
|
+
}
|
|
659
|
+
return result;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
function readActiveTaskStatus(
|
|
663
|
+
projectRoot: string,
|
|
664
|
+
taskDir: string,
|
|
665
|
+
): { taskId: string; status: string } | null {
|
|
666
|
+
try {
|
|
667
|
+
const data = JSON.parse(
|
|
668
|
+
readText(join(taskDir, "task.json")),
|
|
669
|
+
) as JsonObject;
|
|
670
|
+
const status = stringValue(data.status);
|
|
671
|
+
if (!status) return null;
|
|
672
|
+
const id = stringValue(data.id) ?? taskDir.split(/[\\/]/).pop() ?? "";
|
|
673
|
+
return { taskId: id, status };
|
|
674
|
+
} catch {
|
|
675
|
+
return null;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
function buildWorkflowStateBreadcrumb(
|
|
680
|
+
projectRoot: string,
|
|
681
|
+
contextKey: string | null,
|
|
682
|
+
): string {
|
|
683
|
+
const templates = loadWorkflowBreadcrumbs(projectRoot);
|
|
684
|
+
const taskDir = readCurrentTask(
|
|
685
|
+
projectRoot,
|
|
686
|
+
undefined,
|
|
687
|
+
undefined,
|
|
688
|
+
contextKey,
|
|
689
|
+
);
|
|
690
|
+
let header: string;
|
|
691
|
+
let lookupKey: string;
|
|
692
|
+
if (!taskDir) {
|
|
693
|
+
header = "Status: no_task\nSource: session";
|
|
694
|
+
lookupKey = "no_task";
|
|
695
|
+
} else {
|
|
696
|
+
const info = readActiveTaskStatus(projectRoot, taskDir);
|
|
697
|
+
if (!info) {
|
|
698
|
+
header = "Status: no_task\nSource: session";
|
|
699
|
+
lookupKey = "no_task";
|
|
700
|
+
} else {
|
|
701
|
+
header = `Task: ${info.taskId} (${info.status})\nSource: session`;
|
|
702
|
+
lookupKey = info.status;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
const body = templates[lookupKey] ?? "Refer to workflow.md for current step.";
|
|
706
|
+
return `<workflow-state>\n${header}\n${body}\n</workflow-state>`;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// ---------------------------------------------------------------------------
|
|
710
|
+
// Session overview (developer / git branch / active tasks)
|
|
711
|
+
//
|
|
712
|
+
// Spawns `python3 .trellis/scripts/get_context.py` (the same script other
|
|
713
|
+
// platform session-start hooks invoke) to keep developer/git/active-task
|
|
714
|
+
// summary byte-identical with class-1 platforms. Failure is non-fatal — we
|
|
715
|
+
// emit an empty overview rather than block the conversation.
|
|
716
|
+
// ---------------------------------------------------------------------------
|
|
717
|
+
|
|
718
|
+
const SESSION_OVERVIEW_TIMEOUT_MS = 5000;
|
|
719
|
+
|
|
720
|
+
function pythonExecutable(): string {
|
|
721
|
+
const override = stringValue(process.env.TRELLIS_PYTHON);
|
|
722
|
+
if (override) return override;
|
|
723
|
+
return process.platform === "win32" ? "python" : "python3";
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
function buildSessionOverview(
|
|
727
|
+
projectRoot: string,
|
|
728
|
+
contextKey: string | null,
|
|
729
|
+
): string {
|
|
730
|
+
const script = join(projectRoot, ".trellis", "scripts", "get_context.py");
|
|
731
|
+
if (!isExistingFile(script)) return "";
|
|
732
|
+
try {
|
|
733
|
+
const result = spawnSync(pythonExecutable(), [script], {
|
|
734
|
+
cwd: projectRoot,
|
|
735
|
+
env: contextKey
|
|
736
|
+
? { ...process.env, TRELLIS_CONTEXT_ID: contextKey }
|
|
737
|
+
: process.env,
|
|
738
|
+
encoding: "utf-8",
|
|
739
|
+
timeout: SESSION_OVERVIEW_TIMEOUT_MS,
|
|
740
|
+
windowsHide: true,
|
|
741
|
+
});
|
|
742
|
+
if (result.status !== 0) return "";
|
|
743
|
+
const stdout = (result.stdout ?? "").trim();
|
|
744
|
+
if (!stdout) return "";
|
|
745
|
+
return `<session-overview>\n${stdout}\n</session-overview>`;
|
|
746
|
+
} catch {
|
|
747
|
+
return "";
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
// Per-turn cache so input + before_agent_start in the same turn don't double-spawn.
|
|
752
|
+
class TurnContextCache {
|
|
753
|
+
private key: string | null = null;
|
|
754
|
+
private timestamp = 0;
|
|
755
|
+
private workflowState = "";
|
|
756
|
+
private sessionOverview = "";
|
|
757
|
+
// Refresh window: per-turn injections that fire close together share a
|
|
758
|
+
// single python3 spawn; anything older than this re-runs the resolver.
|
|
759
|
+
private static readonly TTL_MS = 1500;
|
|
760
|
+
|
|
761
|
+
get(
|
|
762
|
+
projectRoot: string,
|
|
763
|
+
contextKey: string | null,
|
|
764
|
+
): { workflowState: string; sessionOverview: string } {
|
|
765
|
+
const now = Date.now();
|
|
766
|
+
if (this.key === contextKey && now - this.timestamp < TurnContextCache.TTL_MS) {
|
|
767
|
+
return {
|
|
768
|
+
workflowState: this.workflowState,
|
|
769
|
+
sessionOverview: this.sessionOverview,
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
this.workflowState = buildWorkflowStateBreadcrumb(projectRoot, contextKey);
|
|
773
|
+
this.sessionOverview = buildSessionOverview(projectRoot, contextKey);
|
|
774
|
+
this.key = contextKey;
|
|
775
|
+
this.timestamp = now;
|
|
776
|
+
return {
|
|
777
|
+
workflowState: this.workflowState,
|
|
778
|
+
sessionOverview: this.sessionOverview,
|
|
779
|
+
};
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
// ---------------------------------------------------------------------------
|
|
784
|
+
// Sub-agent dispatch protocol snippet (registered with the `subagent` tool).
|
|
785
|
+
// Mirrors the [workflow-state:in_progress] dispatch protocol text in
|
|
786
|
+
// trellis/workflow.md so the AI sees the same `Active task: <path>` rule
|
|
787
|
+
// whether it reads workflow.md, the per-turn breadcrumb, or the tool prompt.
|
|
788
|
+
// ---------------------------------------------------------------------------
|
|
789
|
+
|
|
790
|
+
const SUBAGENT_DISPATCH_PROTOCOL = `Sub-agent dispatch protocol (Trellis): your dispatch prompt MUST start with one line "Active task: <task path from \`task.py current\`>" before any other instructions. No exceptions. On class-2 platforms (codex / copilot / gemini / qoder) the sub-agent depends on this line because there is no hook to inject task context. On class-1 platforms (claude / cursor / opencode / kiro / codebuddy / droid) and on Pi, the line is the canonical fallback when hook/extension injection misses. trellis-research uses the line to know which {task_dir}/research/ to write into.
|
|
791
|
+
|
|
792
|
+
Wrong: prompt: "implement the new feature"
|
|
793
|
+
Correct: prompt: "Active task: .trellis/tasks/05-09-pi-workflow-state-injection\\n\\nImplement the new feature ..."`;
|
|
794
|
+
|
|
635
795
|
function normalizeAgentName(agent: string): string {
|
|
636
796
|
return agent.startsWith("trellis-") ? agent : `trellis-${agent}`;
|
|
637
797
|
}
|
|
@@ -886,6 +1046,15 @@ export default function trellisExtension(pi: {
|
|
|
886
1046
|
const projectRoot = findProjectRoot(pi.cwd ?? process.cwd());
|
|
887
1047
|
const processContextKey = createProcessContextKey(projectRoot);
|
|
888
1048
|
let currentContextKey: string | null = null;
|
|
1049
|
+
const turnContextCache = new TurnContextCache();
|
|
1050
|
+
|
|
1051
|
+
const buildPerTurnInjection = (contextKey: string | null): string => {
|
|
1052
|
+
const { workflowState, sessionOverview } = turnContextCache.get(
|
|
1053
|
+
projectRoot,
|
|
1054
|
+
contextKey,
|
|
1055
|
+
);
|
|
1056
|
+
return [workflowState, sessionOverview].filter(Boolean).join("\n\n");
|
|
1057
|
+
};
|
|
889
1058
|
|
|
890
1059
|
const getContextKey = (input?: unknown, ctx?: PiExtensionContext): string => {
|
|
891
1060
|
const resolvedContextKey = resolveContextKey(
|
|
@@ -904,6 +1073,8 @@ export default function trellisExtension(pi: {
|
|
|
904
1073
|
name: "subagent",
|
|
905
1074
|
label: "Subagent",
|
|
906
1075
|
description: "Run a Trellis project sub-agent with active task context.",
|
|
1076
|
+
promptSnippet: SUBAGENT_DISPATCH_PROTOCOL,
|
|
1077
|
+
promptGuidelines: SUBAGENT_DISPATCH_PROTOCOL,
|
|
907
1078
|
parameters: {
|
|
908
1079
|
type: "object",
|
|
909
1080
|
properties: {
|
|
@@ -976,8 +1147,9 @@ export default function trellisExtension(pi: {
|
|
|
976
1147
|
ctx,
|
|
977
1148
|
contextKey,
|
|
978
1149
|
);
|
|
1150
|
+
const perTurn = buildPerTurnInjection(contextKey);
|
|
979
1151
|
return {
|
|
980
|
-
systemPrompt: [current, context].filter(Boolean).join("\n\n"),
|
|
1152
|
+
systemPrompt: [current, context, perTurn].filter(Boolean).join("\n\n"),
|
|
981
1153
|
};
|
|
982
1154
|
});
|
|
983
1155
|
pi.on?.("context", (event, ctx) => {
|
|
@@ -986,8 +1158,11 @@ export default function trellisExtension(pi: {
|
|
|
986
1158
|
return Array.isArray(messages) ? { messages } : undefined;
|
|
987
1159
|
});
|
|
988
1160
|
pi.on?.("input", (event, ctx) => {
|
|
989
|
-
getContextKey(event, ctx);
|
|
990
|
-
|
|
1161
|
+
const contextKey = getContextKey(event, ctx);
|
|
1162
|
+
const additionalContext = buildPerTurnInjection(contextKey);
|
|
1163
|
+
return additionalContext
|
|
1164
|
+
? { action: "continue", additionalContext, systemPrompt: additionalContext }
|
|
1165
|
+
: { action: "continue" };
|
|
991
1166
|
});
|
|
992
1167
|
pi.on?.("tool_call", (event, ctx) => {
|
|
993
1168
|
const contextKey = getContextKey(event, ctx);
|
|
@@ -227,20 +227,49 @@ def _read_trellis_config(root: Path) -> dict:
|
|
|
227
227
|
return {}
|
|
228
228
|
|
|
229
229
|
|
|
230
|
+
def _codex_mode_banner(config: dict) -> str:
|
|
231
|
+
"""Emit a `<codex-mode>` banner for the additionalContext payload.
|
|
232
|
+
|
|
233
|
+
Reads `codex.dispatch_mode` from .trellis/config.yaml; defaults to
|
|
234
|
+
`inline` when missing or invalid because Codex sub-agents run with
|
|
235
|
+
`fork_turns="none"` isolation and can't inherit the parent session's
|
|
236
|
+
task context. The banner makes the active mode explicit to Codex AI
|
|
237
|
+
per turn, complementing the workflow-state body which is per-status.
|
|
238
|
+
Mode tells AI which dispatch protocol to follow; workflow-state tells
|
|
239
|
+
AI what step it's at.
|
|
240
|
+
"""
|
|
241
|
+
mode = "inline"
|
|
242
|
+
if isinstance(config, dict):
|
|
243
|
+
codex_cfg = config.get("codex")
|
|
244
|
+
if isinstance(codex_cfg, dict):
|
|
245
|
+
cfg_mode = codex_cfg.get("dispatch_mode")
|
|
246
|
+
if cfg_mode in ("inline", "sub-agent"):
|
|
247
|
+
mode = cfg_mode
|
|
248
|
+
return f"<codex-mode>{mode}</codex-mode>"
|
|
249
|
+
|
|
250
|
+
|
|
230
251
|
def resolve_breadcrumb_key(
|
|
231
252
|
status: str, platform: str | None, config: dict
|
|
232
253
|
) -> str:
|
|
233
254
|
"""Pick the breadcrumb tag key based on Codex dispatch_mode.
|
|
234
255
|
|
|
235
|
-
Codex
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
256
|
+
Codex defaults to ``inline`` because sub-agents run with ``fork_turns="none"``
|
|
257
|
+
isolation and can't inherit the parent session's task context. Users can
|
|
258
|
+
opt into ``codex.dispatch_mode: sub-agent`` in ``.trellis/config.yaml``
|
|
259
|
+
to use the parallel ``<status>-inline`` tag → ``<status>`` flip. Invalid
|
|
260
|
+
or missing values fall back to inline.
|
|
261
|
+
|
|
262
|
+
Non-codex platforms return the plain status unchanged.
|
|
239
263
|
"""
|
|
240
|
-
if platform == "codex"
|
|
241
|
-
|
|
242
|
-
if isinstance(
|
|
243
|
-
|
|
264
|
+
if platform == "codex":
|
|
265
|
+
mode = "inline"
|
|
266
|
+
if isinstance(config, dict):
|
|
267
|
+
codex_cfg = config.get("codex")
|
|
268
|
+
if isinstance(codex_cfg, dict):
|
|
269
|
+
cfg_mode = codex_cfg.get("dispatch_mode")
|
|
270
|
+
if cfg_mode in ("inline", "sub-agent"):
|
|
271
|
+
mode = cfg_mode
|
|
272
|
+
return f"{status}-inline" if mode == "inline" else status
|
|
244
273
|
return status
|
|
245
274
|
|
|
246
275
|
|
|
@@ -311,6 +340,7 @@ def main() -> int:
|
|
|
311
340
|
parts: list[str] = [CODEX_SUB_AGENT_NOTICE]
|
|
312
341
|
if task is None:
|
|
313
342
|
parts.append(CODEX_NO_TASK_BOOTSTRAP_NOTICE)
|
|
343
|
+
parts.append(_codex_mode_banner(config))
|
|
314
344
|
parts.append(breadcrumb)
|
|
315
345
|
breadcrumb = "\n\n".join(parts)
|
|
316
346
|
|
|
@@ -59,12 +59,14 @@ max_journal_lines: 2000
|
|
|
59
59
|
# default_package: frontend
|
|
60
60
|
|
|
61
61
|
#-------------------------------------------------------------------------------
|
|
62
|
-
# Codex (
|
|
62
|
+
# Codex (dispatch behavior)
|
|
63
63
|
#-------------------------------------------------------------------------------
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
64
|
+
# Codex-only knob; other platforms ignore it. Default ("inline") makes the
|
|
65
|
+
# main Codex agent edit code directly because Codex sub-agents run with
|
|
66
|
+
# `fork_turns="none"` isolation and can't inherit the parent session's
|
|
67
|
+
# task context. Set to "sub-agent" to opt into the legacy dispatch model
|
|
68
|
+
# (main agent spawns trellis-implement / trellis-check / trellis-research
|
|
69
|
+
# sub-agents).
|
|
68
70
|
#
|
|
69
71
|
# codex:
|
|
70
|
-
# dispatch_mode:
|
|
72
|
+
# dispatch_mode: inline # or "sub-agent" to dispatch trellis-* sub-agents
|
|
@@ -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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"}
|
|
@@ -23,7 +23,6 @@ from __future__ import annotations
|
|
|
23
23
|
|
|
24
24
|
import argparse
|
|
25
25
|
import re
|
|
26
|
-
import subprocess
|
|
27
26
|
import sys
|
|
28
27
|
from datetime import datetime
|
|
29
28
|
from pathlib import Path
|
|
@@ -37,6 +36,11 @@ from common.paths import (
|
|
|
37
36
|
)
|
|
38
37
|
from common.developer import ensure_developer
|
|
39
38
|
from common.git import run_git
|
|
39
|
+
from common.safe_commit import (
|
|
40
|
+
print_gitignore_warning,
|
|
41
|
+
safe_git_add,
|
|
42
|
+
safe_trellis_paths_to_add,
|
|
43
|
+
)
|
|
40
44
|
from common.tasks import load_task
|
|
41
45
|
from common.config import (
|
|
42
46
|
get_packages,
|
|
@@ -314,36 +318,52 @@ def update_index(
|
|
|
314
318
|
# =============================================================================
|
|
315
319
|
|
|
316
320
|
def _auto_commit_workspace(repo_root: Path) -> None:
|
|
317
|
-
"""Stage
|
|
321
|
+
"""Stage Trellis-owned workspace + task paths and commit.
|
|
322
|
+
|
|
323
|
+
Path scope is restricted to specific products (journal files, index.md,
|
|
324
|
+
active task dirs, the archive subtree). We never `git add` the whole
|
|
325
|
+
`.trellis/` tree, and if `.gitignore` blocks the specific paths we retry
|
|
326
|
+
with `git add -f <those-specific-paths>` — never `-f .trellis/`.
|
|
327
|
+
"""
|
|
318
328
|
commit_msg = get_session_commit_message(repo_root)
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
)
|
|
325
|
-
if
|
|
326
|
-
|
|
327
|
-
|
|
329
|
+
paths = safe_trellis_paths_to_add(repo_root)
|
|
330
|
+
if not paths:
|
|
331
|
+
print("[OK] No workspace changes to commit.", file=sys.stderr)
|
|
332
|
+
return
|
|
333
|
+
|
|
334
|
+
success, used_force, err = safe_git_add(paths, repo_root)
|
|
335
|
+
if not success:
|
|
336
|
+
if err and "ignored by" in err.lower():
|
|
337
|
+
print_gitignore_warning(paths)
|
|
338
|
+
else:
|
|
339
|
+
print(
|
|
340
|
+
f"[WARN] git add failed: {err.strip() if err else 'unknown error'}",
|
|
341
|
+
file=sys.stderr,
|
|
342
|
+
)
|
|
328
343
|
return
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
344
|
+
|
|
345
|
+
if used_force:
|
|
346
|
+
print(
|
|
347
|
+
"[OK] Staged Trellis-owned paths with -f (specific paths, not .trellis/).",
|
|
348
|
+
file=sys.stderr,
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
# Check if there are staged changes for the paths we just staged.
|
|
352
|
+
rc, _, _ = run_git(
|
|
353
|
+
["diff", "--cached", "--quiet", "--", *paths], cwd=repo_root
|
|
333
354
|
)
|
|
334
|
-
if
|
|
355
|
+
if rc == 0:
|
|
335
356
|
print("[OK] No workspace changes to commit.", file=sys.stderr)
|
|
336
357
|
return
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
capture_output=True,
|
|
341
|
-
text=True,
|
|
342
|
-
)
|
|
343
|
-
if commit_result.returncode == 0:
|
|
358
|
+
|
|
359
|
+
rc, _, commit_err = run_git(["commit", "-m", commit_msg], cwd=repo_root)
|
|
360
|
+
if rc == 0:
|
|
344
361
|
print(f"[OK] Auto-committed: {commit_msg}", file=sys.stderr)
|
|
345
362
|
else:
|
|
346
|
-
print(
|
|
363
|
+
print(
|
|
364
|
+
f"[WARN] Auto-commit failed: {commit_err.strip()}",
|
|
365
|
+
file=sys.stderr,
|
|
366
|
+
)
|
|
347
367
|
|
|
348
368
|
|
|
349
369
|
def add_session(
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Safe git-add helpers for Trellis-owned paths.
|
|
3
|
+
|
|
4
|
+
Why this module exists
|
|
5
|
+
----------------------
|
|
6
|
+
A real user incident: a project's `.gitignore` listed `.trellis/` (company-wide
|
|
7
|
+
template / personal habit). When `add_session.py` and `task.py archive` ran
|
|
8
|
+
their auto-commit and `git add` failed with `ignored by .gitignore`, the AI
|
|
9
|
+
agent driving the workflow "fixed" it by retrying with
|
|
10
|
+
`git add -f .trellis/` — which fan-out-included every ignored subtree
|
|
11
|
+
(`.trellis/.backup-*/`, `.trellis/worktrees/`, `.trellis/.template-hashes.json`,
|
|
12
|
+
`.trellis/.runtime/`), committing 548 files / 83474 lines of caches/backups.
|
|
13
|
+
|
|
14
|
+
Design
|
|
15
|
+
------
|
|
16
|
+
- Scripts only stage SPECIFIC product paths (journal files, index.md, the
|
|
17
|
+
current task dir, the archive dir). Never the whole `.trellis/` tree.
|
|
18
|
+
- If plain `git add <specific>` fails with "ignored by", retry with
|
|
19
|
+
`git add -f <specific>` — forcing only the paths the script knows it owns.
|
|
20
|
+
This is safe because the paths are narrow; it is NOT equivalent to
|
|
21
|
+
`git add -f .trellis/` (which would fan out to backups/worktrees/runtime).
|
|
22
|
+
- If the -f retry also fails, print an explicit warning that includes a
|
|
23
|
+
negative example: ``Do NOT use `git add -f .trellis/` ...``
|
|
24
|
+
|
|
25
|
+
The wider-grain forbidden command stays forbidden.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import sys
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
|
|
33
|
+
from .git import run_git
|
|
34
|
+
from .paths import (
|
|
35
|
+
DIR_ARCHIVE,
|
|
36
|
+
DIR_TASKS,
|
|
37
|
+
DIR_WORKFLOW,
|
|
38
|
+
DIR_WORKSPACE,
|
|
39
|
+
FILE_JOURNAL_PREFIX,
|
|
40
|
+
get_developer,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Paths under .trellis/ that must NEVER be auto-staged. Listed here so the
|
|
45
|
+
# warning to the user can show concrete subpaths to ignore individually
|
|
46
|
+
# instead of ignoring the whole `.trellis/` tree.
|
|
47
|
+
TRELLIS_IGNORED_SUBPATHS = (
|
|
48
|
+
".trellis/.backup-*",
|
|
49
|
+
".trellis/worktrees/",
|
|
50
|
+
".trellis/.template-hashes.json",
|
|
51
|
+
".trellis/.runtime/",
|
|
52
|
+
".trellis/.cache/",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def safe_trellis_paths_to_add(repo_root: Path) -> list[str]:
|
|
57
|
+
"""Return the list of repo-relative paths the auto-commit should stage.
|
|
58
|
+
|
|
59
|
+
Only includes paths that exist on disk so callers don't pass non-existent
|
|
60
|
+
arguments to git. The caller is responsible for `git diff --cached`
|
|
61
|
+
checking afterwards.
|
|
62
|
+
|
|
63
|
+
Included:
|
|
64
|
+
- .trellis/workspace/<developer>/journal-*.md
|
|
65
|
+
- .trellis/workspace/<developer>/index.md
|
|
66
|
+
- .trellis/tasks/<task-dir>/ (every active task directory)
|
|
67
|
+
- .trellis/tasks/archive/ (whole archive subtree, if present)
|
|
68
|
+
|
|
69
|
+
Excluded (intentionally — these must not be staged):
|
|
70
|
+
- .trellis/.backup-*, .trellis/worktrees/,
|
|
71
|
+
.trellis/.template-hashes.json, .trellis/.runtime/, .trellis/.cache/
|
|
72
|
+
"""
|
|
73
|
+
paths: list[str] = []
|
|
74
|
+
|
|
75
|
+
# Workspace journal files + index.md
|
|
76
|
+
developer = get_developer(repo_root)
|
|
77
|
+
if developer:
|
|
78
|
+
ws = repo_root / DIR_WORKFLOW / DIR_WORKSPACE / developer
|
|
79
|
+
if ws.is_dir():
|
|
80
|
+
for f in sorted(ws.glob(f"{FILE_JOURNAL_PREFIX}*.md")):
|
|
81
|
+
if f.is_file():
|
|
82
|
+
paths.append(
|
|
83
|
+
f"{DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/{f.name}"
|
|
84
|
+
)
|
|
85
|
+
index_md = ws / "index.md"
|
|
86
|
+
if index_md.is_file():
|
|
87
|
+
paths.append(
|
|
88
|
+
f"{DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/index.md"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Active tasks: each direct child of tasks/ that is a directory and not
|
|
92
|
+
# the archive root. The archive subtree is added as a single path below.
|
|
93
|
+
tasks_dir = repo_root / DIR_WORKFLOW / DIR_TASKS
|
|
94
|
+
if tasks_dir.is_dir():
|
|
95
|
+
for child in sorted(tasks_dir.iterdir()):
|
|
96
|
+
if not child.is_dir():
|
|
97
|
+
continue
|
|
98
|
+
if child.name == DIR_ARCHIVE:
|
|
99
|
+
continue
|
|
100
|
+
paths.append(f"{DIR_WORKFLOW}/{DIR_TASKS}/{child.name}")
|
|
101
|
+
|
|
102
|
+
archive_dir = tasks_dir / DIR_ARCHIVE
|
|
103
|
+
if archive_dir.is_dir():
|
|
104
|
+
paths.append(f"{DIR_WORKFLOW}/{DIR_TASKS}/{DIR_ARCHIVE}")
|
|
105
|
+
|
|
106
|
+
return paths
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def safe_archive_paths_to_add(repo_root: Path) -> list[str]:
|
|
110
|
+
"""Return paths to stage after `task.py archive`.
|
|
111
|
+
|
|
112
|
+
Limited to the archive subtree (where the freshly-moved task lives) plus
|
|
113
|
+
the source task directory's parent area to capture the deletion in the
|
|
114
|
+
same commit. We pass the whole `.trellis/tasks/` path so deletions of the
|
|
115
|
+
pre-move path are tracked, but only as a SPECIFIC subpath — not the whole
|
|
116
|
+
`.trellis/` tree.
|
|
117
|
+
"""
|
|
118
|
+
paths: list[str] = []
|
|
119
|
+
tasks_dir = repo_root / DIR_WORKFLOW / DIR_TASKS
|
|
120
|
+
if tasks_dir.is_dir():
|
|
121
|
+
# The archive copy.
|
|
122
|
+
archive_dir = tasks_dir / DIR_ARCHIVE
|
|
123
|
+
if archive_dir.is_dir():
|
|
124
|
+
paths.append(f"{DIR_WORKFLOW}/{DIR_TASKS}/{DIR_ARCHIVE}")
|
|
125
|
+
# Active tasks (some may have been re-touched, e.g. parent's
|
|
126
|
+
# children list). This captures the source-path deletion too because
|
|
127
|
+
# `git add` on a directory records removals.
|
|
128
|
+
for child in sorted(tasks_dir.iterdir()):
|
|
129
|
+
if not child.is_dir():
|
|
130
|
+
continue
|
|
131
|
+
if child.name == DIR_ARCHIVE:
|
|
132
|
+
continue
|
|
133
|
+
paths.append(f"{DIR_WORKFLOW}/{DIR_TASKS}/{child.name}")
|
|
134
|
+
return paths
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _stderr_indicates_ignored(stderr: str) -> bool:
|
|
138
|
+
"""git add error indicates the path is excluded by .gitignore."""
|
|
139
|
+
if not stderr:
|
|
140
|
+
return False
|
|
141
|
+
lowered = stderr.lower()
|
|
142
|
+
return "ignored by" in lowered
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def safe_git_add(
|
|
146
|
+
paths: list[str], repo_root: Path
|
|
147
|
+
) -> tuple[bool, bool, str]:
|
|
148
|
+
"""Run `git add` on specific paths, retrying with -f if .gitignore blocks.
|
|
149
|
+
|
|
150
|
+
Returns (success, used_force, stderr). On success, callers should still
|
|
151
|
+
`git diff --cached` to detect whether anything was actually staged.
|
|
152
|
+
|
|
153
|
+
Behavior:
|
|
154
|
+
- No paths passed → success, no force, empty stderr.
|
|
155
|
+
- Plain `git add <paths>` succeeds → return.
|
|
156
|
+
- Plain fails with "ignored by" → retry with `git add -f <paths>`.
|
|
157
|
+
- Retry succeeds → return success with used_force=True.
|
|
158
|
+
- Retry fails → return failure; caller should print the gitignore
|
|
159
|
+
warning (see :func:`print_gitignore_warning`).
|
|
160
|
+
- Plain fails with a non-ignored error → return failure; do NOT retry
|
|
161
|
+
with -f (we only force when ignore is the cause).
|
|
162
|
+
"""
|
|
163
|
+
if not paths:
|
|
164
|
+
return True, False, ""
|
|
165
|
+
|
|
166
|
+
rc, _, err = run_git(["add", "--", *paths], cwd=repo_root)
|
|
167
|
+
if rc == 0:
|
|
168
|
+
return True, False, ""
|
|
169
|
+
|
|
170
|
+
if not _stderr_indicates_ignored(err):
|
|
171
|
+
return False, False, err
|
|
172
|
+
|
|
173
|
+
rc2, _, err2 = run_git(["add", "-f", "--", *paths], cwd=repo_root)
|
|
174
|
+
if rc2 == 0:
|
|
175
|
+
return True, True, err2 or err
|
|
176
|
+
return False, True, err2 or err
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def print_gitignore_warning(paths: list[str]) -> None:
|
|
180
|
+
"""Explain to the user (and any AI reading the log) what to do.
|
|
181
|
+
|
|
182
|
+
CRITICAL: includes the negative example
|
|
183
|
+
``Do NOT use `git add -f .trellis/``` — agents reading the warning are
|
|
184
|
+
known to invent that command, which fans out to ignored caches/backups.
|
|
185
|
+
"""
|
|
186
|
+
print(
|
|
187
|
+
"[WARN] git add failed because .trellis/ paths are ignored by your .gitignore.",
|
|
188
|
+
file=sys.stderr,
|
|
189
|
+
)
|
|
190
|
+
print(
|
|
191
|
+
"[WARN] Trellis manages these specific paths and they should be tracked:",
|
|
192
|
+
file=sys.stderr,
|
|
193
|
+
)
|
|
194
|
+
if paths:
|
|
195
|
+
for p in paths:
|
|
196
|
+
print(f"[WARN] {p}", file=sys.stderr)
|
|
197
|
+
else:
|
|
198
|
+
print(
|
|
199
|
+
"[WARN] .trellis/workspace/<developer>/{journal-*.md,index.md}",
|
|
200
|
+
file=sys.stderr,
|
|
201
|
+
)
|
|
202
|
+
print(
|
|
203
|
+
"[WARN] .trellis/tasks/<task-dir>/",
|
|
204
|
+
file=sys.stderr,
|
|
205
|
+
)
|
|
206
|
+
print(
|
|
207
|
+
"[WARN] .trellis/tasks/archive/",
|
|
208
|
+
file=sys.stderr,
|
|
209
|
+
)
|
|
210
|
+
print("[WARN]", file=sys.stderr)
|
|
211
|
+
print(
|
|
212
|
+
"[WARN] Recommended: change your .gitignore from `.trellis/` to specific",
|
|
213
|
+
file=sys.stderr,
|
|
214
|
+
)
|
|
215
|
+
print(
|
|
216
|
+
"[WARN] subpaths that should remain ignored, e.g.:",
|
|
217
|
+
file=sys.stderr,
|
|
218
|
+
)
|
|
219
|
+
for sub in TRELLIS_IGNORED_SUBPATHS:
|
|
220
|
+
print(f"[WARN] {sub}", file=sys.stderr)
|
|
221
|
+
print("[WARN]", file=sys.stderr)
|
|
222
|
+
print(
|
|
223
|
+
"[WARN] Do NOT use `git add -f .trellis/` — it pulls in backups, worktrees,",
|
|
224
|
+
file=sys.stderr,
|
|
225
|
+
)
|
|
226
|
+
print(
|
|
227
|
+
"[WARN] and runtime caches that should never be committed.",
|
|
228
|
+
file=sys.stderr,
|
|
229
|
+
)
|
|
@@ -41,6 +41,11 @@ from .paths import (
|
|
|
41
41
|
get_repo_root,
|
|
42
42
|
get_tasks_dir,
|
|
43
43
|
)
|
|
44
|
+
from .safe_commit import (
|
|
45
|
+
print_gitignore_warning,
|
|
46
|
+
safe_archive_paths_to_add,
|
|
47
|
+
safe_git_add,
|
|
48
|
+
)
|
|
44
49
|
from .task_utils import (
|
|
45
50
|
archive_task_complete,
|
|
46
51
|
find_task_by_name,
|
|
@@ -383,13 +388,37 @@ def cmd_archive(args: argparse.Namespace) -> int:
|
|
|
383
388
|
|
|
384
389
|
|
|
385
390
|
def _auto_commit_archive(task_name: str, repo_root: Path) -> None:
|
|
386
|
-
"""Stage
|
|
387
|
-
|
|
388
|
-
|
|
391
|
+
"""Stage Trellis-owned task paths and commit after archive.
|
|
392
|
+
|
|
393
|
+
Only stages specific subpaths (the archive subtree and active task dirs),
|
|
394
|
+
never the whole `.trellis/` tree. If `.gitignore` excludes `.trellis/`,
|
|
395
|
+
falls back to `git add -f <specific>` and emits a warning that explicitly
|
|
396
|
+
forbids `git add -f .trellis/` (which would fan out to caches/backups).
|
|
397
|
+
"""
|
|
398
|
+
paths = safe_archive_paths_to_add(repo_root)
|
|
399
|
+
if not paths:
|
|
400
|
+
print("[OK] No task changes to commit.", file=sys.stderr)
|
|
401
|
+
return
|
|
402
|
+
|
|
403
|
+
success, used_force, err = safe_git_add(paths, repo_root)
|
|
404
|
+
if not success:
|
|
405
|
+
if err and "ignored by" in err.lower():
|
|
406
|
+
print_gitignore_warning(paths)
|
|
407
|
+
else:
|
|
408
|
+
print(
|
|
409
|
+
f"[WARN] git add failed: {err.strip() if err else 'unknown error'}",
|
|
410
|
+
file=sys.stderr,
|
|
411
|
+
)
|
|
412
|
+
return
|
|
413
|
+
|
|
414
|
+
if used_force:
|
|
415
|
+
print(
|
|
416
|
+
"[OK] Staged Trellis-owned paths with -f (specific paths, not .trellis/).",
|
|
417
|
+
file=sys.stderr,
|
|
418
|
+
)
|
|
389
419
|
|
|
390
|
-
# Check if there are staged changes
|
|
391
420
|
rc, _, _ = run_git(
|
|
392
|
-
["diff", "--cached", "--quiet", "--",
|
|
421
|
+
["diff", "--cached", "--quiet", "--", *paths], cwd=repo_root
|
|
393
422
|
)
|
|
394
423
|
if rc == 0:
|
|
395
424
|
print("[OK] No task changes to commit.", file=sys.stderr)
|
|
@@ -145,17 +145,29 @@ def _platform_matches(platform: str, block_names: list[str]) -> bool:
|
|
|
145
145
|
|
|
146
146
|
|
|
147
147
|
def resolve_effective_platform(platform: str, config: dict) -> str:
|
|
148
|
-
"""Map
|
|
148
|
+
"""Map ``codex`` to a dispatch-mode-namespaced virtual platform name.
|
|
149
149
|
|
|
150
|
-
When
|
|
151
|
-
|
|
152
|
-
``
|
|
153
|
-
|
|
150
|
+
When ``--platform codex`` is passed, return ``"codex-inline"`` (default)
|
|
151
|
+
or ``"codex-sub-agent"`` based on ``.trellis/config.yaml`` ``codex.dispatch_mode``.
|
|
152
|
+
``filter_platform`` then surfaces blocks whose marker lists include the
|
|
153
|
+
namespaced name (e.g. ``[codex-sub-agent, ...]`` or ``[codex-inline, Kilo,
|
|
154
|
+
Antigravity, Windsurf]``).
|
|
155
|
+
|
|
156
|
+
Default is ``inline`` because Codex sub-agents run with ``fork_turns="none"``
|
|
157
|
+
isolation and can't inherit the parent session's task context — inline
|
|
158
|
+
keeps the main agent in charge so context isn't lost. Invalid / missing
|
|
159
|
+
values also fall back to inline.
|
|
160
|
+
|
|
161
|
+
Other platforms are returned unchanged.
|
|
154
162
|
"""
|
|
155
163
|
if platform == "codex":
|
|
164
|
+
mode = "inline"
|
|
156
165
|
codex_cfg = config.get("codex") if isinstance(config, dict) else None
|
|
157
|
-
if isinstance(codex_cfg, dict)
|
|
158
|
-
|
|
166
|
+
if isinstance(codex_cfg, dict):
|
|
167
|
+
cfg_mode = codex_cfg.get("dispatch_mode")
|
|
168
|
+
if cfg_mode in ("inline", "sub-agent"):
|
|
169
|
+
mode = cfg_mode
|
|
170
|
+
return f"codex-{mode}"
|
|
159
171
|
return platform
|
|
160
172
|
|
|
161
173
|
|
|
@@ -245,7 +245,7 @@ If you reach this state with uncommitted code, return to Phase 3.4 first — `/f
|
|
|
245
245
|
|
|
246
246
|
When a user request matches one of these intents, load the corresponding skill (or dispatch the corresponding sub-agent) first — do not skip skills.
|
|
247
247
|
|
|
248
|
-
[Claude Code, Cursor, OpenCode,
|
|
248
|
+
[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
249
249
|
|
|
250
250
|
| User intent | Route |
|
|
251
251
|
|---|---|
|
|
@@ -257,9 +257,9 @@ When a user request matches one of these intents, load the corresponding skill (
|
|
|
257
257
|
|
|
258
258
|
**Why `trellis-before-dev` is NOT in this table:** you are not the one writing code — the `trellis-implement` sub-agent is. Sub-agent platforms get spec context via `implement.jsonl` injection / prelude, not via the main thread loading `trellis-before-dev`.
|
|
259
259
|
|
|
260
|
-
[/Claude Code, Cursor, OpenCode,
|
|
260
|
+
[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
261
261
|
|
|
262
|
-
[Kilo, Antigravity, Windsurf]
|
|
262
|
+
[codex-inline, Kilo, Antigravity, Windsurf]
|
|
263
263
|
|
|
264
264
|
| User intent | Skill |
|
|
265
265
|
|---|---|
|
|
@@ -269,11 +269,11 @@ When a user request matches one of these intents, load the corresponding skill (
|
|
|
269
269
|
| Stuck / fixed same bug several times | `trellis-break-loop` |
|
|
270
270
|
| Spec needs update | `trellis-update-spec` |
|
|
271
271
|
|
|
272
|
-
[/Kilo, Antigravity, Windsurf]
|
|
272
|
+
[/codex-inline, Kilo, Antigravity, Windsurf]
|
|
273
273
|
|
|
274
274
|
### DO NOT skip skills
|
|
275
275
|
|
|
276
|
-
[Claude Code, Cursor, OpenCode,
|
|
276
|
+
[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
277
277
|
|
|
278
278
|
| What you're thinking | Why it's wrong |
|
|
279
279
|
|---|---|
|
|
@@ -282,9 +282,9 @@ When a user request matches one of these intents, load the corresponding skill (
|
|
|
282
282
|
| "I already know the spec" | The spec may have been updated since you last read it; the sub-agent gets the fresh copy, you may not |
|
|
283
283
|
| "Code first, check later" | `trellis-check` surfaces issues you won't notice yourself; earlier is cheaper |
|
|
284
284
|
|
|
285
|
-
[/Claude Code, Cursor, OpenCode,
|
|
285
|
+
[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
286
286
|
|
|
287
|
-
[Kilo, Antigravity, Windsurf]
|
|
287
|
+
[codex-inline, Kilo, Antigravity, Windsurf]
|
|
288
288
|
|
|
289
289
|
| What you're thinking | Why it's wrong |
|
|
290
290
|
|---|---|
|
|
@@ -293,7 +293,7 @@ When a user request matches one of these intents, load the corresponding skill (
|
|
|
293
293
|
| "I already know the spec" | The spec may have been updated since you last read it; read again |
|
|
294
294
|
| "Code first, check later" | `trellis-check` surfaces issues you won't notice yourself; earlier is cheaper |
|
|
295
295
|
|
|
296
|
-
[/Kilo, Antigravity, Windsurf]
|
|
296
|
+
[/codex-inline, Kilo, Antigravity, Windsurf]
|
|
297
297
|
|
|
298
298
|
### Loading Step Detail
|
|
299
299
|
|
|
@@ -342,7 +342,7 @@ Return to this step whenever requirements change and revise `prd.md`.
|
|
|
342
342
|
|
|
343
343
|
Research can happen at any time during requirement exploration. It isn't limited to local code — you can use any available tool (MCP servers, skills, web search, etc.) to look up external information, including third-party library docs, industry practices, API references, etc.
|
|
344
344
|
|
|
345
|
-
[Claude Code, Cursor, OpenCode,
|
|
345
|
+
[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
346
346
|
|
|
347
347
|
Spawn the research sub-agent:
|
|
348
348
|
|
|
@@ -350,13 +350,13 @@ Spawn the research sub-agent:
|
|
|
350
350
|
- **Task description**: Research <specific question>
|
|
351
351
|
- **Key requirement**: Research output MUST be persisted to `{TASK_DIR}/research/`
|
|
352
352
|
|
|
353
|
-
[/Claude Code, Cursor, OpenCode,
|
|
353
|
+
[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
354
354
|
|
|
355
|
-
[Kilo, Antigravity, Windsurf]
|
|
355
|
+
[codex-inline, Kilo, Antigravity, Windsurf]
|
|
356
356
|
|
|
357
|
-
Do the research in the main session directly and write findings into `{TASK_DIR}/research/`.
|
|
357
|
+
Do the research in the main session directly and write findings into `{TASK_DIR}/research/`. (For `codex-inline` this avoids the `fork_turns="none"` isolation that prevents `trellis-research` sub-agents from resolving the active task path.)
|
|
358
358
|
|
|
359
|
-
[/Kilo, Antigravity, Windsurf]
|
|
359
|
+
[/codex-inline, Kilo, Antigravity, Windsurf]
|
|
360
360
|
|
|
361
361
|
**Research artifact conventions**:
|
|
362
362
|
- One file per research topic (e.g. `research/auth-library-comparison.md`)
|
|
@@ -369,7 +369,7 @@ Brainstorm and research can interleave freely — pause to research a technical
|
|
|
369
369
|
|
|
370
370
|
#### 1.3 Configure context `[required · once]`
|
|
371
371
|
|
|
372
|
-
[Claude Code, Cursor, OpenCode,
|
|
372
|
+
[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
373
373
|
|
|
374
374
|
Curate `implement.jsonl` and `check.jsonl` so the Phase 2 sub-agents get the right spec context. These files were seeded on `task create` with a single self-describing `_example` line; your job here is to fill in real entries.
|
|
375
375
|
|
|
@@ -410,13 +410,13 @@ Delete the seed `_example` line once real entries exist (optional — it's skipp
|
|
|
410
410
|
|
|
411
411
|
Skip when: `implement.jsonl` has agent-curated entries (the seed row alone doesn't count).
|
|
412
412
|
|
|
413
|
-
[/Claude Code, Cursor, OpenCode,
|
|
413
|
+
[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
414
414
|
|
|
415
|
-
[Kilo, Antigravity, Windsurf]
|
|
415
|
+
[codex-inline, Kilo, Antigravity, Windsurf]
|
|
416
416
|
|
|
417
417
|
Skip this step. Context is loaded directly by the `trellis-before-dev` skill in Phase 2.
|
|
418
418
|
|
|
419
|
-
[/Kilo, Antigravity, Windsurf]
|
|
419
|
+
[/codex-inline, Kilo, Antigravity, Windsurf]
|
|
420
420
|
|
|
421
421
|
#### 1.4 Activate task `[required · once]`
|
|
422
422
|
|
|
@@ -440,11 +440,11 @@ If `task.py start` errors with a session-identity message (no context key from h
|
|
|
440
440
|
| `research/` has artifacts (complex tasks) | recommended |
|
|
441
441
|
| `info.md` technical design (complex tasks) | optional |
|
|
442
442
|
|
|
443
|
-
[Claude Code, Cursor, OpenCode,
|
|
443
|
+
[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
444
444
|
|
|
445
445
|
| `implement.jsonl` has agent-curated entries (not just the seed row) | ✅ |
|
|
446
446
|
|
|
447
|
-
[/Claude Code, Cursor, OpenCode,
|
|
447
|
+
[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
448
448
|
|
|
449
449
|
---
|
|
450
450
|
|
|
@@ -468,7 +468,7 @@ The platform hook/plugin auto-handles:
|
|
|
468
468
|
|
|
469
469
|
[/Claude Code, Cursor, OpenCode, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
470
470
|
|
|
471
|
-
[
|
|
471
|
+
[codex-sub-agent]
|
|
472
472
|
|
|
473
473
|
Spawn the implement sub-agent:
|
|
474
474
|
|
|
@@ -480,7 +480,7 @@ The Codex sub-agent definition auto-handles the context load requirement:
|
|
|
480
480
|
- Resolves the active task with `task.py current --source`, then reads `prd.md` and `info.md` if present
|
|
481
481
|
- Reads `implement.jsonl` and requires the agent to load each referenced spec file before coding
|
|
482
482
|
|
|
483
|
-
[/
|
|
483
|
+
[/codex-sub-agent]
|
|
484
484
|
|
|
485
485
|
[Kiro]
|
|
486
486
|
|
|
@@ -496,7 +496,7 @@ The platform prelude auto-handles the context load requirement:
|
|
|
496
496
|
|
|
497
497
|
[/Kiro]
|
|
498
498
|
|
|
499
|
-
[Kilo, Antigravity, Windsurf]
|
|
499
|
+
[codex-inline, Kilo, Antigravity, Windsurf]
|
|
500
500
|
|
|
501
501
|
1. Load the `trellis-before-dev` skill to read project guidelines
|
|
502
502
|
2. Read `{TASK_DIR}/prd.md` for requirements
|
|
@@ -504,11 +504,11 @@ The platform prelude auto-handles the context load requirement:
|
|
|
504
504
|
4. Implement the code per requirements
|
|
505
505
|
5. Run project lint and type-check
|
|
506
506
|
|
|
507
|
-
[/Kilo, Antigravity, Windsurf]
|
|
507
|
+
[/codex-inline, Kilo, Antigravity, Windsurf]
|
|
508
508
|
|
|
509
509
|
#### 2.2 Quality check `[required · repeatable]`
|
|
510
510
|
|
|
511
|
-
[Claude Code, Cursor, OpenCode,
|
|
511
|
+
[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
512
512
|
|
|
513
513
|
Spawn the check sub-agent:
|
|
514
514
|
|
|
@@ -521,9 +521,9 @@ The check agent's job:
|
|
|
521
521
|
- Auto-fix issues it finds
|
|
522
522
|
- Run lint and typecheck to verify
|
|
523
523
|
|
|
524
|
-
[/Claude Code, Cursor, OpenCode,
|
|
524
|
+
[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi]
|
|
525
525
|
|
|
526
|
-
[Kilo, Antigravity, Windsurf]
|
|
526
|
+
[codex-inline, Kilo, Antigravity, Windsurf]
|
|
527
527
|
|
|
528
528
|
Load the `trellis-check` skill and verify the code per its guidance:
|
|
529
529
|
- Spec compliance
|
|
@@ -532,7 +532,7 @@ Load the `trellis-check` skill and verify the code per its guidance:
|
|
|
532
532
|
|
|
533
533
|
If issues are found → fix → re-check, until green.
|
|
534
534
|
|
|
535
|
-
[/Kilo, Antigravity, Windsurf]
|
|
535
|
+
[/codex-inline, Kilo, Antigravity, Windsurf]
|
|
536
536
|
|
|
537
537
|
#### 2.3 Rollback `[on demand]`
|
|
538
538
|
|
|
@@ -38,6 +38,7 @@ export declare function scrubOpencodePackageJson(content: string): ScrubResult;
|
|
|
38
38
|
* Scrub `.pi/settings.json`:
|
|
39
39
|
* - drop `enableSkillCommands` (trellis-flagged)
|
|
40
40
|
* - remove trellis entries from `extensions`/`skills`/`prompts` arrays
|
|
41
|
+
* - remove trellis-managed `packages["npm:pi-subagents"]` isolation override
|
|
41
42
|
* - drop arrays that become empty
|
|
42
43
|
*/
|
|
43
44
|
export declare function scrubPiSettings(content: string): ScrubResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall-scrubbers.d.ts","sourceRoot":"","sources":["../../src/utils/uninstall-scrubbers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB;AAmDD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,IAAI,EAAE,QAAQ,GAAG,MAAM,GACtB,WAAW,CAgGb;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA+BrE;
|
|
1
|
+
{"version":3,"file":"uninstall-scrubbers.d.ts","sourceRoot":"","sources":["../../src/utils/uninstall-scrubbers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB;AAmDD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,IAAI,EAAE,QAAQ,GAAG,MAAM,GACtB,WAAW,CAgGb;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA+BrE;AAiBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA4D5D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAoDjE"}
|
|
@@ -201,6 +201,7 @@ export function scrubOpencodePackageJson(content) {
|
|
|
201
201
|
const PI_TRELLIS_EXTENSION = "./extensions/trellis/index.ts";
|
|
202
202
|
const PI_TRELLIS_SKILLS = "./skills";
|
|
203
203
|
const PI_TRELLIS_PROMPTS = "./prompts";
|
|
204
|
+
const PI_SUBAGENTS_PACKAGE = "npm:pi-subagents";
|
|
204
205
|
function isTrellisPiEntry(value, target) {
|
|
205
206
|
return typeof value === "string" && value === target;
|
|
206
207
|
}
|
|
@@ -208,6 +209,7 @@ function isTrellisPiEntry(value, target) {
|
|
|
208
209
|
* Scrub `.pi/settings.json`:
|
|
209
210
|
* - drop `enableSkillCommands` (trellis-flagged)
|
|
210
211
|
* - remove trellis entries from `extensions`/`skills`/`prompts` arrays
|
|
212
|
+
* - remove trellis-managed `packages["npm:pi-subagents"]` isolation override
|
|
211
213
|
* - drop arrays that become empty
|
|
212
214
|
*/
|
|
213
215
|
export function scrubPiSettings(content) {
|
|
@@ -243,6 +245,25 @@ export function scrubPiSettings(content) {
|
|
|
243
245
|
root[key] = filtered;
|
|
244
246
|
}
|
|
245
247
|
}
|
|
248
|
+
const packagesValue = root.packages;
|
|
249
|
+
if (Array.isArray(packagesValue)) {
|
|
250
|
+
const filtered = packagesValue.filter((entry) => {
|
|
251
|
+
if (entry !== null &&
|
|
252
|
+
typeof entry === "object" &&
|
|
253
|
+
!Array.isArray(entry)) {
|
|
254
|
+
const obj = entry;
|
|
255
|
+
return obj.source !== PI_SUBAGENTS_PACKAGE;
|
|
256
|
+
}
|
|
257
|
+
// String entries — keep unless they exactly match the package name
|
|
258
|
+
return entry !== PI_SUBAGENTS_PACKAGE;
|
|
259
|
+
});
|
|
260
|
+
if (filtered.length === 0) {
|
|
261
|
+
delete root.packages;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
root.packages = filtered;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
246
267
|
const fullyEmpty = Object.keys(root).length === 0;
|
|
247
268
|
return {
|
|
248
269
|
content: JSON.stringify(root, null, 2) + "\n",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall-scrubbers.js","sourceRoot":"","sources":["../../src/utils/uninstall-scrubbers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"uninstall-scrubbers.js","sourceRoot":"","sources":["../../src/utils/uninstall-scrubbers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;;;;;;;;;;;GAaG;AACH,SAAS,yBAAyB,CAChC,OAAe,EACf,YAA+B;IAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACxD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAClD,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,UAAU,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,YAA+B,EAC/B,IAAuB;IAEvB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;QACzD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,sEAAsE;QACtE,iCAAiC;QACjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,mDAAmD;QACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,KAAgC,CAAC;IAElD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEvC,MAAM,aAAa,GAAc,EAAE,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,GAAG,KAAK,IAAI,IAAI,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC;oBACjE,SAAS,CAAC,qBAAqB;gBACjC,CAAC;gBACD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAChD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBACD,MAAM,YAAY,GAAG,KAAgC,CAAC;gBACtD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;oBACjC,OAAO,CAAC,CACN,GAAG,KAAK,IAAI,IAAI,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,CAC7D,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,qDAAqD;oBACrD,SAAS;gBACX,CAAC;gBAED,sDAAsD;gBACtD,MAAM,OAAO,GAA4B,EAAE,GAAG,YAAY,EAAE,CAAC;gBAC7D,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,8BAA8B;YAC9B,gEAAgE;YAChE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC;QACtC,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;IAE/B,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,OAAO,GAAG,IAA+B,CAAC;QAChD,IAAI,qBAAqB,IAAI,OAAO,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AAC7D,MAAM,iBAAiB,GAAG,UAAU,CAAC;AACrC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AACvC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEhD,SAAS,gBAAgB,CAAC,KAAc,EAAE,MAAc;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,MAAiC,CAAC;IAE/C,IAAI,qBAAqB,IAAI,IAAI,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,MAAM,aAAa,GAAuB;QACxC,CAAC,YAAY,EAAE,oBAAoB,CAAC;QACpC,CAAC,QAAQ,EAAE,iBAAiB,CAAC;QAC7B,CAAC,SAAS,EAAE,kBAAkB,CAAC;KAChC,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,gEAAgE;YAChE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,IACE,KAAK,KAAK,IAAI;gBACd,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACrB,CAAC;gBACD,MAAM,GAAG,GAAG,KAAgC,CAAC;gBAC7C,OAAO,GAAG,CAAC,MAAM,KAAK,oBAAoB,CAAC;YAC7C,CAAC;YACD,mEAAmE;YACnE,OAAO,KAAK,KAAK,oBAAoB,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,qBAAqB,GAAG;QAC5B,sDAAsD;QACtD,4EAA4E;QAC5E,yDAAyD;QACzD,uEAAuE;QACvE,qEAAqE;QACrE,gEAAgE;QAChE,YAAY;QACZ,cAAc;QACd,oBAAoB;QACpB,oEAAoE;QACpE,kCAAkC;KACnC,CAAC;IAEF,0EAA0E;IAC1E,2EAA2E;IAC3E,SAAS,oBAAoB,CAAC,IAAY;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,qCAAqC;QAC1E,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,SAAS,mBAAmB,CAAC,IAAY;QACvC,OAAO,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,+CAA+C;IAExE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAI,mBAAmB,CAAC,OAAO,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,SAAS,CAAC,OAAO;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;YAC5B,SAAS,CAAC,8CAA8C;QAC1D,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,YAAY,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,6BAA6B;IAC7B,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC"}
|
package/package.json
CHANGED