mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-03-03 15:43:11 +08:00
- Added `findAllCoreMemoryDatabases` function to recursively locate core-memory databases in nested project structures. - Updated `listAllProjects` to utilize the new recursive function for improved project listing. - Enhanced `getMemoriesFromProject` and `findMemoryAcrossProjects` to support nested project structures. feat: Introduce spec context injection in hooks configuration - Added a new hook configuration for "Spec Context Injection" to load project specs based on prompt keywords. chore: Add gray-matter dependency for YAML frontmatter parsing - Included `gray-matter` package in `package.json` for parsing YAML frontmatter in markdown files. feat: Create Spec Index Builder tool for managing project specs - Implemented `spec-index-builder.ts` to scan markdown files, extract YAML frontmatter, and generate index cache files for different spec dimensions. feat: Develop Spec Init tool for initializing spec directories and seed documents - Created `spec-init.ts` to set up the directory structure and seed documents for the spec system. feat: Build Spec Keyword Extractor for keyword extraction from prompts - Added `spec-keyword-extractor.ts` to extract keywords from user prompts, supporting both English and Chinese text. feat: Implement Spec Loader for loading and filtering specs based on keywords - Developed `spec-loader.ts` to handle loading of specs, filtering by read mode and keyword matches, and formatting output for CLI or hooks.
132 lines
4.8 KiB
JSON
132 lines
4.8 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft-07/schema",
|
|
"description": "Example hooks configuration for CCW. Place in .claude/settings.json under 'hooks' key.",
|
|
"hooks": {
|
|
"session-start": [
|
|
{
|
|
"name": "Progressive Disclosure",
|
|
"description": "Injects progressive disclosure index at session start with recovery detection",
|
|
"enabled": true,
|
|
"handler": "internal:context",
|
|
"timeout": 5000,
|
|
"failMode": "silent",
|
|
"notes": [
|
|
"Checks for recovery checkpoints and injects recovery message if found",
|
|
"Uses RecoveryHandler.checkRecovery() for session recovery"
|
|
]
|
|
}
|
|
],
|
|
"session-end": [
|
|
{
|
|
"name": "Update Cluster Metadata",
|
|
"description": "Updates cluster metadata after session ends",
|
|
"enabled": true,
|
|
"command": "ccw core-memory update-cluster --session $SESSION_ID",
|
|
"timeout": 30000,
|
|
"async": true,
|
|
"failMode": "log"
|
|
},
|
|
{
|
|
"name": "Mode State Cleanup",
|
|
"description": "Deactivates all active modes for the session",
|
|
"enabled": true,
|
|
"command": "ccw hook session-end --stdin",
|
|
"timeout": 5000,
|
|
"failMode": "silent"
|
|
}
|
|
],
|
|
"Stop": [
|
|
{
|
|
"name": "Stop Handler",
|
|
"description": "Handles Stop hook events with Soft Enforcement - injects continuation messages for active workflows/modes",
|
|
"enabled": true,
|
|
"command": "ccw hook stop --stdin",
|
|
"timeout": 5000,
|
|
"failMode": "silent",
|
|
"notes": [
|
|
"Priority order: context-limit > user-abort > active-workflow > active-mode",
|
|
"ALWAYS returns continue: true (never blocks stops)",
|
|
"Injects continuation message instead of blocking",
|
|
"Deadlock prevention: context-limit stops are always allowed",
|
|
"Uses ModeRegistryService to check active modes"
|
|
]
|
|
}
|
|
],
|
|
"PreCompact": [
|
|
{
|
|
"name": "Checkpoint Creation",
|
|
"description": "Creates checkpoint before context compaction to preserve session state",
|
|
"enabled": true,
|
|
"command": "ccw hook pre-compact --stdin",
|
|
"timeout": 10000,
|
|
"failMode": "silent",
|
|
"notes": [
|
|
"Creates checkpoint with mode states, workflow state, and memory context",
|
|
"Uses mutex to prevent concurrent compaction for same directory",
|
|
"Returns systemMessage with checkpoint summary for context injection"
|
|
]
|
|
}
|
|
],
|
|
"UserPromptSubmit": [
|
|
{
|
|
"name": "Keyword Detection",
|
|
"description": "Detects mode keywords in prompts and activates corresponding modes",
|
|
"enabled": true,
|
|
"command": "ccw hook keyword --stdin",
|
|
"timeout": 5000,
|
|
"failMode": "silent",
|
|
"notes": [
|
|
"Supported keywords: autopilot, ralph, ultrawork, swarm, pipeline, team, ultrapilot, ultraqa",
|
|
"Maps keywords to execution modes using ModeRegistryService",
|
|
"Injects systemMessage on mode activation"
|
|
]
|
|
},
|
|
{
|
|
"name": "Spec Context Injection",
|
|
"description": "Loads project specs matching prompt keywords and injects as system context",
|
|
"enabled": true,
|
|
"command": "ccw spec load --stdin",
|
|
"timeout": 5000,
|
|
"failMode": "silent"
|
|
}
|
|
],
|
|
"file-modified": [
|
|
{
|
|
"name": "Auto Commit Checkpoint",
|
|
"description": "Creates git checkpoint on file modifications",
|
|
"enabled": false,
|
|
"command": "git add . && git commit -m \"[Auto] Checkpoint: $FILE_PATH\"",
|
|
"timeout": 10000,
|
|
"async": true,
|
|
"failMode": "log"
|
|
}
|
|
],
|
|
"context-request": [
|
|
{
|
|
"name": "Dynamic Context",
|
|
"description": "Provides context based on current session cluster",
|
|
"enabled": true,
|
|
"handler": "internal:context",
|
|
"timeout": 5000,
|
|
"failMode": "silent"
|
|
}
|
|
]
|
|
},
|
|
"hookSettings": {
|
|
"globalTimeout": 60000,
|
|
"defaultFailMode": "silent",
|
|
"allowAsync": true,
|
|
"enableLogging": true
|
|
},
|
|
"notes": {
|
|
"handler": "Use 'internal:context' for built-in context generation, or 'command' for external commands",
|
|
"failMode": "Options: 'silent' (ignore errors), 'log' (log errors), 'fail' (abort on error)",
|
|
"variables": "Available: $SESSION_ID, $FILE_PATH, $PROJECT_PATH, $CLUSTER_ID",
|
|
"async": "Async hooks run in background and don't block the main flow",
|
|
"Stop hook": "The Stop hook uses Soft Enforcement - it never blocks but may inject continuation messages",
|
|
"PreCompact hook": "Creates checkpoint before compaction; uses mutex to prevent concurrent operations",
|
|
"UserPromptSubmit hook": "Detects mode keywords and activates corresponding execution modes",
|
|
"session-end hook": "Cleans up mode states using ModeRegistryService.deactivateMode()"
|
|
}
|
|
}
|