Skip to content

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.yaml must 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:

Loaded N registered projects from intake/projects.yaml

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/

  1. Glob for docs/toolkit-proposals/*.md (exclude .gitkeep)
  2. For each found proposal, check if it already exists in V025's intake:
  3. Grep for the proposal filename in intake/pending/from-projects/ and intake/processed/
  4. If already present → skip (already collected)
  5. For new proposals:
  6. Read the proposal file
  7. Copy to intake/pending/from-projects/ with filename: YYYY-MM-DD-[project-slug]-[original-filename]
  8. Add/update frontmatter fields: source_project, source_path, synced_date

4b: Scan Process Journal Entries (--full mode only)

  1. Glob for docs/vt-c-journal/**/entries/*.md
  2. For each entry, read the YAML frontmatter
  3. Filter to entries where:
  4. type: procedure-improvement, OR
  5. Tags include cross-project, toolkit, every-project, framework
  6. Check if already synced (by matching source_path in existing proposals)
  7. 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.yamlcurrent_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:

  1. Look for project-scoped memory files:
  2. ~/.claude/projects/*/memory/MEMORY.md where * matches the project's path (with - as separator)
  3. Also check the project directory itself for .claude/memory/MEMORY.md
  4. For each found MEMORY.md, read the content
  5. Identify entries that indicate cross-project patterns — look for:
  6. Patterns mentioned in 2+ project memory files (recurring across projects)
  7. Entries tagged with or mentioning "always", "never", "every project", "convention"
  8. Workarounds for tool limitations that apply broadly
  9. For each candidate pattern, check if it already exists in V025's CLAUDE.md or ~/.claude/CLAUDE.md
  10. 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:

    last_synced: "YYYY-MM-DD"

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)