From ecf4e4d84848a47f20c9c31847d5e0ceb2a1ba7c Mon Sep 17 00:00:00 2001 From: catlog22 Date: Sun, 1 Mar 2026 13:28:54 +0800 Subject: [PATCH] fix: align spec paths from .workflow/specs to .ccw/specs - Fix path mismatch between command files and frontend/backend spec-index-builder - Update init-specs.md, init-guidelines.md, sync.md, solidify.md to use .ccw/specs/ - Update init.md, start.md, clean.md, unified-execute-with-file.md, collaborative-plan-with-file.md - Add scope field to architecture-constraints.md and coding-conventions.md - Ensures specs created by commands are visible in frontend Spec Settings page --- .ccw/specs/architecture-constraints.md | 1 + .ccw/specs/coding-conventions.md | 1 + .claude/commands/workflow/clean.md | 2 +- .../workflow/collaborative-plan-with-file.md | 4 +- .claude/commands/workflow/init-guidelines.md | 19 ++++--- .claude/commands/workflow/init-specs.md | 24 ++++----- .claude/commands/workflow/init.md | 14 ++--- .claude/commands/workflow/session/solidify.md | 51 +++++++------------ .claude/commands/workflow/session/start.md | 4 +- .claude/commands/workflow/session/sync.md | 9 ++-- .../workflow/unified-execute-with-file.md | 4 +- 11 files changed, 65 insertions(+), 68 deletions(-) diff --git a/.ccw/specs/architecture-constraints.md b/.ccw/specs/architecture-constraints.md index 4c55bb32..65184861 100644 --- a/.ccw/specs/architecture-constraints.md +++ b/.ccw/specs/architecture-constraints.md @@ -9,6 +9,7 @@ keywords: - pattern readMode: required priority: high +scope: project --- # Architecture Constraints diff --git a/.ccw/specs/coding-conventions.md b/.ccw/specs/coding-conventions.md index f134f9b7..794ed4cf 100644 --- a/.ccw/specs/coding-conventions.md +++ b/.ccw/specs/coding-conventions.md @@ -9,6 +9,7 @@ keywords: - convention readMode: required priority: high +scope: project --- # Coding Conventions diff --git a/.claude/commands/workflow/clean.md b/.claude/commands/workflow/clean.md index a3b31715..42627b19 100644 --- a/.claude/commands/workflow/clean.md +++ b/.claude/commands/workflow/clean.md @@ -496,7 +496,7 @@ if (fileExists(projectPath)) { } // Update specs/*.md: remove learnings referencing deleted sessions -const guidelinesPath = '.workflow/specs/*.md' +const guidelinesPath = '.ccw/specs/*.md' if (fileExists(guidelinesPath)) { const guidelines = JSON.parse(Read(guidelinesPath)) const deletedSessionIds = results.deleted diff --git a/.claude/commands/workflow/collaborative-plan-with-file.md b/.claude/commands/workflow/collaborative-plan-with-file.md index 8bfa962f..bcba835e 100644 --- a/.claude/commands/workflow/collaborative-plan-with-file.md +++ b/.claude/commands/workflow/collaborative-plan-with-file.md @@ -208,7 +208,7 @@ Task( ### Project Context (MANDATORY) Read and incorporate: - \`.workflow/project-tech.json\` (if exists): Technology stack, architecture -- \`.workflow/specs/*.md\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS on sub-domain splitting and plan structure +- \`.ccw/specs/*.md\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS on sub-domain splitting and plan structure ### Input Requirements ${taskDescription} @@ -357,7 +357,7 @@ subDomains.map(sub => ### Project Context (MANDATORY) Read and incorporate: - \`.workflow/project-tech.json\` (if exists): Technology stack, architecture -- \`.workflow/specs/*.md\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS +- \`.ccw/specs/*.md\` (if exists): Constraints, conventions -- apply as HARD CONSTRAINTS ## Dual Output Tasks diff --git a/.claude/commands/workflow/init-guidelines.md b/.claude/commands/workflow/init-guidelines.md index 96abc6ae..4a1dd98a 100644 --- a/.claude/commands/workflow/init-guidelines.md +++ b/.claude/commands/workflow/init-guidelines.md @@ -11,7 +11,7 @@ examples: ## Overview -Interactive multi-round wizard that analyzes the current project (via `project-tech.json`) and asks targeted questions to populate `.workflow/specs/*.md` with coding conventions, constraints, and quality rules. +Interactive multi-round wizard that analyzes the current project (via `project-tech.json`) and asks targeted questions to populate `.ccw/specs/*.md` with coding conventions, constraints, and quality rules. **Design Principle**: Questions are dynamically generated based on the project's tech stack, architecture, and patterns — not generic boilerplate. @@ -55,7 +55,7 @@ Step 5: Display Summary ```bash bash(test -f .workflow/project-tech.json && echo "TECH_EXISTS" || echo "TECH_NOT_FOUND") -bash(test -f .workflow/specs/coding-conventions.md && echo "SPECS_EXISTS" || echo "SPECS_NOT_FOUND") +bash(test -f .ccw/specs/coding-conventions.md && echo "SPECS_EXISTS" || echo "SPECS_NOT_FOUND") ``` **If TECH_NOT_FOUND**: Exit with message @@ -332,9 +332,16 @@ For each category of collected answers, append rules to the corresponding spec M ```javascript // Helper: append rules to a spec MD file with category support +// Uses .ccw/specs/ directory (same as frontend/backend spec-index-builder) function appendRulesToSpecFile(filePath, rules, defaultCategory = 'general') { if (rules.length === 0) return + // Ensure .ccw/specs/ directory exists + const specDir = path.dirname(filePath) + if (!fs.existsSync(specDir)) { + fs.mkdirSync(specDir, { recursive: true }) + } + // Check if file exists if (!file_exists(filePath)) { // Create file with frontmatter including category @@ -360,19 +367,19 @@ keywords: [${defaultCategory}, ${filePath.includes('conventions') ? 'convention' Write(filePath, newContent) } -// Write conventions (general category) -appendRulesToSpecFile('.workflow/specs/coding-conventions.md', +// Write conventions (general category) - use .ccw/specs/ (same as frontend/backend) +appendRulesToSpecFile('.ccw/specs/coding-conventions.md', [...newCodingStyle, ...newNamingPatterns, ...newFileStructure, ...newDocumentation], 'general') // Write constraints (planning category) -appendRulesToSpecFile('.workflow/specs/architecture-constraints.md', +appendRulesToSpecFile('.ccw/specs/architecture-constraints.md', [...newArchitecture, ...newTechStack, ...newPerformance, ...newSecurity], 'planning') // Write quality rules (execution category) if (newQualityRules.length > 0) { - const qualityPath = '.workflow/specs/quality-rules.md' + const qualityPath = '.ccw/specs/quality-rules.md' if (!file_exists(qualityPath)) { Write(qualityPath, `--- title: Quality Rules diff --git a/.claude/commands/workflow/init-specs.md b/.claude/commands/workflow/init-specs.md index b7cab254..3e11e145 100644 --- a/.claude/commands/workflow/init-specs.md +++ b/.claude/commands/workflow/init-specs.md @@ -54,7 +54,7 @@ Step 1: Gather Requirements (Interactive) └─ Ask content (rule text) Step 2: Determine Target File - ├─ specs dimension → .workflow/specs/coding-conventions.md or architecture-constraints.md + ├─ specs dimension → .ccw/specs/coding-conventions.md or architecture-constraints.md └─ personal dimension → ~/.ccw/specs/personal/ or .ccw/specs/personal/ Step 3: Write Spec @@ -109,7 +109,7 @@ if (!dimension) { options: [ { label: "Project Spec", - description: "Coding conventions, constraints, quality rules for this project (stored in .workflow/specs/)" + description: "Coding conventions, constraints, quality rules for this project (stored in .ccw/specs/)" }, { label: "Personal Spec", @@ -234,19 +234,19 @@ let targetFile: string let targetDir: string if (dimension === 'specs') { - // Project specs - targetDir = '.workflow/specs' + // Project specs - use .ccw/specs/ (same as frontend/backend spec-index-builder) + targetDir = '.ccw/specs' if (isConstraint) { targetFile = path.join(targetDir, 'architecture-constraints.md') } else { targetFile = path.join(targetDir, 'coding-conventions.md') } } else { - // Personal specs + // Personal specs - use .ccw/personal/ (same as backend spec-index-builder) if (scope === 'global') { - targetDir = path.join(os.homedir(), '.ccw', 'specs', 'personal') + targetDir = path.join(os.homedir(), '.ccw', 'personal') } else { - targetDir = path.join('.ccw', 'specs', 'personal') + targetDir = path.join('.ccw', 'personal') } // Create category-based filename @@ -333,7 +333,7 @@ Use 'ccw spec load --category ${category}' to load specs by category ### Project Specs (dimension: specs) ``` -.workflow/specs/ +.ccw/specs/ ├── coding-conventions.md ← conventions, learnings ├── architecture-constraints.md ← constraints └── quality-rules.md ← quality rules @@ -341,14 +341,14 @@ Use 'ccw spec load --category ${category}' to load specs by category ### Personal Specs (dimension: personal) ``` -# Global (~/.ccw/specs/personal/) -~/.ccw/specs/personal/ +# Global (~/.ccw/personal/) +~/.ccw/personal/ ├── conventions.md ← personal conventions (all projects) ├── constraints.md ← personal constraints (all projects) └── learnings.md ← personal learnings (all projects) -# Project-local (.ccw/specs/personal/) -.ccw/specs/personal/ +# Project-local (.ccw/personal/) +.ccw/personal/ ├── conventions.md ← personal conventions (this project only) ├── constraints.md ← personal constraints (this project only) └── learnings.md ← personal learnings (this project only) diff --git a/.claude/commands/workflow/init.md b/.claude/commands/workflow/init.md index a16ff1e1..99e8d6a4 100644 --- a/.claude/commands/workflow/init.md +++ b/.claude/commands/workflow/init.md @@ -11,7 +11,7 @@ examples: # Workflow Init Command (/workflow:init) ## Overview -Initialize `.workflow/project-tech.json` and `.workflow/specs/*.md` with comprehensive project understanding by delegating analysis to **cli-explore-agent**. +Initialize `.workflow/project-tech.json` and `.ccw/specs/*.md` with comprehensive project understanding by delegating analysis to **cli-explore-agent**. **Dual File System**: - `project-tech.json`: Auto-generated technical analysis (stack, architecture, components) @@ -58,7 +58,7 @@ Analysis Flow: Output: ├─ .workflow/project-tech.json (+ .backup if regenerate) - └─ .workflow/specs/*.md (scaffold or configured, unless --skip-specs) + └─ .ccw/specs/*.md (scaffold or configured, unless --skip-specs) ``` ## Implementation @@ -75,14 +75,14 @@ const skipSpecs = $ARGUMENTS.includes('--skip-specs') ```bash bash(test -f .workflow/project-tech.json && echo "TECH_EXISTS" || echo "TECH_NOT_FOUND") -bash(test -f .workflow/specs/coding-conventions.md && echo "SPECS_EXISTS" || echo "SPECS_NOT_FOUND") +bash(test -f .ccw/specs/coding-conventions.md && echo "SPECS_EXISTS" || echo "SPECS_NOT_FOUND") ``` **If BOTH_EXIST and no --regenerate**: Exit early ``` Project already initialized: - Tech analysis: .workflow/project-tech.json -- Guidelines: .workflow/specs/*.md +- Guidelines: .ccw/specs/*.md Use /workflow:init --regenerate to rebuild tech analysis Use /workflow:session:solidify to add guidelines @@ -171,7 +171,7 @@ Project root: ${projectRoot} // Skip spec initialization if --skip-specs flag is provided if (!skipSpecs) { // Initialize spec system if not already initialized - const specsCheck = Bash('test -f .workflow/specs/coding-conventions.md && echo EXISTS || echo NOT_FOUND') + const specsCheck = Bash('test -f .ccw/specs/coding-conventions.md && echo EXISTS || echo NOT_FOUND') if (specsCheck.includes('NOT_FOUND')) { console.log('Initializing spec system...') Bash('ccw spec init') @@ -186,7 +186,7 @@ if (!skipSpecs) { ```javascript const projectTech = JSON.parse(Read('.workflow/project-tech.json')); -const specsInitialized = !skipSpecs && file_exists('.workflow/specs/coding-conventions.md'); +const specsInitialized = !skipSpecs && file_exists('.ccw/specs/coding-conventions.md'); console.log(` Project initialized successfully @@ -206,7 +206,7 @@ Components: ${projectTech.overview.key_components.length} core modules --- Files created: - Tech analysis: .workflow/project-tech.json -${!skipSpecs ? `- Specs: .workflow/specs/ ${specsInitialized ? '(initialized)' : ''}` : '- Specs: (skipped via --skip-specs)'} +${!skipSpecs ? `- Specs: .ccw/specs/ ${specsInitialized ? '(initialized)' : ''}` : '- Specs: (skipped via --skip-specs)'} ${regenerate ? '- Backup: .workflow/project-tech.json.backup' : ''} `); ``` diff --git a/.claude/commands/workflow/session/solidify.md b/.claude/commands/workflow/session/solidify.md index e91bd49a..c1f551d7 100644 --- a/.claude/commands/workflow/session/solidify.md +++ b/.claude/commands/workflow/session/solidify.md @@ -18,7 +18,7 @@ When `--yes` or `-y`: Auto-categorize and add guideline without confirmation. ## Overview -Crystallizes ephemeral session context (insights, decisions, constraints) into permanent project guidelines stored in `.workflow/specs/*.md`. This ensures valuable learnings persist across sessions and inform future planning. +Crystallizes ephemeral session context (insights, decisions, constraints) into permanent project guidelines stored in `.ccw/specs/*.md`. This ensures valuable learnings persist across sessions and inform future planning. ## Use Cases @@ -112,8 +112,10 @@ ELSE (convention/constraint/learning): ### Step 1: Ensure Guidelines File Exists +**Uses .ccw/specs/ directory (same as frontend/backend spec-index-builder)** + ```bash -bash(test -f .workflow/specs/coding-conventions.md && echo "EXISTS" || echo "NOT_FOUND") +bash(test -f .ccw/specs/coding-conventions.md && echo "EXISTS" || echo "NOT_FOUND") ``` **If NOT_FOUND**, initialize spec system: @@ -187,9 +189,10 @@ function buildEntry(rule, type, category, sessionId) { ```javascript // Map type+category to target spec file +// Uses .ccw/specs/ directory (same as frontend/backend spec-index-builder) const specFileMap = { - convention: '.workflow/specs/coding-conventions.md', - constraint: '.workflow/specs/architecture-constraints.md' + convention: '.ccw/specs/coding-conventions.md', + constraint: '.ccw/specs/architecture-constraints.md' } if (type === 'convention' || type === 'constraint') { @@ -204,7 +207,8 @@ if (type === 'convention' || type === 'constraint') { } } else if (type === 'learning') { // Learnings go to coding-conventions.md as a special section - const targetFile = '.workflow/specs/coding-conventions.md' + // Uses .ccw/specs/ directory (same as frontend/backend spec-index-builder) + const targetFile = '.ccw/specs/coding-conventions.md' const existing = Read(targetFile) const entry = buildEntry(rule, type, category, sessionId) const learningText = `- [learning/${category}] ${entry.insight} (${entry.date})` @@ -228,7 +232,7 @@ Type: ${type} Category: ${category} Rule: "${rule}" -Location: .workflow/specs/*.md -> ${type}s.${category} +Location: .ccw/specs/*.md -> ${type}s.${category} Total ${type}s in ${category}: ${count} ``` @@ -373,13 +377,9 @@ AskUserQuestion({ /workflow:session:solidify "Use async/await instead of callbacks" --type convention --category coding_style ``` -Result in `specs/*.md`: -```json -{ - "conventions": { - "coding_style": ["Use async/await instead of callbacks"] - } -} +Result in `.ccw/specs/coding-conventions.md`: +```markdown +- [coding_style] Use async/await instead of callbacks ``` ### Add an Architectural Constraint @@ -387,13 +387,9 @@ Result in `specs/*.md`: /workflow:session:solidify "No direct DB access from controllers" --type constraint --category architecture ``` -Result: -```json -{ - "constraints": { - "architecture": ["No direct DB access from controllers"] - } -} +Result in `.ccw/specs/architecture-constraints.md`: +```markdown +- [architecture] No direct DB access from controllers ``` ### Capture a Session Learning @@ -401,18 +397,9 @@ Result: /workflow:session:solidify "Cache invalidation requires event sourcing for consistency" --type learning ``` -Result: -```json -{ - "learnings": [ - { - "date": "2024-12-28", - "session_id": "WFS-auth-feature", - "insight": "Cache invalidation requires event sourcing for consistency", - "category": "architecture" - } - ] -} +Result in `.ccw/specs/coding-conventions.md`: +```markdown +- [learning/architecture] Cache invalidation requires event sourcing for consistency (2024-12-28) ``` ### Compress Recent Memories diff --git a/.claude/commands/workflow/session/start.md b/.claude/commands/workflow/session/start.md index 69acea4e..4d9a95b3 100644 --- a/.claude/commands/workflow/session/start.md +++ b/.claude/commands/workflow/session/start.md @@ -44,7 +44,7 @@ ERROR: Invalid session type. Valid types: workflow, review, tdd, test, docs ```bash # Check if project state exists (both files required) bash(test -f .workflow/project-tech.json && echo "TECH_EXISTS" || echo "TECH_NOT_FOUND") -bash(test -f .workflow/specs/*.md && echo "GUIDELINES_EXISTS" || echo "GUIDELINES_NOT_FOUND") +bash(test -f .ccw/specs/*.md && echo "GUIDELINES_EXISTS" || echo "GUIDELINES_NOT_FOUND") ``` **If either NOT_FOUND**, delegate to `/workflow:init`: @@ -60,7 +60,7 @@ Skill(skill="workflow:init"); - If BOTH_EXIST: `PROJECT_STATE: initialized` - If NOT_FOUND: Calls `/workflow:init` → creates: - `.workflow/project-tech.json` with full technical analysis - - `.workflow/specs/*.md` with empty scaffold + - `.ccw/specs/*.md` with empty scaffold **Note**: `/workflow:init` uses cli-explore-agent to build comprehensive project understanding (technology stack, architecture, key components). This step runs once per project. Subsequent executions skip initialization. diff --git a/.claude/commands/workflow/session/sync.md b/.claude/commands/workflow/session/sync.md index 1868ebf6..05a13444 100644 --- a/.claude/commands/workflow/session/sync.md +++ b/.claude/commands/workflow/session/sync.md @@ -124,7 +124,7 @@ Tech [${detectCategory(summary)}]: ${techEntry.title} Target files: - .workflow/specs/*.md + .ccw/specs/*.md .workflow/project-tech.json `) @@ -138,12 +138,13 @@ if (!autoYes) { ```javascript // ── Update specs/*.md ── +// Uses .ccw/specs/ directory (same as frontend/backend spec-index-builder) if (guidelineUpdates.length > 0) { // Map guideline types to spec files const specFileMap = { - convention: '.workflow/specs/coding-conventions.md', - constraint: '.workflow/specs/architecture-constraints.md', - learning: '.workflow/specs/coding-conventions.md' // learnings appended to conventions + convention: '.ccw/specs/coding-conventions.md', + constraint: '.ccw/specs/architecture-constraints.md', + learning: '.ccw/specs/coding-conventions.md' // learnings appended to conventions } for (const g of guidelineUpdates) { diff --git a/.claude/commands/workflow/unified-execute-with-file.md b/.claude/commands/workflow/unified-execute-with-file.md index ce8705a3..50cb9dee 100644 --- a/.claude/commands/workflow/unified-execute-with-file.md +++ b/.claude/commands/workflow/unified-execute-with-file.md @@ -477,8 +477,8 @@ ${recommendations.map(r => \`- ${r}\`).join('\\n')} const projectTech = file_exists('.workflow/project-tech.json') ? JSON.parse(Read('.workflow/project-tech.json')) : null // Read specs/*.md (if exists) - const projectGuidelines = file_exists('.workflow/specs/*.md') - ? JSON.parse(Read('.workflow/specs/*.md')) : null + const projectGuidelines = file_exists('.ccw/specs/*.md') + ? JSON.parse(Read('.ccw/specs/*.md')) : null ``` ```javascript