From spine
Updates existing Spine architecture documents with timestamped append-only sections after continued work sessions. Supports both auto-detection of stale docs and targeted updates by name.
How this skill is triggered — by the user, by Claude, or both
Slash command
/spine:spine-updateThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Update existing Spine Architecture docs with new context from continued work sessions. Appends timestamped update sections — never overwrites or deletes existing content.
Update existing Spine Architecture docs with new context from continued work sessions. Appends timestamped update sections — never overwrites or deletes existing content.
Resolve the vault path using this config chain:
$SPINE_VAULT_PATH environment variable~/.spine/config.json → read the vaultPath field~/Documents/SpineVault/If the vault doesn't exist, tell the user to run /spine-init first.
basename "$(git remote get-url origin 2>/dev/null)" .git
Fall back to the current directory name if no git remote. If {vault}/{repo}/ doesn't exist, tell the user this repo isn't tracked by Spine yet — suggest /spine-init or /spine-capture to set it up.
If $ARGUMENTS is provided (not empty and not whitespace-only):
→ Targeted Mode — proceed to "Targeted Mode" section below
If $ARGUMENTS is empty or not provided:
→ Auto-Detect Mode — proceed to "Auto-Detect Mode" section below
/spine-update <name>)Match $ARGUMENTS against docs in {vault}/{repo}/ using this precedence (first match wins):
.md extension)/spine-update auth matches {vault}/{repo}/auth/auth.md)title frontmatter field)Rules:
/spine-capture."Load the full content of the resolved doc. Extract:
Staleness date: Read last_updated from frontmatter. If not present, fall back to date field. If neither exists, treat as unknown — skip git-driven context in Step 3.
Referenced files: Parse the **Files changed:** section as a markdown unordered list (one file path per - line). If the section is missing or unparseable, fall back to listing all non-.md files in the doc's parent feature folder:
find {vault}/{repo}/{feature}/ -type f ! -name "*.md" 2>/dev/null
Note: This fallback is rarely needed — most docs created by /spine-capture include the section.
Existing wikilinks: Scan for the ## See Also section and collect all [[...]] wikilinks already present.
Merge two sources of context:
Git-driven context: If a staleness date was found in Step 2:
git log --oneline --since="{staleness_date}" -- {file1} {file2} ...
For commits found, read the diffs to understand what changed:
git diff {hash}~1 {hash} -- {files}
If no staleness date was available, skip git context entirely.
Session-driven context: Summarize the current conversation's context that is relevant to this doc:
If no conversation context is relevant to this doc, omit the session block from the draft.
Empty context guard: If both git context and session context are empty, inform the user:
"No new commits or session context to incorporate into '{doc name}'. Nothing to update."
Exit without presenting a draft. Emit output contract with status: no_candidates.
Draft an update section to append to the existing doc:
---
## Update — {YYYY-MM-DD HH:MM}
> [!note] {One-line summary of what changed}
> {2-3 sentence description combining git changes and session reasoning}
**Context:** {Detailed explanation of what changed and why — include code snippets where they add value}
**New files:** {list any files introduced since last update, or omit this line entirely if none}
Merge rules — follow these strictly:
## See Also section in the update block. Instead, note any new [[wikilinks]] to be inserted into the existing ## See Also section at the bottom of the doc. If no ## See Also section exists yet, one will be created at the very end of the doc in Step 6.**Files changed:** block in the update section. The original **Files changed:** in the doc header is the canonical list and stays unchanged. Only include **New files:** if the work introduced source files not in the original list.HH:MM) to disambiguate multiple updates on the same calendar day.Show the user:
... if the doc is longer)See AlsoAsk: (S)ave, (E)dit, or S(k)ip?
status: skippedBefore writing: Record the file's mtime and size when you first read it (Step 2). Now, before writing, re-check both values. If either has changed, abort with: "File was modified by another process during this update. Please try /spine-update again." Emit output contract with status: error and recovery_hint: "File conflict — retry". This conflict guard applies to every file write in this step (doc and spine note).
After conflict guard passes:
## See Also section — the update goes between the last content section and See Also)[[wikilinks]] into the existing ## See Also section. If no ## See Also section exists, create one at the very end of the doc after the appended updatelast_updated: {YYYY-MM-DD} in the doc's YAML frontmatter. Preserve the original date field unchangedspine_updated: true in output contractspine_updated: false{vault}/.spine/curator-log.md exists (create from templates/curator-log.md if missing). Prepend this entry (newest at top):
## {YYYY-MM-DD} — Update
- **Updated:** `{filename}` — {N} commits incorporated
/spine-update no args)For each .md file in {vault}/{repo}/ and its subfolders:
last_updated from frontmatter. If not present, fall back to date. If neither field exists, skip this doc (cannot determine staleness)**Files changed:** section as a markdown unordered list (one path per - line). If missing, use all non-.md files in the doc's parent folder as the file listgit log --oneline --since="{last_updated or date}" -- {filepath}
Sort flagged docs by total commit count, descending (most stale first). Cap the list at 10 results.
If stale docs were found:
Spine: {N} docs may need updating:
[1] {doc title} ({feature}/) — {N} commits since last updated
[2] {doc title} ({feature}/) — {N} commits since last updated
[3] {doc title} ({feature}/) — {N} commits since last updated
Pick a number to update, or (s)kip all:
If more than 10 stale docs exist, add: (showing top 10 of {total} stale docs)
If the user picks a number → load that doc and enter Targeted Mode, Step 2 (Read Existing Doc) onward. The target is already resolved from the pick list — skip Step 1.
If the user skips → emit output contract with status: skipped.
If no docs meet the 3-commit threshold:
Spine: All docs up to date. Nothing to update.
Emit output contract with status: no_candidates.
After completing an update (or determining there is nothing to update), emit a structured observation block:
spine_update_result:
status: success | skipped | no_candidates | error
summary: "Updated 'Plan - Migration Strategy' with 7 commits of context"
updated:
- { file: "Plan - Migration Strategy.md", feature: "auth", commits_incorporated: 7, spine_updated: true }
next_actions:
- { action: "review in Obsidian", path: "{vault}/repo/auth/Plan - Migration Strategy.md" }
recovery_hint: null
Status values:
success — doc updated and savedskipped — user chose not to save (declined or skipped in review)no_candidates — auto-detect found no stale docs, or empty context guard triggered in targeted modeerror — write failure, vault missing, conflict guard triggered — include recovery_hintspine_updated field: true when new wikilinks were added to the corresponding spine note (hub). false when no spine note changes were needed, or when the updated doc itself is a spine note.
Cross-skill: All Spine skills use last_updated (falling back to date) for staleness queries. /spine-health stale doc findings naturally align with auto-detect mode. No handoff file needed — both skills scan fresh on demand.
npx claudepluginhub nodewarrior/spine --plugin spineCaptures completed work (fixes, features, architecture decisions, plans) as Obsidian docs in a Spine Architecture vault. Auto-detects repo, feature, and doc type from context. Supports --batch for session-end capture.
Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.