Loading...
Loading...
Incrementally update reverse-engineering docs based on git changes since they were last generated. Reads the commit hash from .stackshift-docs-meta.json, diffs against HEAD, analyzes only the changed files, and surgically updates the affected docs. Saves time and cost compared to full regeneration.
npx skill4agent add jschulte/stackshift refresh-docs.stackshift-docs-meta.jsondocs/reverse-engineering/Previous Docs (commit abc123) Latest Code (commit def456)
┌─────────────────────────┐ ┌─────────────────────────┐
│ 11 reverse-eng docs │ │ New commits since abc123│
│ .stackshift-docs-meta │──── diff ──│ Changed files list │
└─────────────────────────┘ └─────────────────────────┘
│
Analyze only changes
│
▼
Updated docs + new hash.stackshift-docs-meta.jsongit diff# Read the pinned commit hash
META_FILE="docs/reverse-engineering/.stackshift-docs-meta.json"
if [ ! -f "$META_FILE" ]; then
echo "ERROR: No metadata file found. Run /stackshift.reverse-engineer first."
exit 1
fi
PINNED_HASH=$(cat "$META_FILE" | jq -r '.commit_hash')
CURRENT_HASH=$(git rev-parse HEAD)
PINNED_DATE=$(cat "$META_FILE" | jq -r '.commit_date')
echo "Docs pinned to: $PINNED_HASH ($PINNED_DATE)"
echo "Current HEAD: $CURRENT_HASH"
if [ "$PINNED_HASH" = "$CURRENT_HASH" ]; then
echo "Docs are up to date. Nothing to refresh."
exit 0
fi
# Count commits since docs were generated
COMMIT_COUNT=$(git rev-list --count "$PINNED_HASH".."$CURRENT_HASH" 2>/dev/null || echo "unknown")
echo "Commits since last generation: $COMMIT_COUNT"# Get list of changed files with change type
git diff --name-status "$PINNED_HASH"..HEAD
# Get commit log summary (for context)
git log --oneline "$PINNED_HASH"..HEAD
# Get a statistical summary
git diff --stat "$PINNED_HASH"..HEADDocs were generated at commit abc1234 (2025-12-15)
Current HEAD: def4567 (2026-02-12)
42 commits, 156 files changed:
src/api/ - 12 files (endpoints, middleware)
src/models/ - 3 files (User, Product schemas)
src/services/ - 8 files (business logic)
package.json - dependency updates
.env.example - new env vars
docker-compose - infrastructure changes
tests/ - 15 new test files
Estimated refresh time: ~5 minutes| Changed File Pattern | Affected Doc(s) |
|---|---|
| functional-specification.md, integration-points.md, data-architecture.md |
| data-architecture.md |
| functional-specification.md |
| decision-rationale.md, configuration-reference.md |
| configuration-reference.md |
| operations-guide.md |
| test-documentation.md |
| visual-design-system.md |
| business-context.md |
| Infrastructure/monitoring files | observability-requirements.md |
| Any tech stack changes | decision-rationale.md |
| External service integrations | integration-points.md |
.gitignoreDocs to update:
functional-specification.md - 8 changed files affect this doc
data-architecture.md - 3 changed files (schema changes)
configuration-reference.md - 2 changed files (new env vars)
test-documentation.md - 15 new test files
Docs unchanged:
visual-design-system.md - no UI changes detected
observability-requirements.md - no monitoring changes
business-context.md - no business context changes
decision-rationale.md - no tech stack changes
operations-guide.md - no infra changes
integration-points.md - no integration changes
technical-debt-analysis.md - no debt-relevant changessubagent_type=Explorestackshift:code-analyzer| Change Type | Update Approach |
|---|---|
| New file (Added) | Add new section/entry to relevant doc |
| Modified file | Read diff, update affected sections, preserve unchanged |
| Deleted file | Mark related sections as removed or deprecated |
| Renamed file | Update file paths in brownfield docs |
| New dependency | Add to decision-rationale.md and/or integration-points.md |
| Config change | Update configuration-reference.md |
| New test | Update test-documentation.md coverage |
NEW_HASH=$(git rev-parse HEAD)
NEW_DATE=$(git log -1 --format=%ci)
REFRESHED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")docs/reverse-engineering/.stackshift-docs-meta.jsoncommit_hashcommit_dategenerated_atcommit_hashrefresh_history{
"commit_hash": "<NEW_HASH>",
"commit_date": "<NEW_DATE>",
"generated_at": "<original generation date>",
"last_refreshed_at": "<REFRESHED_AT>",
"doc_count": 11,
"route": "brownfield",
"refresh_history": [
{
"from_commit": "<OLD_HASH>",
"to_commit": "<NEW_HASH>",
"refreshed_at": "<REFRESHED_AT>",
"commits_analyzed": 42,
"files_changed": 156,
"docs_updated": ["functional-specification.md", "data-architecture.md", "configuration-reference.md", "test-documentation.md"],
"docs_unchanged": ["visual-design-system.md", "observability-requirements.md", "..."]
}
],
"docs": {
"functional-specification.md": { "generated_at": "<original>", "last_updated": "<REFRESHED_AT>", "commit_hash": "<NEW_HASH>" },
"data-architecture.md": { "generated_at": "<original>", "last_updated": "<REFRESHED_AT>", "commit_hash": "<NEW_HASH>" },
"configuration-reference.md": { "generated_at": "<original>", "last_updated": "<REFRESHED_AT>", "commit_hash": "<NEW_HASH>" },
"test-documentation.md": { "generated_at": "<original>", "last_updated": "<REFRESHED_AT>", "commit_hash": "<NEW_HASH>" },
"visual-design-system.md": { "generated_at": "<original>", "last_updated": "<original>", "commit_hash": "<OLD_HASH>" },
"...": "unchanged docs keep old timestamps"
}
}> **Generated by StackShift** | Commit: `<new-short-hash>` | Updated: `<REFRESHED_AT>` | Originally generated: `<original-date>`Docs Refresh Complete
═════════════════════
Analyzed: 42 commits (abc1234 → def4567)
Changed files: 156
Time: 4 minutes
Updated docs (4):
functional-specification.md
+ Added FR-008: Bulk export feature
~ Updated FR-003: Modified user registration flow
- Removed FR-005: Legacy import (deleted)
data-architecture.md
+ Added Product.variants field
~ Updated User model (new preferences column)
configuration-reference.md
+ Added EXPORT_BATCH_SIZE env var
+ Added REDIS_CLUSTER_URL env var
test-documentation.md
~ Coverage updated: 67% → 74%
+ 15 new test files documented
Unchanged docs (7):
visual-design-system.md, observability-requirements.md,
business-context.md, decision-rationale.md, operations-guide.md,
integration-points.md, technical-debt-analysis.md
Next refresh: Run /stackshift.refresh-docs again after more commits./stackshift.reverse-engineerLarge change detected: 78% of source files modified.
A full refresh is recommended over incremental update.
A) Full refresh (regenerate all docs, ~30 min)
B) Incremental anyway (faster but may miss systemic changes)/stackshift.reverse-engineergit diffgit log -pExisting docs detected (pinned to abc1234, 15 commits behind).
A) Refresh docs incrementally (~5 min)
B) Full regeneration (~30 min)- name: Refresh StackShift docs
run: |
# Check if docs need refresh
if [ -f "docs/reverse-engineering/.stackshift-docs-meta.json" ]; then
echo "Refreshing docs..."
# Trigger /stackshift.refresh-docs
figit diff --name-statusgit diff <hash>..HEAD -- <file>