pi-soly 1.13.5 → 1.14.0

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.
@@ -36,7 +36,7 @@ export function showStatus(
36
36
  config?: SolyConfig,
37
37
  ): void {
38
38
  if (!state.exists) {
39
- ui.notify("soly: no .soly/ directory in cwd", "error");
39
+ ui.notify("soly: no .agents/ directory in cwd", "error");
40
40
  return;
41
41
  }
42
42
  const maxPhases = config?.display.maxPhasesInStatus ?? 20;
@@ -122,7 +122,7 @@ const DECISIONS_TABLE_ROW = /^\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*
122
122
 
123
123
  export function showLog(cmd: SolyCommand, state: SolyState, ui: QuickUI): void {
124
124
  if (!state.exists) {
125
- ui.notify("soly log: no .soly/ directory in cwd", "error");
125
+ ui.notify("soly log: no .agents/ directory in cwd", "error");
126
126
  return;
127
127
  }
128
128
 
@@ -214,7 +214,7 @@ export async function showDiff(
214
214
  state: SolyState,
215
215
  ui: QuickUI,
216
216
  ): Promise<void> {
217
- // Graceful without .soly/: use cwd as project root, skip the .soly/ filter
217
+ // Graceful without .agents/: use cwd as project root, skip the .agents/ filter
218
218
  const projectRoot = state.solyDir ? path.dirname(state.solyDir) : process.cwd();
219
219
  const solyDir = state.solyDir; // may be empty when run outside a soly project
220
220
 
@@ -222,7 +222,7 @@ export async function showDiff(
222
222
  const status = await safeExec("git", ["status", "--short", "--branch"], projectRoot);
223
223
  // 2. git diff (tracked changes, no untracked)
224
224
  const diff = await safeExec("git", ["diff", "--stat"], projectRoot);
225
- // 3. uncommitted .soly/ file changes (since last commit)
225
+ // 3. uncommitted .agents/ file changes (since last commit)
226
226
  const solyChanges = await safeExec(
227
227
  "git",
228
228
  ["status", "--short", "--", solyDir],
@@ -230,7 +230,7 @@ export async function showDiff(
230
230
  );
231
231
 
232
232
  const out: string[] = [];
233
- out.push(state.exists ? "=== soly diff ===" : "=== git diff (no .soly/ in cwd) ===");
233
+ out.push(state.exists ? "=== soly diff ===" : "=== git diff (no .agents/ in cwd) ===");
234
234
  out.push("");
235
235
 
236
236
  if (status.code !== 0) {
@@ -246,10 +246,10 @@ export async function showDiff(
246
246
  }
247
247
  if (solyDir) {
248
248
  if (solyChanges.stdout.trim()) {
249
- out.push("uncommitted .soly/ changes:");
249
+ out.push("uncommitted .agents/ changes:");
250
250
  out.push(solyChanges.stdout.trim());
251
251
  } else {
252
- out.push("uncommitted .soly/ changes: (none)");
252
+ out.push("uncommitted .agents/ changes: (none)");
253
253
  }
254
254
  }
255
255
  }
@@ -7,11 +7,11 @@
7
7
  // session context from the last handoff.
8
8
  //
9
9
  // Reads:
10
- // - .soly/HANDOFF.json (machine-readable state, written by pause/compact)
11
- // - .soly/.continue-here.md (human-readable context, written by pause/compact)
10
+ // - .agents/HANDOFF.json (machine-readable state, written by pause/compact)
11
+ // - .agents/.continue-here.md (human-readable context, written by pause/compact)
12
12
  //
13
13
  // If neither file exists, falls back to a "no prior handoff" message that
14
- // tells the LLM to load context from .soly/STATE.md + ROADMAP.md normally.
14
+ // tells the LLM to load context from .agents/STATE.md + ROADMAP.md normally.
15
15
  // =============================================================================
16
16
 
17
17
  import * as fs from "node:fs";
@@ -73,7 +73,7 @@ function formatListSection(label: string, items: string[] | undefined): string {
73
73
  function formatHandoffSummary(h: HandoffJson): string {
74
74
  const lines: string[] = [];
75
75
 
76
- lines.push("=== From .soly/HANDOFF.json ===");
76
+ lines.push("=== From .agents/HANDOFF.json ===");
77
77
  if (h.generated_at) lines.push(` generated_at: ${h.generated_at}`);
78
78
  if (h.milestone) lines.push(` milestone: ${h.milestone}${h.milestone_name ? ` — ${h.milestone_name}` : ""}`);
79
79
  if (h.status) lines.push(` status: ${h.status}`);
@@ -112,7 +112,7 @@ export function buildResumeTransform(cmd: SolyCommand, state: SolyState): Resume
112
112
  return {
113
113
  handled: true,
114
114
  transformedText:
115
- `soly resume: no .soly/ directory in cwd (${state.solyDir || "<cwd>"}) — nothing to resume.\n` +
115
+ `soly resume: no .agents/ directory in cwd (${state.solyDir || "<cwd>"}) — nothing to resume.\n` +
116
116
  `Initialize a soly project first, or run \`soly pause\` later to create handoff files.`,
117
117
  };
118
118
  }
@@ -149,24 +149,24 @@ export function buildResumeTransform(cmd: SolyCommand, state: SolyState): Resume
149
149
  }
150
150
 
151
151
  if (!handoff && !continueMd) {
152
- // No prior handoff — fall back to loading from .soly/STATE.md directly.
152
+ // No prior handoff — fall back to loading from .agents/STATE.md directly.
153
153
  const fallbackScope = phaseFilter != null
154
154
  ? `Focus: phase ${phaseFilter}.`
155
155
  : "Scope: full project.";
156
156
  return {
157
157
  handled: true,
158
158
  transformedText:
159
- `soly resume: no handoff files found (looked for .soly/HANDOFF.json and .soly/.continue-here.md).\n` +
160
- `No prior \`soly pause\` was run — loading context from .soly/STATE.md and .soly/ROADMAP.md directly.\n\n` +
159
+ `soly resume: no handoff files found (looked for .agents/HANDOFF.json and .agents/.continue-here.md).\n` +
160
+ `No prior \`soly pause\` was run — loading context from .agents/STATE.md and .agents/ROADMAP.md directly.\n\n` +
161
161
  `${fallbackScope}\n\n` +
162
- `Read .soly/STATE.md (Current Position, Decisions, Blockers sections) and .soly/ROADMAP.md.\n` +
162
+ `Read .agents/STATE.md (Current Position, Decisions, Blockers sections) and .agents/ROADMAP.md.\n` +
163
163
  `Summarize: where the project is, what's next, what's blocking. Then ask the user what to focus on first.`,
164
164
  };
165
165
  }
166
166
 
167
167
  const handoffBlock = handoff ? formatHandoffSummary(handoff) : "(no HANDOFF.json found)";
168
168
  const continueBlock = continueMd
169
- ? `\n=== From .soly/.continue-here.md ===\n${continueMd.trim()}\n`
169
+ ? `\n=== From .agents/.continue-here.md ===\n${continueMd.trim()}\n`
170
170
  : "";
171
171
 
172
172
  const focusLine = phaseFilter != null
@@ -182,10 +182,10 @@ ${continueBlock}
182
182
 
183
183
  === Resume protocol ===
184
184
 
185
- 1. **Read .soly/docs/ first** — the project's 0-point intent. Pickup is meaningless without knowing what the user is building toward.
186
- 2. Read .soly/STATE.md to confirm current position (the handoff may be stale).
187
- 3. Read .soly/ROADMAP.md and any CONTEXT.md / RESEARCH.md for the active phase.
188
- 4. Compare handoff's "work remaining" with the actual repo state (git status, recent commits, .soly/ files).
185
+ 1. **Read .agents/docs/ first** — the project's 0-point intent. Pickup is meaningless without knowing what the user is building toward.
186
+ 2. Read .agents/STATE.md to confirm current position (the handoff may be stale).
187
+ 3. Read .agents/ROADMAP.md and any CONTEXT.md / RESEARCH.md for the active phase.
188
+ 4. Compare handoff's "work remaining" with the actual repo state (git status, recent commits, .agents/ files).
189
189
  5. Produce a one-screen "Where we are" summary:
190
190
  - current phase + plan
191
191
  - what's actually been done (verified via filesystem / git)
@@ -10,7 +10,7 @@ canonical CONTEXT.md. For design/architecture forks you may reach for
10
10
  markdown is background context, not a strict protocol.</purpose>
11
11
 
12
12
  <path_discipline>
13
- **All soly-managed files live under `.soly/`.** CONTEXT.md, RESEARCH.md, and the discuss checkpoint all go in `.soly/phases/<NN>-<slug>/`. Never write these to the project root. Use absolute paths.
13
+ **All soly-managed files live under `.agents/`.** CONTEXT.md, RESEARCH.md, and the discuss checkpoint all go in `.agents/phases/<NN>-<slug>/`. Never write these to the project root. Use absolute paths.
14
14
 
15
15
  The iteration context file (path given by the parent in the task prompt) is your single source of truth for intent, STATE, ROADMAP, and any existing phase artifacts. Read it FIRST.
16
16
  </path_discipline>
@@ -36,7 +36,7 @@ The iteration context file (path given by the parent in the task prompt) is your
36
36
  **Resume:** if a checkpoint file exists, the parent detects it and tells you to resume from where the prior session left off. Acknowledge locked decisions at the top of your output, then continue with the next un-answered gray area.
37
37
  </interactive_flow>
38
38
 
39
- <read_first>`.soly/docs/` (INTENT, 0-point) · `.soly/STATE.md` · `.soly/ROADMAP.md` · `${PHASE_DIR}/*-CONTEXT.md` if exists (refine, don't re-derive) · `${PHASE_DIR}/*-DISCUSS-CHECKPOINT.json` if exists (resume from `areas_completed`)</read_first>
39
+ <read_first>`.agents/docs/` (INTENT, 0-point) · `.agents/STATE.md` · `.agents/ROADMAP.md` · `${PHASE_DIR}/*-CONTEXT.md` if exists (refine, don't re-derive) · `${PHASE_DIR}/*-DISCUSS-CHECKPOINT.json` if exists (resume from `areas_completed`)</read_first>
40
40
 
41
41
  <philosophy>
42
42
  **User = visionary. Worker = builder.** The user knows: how it should feel, what's essential vs nice-to-have, specific references. The user doesn't know (don't ask): codebase patterns, technical risks, implementation approach, success metrics.
@@ -90,7 +90,7 @@ PHASE=$1
90
90
  # Worker subagent inherits the parent's cwd (the project root), so
91
91
  # `pwd` IS the project root. The previous `cd .. && pwd` was a bug.
92
92
  PROJECT_ROOT="$(pwd)"
93
- SOLY_DIR="$PROJECT_ROOT/.soly"
93
+ SOLY_DIR="$PROJECT_ROOT/.agents"
94
94
  PHASE_DIR=$(ls -d "$SOLY_DIR/phases/"*"-$PHASE-"* 2>/dev/null | head -1) || { echo "Phase $PHASE not found" >&2; exit 1; }
95
95
  PADDED_PHASE=$(printf "%02d" "$(echo "$PHASE" | grep -oE '^[0-9]+' | sed 's/^0*//')")
96
96
  PHASE_SLUG=$(basename "$PHASE_DIR")
@@ -137,7 +137,7 @@ If you cannot answer from `.continue-here.md`, return `## Clarifications Needed`
137
137
  [ -f "$SOLY_DIR/DECISIONS-INDEX.md" ] && echo "DECISIONS-INDEX.md (prefer over per-phase if present)"
138
138
  ```
139
139
 
140
- Most-recent 3 prior `*-CONTEXT.md` files (prefer DECISIONS-INDEX if present). Extract `<decisions>`, `<specifics>`, and patterns (e.g., "user prefers minimal UI"). If `.soly/spikes/MANIFEST.md` or `.soly/sketches/MANIFEST.md` exist with `WRAPPED: true` frontmatter, read as validated findings.
140
+ Most-recent 3 prior `*-CONTEXT.md` files (prefer DECISIONS-INDEX if present). Extract `<decisions>`, `<specifics>`, and patterns (e.g., "user prefers minimal UI"). If `.agents/spikes/MANIFEST.md` or `.agents/sketches/MANIFEST.md` exist with `WRAPPED: true` frontmatter, read as validated findings.
141
141
 
142
142
  **6. Cross-reference todos.** (Worker doesn't have `soly_todos`; use `bash` + `grep` with phase-domain keywords.)
143
143
 
@@ -217,9 +217,9 @@ Requirements locked by SPEC.md. Do not re-litigate.
217
217
  </decisions>
218
218
 
219
219
  <canonical_refs> <!-- MANDATORY -->
220
- - `.soly/docs/<file>` — <why>
221
- - `.soly/features/<feat>/README.md` — <why>
222
- - `.soly/contracts/<file>` — <why>
220
+ - `.agents/docs/<file>` — <why>
221
+ - `.agents/features/<feat>/README.md` — <why>
222
+ - `.agents/contracts/<file>` — <why>
223
223
  - (no external docs referenced) <!-- only if literally none -->
224
224
  </canonical_refs>
225
225
 
@@ -289,8 +289,8 @@ Update after every round. Delete after `write_context` succeeds.
289
289
  <hard_rules>
290
290
  - No production code. Discussion/planning only.
291
291
  - No PLAN.md from this workflow — that's `soly plan`.
292
- - Don't assume missing intent. If `.soly/docs/` is silent, ask.
292
+ - Don't assume missing intent. If `.agents/docs/` is silent, ask.
293
293
  - No scope creep. Deferred ideas → `<deferred_ideas>`, not decisions.
294
- - No subagents (you ARE one). No `.soly/rules/` edits.
294
+ - No subagents (you ARE one). No `.agents/rules/` edits.
295
295
  - Return: structured output per output_protocol + checkpoint updates. Parent relays to user.
296
296
  </hard_rules>
@@ -3,12 +3,12 @@
3
3
  <purpose>Execute all plans in a phase, wave by wave. Per plan, follow `execute-plan.md` inline. Update STATE.md between plans. Generate a phase-level VERIFICATION.md at the end. You ARE the executor (`maxSubagentDepth: 1` is enforced — no sub-sub-agents). Checkpoint requests return a structured block; parent relays to user; next `soly execute <N>` resumes from `.execute-checkpoint.json`.</purpose>
4
4
 
5
5
  <path_discipline>
6
- **All soly-managed files live under `.soly/`.** Never write PLAN.md, CONTEXT.md, RESEARCH.md, SUMMARY.md, iteration files, or handoffs to the project root. All phase files go in `.soly/phases/<NN>-<slug>/`. Use absolute paths (or paths starting with `$SOLY_DIR`) — never bare relative names that could land in cwd.
6
+ **All soly-managed files live under `.agents/`.** Never write PLAN.md, CONTEXT.md, RESEARCH.md, SUMMARY.md, iteration files, or handoffs to the project root. All phase files go in `.agents/phases/<NN>-<slug>/`. Use absolute paths (or paths starting with `$SOLY_DIR`) — never bare relative names that could land in cwd.
7
7
 
8
8
  The iteration context file (path given by the parent in the task prompt) is your single source of truth for intent, STATE, ROADMAP, and any existing phase artifacts. Read it FIRST, before any of your own `read` or `ls` calls.
9
9
  </path_discipline>
10
10
 
11
- <read_first>`.soly/STATE.md` (single source of truth for "where am I") · `.soly/ROADMAP.md` (phase goal + reqs) · `.soly/docs/` (INTENT, re-read before each plan) · the phase directory: list PLAN.md sorted, plus any SUMMARY.md / CONTEXT.md / RESEARCH.md / `.execute-checkpoint.json`. If `.soly/` missing → stop + error.</read_first>
11
+ <read_first>`.agents/STATE.md` (single source of truth for "where am I") · `.agents/ROADMAP.md` (phase goal + reqs) · `.agents/docs/` (INTENT, re-read before each plan) · the phase directory: list PLAN.md sorted, plus any SUMMARY.md / CONTEXT.md / RESEARCH.md / `.execute-checkpoint.json`. If `.agents/` missing → stop + error.</read_first>
12
12
 
13
13
  <core_principle>
14
14
  **Orchestrate, don't re-specify.** Each PLAN.md is the contract; `execute-plan.md` is the per-plan protocol. This file adds: wave grouping, state transitions between plans, phase-level aggregation (VERIFICATION.md), safe resumption from partial state. The full per-plan steps live in `execute-plan.md` — read it once, then apply per plan.
@@ -28,7 +28,7 @@ PHASE="$1"
28
28
  # would fall back to the `write` tool with a relative path, polluting
29
29
  # the project root).
30
30
  PROJECT_ROOT="$(pwd)"
31
- SOLY_DIR="$PROJECT_ROOT/.soly"
31
+ SOLY_DIR="$PROJECT_ROOT/.agents"
32
32
  PHASE_DIR=$(ls -d "$SOLY_DIR/phases/"*"-$PHASE-"* 2>/dev/null | head -1) || { echo "Phase $PHASE not found" >&2; exit 1; }
33
33
  PADDED_PHASE=$(printf "%02d" "$(echo "$PHASE" | grep -oE '^[0-9]+' | sed 's/^0*//')")
34
34
  PHASE_SLUG=$(basename "$PHASE_DIR")
@@ -190,7 +190,7 @@ phase: <N> phase_slug: <slug> status: pending generated: <ISO>
190
190
  </process>
191
191
 
192
192
  <hard_rules>
193
- - No `.soly/rules/` edits. No subagents (`maxSubagentDepth: 1`).
193
+ - No `.agents/rules/` edits. No subagents (`maxSubagentDepth: 1`).
194
194
  - No silent skip of partial-state plans — surface and stop.
195
195
  - No flipping VERIFICATION.md to `passed` yourself.
196
196
  - No silent architectural decisions — use `execute-plan.md`'s Rule 4 + checkpoint.
@@ -3,12 +3,12 @@
3
3
  <purpose>Execute one PLAN.md, produce a matching SUMMARY.md, update STATE.md/ROADMAP.md. Single worker — no sub-subagents.</purpose>
4
4
 
5
5
  <path_discipline>
6
- **All soly-managed files live under `.soly/`.** Never write PLAN.md, CONTEXT.md, RESEARCH.md, SUMMARY.md, iteration files, or handoffs to the project root. All phase files go in `.soly/phases/<NN>-<slug>/`. Use absolute paths (or paths starting with `$SOLY_DIR`) — never bare relative names that could land in cwd.
6
+ **All soly-managed files live under `.agents/`.** Never write PLAN.md, CONTEXT.md, RESEARCH.md, SUMMARY.md, iteration files, or handoffs to the project root. All phase files go in `.agents/phases/<NN>-<slug>/`. Use absolute paths (or paths starting with `$SOLY_DIR`) — never bare relative names that could land in cwd.
7
7
 
8
8
  The iteration context file (path given by the parent in the task prompt) is your single source of truth for intent, STATE, ROADMAP, phase CONTEXT/RESEARCH, prior SUMMARYs, and (section 6) the current PLAN. Read it FIRST.
9
9
  </path_discipline>
10
10
 
11
- <read_first>`.soly/STATE.md` · `.soly/ROADMAP.md` · `PLAN.md` (the contract) · `<phase>-CONTEXT.md` if exists (honor user decisions) · `<phase>-RESEARCH.md` if exists (use chosen libs/patterns). If `.soly/` missing → stop + error.</read_first>
11
+ <read_first>`.agents/STATE.md` · `.agents/ROADMAP.md` · `PLAN.md` (the contract) · `<phase>-CONTEXT.md` if exists (honor user decisions) · `<phase>-RESEARCH.md` if exists (use chosen libs/patterns). If `.agents/` missing → stop + error.</read_first>
12
12
 
13
13
  <atomic_close_out>
14
14
  **Only legal close-out order:** `production-code commit(s) → SUMMARY commit → STATE/ROADMAP update`.
@@ -24,7 +24,7 @@ PHASE="$1"; PLAN="$2" # PLAN optional — defaults to next unfinished
24
24
  # Worker subagent inherits the parent's cwd (the project root), so
25
25
  # `pwd` IS the project root. The previous `cd .. && pwd` was a bug.
26
26
  PROJECT_ROOT="$(pwd)"
27
- SOLY_DIR="$PROJECT_ROOT/.soly"
27
+ SOLY_DIR="$PROJECT_ROOT/.agents"
28
28
  PHASE_DIR=$(ls -d "$SOLY_DIR/phases/"*"-$PHASE-"* 2>/dev/null | head -1) || { echo "Phase $PHASE not found" >&2; exit 1; }
29
29
  PADDED_PHASE=$(printf "%02d" "$(echo "$PHASE" | grep -oE '^[0-9]+' | sed 's/^0*//')")
30
30
  PHASE_SLUG=$(basename "$PHASE_DIR")
@@ -60,7 +60,7 @@ PARTIAL_PLAN=$([ "$COMMIT_COUNT" -gt 0 ] && [ "$SUMMARY_EXISTS" = false ] && ech
60
60
  **5. Execute tasks in order.** Per task:
61
61
 
62
62
  1. **Read first** — open every `<read_first>` file.
63
- 2. **Implement** — minimal correct change, follow project patterns. No speculative scaffolding. No `.soly/rules/` edits.
63
+ 2. **Implement** — minimal correct change, follow project patterns. No speculative scaffolding. No `.agents/rules/` edits.
64
64
  3. **Verify acceptance criteria (HARD GATE):**
65
65
  - Run the grep/file-check/CLI for each criterion in `<acceptance_criteria>`.
66
66
  - Log PASS/FAIL with output. If ANY fails → fix immediately, re-run ALL.
@@ -123,7 +123,7 @@ Can't talk to user directly. Stop, return structured block, parent relays.
123
123
 
124
124
  **9. Pre-commit hook failure:**
125
125
  1. `git commit` fails with hook error. 2. Read error — names hook + what failed. 3. Fix (type/lint/secret). 4. `git add` fixed. 5. Retry. 6. Budget 1–2 cycles per commit. If still failing → `type: "human-action"` checkpoint with hook output.
126
- **Do NOT use `--no-verify`** unless project's `.soly/docs/` or ROADMAP.md explicitly opts out.
126
+ **Do NOT use `--no-verify`** unless project's `.agents/docs/` or ROADMAP.md explicitly opts out.
127
127
 
128
128
  **10. Verification failure gate:** 1st retry (hooks flake) → 2nd retry (fix obvious cause) → 3rd retry (apply deviation rules) → 3+ fails → `type: "decision"` checkpoint, STOP.
129
129
 
@@ -212,7 +212,7 @@ git commit -m "chore(${PADDED_PHASE}-${PLAN_NUM}): complete plan <N>"
212
212
  - Bump `current_plan` in "Current Position".
213
213
  - Add `key-decisions` to "Decisions" table (skip if trivial).
214
214
  - Update `last_updated`.
215
- - Keep < 150 lines — archive long-form to `.soly/DECISIONS-INDEX.md` if it grows.
215
+ - Keep < 150 lines — archive long-form to `.agents/DECISIONS-INDEX.md` if it grows.
216
216
 
217
217
  **Update ROADMAP.md** — phase's progress row: increment completed plan count; status → `In Progress` (more plans) or `Complete` (last) with date.
218
218
 
@@ -222,7 +222,7 @@ git commit -m "chore(${PADDED_PHASE}-${PLAN_NUM}): complete plan <N>"
222
222
  REQUIREMENTS=$(grep -A1 "^requirements:" "$PLAN_PATH" | tail -1 | sed -E 's/.*\[([^]]+)\].*/\1/' | tr ',' ' ')
223
223
  ```
224
224
 
225
- For each ID, find line in `.soly/REQUIREMENTS.md`, flip status to `Complete`.
225
+ For each ID, find line in `.agents/REQUIREMENTS.md`, flip status to `Complete`.
226
226
 
227
227
  **15. Return:**
228
228
 
@@ -241,7 +241,7 @@ For each ID, find line in `.soly/REQUIREMENTS.md`, flip status to `Complete`.
241
241
  </process>
242
242
 
243
243
  <hard_rules>
244
- - No `.soly/rules/` edits. No `.soly/docs/` edits without explicit user decision in conversation.
244
+ - No `.agents/rules/` edits. No `.agents/docs/` edits without explicit user decision in conversation.
245
245
  - No subagents (you ARE one). `maxSubagentDepth: 1` is enforced.
246
246
  - **Never skip `<acceptance_criteria>` HARD GATE.** Not optional.
247
247
  - **Never emit narrative between SUMMARY `write` and `git commit`** (truncation is a known failure mode).
@@ -1,14 +1,14 @@
1
1
  # Execute Task
2
2
 
3
- <purpose>Execute ONE task (atomic unit — a feature slice, one endpoint, one page, one contract wire). Produce SUMMARY.md. Tasks live under `.soly/features/<feature>/tasks/<task-id>/` with PLAN.md as the contract.</purpose>
3
+ <purpose>Execute ONE task (atomic unit — a feature slice, one endpoint, one page, one contract wire). Produce SUMMARY.md. Tasks live under `.agents/features/<feature>/tasks/<task-id>/` with PLAN.md as the contract.</purpose>
4
4
 
5
5
  <path_discipline>
6
- **All soly-managed files live under `.soly/`.** Never write PLAN.md, SUMMARY.md, iteration files, or handoffs to the project root. Task files go in `.soly/features/<feature>/tasks/<task-id>/`. Use absolute paths — never bare relative names that could land in cwd.
6
+ **All soly-managed files live under `.agents/`.** Never write PLAN.md, SUMMARY.md, iteration files, or handoffs to the project root. Task files go in `.agents/features/<feature>/tasks/<task-id>/`. Use absolute paths — never bare relative names that could land in cwd.
7
7
 
8
8
  The iteration context file (path given by the parent in the task prompt) is your single source of truth for intent, STATE, the feature README, prior task SUMMARYs, and the current task PLAN. Read it FIRST.
9
9
  </path_discipline>
10
10
 
11
- <read_first>`.soly/STATE.md` · `.soly/docs/` (INTENT, 0-point) · `.soly/features/<feature>/README.md` · `PLAN.md` (the contract) · `.soly/contracts/*` if PLAN.md references it. If `.soly/features/` or task dir missing → error + stop, do not invent paths.</read_first>
11
+ <read_first>`.agents/STATE.md` · `.agents/docs/` (INTENT, 0-point) · `.agents/features/<feature>/README.md` · `PLAN.md` (the contract) · `.agents/contracts/*` if PLAN.md references it. If `.agents/features/` or task dir missing → error + stop, do not invent paths.</read_first>
12
12
 
13
13
  <task_frontmatter>
14
14
  PLAN.md frontmatter (executor must respect all fields; **flag** incomplete ones in your report, don't silently fill):
@@ -46,13 +46,13 @@ STATUS=$(awk '/^---$/{c++; next} c==1{print}' "$TASK_DIR/PLAN.md" | grep -E '^st
46
46
 
47
47
  If not → return `## Blocker` to parent, stop. Do NOT start a blocked task.
48
48
 
49
- **2. Read intent + feature context.** **0-POINT CHECK** — the iteration context file (path given in the task prompt) already contains the intent docs as a summary, the feature README, prior task SUMMARYs, and the current task PLAN. Use that. If intent and PLAN.md conflict, flag it. Read `.soly/contracts/*` (if it exists) only if the task touches API surfaces.
49
+ **2. Read intent + feature context.** **0-POINT CHECK** — the iteration context file (path given in the task prompt) already contains the intent docs as a summary, the feature README, prior task SUMMARYs, and the current task PLAN. Use that. If intent and PLAN.md conflict, flag it. Read `.agents/contracts/*` (if it exists) only if the task touches API surfaces.
50
50
 
51
51
  **3. Execute** with standard worker self-audit:
52
52
 
53
53
  1. Write code.
54
54
  2. Run build / typecheck / lint — **0 warnings**.
55
- 3. Cross-check diff against `.soly/rules/coding/*` (or `.editorconfig`).
55
+ 3. Cross-check diff against `.agents/rules/coding/*` (or `.editorconfig`).
56
56
  4. **Rule gap?** Invoke the project's rule-authoring skill (`analyzer-coach` or equivalent) — it proposes an `.editorconfig` entry, a coding-rule doc addition, or a custom-analyzer rule. Loop until clean, max 3 iterations.
57
57
  5. Commit production-code changes (one or more commits).
58
58
 
@@ -101,7 +101,7 @@ You may combine into one commit, but the SUMMARY must be on disk before the fron
101
101
  </process>
102
102
 
103
103
  <hard_rules>
104
- - No `.soly/rules/` edits. No subagents (you ARE one).
104
+ - No `.agents/rules/` edits. No subagents (you ARE one).
105
105
  - No starting tasks with un-`done` `depends-on:`.
106
106
  - If rule gap → add via the rule-authoring skill. **No silent workarounds** (`#pragma`, `severity = none`).
107
107
  - Return: changed files, commands + exit codes, validation evidence, surprises, decisions needing parent approval.
@@ -112,5 +112,5 @@ You may combine into one commit, but the SUMMARY must be on disk before the fron
112
112
  </interactive_rules_out_of_scope>
113
113
 
114
114
  <dual_mode_note>
115
- Project may also have `.soly/phases/` (phase-based layout, distinct from task-based). You are only responsible for this task. Don't touch phases. Don't modify ROADMAP.md or STATE.md beyond what your close-out requires (typically nothing for tasks — the parent updates those).
115
+ Project may also have `.agents/phases/` (phase-based layout, distinct from task-based). You are only responsible for this task. Don't touch phases. Don't modify ROADMAP.md or STATE.md beyond what your close-out requires (typically nothing for tasks — the parent updates those).
116
116
  </dual_mode_note>
@@ -1,36 +1,36 @@
1
1
  # Pause Work
2
2
 
3
- <purpose>Create `.soly/HANDOFF.json` (machine-readable) and a `.continue-here.md` (human-readable) to preserve work state across sessions. `soly resume` consumes both.</purpose>
3
+ <purpose>Create `.agents/HANDOFF.json` (machine-readable) and a `.continue-here.md` (human-readable) to preserve work state across sessions. `soly resume` consumes both.</purpose>
4
4
 
5
- <read_first>.soly/STATE.md (current position) · the most recent `.soly/phases/*/SUMMARY.md` if any</read_first>
5
+ <read_first>.agents/STATE.md (current position) · the most recent `.agents/phases/*/SUMMARY.md` if any</read_first>
6
6
 
7
7
  <process>
8
8
 
9
- **1. Detect context.** First match wins; nothing detectable → `.soly/.continue-here.md` (note ambiguity in `<current_state>`).
9
+ **1. Detect context.** First match wins; nothing detectable → `.agents/.continue-here.md` (note ambiguity in `<current_state>`).
10
10
 
11
11
  ```bash
12
- phase=$(ls -t .soly/phases/*/PLAN.md 2>/dev/null | head -1)
12
+ phase=$(ls -t .agents/phases/*/PLAN.md 2>/dev/null | head -1)
13
13
  phase_slug=$(echo "$phase" | grep -oP 'phases/\K[^/]+')
14
- spike=$(ls -td .soly/spikes/*/ 2>/dev/null | head -1)
15
- sketch=$(ls -td .soly/sketches/*/ 2>/dev/null | head -1)
16
- deliberation=$(ls .soly/deliberations/*.md 2>/dev/null | head -1)
14
+ spike=$(ls -td .agents/spikes/*/ 2>/dev/null | head -1)
15
+ sketch=$(ls -td .agents/sketches/*/ 2>/dev/null | head -1)
16
+ deliberation=$(ls .agents/deliberations/*.md 2>/dev/null | head -1)
17
17
  ```
18
18
 
19
19
  | detected | handoff path |
20
20
  |---|---|
21
- | phase_slug | `.soly/phases/<phase_slug>/.continue-here.md` |
22
- | spike | `.soly/spikes/<spike_slug>/.continue-here.md` |
23
- | sketch | `.soly/sketches/<sketch_slug>/.continue-here.md` |
24
- | deliberation | `.soly/deliberations/.continue-here.md` |
25
- | (notes only) | `.soly/.continue-here.md` |
21
+ | phase_slug | `.agents/phases/<phase_slug>/.continue-here.md` |
22
+ | spike | `.agents/spikes/<spike_slug>/.continue-here.md` |
23
+ | sketch | `.agents/sketches/<sketch_slug>/.continue-here.md` |
24
+ | deliberation | `.agents/deliberations/.continue-here.md` |
25
+ | (notes only) | `.agents/.continue-here.md` |
26
26
 
27
27
  **2. Gather state.** Walk the conversation + recent diffs. Collect: current position (phase/plan/task + paths), work done this session (artifacts, not aspirations), work remaining, decisions (only those future-you must not re-litigate), blockers, human actions pending (API keys, approvals, manual tests), background processes, uncommitted files (`git status --porcelain`), and blocking constraints (anti-patterns discovered through actual failure — each tagged `blocking` or `advisory`).
28
28
 
29
29
  If anything is ambiguous, return a `## Clarifications Needed` block — do not invent.
30
30
 
31
- **3. Check for false completions.** `grep -l "To be filled\|placeholder\|TBD" .soly/phases/*/*.md 2>/dev/null` — report matches as incomplete.
31
+ **3. Check for false completions.** `grep -l "To be filled\|placeholder\|TBD" .agents/phases/*/*.md 2>/dev/null` — report matches as incomplete.
32
32
 
33
- **4. Write `.soly/HANDOFF.json`.** Timestamp via `date -u +"%Y-%m-%dT%H:%M:%SZ"` (no SDK).
33
+ **4. Write `.agents/HANDOFF.json`.** Timestamp via `date -u +"%Y-%m-%dT%H:%M:%SZ"` (no SDK).
34
34
 
35
35
  ```json
36
36
  {
@@ -98,7 +98,7 @@ _If none, remove this section._
98
98
 
99
99
  ## Required Reading (in order)
100
100
  1. <doc> — <why>
101
- 2. `.soly/METHODOLOGY.md` if it exists — project lenses
101
+ 2. `.agents/METHODOLOGY.md` if it exists — project lenses
102
102
 
103
103
  ## Infrastructure State
104
104
  - <service/env>: <state>
@@ -117,14 +117,14 @@ Specific enough that a fresh worker can resume without re-deriving from git hist
117
117
 
118
118
  **6. Commit:**
119
119
  ```bash
120
- git add .soly/HANDOFF.json <handoff-md-path>
120
+ git add .agents/HANDOFF.json <handoff-md-path>
121
121
  git commit -m "chore(soly): pause work — create handoff"
122
122
  ```
123
123
 
124
124
  **7. Return:**
125
125
  ```
126
126
  Handoff created:
127
- - .soly/HANDOFF.json
127
+ - .agents/HANDOFF.json
128
128
  - <handoff-md-path>
129
129
  State: <context>, <location>, task <x>/<m>, in_progress, <n> blockers (<m> human)
130
130
  Resume: `soly resume`
@@ -136,7 +136,7 @@ Resume: `soly resume`
136
136
  - No production code. Handoff only.
137
137
  - A summary with `TBD`/`placeholder`/`To be filled` is incomplete — report it.
138
138
  - `null` is JSON `null`, not the string `"null"`.
139
- - Do not modify `.soly/rules/`. Do not run subagents (you ARE one).
139
+ - Do not modify `.agents/rules/`. Do not run subagents (you ARE one).
140
140
  - Commit message: `chore(soly): pause work — create handoff`.
141
141
  - Return: paths, state summary, blocker count, `soly resume` command.
142
142
  </hard_rules>
@@ -3,12 +3,12 @@
3
3
  <purpose>Produce one or more PLAN.md files for a phase — each a self-contained contract (requirements, must_haves, tasks with runnable acceptance criteria) the executor can run standalone. Pre-compute wave numbers encoding the dependency graph. Update STATE.md.</purpose>
4
4
 
5
5
  <path_discipline>
6
- **All soly-managed files live under `.soly/`.** Never write PLAN.md, CONTEXT.md, RESEARCH.md, SUMMARY.md, iteration files, or handoffs to the project root. All phase files go in `.soly/phases/<NN>-<slug>/`. Use absolute paths (or paths starting with `$SOLY_DIR`) — never bare relative names that could land in cwd.
6
+ **All soly-managed files live under `.agents/`.** Never write PLAN.md, CONTEXT.md, RESEARCH.md, SUMMARY.md, iteration files, or handoffs to the project root. All phase files go in `.agents/phases/<NN>-<slug>/`. Use absolute paths (or paths starting with `$SOLY_DIR`) — never bare relative names that could land in cwd.
7
7
 
8
8
  The iteration context file (path given by the parent in the task prompt) is your single source of truth for intent, STATE, ROADMAP, and any existing phase artifacts. Read it FIRST, before any of your own `read` or `ls` calls.
9
9
  </path_discipline>
10
10
 
11
- <read_first>`.soly/docs/` (INTENT, 0-point) · `.soly/STATE.md` (current position) · `.soly/ROADMAP.md` (this phase's row) · `.soly/REQUIREMENTS.md` if exists · `<phase>-CONTEXT.md` if exists (user decisions from `soly discuss`) · `<phase>-RESEARCH.md` if exists (chosen libs/patterns) · up to 3 most recent prior `*-SUMMARY.md` (avoid re-implementing). If `.soly/` missing → stop + error.</read_first>
11
+ <read_first>`.agents/docs/` (INTENT, 0-point) · `.agents/STATE.md` (current position) · `.agents/ROADMAP.md` (this phase's row) · `.agents/REQUIREMENTS.md` if exists · `<phase>-CONTEXT.md` if exists (user decisions from `soly discuss`) · `<phase>-RESEARCH.md` if exists (chosen libs/patterns) · up to 3 most recent prior `*-SUMMARY.md` (avoid re-implementing). If `.agents/` missing → stop + error.</read_first>
12
12
 
13
13
  <git_branch_invariant>
14
14
  **Do not create, rename, or switch git branches.** The branch was established at `soly discuss` and is owned by the user's git workflow. Verify the current branch matches expectations, but do NOT change it.
@@ -81,7 +81,7 @@ PHASE="$1"
81
81
  # would fall back to the `write` tool with a relative path, polluting
82
82
  # the project root).
83
83
  PROJECT_ROOT="$(pwd)"
84
- SOLY_DIR="$PROJECT_ROOT/.soly"
84
+ SOLY_DIR="$PROJECT_ROOT/.agents"
85
85
  PHASE_DIR=$(ls -d "$SOLY_DIR/phases/"*"-$PHASE-"* 2>/dev/null | head -1) || { echo "Phase $PHASE not found" >&2; exit 1; }
86
86
  PADDED_PHASE=$(printf "%02d" "$(echo "$PHASE" | grep -oE '^[0-9]+' | sed 's/^0*//')")
87
87
  PHASE_SLUG=$(basename "$PHASE_DIR")
@@ -103,8 +103,8 @@ HAS_SUMMARIES=$(ls "$PHASE_DIR"/${PADDED_PHASE}-*-SUMMARY.md 2>/dev/null | wc -l
103
103
  **3. Read phase context** (also in the iteration file) in priority order:
104
104
  1. `<phase>-CONTEXT.md` if exists — user decisions, honor them. Missing decision in an area you need to plan → surface in report.
105
105
  2. `<phase>-RESEARCH.md` if exists — chosen libs/patterns. Pitfalls → Must Haves or task body.
106
- 3. `.soly/ROADMAP.md` — this phase's row: goal, requirements, deps on other phases.
107
- 4. `.soly/REQUIREMENTS.md` if exists — full text + acceptance criteria for each `phase_req_ids`. Every requirement → some plan's `requirements:` array.
106
+ 3. `.agents/ROADMAP.md` — this phase's row: goal, requirements, deps on other phases.
107
+ 4. `.agents/REQUIREMENTS.md` if exists — full text + acceptance criteria for each `phase_req_ids`. Every requirement → some plan's `requirements:` array.
108
108
  5. Up to 3 most recent prior `*-SUMMARY.md` — what was already built.
109
109
 
110
110
  **4. Decompose into plans.**
@@ -156,7 +156,7 @@ git commit -m "chore(${PADDED_PHASE}): plan phase <N> — <M> plan(s)"
156
156
  - Phase status → `Planned`, `current_plan` → 1.
157
157
  - `last_updated` → `date -u +"%Y-%m-%dT%H:%M:%SZ"`.
158
158
  - If STATE.md has `progress:`, increment `total_plans` by new plan count.
159
- - Keep < 150 lines — archive to `.soly/DECISIONS-INDEX.md` if it grows.
159
+ - Keep < 150 lines — archive to `.agents/DECISIONS-INDEX.md` if it grows.
160
160
 
161
161
  **9. Report:**
162
162
 
@@ -188,7 +188,7 @@ Parent summarizes + asks confirmation. On confirm: `soly execute-plan <N>` (or `
188
188
 
189
189
  <hard_rules>
190
190
  - No production code. Planning only.
191
- - No subagents (you ARE one). No `.soly/rules/` edits. No `.soly/docs/` edits without surfacing to parent.
191
+ - No subagents (you ARE one). No `.agents/rules/` edits. No `.agents/docs/` edits without surfacing to parent.
192
192
  - No git branch create/rename/switch.
193
193
  - `must_haves` (truths/artifacts/key_links) is NOT optional — executor relies on it for self-verification.
194
194
  - Every acceptance criterion is RUNNABLE — command/check/test, not "works correctly" or "feels right".
@@ -1,10 +1,10 @@
1
1
  # Plan Task Workflow
2
2
 
3
- # Всегда соблюдай правила проекта из .soly/rules/
3
+ # Всегда соблюдай правила проекта из .agents/rules/
4
4
  # Не используй shortcuts ради скорости
5
5
 
6
6
  <path_discipline>
7
- **All soly-managed files live under `.soly/`.** PLAN.md lives at `.soly/features/<feature>/tasks/<task-id>/PLAN.md`. Never write plan files to the project root. Use absolute paths.
7
+ **All soly-managed files live under `.agents/`.** PLAN.md lives at `.agents/features/<feature>/tasks/<task-id>/PLAN.md`. Never write plan files to the project root. Use absolute paths.
8
8
 
9
9
  The iteration context file (path given by the parent in the task prompt) is your single source of truth for intent, STATE, the feature README, prior task SUMMARYs, and the current task PLAN (for refinement). Read it FIRST.
10
10
  </path_discipline>
@@ -18,14 +18,14 @@ executor can pick it up standalone.
18
18
 
19
19
  <required_reading>
20
20
  Before any planning, read:
21
- 1. .soly/docs/ — INTENT (0-point)
22
- 2. .soly/STATE.md — current state
23
- 3. .soly/ROADMAP.md — high-level requirements
24
- 4. .soly/features/<feature>/README.md — feature context
25
- 5. .soly/contracts/* — shared API schemas (if any)
21
+ 1. .agents/docs/ — INTENT (0-point)
22
+ 2. .agents/STATE.md — current state
23
+ 3. .agents/ROADMAP.md — high-level requirements
24
+ 4. .agents/features/<feature>/README.md — feature context
25
+ 5. .agents/contracts/* — shared API schemas (if any)
26
26
  6. The task's existing PLAN.md (if refining) or relevant sibling tasks (if creating)
27
27
 
28
- If `.soly/features/` is empty for the target feature, error and stop.
28
+ If `.agents/features/` is empty for the target feature, error and stop.
29
29
  Do not invent feature paths.
30
30
  </required_reading>
31
31
 
@@ -36,7 +36,7 @@ PLAN.md starts with a YAML frontmatter block. The executor depends on it.
36
36
  ---
37
37
  id: auth-be-login-a3f9 # slug-4hex, must match the directory name
38
38
  kind: be # be | fe | infra | docs | integration
39
- feature: auth # parent feature name (must match .soly/features/<feature>/)
39
+ feature: auth # parent feature name (must match .agents/features/<feature>/)
40
40
  status: ready # ready | in-progress | blocked | done
41
41
  priority: high # high | medium | low
42
42
  parallelizable: true # whether this task can run alongside other parallel tasks
@@ -68,7 +68,7 @@ If unclear, error and ask the parent.
68
68
  </step>
69
69
 
70
70
  <step name="read_intent" priority="first">
71
- **0-POINT CHECK.** Re-read `.soly/docs/` (intent docs) before any planning.
71
+ **0-POINT CHECK.** Re-read `.agents/docs/` (intent docs) before any planning.
72
72
  The task PLAN.md is the contract; intent docs are the WHY. If you find
73
73
  a conflict, flag it instead of silently choosing.
74
74
 
@@ -79,13 +79,13 @@ read it directly from its path.
79
79
  </step>
80
80
 
81
81
  <step name="read_feature">
82
- Read `.soly/features/<feature>/README.md` for feature-level context.
82
+ Read `.agents/features/<feature>/README.md` for feature-level context.
83
83
  If missing, note it but proceed (the parent may not have written one yet).
84
84
  </step>
85
85
 
86
86
  <step name="check_contracts">
87
87
  If the task touches API surfaces (BE endpoints, FE request shapes, shared
88
- types), read `.soly/contracts/<feature>.openapi.yaml` or similar. Contracts
88
+ types), read `.agents/contracts/<feature>.openapi.yaml` or similar. Contracts
89
89
  are the synchronizing artifact between parallel BE and FE tasks.
90
90
  </step>
91
91
 
@@ -137,13 +137,13 @@ For new-task, commit the new PLAN.md:
137
137
  ```
138
138
  # Use absolute path with `cd "$PROJECT_ROOT"` so git doesn't interpret
139
139
  # a bare relative path as cwd-relative.
140
- cd "$PROJECT_ROOT" && git add .soly/features/<feature>/tasks/<id>/PLAN.md
140
+ cd "$PROJECT_ROOT" && git add .agents/features/<feature>/tasks/<id>/PLAN.md
141
141
  git commit -m "chore(tasks): plan <id>"
142
142
  ```
143
143
 
144
144
  For existing-task refinement, commit only if material change:
145
145
  ```
146
- cd "$PROJECT_ROOT" && git add .soly/features/<feature>/tasks/<id>/PLAN.md
146
+ cd "$PROJECT_ROOT" && git add .agents/features/<feature>/tasks/<id>/PLAN.md
147
147
  git commit -m "chore(tasks): refine plan <id>"
148
148
  ```
149
149
 
@@ -152,7 +152,7 @@ If nothing material changed, do not commit.
152
152
  **Worker bash setup (when you do need it):**
153
153
  ```bash
154
154
  PROJECT_ROOT="$(pwd)" # worker inherits parent cwd = project root
155
- SOLY_DIR="$PROJECT_ROOT/.soly"
155
+ SOLY_DIR="$PROJECT_ROOT/.agents"
156
156
  ```
157
157
  </step>
158
158
 
@@ -172,14 +172,14 @@ Return to parent:
172
172
  - Preserve existing frontmatter on refinement. Only update if you find a bug.
173
173
  - For new-task, generate the id as `<slug>-<4hex>` (lowercase).
174
174
  - Commit messages follow Conventional Commits 1.0.0 — `chore(tasks): ...`.
175
- - Do not modify `.soly/rules/`.
175
+ - Do not modify `.agents/rules/`.
176
176
  - Do not run subagents yourself.
177
- - **PATH DISCIPLINE:** PLAN.md goes to `.soly/features/<feature>/tasks/<id>/PLAN.md`. Never to the project root.
177
+ - **PATH DISCIPLINE:** PLAN.md goes to `.agents/features/<feature>/tasks/<id>/PLAN.md`. Never to the project root.
178
178
  - Return: created/refined path, task id, plan summary, open questions.
179
179
  </hard_rules>
180
180
 
181
181
  <dual_mode_note>
182
182
  Tasks are part of soly's dual-mode system. The project may also have
183
- `.soly/phases/` (phase-based layout, distinct from task-based). You are only planning a specific task.
183
+ `.agents/phases/` (phase-based layout, distinct from task-based). You are only planning a specific task.
184
184
  Do not touch phases. Do not modify ROADMAP.md or STATE.md.
185
185
  </dual_mode_note>