squadrant 0.28.1 → 0.29.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "squadrant",
3
3
  "packageManager": "pnpm@10.30.3",
4
- "version": "0.28.1",
4
+ "version": "0.29.0",
5
5
  "description": "Multi-project orchestration for your coding agents (Claude, Codex, opencode, Gemini)",
6
6
  "type": "module",
7
7
  "bin": {
@@ -28,13 +28,13 @@ Execute the 4-step startup contract defined in your system prompt.
28
28
  Check tasks from the same call — `liveRepo.liveCrews` lists every non-terminal crew task for this project. A `state: "blocked"` entry with a `question` is waiting on you right now.
29
29
 
30
30
  4. **Read handoff:**
31
- `~/.config/squadrant/scripts/read-handoff.sh "{spokeVaultPath}"`
31
+ `~/.config/squadrant/scripts/read-handoff.sh "{project}"` (reads `~/squadrant/workspace/{project}/handoff.json`)
32
32
  If a handoff exists, read the context carefully (`currentState`, `openBranches`, `nextSteps`, `blockedItems`, `decisions`).
33
33
  If it reported `"exists": false`, reconstruct from the `handoff facts` output instead of cold-starting blind (check `checkpoint`, `gapSessions`, `claudeMem`). You do the synthesizing.
34
34
 
35
35
  5. **Additional Context (opt-in):**
36
36
  - Search **claude-mem** (`mem-search` skill) for your project name.
37
- - Check `{spokeVault}/daily-logs/` for the most recent log.
37
+ - Check `~/squadrant/workspace/{project}/artifacts/daily-logs/` for the most recent log.
38
38
  - Check `{spokeVault}/learnings/` — selectively load relevant learnings.
39
39
  - Check `{spokeVault}/skills/` and `{spokeVault}/wiki/`.
40
40
  - Crew lifecycle events (done / blocked / idle) are delivered to your captain pane automatically by the squadrant daemon via daemon-direct cmux delivery (#332). No relay setup required.
@@ -300,8 +300,12 @@ On CREW REVIEW or CREW DONE:
300
300
  | Good — matches the task, tests pass, no scope creep | **DEFAULT mode:** Surface diff summary to user and WAIT. Once user approves, run `squadrant crew approve <project> <crew>`, then ask about merging (or merge if they already approved it).<br><br>**DELEGATED mode:** Run `squadrant crew approve <project> <crew>`, then merge autonomously. |
301
301
  | Needs changes | `squadrant crew send <project> <crew> "<feedback>"` — the crew iterates and re-signals. Loop until approved. |
302
302
 
303
- 3. **Never auto-terminalize** by emitting `task.done` directly — always go through `squadrant crew approve`.
304
- 4. Do **not** re-send the original task or close the crew while it's awaiting review — `crew close` on a `review`-state task discards work that hasn't been pushed anywhere yet.
303
+ 3. **Grade the rules the crew was given** (only if the project subscribes to a knowledge base; #945). While the diff is open:
304
+ - `squadrant knowledge surfaced --task <task-id>` lists the rules delivered to that task (task id from `squadrant crew tasks <project>`).
305
+ - For each listed rule that **applies to this diff**, record what you saw: `squadrant knowledge feedback <rule-id> --followed|--violated --source review --task <task-id>` (`--wrong` if the rule itself is wrong).
306
+ - Skip the rules that don't apply. Don't guess: grade only what the diff shows. These grades are the high-confidence signal behind `complianceRate` and `violationRate` in the KB's REPORT.md.
307
+ 4. **Never auto-terminalize** by emitting `task.done` directly — always go through `squadrant crew approve`.
308
+ 5. Do **not** re-send the original task or close the crew while it's awaiting review — `crew close` on a `review`-state task discards work that hasn't been pushed anywhere yet.
305
309
 
306
310
  ## When Crew is Fully Finished (After Approval)
307
311
 
@@ -390,7 +394,7 @@ End-of-session writes are **opt-in**, not on a schedule. Only write what is mean
390
394
  3. **Handoff (opt-in but recommended for in-flight work):** if work is mid-flight, write a handoff so tomorrow's session can resume:
391
395
 
392
396
  ```bash
393
- ~/.config/squadrant/scripts/write-handoff.sh "{spokeVaultPath}" '{
397
+ ~/.config/squadrant/scripts/write-handoff.sh "{project}" '{
394
398
  "currentState": "Brief description of where things stand",
395
399
  "openBranches": ["feat/branch-name — what it contains"],
396
400
  "nextSteps": ["First thing to do tomorrow", "Second thing"],
@@ -13,9 +13,9 @@ Run when session starts, or user says "morning", "catch up", "summary":
13
13
 
14
14
  1. **Check handoffs from all projects** (context from yesterday's sessions):
15
15
  ```bash
16
- for vault in $(cat ~/.config/squadrant/config.json | python3 -c "import json,sys; [print(p['spokeVault']) for p in json.loads(sys.stdin.read())['projects'].values()]"); do
17
- echo "=== $(basename $vault) ==="
18
- ~/.config/squadrant/scripts/read-handoff.sh "$vault" --keep
16
+ for project in $(cat ~/.config/squadrant/config.json | python3 -c "import json,sys; [print(p) for p in json.loads(sys.stdin.read())['projects']]"); do
17
+ echo "=== $project ==="
18
+ ~/.config/squadrant/scripts/read-handoff.sh "$project" --keep
19
19
  done
20
20
  ```
21
21
  Handoffs contain: currentState, openBranches, nextSteps, blockedItems, decisions. Use these to understand where each project left off.
@@ -24,9 +24,9 @@ Handoffs contain: currentState, openBranches, nextSteps, blockedItems, decisions
24
24
  3. Read yesterday's logs:
25
25
  ```bash
26
26
  YESTERDAY=$(date -v-1d +"%Y-%m-%d")
27
- for vault in $(cat ~/.config/squadrant/config.json | python3 -c "import json,sys; [print(p['spokeVault']) for p in json.loads(sys.stdin.read())['projects'].values()]"); do
28
- echo "=== $vault ==="
29
- cat "$vault/daily-logs/${YESTERDAY}.md" 2>/dev/null || echo "(no log)"
27
+ for project in $(cat ~/.config/squadrant/config.json | python3 -c "import json,sys; [print(p) for p in json.loads(sys.stdin.read())['projects']]"); do
28
+ echo "=== $project ==="
29
+ cat ~/squadrant/workspace/"$project"/artifacts/daily-logs/"${YESTERDAY}.md" 2>/dev/null || echo "(no log)"
30
30
  done
31
31
  ```
32
32
  4. Run quick standup for context: `squadrant standup --yesterday --raw`
@@ -49,7 +49,9 @@ squadrant runtime list
49
49
  A name match is **not** sufficient — the workspace may be holding a session from a previous day. Check `sessions.json` against today before reusing:
50
50
  ```bash
51
51
  TODAY=$(date +%Y-%m-%d)
52
- LAST=$(python3 -c "import json; d=json.load(open('$HOME/.config/squadrant/sessions.json')); print(d.get('workspaces',{}).get('{captainName}',{}).get('lastLaunched',''))" 2>/dev/null)
52
+ S="${SQUADRANT_STATE_DIR:-${XDG_STATE_HOME:-$HOME/.local/state}/squadrant}/sessions.json"
53
+ [ -f "$S" ] || S="$HOME/.config/squadrant/sessions.json" # pre-#983 location
54
+ LAST=$(python3 -c "import json,sys; d=json.load(open(sys.argv[1])); print(d.get('workspaces',{}).get('{captainName}',{}).get('lastLaunched',''))" "$S" 2>/dev/null)
53
55
  [ "$LAST" = "$TODAY" ] && echo "fresh" || echo "stale"
54
56
  ```
55
57
  - `fresh` → reuse the existing workspace, proceed to step 5.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: daily-log
3
- description: Write an end-of-day log to your spoke vault. Use when session ends or user says "end of day" / "wrap up".
3
+ description: Write an end-of-day log to your project workspace. Use when session ends or user says "end of day" / "wrap up".
4
4
  ---
5
5
 
6
6
  # Daily Log
@@ -11,11 +11,11 @@ Write a daily log before your session ends.
11
11
 
12
12
  ```bash
13
13
  DATE=$(date +"%Y-%m-%d")
14
- SPOKE_VAULT="{spokeVaultPath}"
15
- mkdir -p "$SPOKE_VAULT/daily-logs"
14
+ LOG_DIR=~/squadrant/workspace/{project-name}/artifacts/daily-logs
15
+ mkdir -p "$LOG_DIR"
16
16
  ```
17
17
 
18
- ## Write to `{spokeVaultPath}/daily-logs/YYYY-MM-DD.md`
18
+ ## Write to `~/squadrant/workspace/{project-name}/artifacts/daily-logs/YYYY-MM-DD.md`
19
19
 
20
20
  ```markdown
21
21
  ---
@@ -61,7 +61,7 @@ If the topic already contains all of this, it confirms and proceeds. Otherwise i
61
61
  1. Side session produces a result (root cause / artifact).
62
62
  2. Session asks: "Notify the primary captain now? (y/n)"
63
63
  3. On yes:
64
- - Writes durable record: {spokeVault}/side-handoffs/<topic>.md
64
+ - Writes durable record: ~/squadrant/workspace/<project>/side-handoffs/<topic>.md
65
65
  - Sends: squadrant runtime send <project> "🗒 Side handoff [<role>] — <topic> ..."
66
66
  4. Primary captain receives handoff delivered daemon-direct via cmux (#332).
67
67
  5. Captain does NOT auto-spawn a crew — waits for user's go.
@@ -73,12 +73,12 @@ echo "$PROJECT_JSON"
73
73
 
74
74
  If empty `{}`: not inside a known squadrant project — build the report from **session context + git only**, and skip steps 2–3 below.
75
75
 
76
- Otherwise note `name` and `spokeVault` for the next steps.
76
+ Otherwise note `name` for the next steps.
77
77
 
78
78
  **2. Read the handoff WITHOUT consuming it** (note the `--keep` — never drop the `--keep`, or you destroy the next session's startup context):
79
79
 
80
80
  ```bash
81
- ~/.config/squadrant/scripts/read-handoff.sh "<spokeVault>" --keep
81
+ ~/.config/squadrant/scripts/read-handoff.sh "<name>" --keep
82
82
  ```
83
83
 
84
84
  `{"exists": false}` means none — fine, skip it.
@@ -86,7 +86,7 @@ Otherwise note `name` and `spokeVault` for the next steps.
86
86
  **3. Read the latest daily-log** (if any):
87
87
 
88
88
  ```bash
89
- ls -t "<spokeVault>"/daily-logs/*.md 2>/dev/null | head -1
89
+ ls -t ~/squadrant/workspace/"<name>"/artifacts/daily-logs/*.md 2>/dev/null | head -1
90
90
  ```
91
91
 
92
92
  Read that one file for `Completed` / `In Progress` / `Blocked` / `Tomorrow`.
@@ -1,14 +1,29 @@
1
1
  #!/bin/bash
2
- # Usage: read-handoff.sh <spoke-vault-path> [--keep]
3
- # Reads and prints handoff.json, then archives it to handoffs/<date>.json
4
- # (unless --keep). Captain calls this on session startup to load previous
5
- # context.
2
+ # Usage: read-handoff.sh <project|workspace-path|spoke-vault-path> [--keep]
3
+ # Reads and prints workspace/<project>/handoff.json, then archives it to
4
+ # workspace/<project>/handoffs/<date>.json (unless --keep). Captain calls this
5
+ # on session startup to load previous context. Only the basename of the first
6
+ # arg is used (#983).
6
7
  set -euo pipefail
7
8
 
8
- VAULT="${1:?Usage: read-handoff.sh <vault-path> [--keep]}"
9
+ TARGET="${1:?Usage: read-handoff.sh <project-or-vault-path> [--keep]}"
9
10
  KEEP="${2:-}"
11
+ PROJECT="$(basename "$TARGET")"
12
+ VAULT="${SQUADRANT_WORKSPACE_DIR:-$HOME/squadrant/workspace}/$PROJECT"
10
13
  HANDOFF_FILE="$VAULT/handoff.json"
11
14
 
15
+ # #983 dual-read (one version): a handoff written before the move still sits
16
+ # in the old spoke vault — the path passed in, or the default hub location.
17
+ if [ ! -f "$HANDOFF_FILE" ]; then
18
+ for LEGACY in "$TARGET" "$HOME/squadrant-hub/spokes/$PROJECT"; do
19
+ case "$LEGACY" in */*) ;; *) continue ;; esac
20
+ if [ -f "$LEGACY/handoff.json" ]; then
21
+ HANDOFF_FILE="$LEGACY/handoff.json"
22
+ break
23
+ fi
24
+ done
25
+ fi
26
+
12
27
  if [ ! -f "$HANDOFF_FILE" ]; then
13
28
  echo '{"exists": false}'
14
29
  exit 0
@@ -1,9 +1,11 @@
1
1
  #!/bin/bash
2
- # Usage: record-side-handoff.sh <spoke-vault-path> <topic> <role> <summary>
3
- # Writes a durable handoff record to {spokeVault}/side-handoffs/<topic-slug>.md
2
+ # Usage: record-side-handoff.sh <project|workspace-path|spoke-vault-path> <topic> <role> <summary>
3
+ # Writes a durable handoff record to workspace/<project>/side-handoffs/<topic-slug>.md
4
+ # (#983: was {spokeVault}/side-handoffs/). Only the basename of the first arg is used.
4
5
  set -euo pipefail
5
6
 
6
- VAULT="${1:?Usage: record-side-handoff.sh <vault-path> <topic> <role> <summary>}"
7
+ TARGET="${1:?Usage: record-side-handoff.sh <project-or-vault-path> <topic> <role> <summary>}"
8
+ VAULT="${SQUADRANT_WORKSPACE_DIR:-$HOME/squadrant/workspace}/$(basename "$TARGET")"
7
9
  TOPIC="${2:?}"
8
10
  ROLE="${3:?}"
9
11
  SUMMARY="${4:?}"
@@ -6,7 +6,11 @@ set -euo pipefail
6
6
 
7
7
  CMUX="/Applications/cmux.app/Contents/Resources/bin/cmux"
8
8
  TEMPLATES_DIR="${HOME}/.config/squadrant/templates"
9
- SESSIONS_FILE="${HOME}/.config/squadrant/sessions.json"
9
+ # #983 6a: sessions.json lives in XDG state (mirrors stateRoot()). Read the
10
+ # pre-move ~/.config file until the new one exists; writes go to the new path.
11
+ SESSIONS_FILE="${SQUADRANT_STATE_DIR:-${XDG_STATE_HOME:-$HOME/.local/state}/squadrant}/sessions.json"
12
+ SESSIONS_READ="$SESSIONS_FILE"
13
+ [ -f "$SESSIONS_READ" ] || SESSIONS_READ="${HOME}/.config/squadrant/sessions.json"
10
14
  NAME="${1:?Usage: spawn-workspace.sh <name> <cwd> [role] [--fresh]}"
11
15
  CWD="${2:?Usage: spawn-workspace.sh <name> <cwd> [role] [--fresh]}"
12
16
  ROLE="${3:-captain}"
@@ -18,12 +22,12 @@ FRESH=false
18
22
  # --- Session freshness check ---
19
23
  if [ "$FORCE_FRESH" = "--fresh" ]; then
20
24
  FRESH=true
21
- elif [ -f "$SESSIONS_FILE" ]; then
25
+ elif [ -f "$SESSIONS_READ" ]; then
22
26
  # Check last launch date
23
27
  LAST_DATE=$(python3 -c "
24
28
  import json, sys
25
29
  try:
26
- data = json.load(open('$SESSIONS_FILE'))
30
+ data = json.load(open('$SESSIONS_READ'))
27
31
  print(data.get('workspaces', {}).get('$NAME', {}).get('lastLaunched', ''))
28
32
  except: print('')
29
33
  " 2>/dev/null)
@@ -43,7 +47,7 @@ except: print('')
43
47
  STORED_HASH=$(python3 -c "
44
48
  import json
45
49
  try:
46
- data = json.load(open('$SESSIONS_FILE'))
50
+ data = json.load(open('$SESSIONS_READ'))
47
51
  print(data.get('workspaces', {}).get('$NAME', {}).get('templateHash', ''))
48
52
  except: print('')
49
53
  " 2>/dev/null)
@@ -64,7 +68,7 @@ python3 -c "
64
68
  import json, os
65
69
  path = '$SESSIONS_FILE'
66
70
  try:
67
- data = json.load(open(path))
71
+ data = json.load(open('$SESSIONS_READ'))
68
72
  except: data = {'workspaces': {}}
69
73
  data.setdefault('workspaces', {})['$NAME'] = {'lastLaunched': '$TODAY', 'templateHash': '$CURRENT_HASH'}
70
74
  os.makedirs(os.path.dirname(path), exist_ok=True)
@@ -1,11 +1,14 @@
1
1
  #!/bin/bash
2
- # Usage: write-handoff.sh <spoke-vault-path> <json-content>
3
- # Writes a handoff.json file for session continuity.
2
+ # Usage: write-handoff.sh <project|workspace-path|spoke-vault-path> <json-content>
3
+ # Writes workspace/<project>/handoff.json for session continuity (#983: was
4
+ # <spokeVault>/handoff.json). Only the basename of the first arg is used, so
5
+ # captains still passing their old spoke path keep working.
4
6
  # Captain calls this at session end to preserve context for tomorrow.
5
7
  set -euo pipefail
6
8
 
7
- VAULT="${1:?Usage: write-handoff.sh <vault-path> <json-content>}"
9
+ TARGET="${1:?Usage: write-handoff.sh <project-or-vault-path> <json-content>}"
8
10
  CONTENT="${2:?Provide JSON content as second argument}"
11
+ VAULT="${SQUADRANT_WORKSPACE_DIR:-$HOME/squadrant/workspace}/$(basename "$TARGET")"
9
12
 
10
13
  mkdir -p "$VAULT"
11
14
  HANDOFF_FILE="$VAULT/handoff.json"
@@ -16,7 +16,7 @@ You are a **project captain** for Squadrant. You lead ONE project. You are a **c
16
16
  1. **Fetch and gather facts:** `squadrant handoff facts {project} --fetch` (updates remote refs so branch state is verified, not stale).
17
17
  2. **Check branchState flags:** Act on `upstreamStatus` (`behind`, `diverged`, `upstream-gone`) explicitly.
18
18
  3. **Identify current state:** List live crews (`squadrant crew list`) and current task.
19
- 4. **Read handoff:** `~/.config/squadrant/scripts/read-handoff.sh {spokeVaultPath}` to load previous session context.
19
+ 4. **Read handoff:** `~/.config/squadrant/scripts/read-handoff.sh {project}` to load previous session context.
20
20
  5. **Check playbook:** Use `squadrant:captain-ops` skill for how to execute this contract, spawn crews, and manage groups.
21
21
 
22
22
  ## Core Rules
@@ -40,7 +40,7 @@ You are a **project captain** for Squadrant. You lead ONE project. You are a **c
40
40
  ```
41
41
  **Operator Takeover:** A crew under operator takeover is off-limits — no `send`, no `close`, and its lifecycle signals are not yours to act on. If you are at your crew limit, **ask the operator**; never pick a held crew to close. `--force` exists only for when the operator explicitly tells you to use it.
42
42
  3. **Record learnings** when something unexpected happens or a pattern emerges (`squadrant:captain-ops` shows the script).
43
- 4. **Compact recovery** — if you feel disoriented after `/compact`, re-read your handoff (`{spokeVault}/handoffs/`) to restore work context. Role itself survives compact via `--append-system-prompt-file`.
43
+ 4. **Compact recovery** — if you feel disoriented after `/compact`, re-read your handoff (`~/squadrant/workspace/{project}/handoffs/`) to restore work context. Role itself survives compact via `--append-system-prompt-file`.
44
44
 
45
45
  ## Available Skills
46
46
 
@@ -34,7 +34,7 @@ Use `squadrant crew spawn`. Never spawn workspaces directly with `cmux` or runti
34
34
  1. **Fetch and gather facts:** `squadrant handoff facts {project} --fetch` (updates remote refs so branch state is verified, not stale).
35
35
  2. **Check branchState flags:** Act on `upstreamStatus` (`behind`, `diverged`, `upstream-gone`) explicitly.
36
36
  3. **Identify current state:** List live crews (`squadrant crew list`) and current task.
37
- 4. **Read handoff:** `~/.config/squadrant/scripts/read-handoff.sh {spokeVaultPath}` to load previous session context.
37
+ 4. **Read handoff:** `~/.config/squadrant/scripts/read-handoff.sh {project}` to load previous session context.
38
38
 
39
39
  ## Session Lifecycle
40
40
 
@@ -52,7 +52,7 @@ When you have a root cause (with or without a draft patch):
52
52
 
53
53
  a. Write the durable vault record (replace placeholders with actual values from the "Side-session context" block in your first turn):
54
54
  ```bash
55
- ~/.config/squadrant/scripts/record-side-handoff.sh "<spoke-vault>" "<topic>" "debug" "<one-line root cause>"
55
+ ~/.config/squadrant/scripts/record-side-handoff.sh "<workspace>" "<topic>" "debug" "<one-line root cause>"
56
56
  ```
57
57
 
58
58
  b. Send the structured handoff to the primary captain via relay:
@@ -68,7 +68,7 @@ HANDOFF
68
68
 
69
69
  3. **On no:** keep working; you can trigger the handoff whenever you're ready.
70
70
 
71
- The `<project>`, `<spoke-vault>`, and `<name>` (your scratch branch) are in the "Side-session context" block of your first turn. The draft patch (if any) lives on the scratch branch — reference it by name; do NOT merge it.
71
+ The `<project>`, `<workspace>`, and `<name>` (your scratch branch) are in the "Side-session context" block of your first turn. The draft patch (if any) lives on the scratch branch — reference it by name; do NOT merge it.
72
72
 
73
73
  ## Karpathy Discipline
74
74
 
@@ -37,7 +37,7 @@ When you have produced a result that deserves the primary captain's attention:
37
37
 
38
38
  a. Write the durable vault record (replace placeholders with actual values from the "Side-session context" block in your first turn):
39
39
  ```bash
40
- ~/.config/squadrant/scripts/record-side-handoff.sh "<spoke-vault>" "<topic>" "research" "<one-line summary>"
40
+ ~/.config/squadrant/scripts/record-side-handoff.sh "<workspace>" "<topic>" "research" "<one-line summary>"
41
41
  ```
42
42
 
43
43
  b. Send the structured handoff to the primary captain via relay:
@@ -53,7 +53,7 @@ HANDOFF
53
53
 
54
54
  3. **On no:** keep working; you can trigger the handoff whenever you're ready.
55
55
 
56
- The `<project>` and `<spoke-vault>` values are in the "Side-session context" block of your first turn.
56
+ The `<project>` and `<workspace>` values are in the "Side-session context" block of your first turn.
57
57
 
58
58
  ## Karpathy Discipline
59
59
 
@@ -1,6 +0,0 @@
1
- # Spoke Vault Changelog
2
-
3
- Track structural changes to this vault.
4
-
5
- ## Log
6
- - Initial creation
@@ -1,19 +0,0 @@
1
- ---
2
- project: unnamed
3
- captain_session: inactive
4
- last_updated:
5
- active_crew: 0
6
- tasks_total: 0
7
- tasks_completed: 0
8
- tasks_in_progress: 0
9
- tasks_pending: 0
10
- ---
11
-
12
- # Captain Status
13
-
14
- ## Active Crew
15
-
16
- | Crew | Task | Branch | Status |
17
- |------|------|--------|--------|
18
-
19
- ## Recent Activity
@@ -1,21 +0,0 @@
1
- ---
2
- crew: {{crew_name}}
3
- task: {{task}}
4
- branch: {{branch}}
5
- worktree: .worktrees/{{task}}
6
- started: {{date}}
7
- status: in-progress
8
- ---
9
-
10
- # {{crew_name}} — Session Log
11
-
12
- ## Task
13
- {{task}}
14
-
15
- ## Branch
16
- {{branch}}
17
-
18
- ## Progress
19
- -
20
-
21
- ## Notes
@@ -1,16 +0,0 @@
1
- ---
2
- date: {{date}}
3
- project: {{project}}
4
- ---
5
-
6
- # {{date}} — Daily Log
7
-
8
- ## Summary
9
-
10
- ## Tasks Completed
11
-
12
- ## Tasks In Progress
13
-
14
- ## Blockers
15
-
16
- ## Learnings
@@ -1,14 +0,0 @@
1
- ---
2
- type: wiki-index
3
- project: unnamed
4
- last_updated:
5
- page_count: 0
6
- ---
7
-
8
- # Wiki Index
9
-
10
- > Auto-maintained by wiki-ingest. Do not edit manually.
11
-
12
- ## By Category
13
-
14
- <!-- Categories will be added automatically as pages are ingested -->
@@ -1,10 +0,0 @@
1
- ---
2
- type: wiki-log
3
- project: unnamed
4
- ---
5
-
6
- # Wiki Changelog
7
-
8
- > Append-only record of wiki changes. Newest entries at top.
9
-
10
- <!-- Entries will be appended by wiki-ingest -->
File without changes