project-sync¶
Plugin: core-standards
Category: Other
Command: /project-sync
/vt-c-project-sync — Cross-Project Aggregation¶
Scan all registered projects and aggregate procedure improvement proposals, process-level journal entries, and project health signals into V025-claude-toolkit's intake pipeline.
Invocation¶
/vt-c-project-sync # Scan all registered projects, collect proposals
/vt-c-project-sync --status # Quick status dashboard (no collection)
/vt-c-project-sync --full # Full scan including journal analysis
/vt-c-project-sync --project V024 # Scan specific project only (name substring match)
Prerequisites¶
- Must be run from within V025-claude-toolkit (
TOOLKIT_ROOT) intake/projects.yamlmust exist with registered projects
Execution Instructions¶
Step 1: Validate Context¶
Verify the current working directory is V025-claude-toolkit:
if [ ! -f "intake/projects.yaml" ]; then
echo "Error: Must run from V025-claude-toolkit root."
echo "Current directory: $(pwd)"
exit 1
fi
Step 2: Load Registry¶
Read intake/projects.yaml and parse all projects into a list.
If --project NAME argument provided, filter to projects whose name contains the NAME substring (case-insensitive).
Display:
Step 3: Check Accessibility¶
For each project, verify the path exists and is accessible:
| Location Type | Check Method |
|---|---|
local-git |
Path exists AND .git/ directory exists |
local-folder |
Path exists |
| (no location field) | Path exists (backward-compatible with old entries) |
Build an accessibility matrix:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Project Registry: N projects
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| Project | Type | Location | Accessible | Last Synced |
|---------|------|----------|------------|-------------|
| V024-Websites-dev | coding | local-git | Yes | 2026-02-20 |
| P01-Notfallsani | coding | local-git | Yes | never |
| ... | ... | ... | ... | ... |
If --status argument: Display the matrix and exit. Do not collect anything.
Step 4: Scan Each Accessible Project¶
For each accessible project:
4a: Scan docs/toolkit-proposals/¶
- Glob for
docs/toolkit-proposals/*.md(exclude.gitkeep) - For each found proposal, check if it already exists in V025's intake:
- Grep for the proposal filename in
intake/pending/from-projects/andintake/processed/ - If already present → skip (already collected)
- For new proposals:
- Read the proposal file
- Copy to
intake/pending/from-projects/with filename:YYYY-MM-DD-[project-slug]-[original-filename] - Add/update frontmatter fields:
source_project,source_path,synced_date
4b: Scan Process Journal Entries (--full mode only)¶
- Glob for
docs/vt-c-journal/**/entries/*.md - For each entry, read the YAML frontmatter
- Filter to entries where:
type: procedure-improvement, OR- Tags include
cross-project,toolkit,every-project,framework - Check if already synced (by matching
source_pathin existing proposals) - For new entries: create a lightweight proposal in
intake/pending/from-projects/
4c: Collect Project Health Signals¶
For each project, gather:
| Signal | How | Fallback (non-git) |
|---|---|---|
| Last commit date | git log -1 --format=%ci |
File modification date of newest file |
| Current branch | git rev-parse --abbrev-ref HEAD |
N/A |
| Active workflow phase | Read .design-state.yaml → current_phase |
N/A |
| Pending toolkit proposals | Count files in docs/toolkit-proposals/ |
Same |
4d: Scan MEMORY.md for Promotable Patterns (--full mode only)¶
Check each project's auto-memory for patterns worth promoting to the shared CLAUDE.md:
- Look for project-scoped memory files:
~/.claude/projects/*/memory/MEMORY.mdwhere*matches the project's path (with-as separator)- Also check the project directory itself for
.claude/memory/MEMORY.md - For each found MEMORY.md, read the content
- Identify entries that indicate cross-project patterns — look for:
- Patterns mentioned in 2+ project memory files (recurring across projects)
- Entries tagged with or mentioning "always", "never", "every project", "convention"
- Workarounds for tool limitations that apply broadly
- For each candidate pattern, check if it already exists in V025's
CLAUDE.mdor~/.claude/CLAUDE.md - Report promotable patterns in the summary (do NOT auto-promote — human review required):
Memory Promotion Candidates:
| Pattern | Found in | Already in CLAUDE.md? |
|---------|----------|-----------------------|
| "Always run tests before commit" | V024, P01 | No |
| "Use git worktrees for parallel specs" | V024 | Yes (skip) |
This implements a "local discovery, shared codification" workflow: developers accumulate
auto-memory locally, and /vt-c-project-sync --full surfaces recurring patterns for team-wide adoption.
Step 5: Update Registry¶
For each scanned project, update last_synced in intake/projects.yaml:
If the project entry does not yet have a last_synced field, add it.
Step 6: Detect Unregistered Siblings¶
Scan known repository parent directories for projects with CLAUDE.md that are not in the registry:
# Check common parent directories
for parent in ~/01-repositories/03-VisiTrans ~/01-repositories/04-VisiMatch ~/01-repositories/07-rolf\ privat; do
for project in "$parent"/*/; do
if [ -f "$project/CLAUDE.md" ] || [ -f "$project/.design-state.yaml" ]; then
# Check if registered
if ! grep -qF "$project" intake/projects.yaml; then
echo "Unregistered: $project"
fi
fi
done
done
Step 7: Generate Summary Report¶
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Project Sync Complete
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Projects scanned: N/M (N accessible, M total)
New proposals collected: X
from V024-Websites-dev: 2
from P01-Notfallsani: 1
Project Health:
| Project | Branch | Phase | Last Commit | Proposals |
|---------|--------|-------|-------------|-----------|
| V024-Websites-dev | feature/... | development | 2d ago | 3 |
| P01-Notfallsani | main | pd-3-prototype | 5d ago | 0 |
Unregistered projects found: N
<unregistered-project-path>
→ Run /vt-c-project-register from that directory to track it
Memory Promotion Candidates: N (--full mode only)
[shown only when --full and candidates found]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
NEXT STEPS:
• Review proposals: /vt-c-toolkit-review --status
• Register untracked projects: /vt-c-project-register (from project dir)
• Full journal scan: /vt-c-project-sync --full
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Edge Cases¶
| Scenario | Handling |
|---|---|
| Project path no longer exists (moved/deleted) | Mark as inaccessible in report, skip |
| OneDrive offline/not mounted | Path check fails, mark inaccessible |
| Proposal already collected | Skip (dedup by filename match) |
| Projects.yaml has old format (no location/last_synced) | Treat as local-git, last_synced: null |
| No proposals found anywhere | Report "No new proposals" cleanly |
| Running outside V025-claude-toolkit | Error and exit |
Integration Points¶
| Skill | Relationship |
|---|---|
/vt-c-project-register |
Adds projects to the registry that this skill scans |
/vt-c-toolkit-review |
Processes proposals collected by this skill |
/vt-c-session-journal |
Creates entries that this skill can aggregate (--full mode) |
/vt-c-inbox-qualify |
Alternative intake path for external articles (not project learnings) |