一键导入
spine-update
Resume and enrich existing spine docs after continued work sessions. Supports targeted updates and auto-detection of stale docs.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Resume and enrich existing spine docs after continued work sessions. Supports targeted updates and auto-detection of stale docs.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Capture completed work (fix, feature, architecture decision, plan) as an Obsidian doc in the Spine Architecture vault. Auto-detects repo, feature, and doc type from context. Supports --batch mode for session-end batch capture.
Search past Claude Code sessions (episodic memory). Two-tier — grep the Spine episode log first, then targeted ripgrep over raw session transcripts. Deterministic, no LLM calls, returns verbatim excerpts with resume commands.
Load all vault docs for a feature area into context. Deep pull for when you need full knowledge on a topic.
Session-start vault scanner. Auto-fixes broken wikilinks, missing tags, and orphan docs. Detects coverage gaps from recent commits. Runs automatically at session start.
Scan the Spine Architecture Obsidian vault for gaps, stale docs, duplicates, and missing coverage. On-demand curator for vault hygiene.
Initialize or adopt a Spine Architecture vault. Creates the Obsidian vault structure, graph color config, and config file. Run once per vault.
| name | spine-update |
| description | Resume and enrich existing spine docs after continued work sessions. Supports targeted updates and auto-detection of stale docs. |
| argument-hint | [{"optional":"spine note name"},"doc name","or feature name"] |
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 unchanged. If the update changed what the doc covers, refresh the answers: list (2-5 questions this doc answers, phrased as a future session would ask them); add the list if the doc predates itspine_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.