From e130d5a8c42b985bf90ca57603b3f1f817203beb Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 1 Feb 2026 19:27:40 +0000 Subject: [PATCH] chore: remove issue drafts (migrated to GitHub) Issues #1-27 created on host-uk/core-agent. Co-Authored-By: Claude Opus 4.5 --- claude/issues/000-overview.md | 86 ------- claude/issues/001-ai-session.md | 46 ---- claude/issues/002-ai-context.md | 53 ---- claude/issues/003-ai-hook.md | 60 ----- claude/issues/004-lint-debug.md | 58 ----- claude/issues/005-collect-github.md | 71 ----- claude/issues/006-collect-bitcointalk.md | 64 ----- claude/issues/007-collect-market.md | 67 ----- claude/issues/008-collect-papers.md | 68 ----- claude/issues/009-collect-excavate.md | 92 ------- claude/issues/010-collect-process.md | 70 ----- claude/issues/011-collect-dispatch.md | 73 ------ claude/issues/012-hooks-test-feedback.md | 80 ------ claude/issues/013-hooks-stop-verify.md | 98 ------- claude/issues/014-hooks-auto-test.md | 97 ------- claude/issues/015-hooks-context-inject.md | 101 -------- claude/issues/016-hooks-format-auto.md | 89 ------- claude/issues/017-hooks-expose-hide.md | 124 --------- claude/issues/018-skill-yes-mode.md | 164 ------------ claude/issues/019-skill-qa-loop.md | 301 ---------------------- 20 files changed, 1862 deletions(-) delete mode 100644 claude/issues/000-overview.md delete mode 100644 claude/issues/001-ai-session.md delete mode 100644 claude/issues/002-ai-context.md delete mode 100644 claude/issues/003-ai-hook.md delete mode 100644 claude/issues/004-lint-debug.md delete mode 100644 claude/issues/005-collect-github.md delete mode 100644 claude/issues/006-collect-bitcointalk.md delete mode 100644 claude/issues/007-collect-market.md delete mode 100644 claude/issues/008-collect-papers.md delete mode 100644 claude/issues/009-collect-excavate.md delete mode 100644 claude/issues/010-collect-process.md delete mode 100644 claude/issues/011-collect-dispatch.md delete mode 100644 claude/issues/012-hooks-test-feedback.md delete mode 100644 claude/issues/013-hooks-stop-verify.md delete mode 100644 claude/issues/014-hooks-auto-test.md delete mode 100644 claude/issues/015-hooks-context-inject.md delete mode 100644 claude/issues/016-hooks-format-auto.md delete mode 100644 claude/issues/017-hooks-expose-hide.md delete mode 100644 claude/issues/018-skill-yes-mode.md delete mode 100644 claude/issues/019-skill-qa-loop.md diff --git a/claude/issues/000-overview.md b/claude/issues/000-overview.md deleted file mode 100644 index e15d5b4..0000000 --- a/claude/issues/000-overview.md +++ /dev/null @@ -1,86 +0,0 @@ -# feat: Replace shell scripts with core CLI commands - -## Summary - -This tracking issue covers the migration from shell scripts to native `core` CLI commands in `core-agent`. Every shell script should be replaced by a `core` command, making the plugin purely configuration (JSON, MD) + calls to `core`. - -## Philosophy - -- Every agent using `core` tests the framework -- Missing features get raised as issues -- Code as if functionality exists (TDD approach) -- The CLI becomes battle-tested and bulletproof - -## Issues - -### Claude Code Hooks (core ai) - -| Issue | Command | Replaces | -|-------|---------|----------| -| #001 | `core ai session` | pre-compact.sh, session-start.sh, suggest-compact.sh | -| #002 | `core ai context` | capture-context.sh, extract-actionables.sh | -| #003 | `core ai hook` | prefer-core.sh, block-docs.sh, post-commit-check.sh | - -### Quality Assurance (core qa) - -| Issue | Command | Replaces | -|-------|---------|----------| -| #004 | `core qa debug` | check-debug.sh | - -### Data Collection (core collect) - -| Issue | Command | Replaces | -|-------|---------|----------| -| #005 | `core collect github` | github-history/collect.sh | -| #006 | `core collect bitcointalk` | bitcointalk/collect.sh | -| #007 | `core collect market` | coinmarketcap/*.sh | -| #008 | `core collect papers` | ledger-papers/discover.sh, collect-whitepaper.sh | -| #009 | `core collect excavate` | project-archaeology/excavate.sh | -| #010 | `core collect process` | job-collector/process.sh | -| #011 | `core collect dispatch` | collection/dispatch.sh | - -## Target State - -After all issues are implemented: - -``` -claude/ -├── hooks/ -│ └── hooks.json # Calls core ai hook validate-* -├── commands/ -│ └── remember.md # Calls core ai context add -├── collection/ -│ └── hooks.json # Calls core collect dispatch -└── skills/ - └── */ - └── SKILL.md # Documentation only, calls core collect * -``` - -No shell scripts. Just JSON config + markdown docs + `core` CLI calls. - -### Hook Improvements (feedback cycle) - -| Issue | Feature | Purpose | -|-------|---------|---------| -| #012 | Test output filtering | Reduce noise, show only failures | -| #013 | Stop verification | Verify work complete before stopping | -| #014 | Auto-test on edit | Run tests async after code changes | -| #015 | Session context | Inject git/issues/CI context on start | -| #016 | Silent formatting | Auto-format without output noise | -| #017 | Expose/hide policy | Define what to show vs suppress | - -### Skills (autonomous workflows) - -| Issue | Skill | Purpose | -|-------|-------|---------| -| #018 | `/core:yes` | Auto-approve all, ensure commit before stop | -| #019 | `/core:qa` | Run QA, fix issues iteratively until clean | - -## Implementation Order - -1. **Phase 1**: `core ai session` + `core ai context` (enables hooks to work) -2. **Phase 2**: `core ai hook` + `core qa debug` (safety + quality) -3. **Phase 3**: Hook improvements (012-017) - better feedback cycle -4. **Phase 4**: Skills (018-019) - autonomous workflows -5. **Phase 5**: `core collect github` + `core collect bitcointalk` (most used) -6. **Phase 6**: Remaining collection commands diff --git a/claude/issues/001-ai-session.md b/claude/issues/001-ai-session.md deleted file mode 100644 index 4adadad..0000000 --- a/claude/issues/001-ai-session.md +++ /dev/null @@ -1,46 +0,0 @@ -# feat(ai): Add session state management for Claude Code hooks - -## Summary - -Add `core ai session` subcommands to manage Claude Code session state, replacing shell scripts that currently handle this. - -## Required Commands - -```bash -core ai session save # Save current session state (pre-compact) -core ai session restore # Restore session state (session-start) -core ai session stats # Track tool calls, suggest compaction -core ai session clear # Clear stale session data -``` - -## Current Shell Scripts Being Replaced - -- `claude/scripts/pre-compact.sh` - Saves state before auto-compact -- `claude/scripts/session-start.sh` - Restores context on startup -- `claude/scripts/suggest-compact.sh` - Suggests compaction at intervals - -## State to Manage - -- Working directory and git branch -- Git status (modified files) -- In-progress todos -- Context facts (decisions, actionables) -- Tool call counter per session - -## Storage - -State stored in `~/.claude/sessions/`: -- `scratchpad.md` - Human-readable resume state -- `context.json` - Structured context facts -- `stats.json` - Session statistics - -## Output Format - -```json -{ - "saved": true, - "path": "~/.claude/sessions/scratchpad.md", - "facts": 5, - "tool_calls": 47 -} -``` diff --git a/claude/issues/002-ai-context.md b/claude/issues/002-ai-context.md deleted file mode 100644 index 3d23ed4..0000000 --- a/claude/issues/002-ai-context.md +++ /dev/null @@ -1,53 +0,0 @@ -# feat(ai): Add context fact management for Claude Code - -## Summary - -Add `core ai context` subcommands to capture and manage context facts that persist across compaction. - -## Required Commands - -```bash -core ai context add [--source=X] # Save a context fact -core ai context list # List current facts -core ai context extract # Extract actionables from tool output -core ai context clear # Clear old context (>3h) -``` - -## Current Shell Scripts Being Replaced - -- `claude/scripts/capture-context.sh` - Stores context facts -- `claude/scripts/extract-actionables.sh` - Extracts actionables from core CLI output - -## Context Format - -```json -[ - {"fact": "Use Action pattern not Service", "source": "user", "ts": 1234567890}, - {"fact": "FAIL: TestFoo", "source": "core go test", "ts": 1234567891} -] -``` - -## Extraction Patterns - -The `extract` command should parse output from: -- `core go test` / `core go qa` / `core go lint` - Extract ERROR/WARN/FAIL lines -- `core php test` / `core php stan` - Extract FAIL/Error lines -- `core build` - Extract error/cannot/undefined lines - -## Storage - -- `~/.claude/sessions/context.json` -- Max 20 items, auto-clear after 3 hours of inactivity - -## Example Usage - -```bash -# Manual fact -core ai context add "User prefers UK English" --source=user - -# Extract from piped output -core go test 2>&1 | core ai context extract - -# List facts -core ai context list --json -``` diff --git a/claude/issues/003-ai-hook.md b/claude/issues/003-ai-hook.md deleted file mode 100644 index 0b378e6..0000000 --- a/claude/issues/003-ai-hook.md +++ /dev/null @@ -1,60 +0,0 @@ -# feat(ai): Add hook validation for Claude Code PreToolUse - -## Summary - -Add `core ai hook` subcommands to validate commands and file operations for Claude Code hooks. - -## Required Commands - -```bash -core ai hook validate-command # Check if command is safe/allowed -core ai hook validate-file # Check if file creation is allowed -core ai hook post-commit # Check for uncommitted work after commit -``` - -## Current Shell Scripts Being Replaced - -- `claude/hooks/prefer-core.sh` - Blocks dangerous commands, enforces core CLI -- `claude/scripts/block-docs.sh` - Blocks random .md file creation -- `claude/scripts/post-commit-check.sh` - Warns about uncommitted work - -## Command Validation Rules - -Block these patterns: -- `rm -rf` / `rm -r` (except node_modules, vendor, .cache, dist, build) -- `mv`/`cp` with wildcards -- `xargs` with rm/mv/cp -- `find -exec` with file operations -- `sed -i` (in-place editing) -- `grep -l | ...` (mass file targeting) -- `perl -i`, `awk > file` - -Redirect to core: -- `go test/build/fmt/mod` → suggest `core go *` -- `golangci-lint` → suggest `core go lint` -- `composer test` → suggest `core php test` -- `./vendor/bin/pint` → suggest `core php fmt` -- `php artisan serve` → suggest `core php dev` - -## File Validation Rules - -Allow: -- `README.md`, `CLAUDE.md`, `AGENTS.md`, `CONTRIBUTING.md`, `CHANGELOG.md`, `LICENSE.md` -- Files in `docs/` directory - -Block: -- Other `.md` files (suggest using README.md or docs/) - -## Output Format (JSON for hooks) - -```json -{"decision": "approve"} -``` - -```json -{"decision": "block", "message": "Use `core go test` instead of raw go test"} -``` - -```json -{"decision": "warn", "message": "3 files remain uncommitted after commit"} -``` diff --git a/claude/issues/004-lint-debug.md b/claude/issues/004-lint-debug.md deleted file mode 100644 index 431d98e..0000000 --- a/claude/issues/004-lint-debug.md +++ /dev/null @@ -1,58 +0,0 @@ -# feat(qa): Add debug statement detection - -## Summary - -Add `core qa debug` command to detect debug statements in code, for use in Claude Code PostToolUse hooks. - -## Required Commands - -```bash -core qa debug # Check single file for debug statements -core qa debug --staged # Check all staged files -core qa debug --changed # Check all changed files -``` - -## Current Shell Script Being Replaced - -- `claude/scripts/check-debug.sh` - Warns about debug statements after edits - -## Detection Patterns - -**Go files (*.go):** -- `fmt.Println` -- `fmt.Printf` (without format verbs suggesting actual logging) -- `log.Println` -- `log.Printf` -- `spew.Dump` -- `pp.Println` - -**PHP files (*.php):** -- `dd(` -- `dump(` -- `var_dump(` -- `print_r(` -- `ray(` - -**JavaScript/TypeScript (*.js, *.ts, *.tsx):** -- `console.log` -- `console.debug` -- `debugger` - -## Output Format - -```json -{ - "file": "src/main.go", - "warnings": [ - {"line": 42, "type": "fmt.Println", "content": "fmt.Println(\"debug\")"}, - {"line": 87, "type": "log.Println", "content": "log.Println(err)"} - ] -} -``` - -For hooks, output to stderr: -``` -[qa] WARNING: Debug statements found in src/main.go - 42: fmt.Println("debug") - 87: log.Println(err) -``` diff --git a/claude/issues/005-collect-github.md b/claude/issues/005-collect-github.md deleted file mode 100644 index 09955aa..0000000 --- a/claude/issues/005-collect-github.md +++ /dev/null @@ -1,71 +0,0 @@ -# feat(collect): Add GitHub history collection - -## Summary - -Add `core collect github` command to archive GitHub issues and PRs from repositories and organisations. - -## Required Commands - -```bash -core collect github # Collect issues + PRs from repo -core collect github --org # Collect all repos in org -core collect github --org # Batch collect multiple orgs -core collect github --issues-only # Issues only -core collect github --prs-only # PRs only -core collect github --check-rate # Show rate limit status -``` - -## Current Shell Script Being Replaced - -- `claude/skills/github-history/collect.sh` - 517 lines of bash - -## Features - -1. **Rate limit protection** - - Check every N calls - - Auto-pause at 25% remaining (75% used) - - Resume after reset + 10s buffer - -2. **Incremental collection** - - Skip already-fetched issues/PRs - - Resume interrupted collections - -3. **Reception scoring** - - ADDRESSED: Closed after discussion - - DISMISSED: Labeled wontfix/invalid - - IGNORED: Closed with no response - - STALE: Open with no replies - - ACTIVE: Open with discussion - - MERGED/REJECTED/PENDING for PRs - -4. **Output structure** - ``` - repo/{org}/{repo}/ - ├── Issue/ - │ ├── INDEX.md - │ ├── 001.md - │ └── 002.md - ├── PR/ - │ ├── INDEX.md - │ ├── 001.md - │ └── 002.md - └── .json/ - ├── issues-list.json - └── prs-list.json - ``` - -5. **Index generation** - - Markdown tables with seq, GitHub #, title, score - - Score legend - -## Output Format - -Progress to stderr, final summary to stdout: -```json -{ - "repo": "host-uk/core", - "issues": 47, - "prs": 23, - "output": "repo/host-uk/core/" -} -``` diff --git a/claude/issues/006-collect-bitcointalk.md b/claude/issues/006-collect-bitcointalk.md deleted file mode 100644 index eaada6d..0000000 --- a/claude/issues/006-collect-bitcointalk.md +++ /dev/null @@ -1,64 +0,0 @@ -# feat(collect): Add BitcoinTalk thread collection - -## Summary - -Add `core collect bitcointalk` command to archive BitcoinTalk forum threads. - -## Required Commands - -```bash -core collect bitcointalk # Collect full thread -core collect bitcointalk # Collect from URL -core collect bitcointalk --pages=5 # Limit pages -core collect bitcointalk --output=DIR # Custom output dir -``` - -## Current Shell Script Being Replaced - -- `claude/skills/bitcointalk/collect.sh` - 270 lines of bash + embedded Python - -## Features - -1. **Rate limiting** - - Respectful delay between requests (default 2s) - - Configurable via `--delay=N` - -2. **Post type detection** - - ANN: Original announcement (post #1) - - UPDATE: Contains [UPDATE]/[RELEASE]/[ANNOUNCEMENT] - - QUESTION: Contains question mark in first 200 chars - - COMMUNITY: General discussion - -3. **Output structure** - ``` - bitcointalk-{topic}/ - ├── INDEX.md - ├── pages/ - │ ├── page-0.html - │ └── page-20.html - └── posts/ - ├── POST-0001.md - └── POST-0002.md - ``` - -4. **Post metadata** - - Author - - Date - - Post type/score - - Original content - -5. **Incremental collection** - - Resume interrupted collections - - Skip already-fetched pages - -## Output Format - -```json -{ - "topic_id": "2769739", - "title": "Lethean - Privacy Blockchain VPN", - "posts": 1247, - "pages": 63, - "output": "bitcointalk-2769739/" -} -``` diff --git a/claude/issues/007-collect-market.md b/claude/issues/007-collect-market.md deleted file mode 100644 index 73d52be..0000000 --- a/claude/issues/007-collect-market.md +++ /dev/null @@ -1,67 +0,0 @@ -# feat(collect): Add cryptocurrency market data collection - -## Summary - -Add `core collect market` command to collect historical price/market data from CoinMarketCap, CoinGecko, etc. - -## Required Commands - -```bash -core collect market # Collect current data -core collect market --historical # Include historical data -core collect market --from=2018-01-01 # Date range -core collect market # Multiple coins -core collect market jobs # Generate job list -``` - -## Current Shell Scripts Being Replaced - -- `claude/skills/coinmarketcap/generate-jobs.sh` - Generates CMC collection jobs -- `claude/skills/coinmarketcap/process.sh` - Processes collected CMC data - -## Data Sources - -1. **CoinMarketCap** - - Main page (description, links) - - Markets/exchanges - - Historical data - - News - - API endpoints (where available) - -2. **CoinGecko** (backup) - - Main page - - API for historical data - -## Output Structure - -``` -market/{coin}/ -├── INDEX.md -├── cmc/ -│ ├── main.json -│ ├── markets.json -│ └── historical.json -├── coingecko/ -│ ├── detail.json -│ └── history.json -└── summary.md -``` - -## Job Format - -For `jobs` subcommand (pipe to collector): -``` -URL|FILENAME|TYPE|METADATA -https://coinmarketcap.com/currencies/lethean/|cmc-lethean-main.html|cmc-main|coin=lethean -``` - -## Output Format - -```json -{ - "coin": "lethean", - "sources": ["cmc", "coingecko"], - "historical_days": 2190, - "output": "market/lethean/" -} -``` diff --git a/claude/issues/008-collect-papers.md b/claude/issues/008-collect-papers.md deleted file mode 100644 index a15e424..0000000 --- a/claude/issues/008-collect-papers.md +++ /dev/null @@ -1,68 +0,0 @@ -# feat(collect): Add research paper/whitepaper collection - -## Summary - -Add `core collect papers` command to discover and collect distributed ledger research papers and whitepapers. - -## Required Commands - -```bash -core collect papers --all # All known papers -core collect papers --category=cryptography # Filter by category -core collect papers --topic=bulletproofs # Filter by topic -core collect papers --project=monero # Filter by project -core collect papers --search-iacr # Search IACR eprint -core collect papers queue # Queue single paper -``` - -## Current Shell Scripts Being Replaced - -- `claude/skills/ledger-papers/discover.sh` - Paper discovery -- `claude/collection/collect-whitepaper.sh` - Queue whitepaper collection -- `claude/collection/update-index.sh` - Update paper index - -## Categories - -- genesis (Bitcoin, b-money, hashcash, bit gold) -- cryptonote (CryptoNote v2.0, CNS standards) -- mrl (Monero Research Lab papers) -- privacy (Zcash, Dash, Mimblewimble, Lelantus) -- smart-contracts (Ethereum, Solana, Cardano) -- layer2 (Lightning, Plasma, Rollups) -- consensus (PBFT, Tendermint, HotStuff) -- cryptography (Bulletproofs, CLSAG, PLONK) -- defi (Uniswap, Aave, Compound) -- storage (IPFS, Filecoin, Arweave) -- identity (DIDs, Verifiable Credentials) -- attacks (Selfish mining, eclipse, traceability) - -## Registry - -Papers defined in `registry.json`: -```json -{ - "id": "bulletproofs", - "title": "Bulletproofs: Short Proofs for Confidential Transactions", - "year": 2017, - "url": "https://eprint.iacr.org/2017/1066.pdf", - "topics": ["range-proofs", "zero-knowledge"] -} -``` - -## Output Format - -Job list for collection: -``` -URL|FILENAME|TYPE|METADATA -https://bitcoin.org/bitcoin.pdf|bitcoin.pdf|paper|category=genesis,title=Bitcoin... -``` - -Summary: -```json -{ - "papers": 91, - "categories": 15, - "queued": 3, - "output": "papers/" -} -``` diff --git a/claude/issues/009-collect-excavate.md b/claude/issues/009-collect-excavate.md deleted file mode 100644 index dd97045..0000000 --- a/claude/issues/009-collect-excavate.md +++ /dev/null @@ -1,92 +0,0 @@ -# feat(collect): Add project archaeology/excavation - -## Summary - -Add `core collect excavate` command to perform deep excavation of abandoned cryptocurrency projects before data is lost. - -## Required Commands - -```bash -core collect excavate # Full excavation -core collect excavate --scan-only # Check what's accessible -core collect excavate --resume # Resume interrupted dig -core collect excavate --only=github,btt # Specific collectors -``` - -## Current Shell Script Being Replaced - -- `claude/skills/project-archaeology/excavate.sh` - 312 lines of bash - -## Excavation Pipeline - -Runs collectors in priority order: - -| Phase | Source | Collector | Priority | Notes | -|-------|--------|-----------|----------|-------| -| 1 | GitHub repos | `collect github` | P1 | Often deleted first | -| 1 | GitHub releases | `collect github` | P1 | Binaries disappear | -| 2 | BitcoinTalk ANN | `collect bitcointalk` | P2 | Usually persists | -| 2 | Website (Wayback) | `collect wayback` | P2 | Snapshots exist | -| 3 | Block explorer | `collect explorer` | P3 | Chain data | -| 3 | CoinMarketCap | `collect market` | P3 | Historical prices | -| 4 | Reddit | `collect reddit` | P4 | Community context | -| 4 | Medium posts | `collect medium` | P4 | Announcements | - -## Project Registry - -Projects defined in `cryptonote-discovery/registry.json`: -```json -{ - "name": "Masari", - "symbol": "MSR", - "status": "abandoned", - "github": ["masari-project"], - "bitcointalk": "2769739", - "website": "getmasari.org", - "explorer": "explorer.getmasari.org", - "cmc": "masari" -} -``` - -## Output Structure - -``` -digs/{project}/ -├── EXCAVATION.md # Dig log with timestamps -├── SALVAGE-REPORT.md # What's worth keeping -├── LESSONS.md # Post-mortem analysis -├── github/ # All repo history -├── releases/ # Wallet binaries, checksums -├── bitcointalk/ # Thread archive -├── website/ # Wayback snapshots -├── explorer/ # Chain data samples -├── market/ # Price history -├── papers/ # Whitepapers, docs -└── community/ # Reddit, Medium, etc -``` - -## Scan Mode - -`--scan-only` checks accessibility without downloading: -- GitHub org accessible? -- BitcoinTalk thread exists? -- Wayback snapshots available? -- Block explorer online? -- CMC page exists? - -## Output Format - -```json -{ - "project": "masari", - "status": "abandoned", - "accessible": { - "github": true, - "bitcointalk": true, - "wayback": true, - "explorer": false, - "cmc": true - }, - "output": "digs/masari/" -} -``` diff --git a/claude/issues/010-collect-process.md b/claude/issues/010-collect-process.md deleted file mode 100644 index c6999e1..0000000 --- a/claude/issues/010-collect-process.md +++ /dev/null @@ -1,70 +0,0 @@ -# feat(collect): Add collected data processing - -## Summary - -Add `core collect process` command to convert collected HTML/JSON files into clean markdown. - -## Required Commands - -```bash -core collect process # Process downloaded files -core collect process bitcointalk ./downloads # BitcoinTalk HTML → MD -core collect process reddit ./downloads # Reddit JSON → MD -core collect process wayback ./downloads # Wayback HTML → MD -core collect process medium ./downloads # Medium RSS → MD -``` - -## Current Shell Script Being Replaced - -- `claude/skills/job-collector/process.sh` - 243 lines of bash + embedded Python - -## Supported Sources - -1. **bitcointalk** / **btt** - - Input: HTML pages - - Extract: posts, authors, dates - - Output: POST-NNNN.md files - -2. **reddit** - - Input: JSON from Reddit API - - Extract: posts, comments, scores - - Output: REDDIT-NNNN.md files - -3. **wayback** - - Input: HTML from Wayback Machine - - Extract: title, body text - - Output: {basename}.md files - -4. **medium** - - Input: RSS/XML feed - - Extract: title, author, date, content - - Output: MEDIUM-NNNN.md files - -## Output Structure - -``` -processed/ -├── INDEX.md -└── posts/ - ├── POST-0001.md - ├── POST-0002.md - └── ... -``` - -## Index Generation - -Auto-generates INDEX.md with: -- Source metadata -- Post count -- Links to all posts - -## Output Format - -```json -{ - "source": "bitcointalk", - "input_files": 15, - "posts_extracted": 347, - "output": "processed/" -} -``` diff --git a/claude/issues/011-collect-dispatch.md b/claude/issues/011-collect-dispatch.md deleted file mode 100644 index fa28315..0000000 --- a/claude/issues/011-collect-dispatch.md +++ /dev/null @@ -1,73 +0,0 @@ -# feat(collect): Add event hook dispatch system - -## Summary - -Add `core collect dispatch` command to fire events during data collection, allowing modular hook handling. - -## Required Commands - -```bash -core collect dispatch [args...] # Fire an event -core collect dispatch on_url_found # URL discovered -core collect dispatch on_file_collected # File downloaded -core collect dispatch on_collection_complete # Batch finished -core collect hooks list # List registered hooks -core collect hooks register # Register new hook -``` - -## Current Shell Script Being Replaced - -- `claude/collection/dispatch.sh` - Hook dispatcher - -## Events - -| Event | Trigger | Args | -|-------|---------|------| -| `on_url_found` | URL discovered during collection | url | -| `on_file_collected` | File successfully downloaded | file, type | -| `on_collection_complete` | Job batch finishes | - | - -## Hook Registration - -Hooks defined in `hooks.json`: -```json -{ - "hooks": { - "on_url_found": [ - { - "name": "whitepaper-collector", - "pattern": "\\.pdf$", - "handler": "collect papers queue", - "priority": 10, - "enabled": true - } - ] - } -} -``` - -## Pattern Matching - -- Hooks can specify regex pattern for filtering -- Only matching events trigger the handler -- Multiple hooks can handle same event (priority ordering) - -## Handler Types - -1. **Core commands**: `collect papers queue` -2. **Shell scripts**: `./my-handler.sh` -3. **External binaries**: `/usr/local/bin/handler` - -## Output Format - -```json -{ - "event": "on_url_found", - "args": ["https://example.com/paper.pdf"], - "handlers_fired": 2, - "results": [ - {"handler": "whitepaper-collector", "status": "ok"}, - {"handler": "archive-notifier", "status": "ok"} - ] -} -``` diff --git a/claude/issues/012-hooks-test-feedback.md b/claude/issues/012-hooks-test-feedback.md deleted file mode 100644 index 3917ead..0000000 --- a/claude/issues/012-hooks-test-feedback.md +++ /dev/null @@ -1,80 +0,0 @@ -# feat(hooks): Reduce test noise with smart output filtering - -## Summary - -Add PostToolUse hooks that filter test output to show only what matters - failures and summaries, not passing tests. - -## Problem - -When running `core go test` or `core php test`, the full output floods the context: -- Hundreds of "PASS" lines for passing tests -- Verbose coverage output -- Repetitive timing information - -This wastes context window and makes failures harder to spot. - -## Solution - -PostToolUse hooks that: -1. Parse test output -2. Extract only failures, errors, and summary -3. Return filtered output as `additionalContext` -4. Use `suppressOutput: true` to hide the verbose original - -## Hook Configuration - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Bash", - "hooks": [ - { - "type": "command", - "command": "core ai filter test-output" - } - ] - } - ] - } -} -``` - -## Filter Logic - -**Go tests:** -- Show: FAIL, ERROR, panic, --- FAIL -- Hide: PASS, RUN, coverage lines (unless requested) -- Summary: "47 passed, 2 failed, 1 skipped" - -**PHP/Pest tests:** -- Show: ✗, FAIL, Error, Exception -- Hide: ✓, passing test names -- Summary: "Tests: 47 passed, 2 failed" - -**Lint output:** -- Show: actual errors/warnings with file:line -- Hide: "no issues found" for each file -- Summary: "3 issues in 2 files" - -## Output Format - -```json -{ - "suppressOutput": true, - "hookSpecificOutput": { - "hookEventName": "PostToolUse", - "additionalContext": "## Test Results\n\n✗ 2 failed, 47 passed\n\n### Failures:\n- TestFoo: expected 5, got 3\n- TestBar: nil pointer" - } -} -``` - -## Command Detection - -Only filter when command matches: -- `core go test*` -- `core php test*` -- `core go lint*` -- `core php stan*` -- `core qa*` diff --git a/claude/issues/013-hooks-stop-verify.md b/claude/issues/013-hooks-stop-verify.md deleted file mode 100644 index f49a43c..0000000 --- a/claude/issues/013-hooks-stop-verify.md +++ /dev/null @@ -1,98 +0,0 @@ -# feat(hooks): Stop hook to verify work is complete - -## Summary - -Add a Stop hook that verifies Claude has actually completed the task before stopping, preventing premature "I'm done" responses. - -## Problem - -Claude sometimes stops too early: -- "I've updated the file" (but didn't run tests) -- "The fix is complete" (but there are lint errors) -- "Done" (but left debug statements) - -## Solution - -A Stop hook (type: "agent") that spawns a verification subagent to check: -1. Were tests run? Did they pass? -2. Are there uncommitted changes that should be committed? -3. Are there debug statements left in code? -4. Does the output match what was requested? - -## Hook Configuration - -```json -{ - "hooks": { - "Stop": [ - { - "hooks": [ - { - "type": "agent", - "prompt": "Verify the work is complete. Check: 1) Tests passed if code was changed, 2) No debug statements (dd, dump, fmt.Println), 3) Code is formatted. Context: $ARGUMENTS", - "timeout": 60 - } - ] - } - ] - } -} -``` - -## Alternative: Command-based - -For faster verification without subagent overhead: - -```json -{ - "hooks": { - "Stop": [ - { - "hooks": [ - { - "type": "command", - "command": "core ai verify-complete" - } - ] - } - ] - } -} -``` - -## Verification Checks - -`core ai verify-complete` should check: - -1. **If code was modified:** - - Run `core go test` or `core php test` - - Check for debug statements - - Verify formatting - -2. **If commit was requested:** - - Check git status for uncommitted changes - -3. **Return decision:** - ```json - { - "decision": "block", - "reason": "Tests have not been run. Please run: core go test" - } - ``` - -## Guard Against Loops - -Check `stop_hook_active` to prevent infinite loops: - -```bash -#!/bin/bash -INPUT=$(cat) -STOP_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active') - -if [ "$STOP_ACTIVE" = "true" ]; then - # Already continued once, allow stop - exit 0 -fi - -# Run verification... -``` diff --git a/claude/issues/014-hooks-auto-test.md b/claude/issues/014-hooks-auto-test.md deleted file mode 100644 index dc1abad..0000000 --- a/claude/issues/014-hooks-auto-test.md +++ /dev/null @@ -1,97 +0,0 @@ -# feat(hooks): Auto-run tests after code changes (async) - -## Summary - -Add async PostToolUse hooks that automatically run tests after Write/Edit operations, reporting results without blocking. - -## Problem - -Claude often edits code but forgets to run tests, or runs tests manually each time which is slow and repetitive. - -## Solution - -Async PostToolUse hooks that: -1. Detect code file changes (*.go, *.php, *.ts) -2. Run relevant tests in background -3. Report results on next turn via `systemMessage` - -## Hook Configuration - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Write|Edit", - "hooks": [ - { - "type": "command", - "command": "core ai auto-test", - "async": true, - "timeout": 120, - "statusMessage": "Running tests..." - } - ] - } - ] - } -} -``` - -## Test Detection Logic - -`core ai auto-test` should: - -1. **Read file path from stdin:** - ```bash - FILE=$(jq -r '.tool_input.file_path') - ``` - -2. **Detect test scope:** - - `*.go` in `pkg/foo/` → `core go test ./pkg/foo/...` - - `*.php` in `src/` → `core php test --filter=related` - - `*_test.go` → run that specific test file - - `*.spec.ts` → run that specific spec - -3. **Run minimal test set:** - - Don't run full suite on every change - - Use `--filter` or package scope - - Cache recent test runs - -4. **Report results:** - ```json - { - "systemMessage": "Tests for pkg/foo: 12 passed, 0 failed (2.3s)" - } - ``` - -## Smart Test Selection - -For Go: -```bash -# Find related test file -TEST_FILE="${FILE%.go}_test.go" -if [ -f "$TEST_FILE" ]; then - core go test -run "$(basename $TEST_FILE .go)" ./... -else - # Run package tests - PKG_DIR=$(dirname "$FILE") - core go test "./$PKG_DIR/..." -fi -``` - -For PHP: -```bash -# Find related test -TEST_FILE=$(echo "$FILE" | sed 's/\.php$/Test.php/' | sed 's|src/|tests/|') -if [ -f "$TEST_FILE" ]; then - core php test "$TEST_FILE" -fi -``` - -## Debouncing - -Avoid running tests multiple times for rapid edits: -- Track last test run per package -- Skip if <5 seconds since last run -- Queue and batch rapid changes diff --git a/claude/issues/015-hooks-context-inject.md b/claude/issues/015-hooks-context-inject.md deleted file mode 100644 index fab56dc..0000000 --- a/claude/issues/015-hooks-context-inject.md +++ /dev/null @@ -1,101 +0,0 @@ -# feat(hooks): SessionStart context injection - -## Summary - -Add SessionStart hooks that inject relevant project context at the start of each session. - -## Problem - -Claude starts each session without knowing: -- Recent git changes -- Open issues assigned to the user -- CI status -- Current branch and uncommitted work - -This leads to repeated context-gathering at the start of every session. - -## Solution - -SessionStart hook that runs `core` commands to gather context and inject it. - -## Hook Configuration - -```json -{ - "hooks": { - "SessionStart": [ - { - "matcher": "startup|resume", - "hooks": [ - { - "type": "command", - "command": "core ai session-context", - "timeout": 30 - } - ] - } - ] - } -} -``` - -## Context to Gather - -`core ai session-context` should collect: - -1. **Git status:** - ```bash - BRANCH=$(git branch --show-current) - CHANGES=$(git status --short | head -10) - ``` - -2. **Recent activity:** - ```bash - COMMITS=$(git log --oneline -5) - ``` - -3. **Open issues (if gh available):** - ```bash - ISSUES=$(core dev issues --assignee @me --limit 5) - ``` - -4. **CI status:** - ```bash - CI=$(core qa health --brief) - ``` - -5. **Restored session state:** - ```bash - if [ -f ~/.claude/sessions/scratchpad.md ]; then - # Include previous session context - fi - ``` - -## Output Format - -```json -{ - "hookSpecificOutput": { - "hookEventName": "SessionStart", - "additionalContext": "## Session Context\n\n**Branch:** feature/foo\n**Uncommitted:** 3 files\n\n**Recent commits:**\n- abc123 fix: resolve test flake\n- def456 feat: add new endpoint\n\n**Your issues:**\n- #42 Bug in login flow\n- #38 Add caching\n\n**CI:** All green ✓" - } -} -``` - -## Environment Variables - -Also set useful env vars via `CLAUDE_ENV_FILE`: - -```bash -if [ -n "$CLAUDE_ENV_FILE" ]; then - echo "export PROJECT_ROOT=\"$(pwd)\"" >> "$CLAUDE_ENV_FILE" - echo "export GIT_BRANCH=\"$BRANCH\"" >> "$CLAUDE_ENV_FILE" -fi -``` - -## Conditional Context - -Only inject what's relevant: -- Skip CI status if not in a repo with workflows -- Skip issues if gh not authenticated -- Skip session restore if >3 hours old diff --git a/claude/issues/016-hooks-format-auto.md b/claude/issues/016-hooks-format-auto.md deleted file mode 100644 index 481da86..0000000 --- a/claude/issues/016-hooks-format-auto.md +++ /dev/null @@ -1,89 +0,0 @@ -# feat(hooks): Auto-format code silently after edits - -## Summary - -Add PostToolUse hooks that silently auto-format code after Write/Edit, without polluting context with formatter output. - -## Current State - -Current hooks call formatters but output is visible: -- `php-format.sh` - runs Pint -- `go-format.sh` - runs gofmt - -This creates noise in the conversation. - -## Solution - -Use `suppressOutput: true` to hide formatter output entirely. - -## Hook Configuration - -```json -{ - "hooks": { - "PostToolUse": [ - { - "matcher": "Write|Edit", - "hooks": [ - { - "type": "command", - "command": "core ai format-file", - "statusMessage": "Formatting..." - } - ] - } - ] - } -} -``` - -## Implementation - -`core ai format-file`: - -```bash -#!/bin/bash -INPUT=$(cat) -FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty') - -[ -z "$FILE" ] || [ ! -f "$FILE" ] && exit 0 - -case "$FILE" in - *.go) - core go fmt "$FILE" 2>/dev/null - ;; - *.php) - core php fmt "$FILE" 2>/dev/null - ;; - *.ts|*.tsx|*.js|*.jsx) - npx prettier --write "$FILE" 2>/dev/null - ;; - *.json) - jq '.' "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE" 2>/dev/null - ;; -esac - -# Suppress all output - formatting is silent -echo '{"suppressOutput": true}' -``` - -## Benefits - -1. **No context pollution** - formatter output hidden -2. **Consistent formatting** - every file formatted on save -3. **No manual step** - Claude doesn't need to remember to format -4. **Fast** - formatters are quick, doesn't block significantly - -## Error Handling - -Only report if formatting fails badly: - -```bash -if ! core go fmt "$FILE" 2>&1; then - # Only surface actual errors, not warnings - echo '{"systemMessage": "Format failed for '$FILE' - syntax error?"}' - exit 0 -fi - -echo '{"suppressOutput": true}' -``` diff --git a/claude/issues/017-hooks-expose-hide.md b/claude/issues/017-hooks-expose-hide.md deleted file mode 100644 index 8a9aafb..0000000 --- a/claude/issues/017-hooks-expose-hide.md +++ /dev/null @@ -1,124 +0,0 @@ -# feat(hooks): Define what to expose vs hide in output - -## Summary - -Document and implement a consistent policy for what hook output should be exposed to Claude vs hidden. - -## Principles - -**Expose (additionalContext):** -- Errors that need fixing -- Failures that block progress -- Decisions that need to be made -- Security warnings -- Breaking changes - -**Hide (suppressOutput):** -- Success confirmations ("formatted", "passed") -- Verbose progress output -- Repetitive status messages -- Debug information -- Intermediate results - -## Output Categories - -### Always Expose - -| Category | Example | Reason | -|----------|---------|--------| -| Test failures | `FAIL: TestFoo` | Must be fixed | -| Build errors | `cannot find package` | Blocks progress | -| Lint errors | `undefined: foo` | Code quality | -| Security alerts | `HIGH vulnerability` | Critical | -| Type errors | `type mismatch` | Must be fixed | - -### Always Hide - -| Category | Example | Reason | -|----------|---------|--------| -| Pass confirmations | `PASS: TestFoo` | No action needed | -| Format success | `Formatted 3 files` | No action needed | -| Coverage numbers | `coverage: 84.2%` | Unless requested | -| Timing info | `(12.3s)` | Noise | -| Progress bars | `[=====> ]` | Noise | - -### Conditional - -| Category | Show When | Hide When | -|----------|-----------|-----------| -| Warnings | First occurrence | Repeated | -| Suggestions | Actionable | Informational | -| Diffs | Small (<10 lines) | Large | -| Stack traces | Unique error | Repeated | - -## Implementation Pattern - -```bash -#!/bin/bash -INPUT=$(cat) -OUTPUT=$(echo "$INPUT" | jq -r '.tool_response.output // empty') - -# Extract what matters -ERRORS=$(echo "$OUTPUT" | grep -E "FAIL|ERROR|panic" | head -10) -SUMMARY=$(echo "$OUTPUT" | tail -1) - -if [ -n "$ERRORS" ]; then - # Expose failures - cat << EOF -{ - "hookSpecificOutput": { - "hookEventName": "PostToolUse", - "additionalContext": "## Issues Found\n\n$ERRORS\n\n**Summary:** $SUMMARY" - } -} -EOF -else - # Hide success - echo '{"suppressOutput": true}' -fi -``` - -## Hook-Specific Policies - -### PostToolUse (Bash) - -``` -core go test → Expose failures, hide passes -core go lint → Expose errors, hide "no issues" -core build → Expose errors, hide success -git status → Always expose (informational) -git commit → Expose result, hide diff -``` - -### PostToolUse (Write/Edit) - -``` -Format result → Always hide -Debug check → Expose if found, hide if clean -``` - -### PostToolUseFailure - -``` -All errors → Always expose with context -Interrupts → Hide (user initiated) -``` - -## Aggregation - -When multiple issues, aggregate intelligently: - -``` -Instead of: -- FAIL: TestA -- FAIL: TestB -- FAIL: TestC -- (47 more) - -Show: -"50 tests failed. Top failures: -- TestA: nil pointer -- TestB: timeout -- TestC: assertion failed -Run `core go test -v` for full output" -``` diff --git a/claude/issues/018-skill-yes-mode.md b/claude/issues/018-skill-yes-mode.md deleted file mode 100644 index 8ce2880..0000000 --- a/claude/issues/018-skill-yes-mode.md +++ /dev/null @@ -1,164 +0,0 @@ -# feat(skill): Add /core:yes auto-approve and commit skill - -## Summary - -Add a `/core:yes` skill that auto-approves all permission requests and ensures work completes with a commit - like a "just do it" mode for trusted workflows. - -## Use Case - -When you trust Claude to complete a task end-to-end: -``` -/core:yes fix the failing test and commit -``` - -Instead of: -1. Claude proposes edit → you approve -2. Claude runs test → you approve -3. Claude proposes commit → you approve - -It just does it all and commits. - -## Skill Definition - -`claude/commands/yes.md`: - -```markdown ---- -name: yes -description: Auto-approve mode - trust Claude to complete task and commit -args: -hooks: - PermissionRequest: - - hooks: - - type: command - command: "core ai auto-approve" - Stop: - - hooks: - - type: command - command: "core ai ensure-commit" - once: true ---- - -# Yes Mode - -You are in **auto-approve mode**. The user trusts you to complete this task autonomously. - -## Task -$ARGUMENTS - -## Rules - -1. **No confirmation needed** - all tool uses are pre-approved -2. **Complete the full workflow** - don't stop until done -3. **Commit when finished** - create a commit with the changes -4. **Use conventional commits** - type(scope): description - -## Workflow - -1. Understand the task -2. Make necessary changes (edits, writes) -3. Run tests to verify (`core go test` or `core php test`) -4. Format code (`core go fmt` or `core php fmt`) -5. Commit changes with descriptive message -6. Report completion - -Do NOT stop to ask for confirmation. Just do it. -``` - -## Hook Implementations - -### core ai auto-approve - -Auto-approves all permission requests during the skill: - -```bash -#!/bin/bash -# Reads PermissionRequest input, returns allow decision - -INPUT=$(cat) -TOOL=$(echo "$INPUT" | jq -r '.tool_name') - -# Log what we're approving -echo "[yes-mode] Auto-approving: $TOOL" >&2 - -# Return allow decision -cat << EOF -{ - "hookSpecificOutput": { - "hookEventName": "PermissionRequest", - "decision": { - "behavior": "allow" - } - } -} -EOF -``` - -### core ai ensure-commit - -Stop hook that ensures work ends with a commit: - -```bash -#!/bin/bash -INPUT=$(cat) -STOP_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active') - -# Prevent infinite loop -if [ "$STOP_ACTIVE" = "true" ]; then - exit 0 -fi - -# Check for uncommitted changes -CHANGES=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ') - -if [ "$CHANGES" -gt 0 ]; then - cat << EOF -{ - "decision": "block", - "reason": "You have uncommitted changes. Please commit them before stopping. Use: git add -A && git commit -m 'type(scope): description'" -} -EOF -else - exit 0 -fi -``` - -## Safety Considerations - -1. **Skill-scoped hooks** - only active while `/core:yes` is running -2. **once: true on Stop hook** - prevents infinite loops -3. **Still respects blocked commands** - prefer-core.sh still blocks dangerous patterns -4. **Commit required** - ensures changes are tracked - -## Alternative: Permission Mode - -Could also be implemented as a permission mode flag: - -```bash -claude --permission-mode=dontAsk -``` - -But the skill approach is more explicit and adds the commit requirement. - -## Example Usage - -``` -> /core:yes add a --version flag to the CLI that prints the version from go.mod - -[yes-mode] Auto-approving: Read -[yes-mode] Auto-approving: Edit -[yes-mode] Auto-approving: Bash (core go test) -[yes-mode] Auto-approving: Bash (git commit) - -Done. Created commit: feat(cli): add --version flag -``` - -## Integration with core CLI - -Eventually this becomes: - -```bash -core ai yes "fix the failing test" -``` - -Which spawns Claude in yes-mode with the task. diff --git a/claude/issues/019-skill-qa-loop.md b/claude/issues/019-skill-qa-loop.md deleted file mode 100644 index 11d2fd5..0000000 --- a/claude/issues/019-skill-qa-loop.md +++ /dev/null @@ -1,301 +0,0 @@ -# feat(skill): Add /core:qa iterative QA fix loop - -## Summary - -Add a `/core:qa` skill that runs the full QA pipeline, extracts actionable issues, and guides Claude through fixing them one by one until everything passes. - -## Use Case - -``` -/core:qa -``` - -Runs `core go qa` or `core php qa`, parses output, and iteratively fixes issues: - -``` -[QA] Running core go qa... -[QA] Found 3 issues: - -1. ✗ lint: undefined: ErrNotFound (pkg/api/handler.go:42) -2. ✗ test: TestCreateUser failed - expected 200, got 500 -3. ✗ fmt: pkg/api/handler.go needs formatting - -Fixing issue 1/3: undefined: ErrNotFound -→ Reading pkg/api/handler.go... -→ Adding missing import... -→ Fixed. - -Fixing issue 2/3: TestCreateUser failed -→ Reading test output... -→ The handler returns 500 because ErrNotFound wasn't defined -→ Already fixed by issue 1, re-running test... -→ Passed. - -Fixing issue 3/3: formatting -→ Running core go fmt... -→ Fixed. - -[QA] Re-running full QA... -[QA] ✓ All checks passed! -``` - -## Skill Definition - -`claude/commands/qa.md`: - -```markdown ---- -name: qa -description: Run QA checks and fix all issues iteratively -hooks: - PostToolUse: - - matcher: "Bash" - hooks: - - type: command - command: "core ai qa-filter" - Stop: - - hooks: - - type: command - command: "core ai qa-verify" - once: true ---- - -# QA Fix Loop - -Run the full QA pipeline and fix all issues. - -## Detection - -First, detect the project type: -- If `go.mod` exists → Go project → `core go qa` -- If `composer.json` exists → PHP project → `core php qa` -- If both exist → ask user or check current directory - -## Process - -1. **Run QA**: Execute `core go qa` or `core php qa` -2. **Parse issues**: Extract failures from output (see format below) -3. **Fix each issue**: Address one at a time, simplest first -4. **Re-verify**: After fixes, re-run QA -5. **Repeat**: Until all checks pass -6. **Report**: Summary of what was fixed - -## Issue Priority - -Fix in this order (fastest feedback first): -1. **fmt** - formatting issues (auto-fix with `core go fmt`) -2. **lint** - static analysis (usually quick fixes) -3. **test** - failing tests (may need more investigation) -4. **build** - compilation errors (fix before tests can run) - -## Output Parsing - -### Go QA Output -``` -=== FMT === -FAIL: pkg/api/handler.go needs formatting - -=== LINT === -pkg/api/handler.go:42:15: undefined: ErrNotFound (typecheck) -pkg/api/handler.go:87:2: ineffectual assignment to err (ineffassign) - -=== TEST === ---- FAIL: TestCreateUser (0.02s) - handler_test.go:45: expected 200, got 500 -FAIL - -=== RESULT === -fmt: FAIL -lint: FAIL (2 issues) -test: FAIL (1 failed) -``` - -### PHP QA Output -``` -=== PINT === -FAIL: 2 files need formatting - -=== STAN === -src/Http/Controller.php:42 - Undefined variable $user - -=== TEST === -✗ CreateUserTest::testSuccess - Expected status 200, got 500 - -=== RESULT === -pint: FAIL -stan: FAIL (1 error) -test: FAIL (1 failed) -``` - -## Fixing Strategy - -**Formatting (fmt/pint):** -- Just run `core go fmt` or `core php fmt` -- No code reading needed - -**Lint errors:** -- Read the specific file:line -- Understand the error type -- Make minimal fix - -**Test failures:** -- Read the test file to understand expectation -- Read the implementation -- Fix the root cause (not just the symptom) - -**Build errors:** -- Usually missing imports or typos -- Fix before attempting other checks - -## Stop Condition - -Only stop when: -- All QA checks pass, OR -- User explicitly cancels, OR -- Same error repeats 3 times (stuck) -``` - -## Hook Implementations - -### core ai qa-filter - -Filters QA output to show only actionable issues: - -```bash -#!/bin/bash -INPUT=$(cat) -COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty') -OUTPUT=$(echo "$INPUT" | jq -r '.tool_response.output // empty') - -# Only process QA commands -case "$COMMAND" in - "core go qa"*|"core php qa"*|"core go test"*|"core php test"*|"core go lint"*|"core php stan"*) - ;; - *) - echo "$INPUT" - exit 0 - ;; -esac - -# Extract failures only -FAILURES=$(echo "$OUTPUT" | grep -E "^(FAIL|---\s*FAIL|✗|ERROR|undefined:|error:)" | head -20) -SUMMARY=$(echo "$OUTPUT" | grep -E "^(fmt:|lint:|test:|pint:|stan:|RESULT)" | tail -5) - -if [ -z "$FAILURES" ]; then - # All passed - show brief summary - echo '{"suppressOutput": true, "hookSpecificOutput": {"hookEventName": "PostToolUse", "additionalContext": "✓ QA passed"}}' -else - # Show only failures - cat << EOF -{ - "suppressOutput": true, - "hookSpecificOutput": { - "hookEventName": "PostToolUse", - "additionalContext": "## QA Issues\n\n\`\`\`\n$FAILURES\n\`\`\`\n\n**Summary:** $SUMMARY" - } -} -EOF -fi -``` - -### core ai qa-verify - -Stop hook that ensures QA passes before stopping: - -```bash -#!/bin/bash -INPUT=$(cat) -STOP_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active') - -if [ "$STOP_ACTIVE" = "true" ]; then - exit 0 -fi - -# Detect project type and run QA -if [ -f "go.mod" ]; then - RESULT=$(core go qa 2>&1) -elif [ -f "composer.json" ]; then - RESULT=$(core php qa 2>&1) -else - exit 0 -fi - -# Check if passed -if echo "$RESULT" | grep -q "FAIL\|ERROR\|✗"; then - ISSUES=$(echo "$RESULT" | grep -E "^(FAIL|ERROR|✗|undefined:)" | head -5) - cat << EOF -{ - "decision": "block", - "reason": "QA still has issues:\n$ISSUES\n\nPlease fix these before stopping." -} -EOF -else - exit 0 -fi -``` - -## Example Session - -``` -> /core:qa - -Detecting project type... Found go.mod → Go project - -Running: core go qa - -## QA Issues - -``` -pkg/api/handler.go:42:15: undefined: ErrNotFound ---- FAIL: TestCreateUser (0.02s) -``` - -**Summary:** lint: FAIL (1) | test: FAIL (1) - ---- - -Fixing lint issue: undefined ErrNotFound - -Reading pkg/api/handler.go... -The error variable is used but not defined. Adding: - -var ErrNotFound = errors.New("not found") - -Running: core go qa - -## QA Issues - -``` ---- FAIL: TestCreateUser (0.02s) - expected 200, got 404 -``` - -**Summary:** lint: PASS | test: FAIL (1) - ---- - -Fixing test issue: expected 200, got 404 - -Reading the test... it expects success but handler now returns 404. -The test data doesn't have a matching record. Fixing test setup... - -Running: core go qa - -✓ QA passed - ---- - -**Summary:** -- Fixed: undefined ErrNotFound (added error variable) -- Fixed: TestCreateUser (corrected test setup) -- 2 issues resolved, all checks passing -``` - -## Future CLI Integration - -```bash -core ai qa # Run QA fix loop -core ai qa --check-only # Just report, don't fix -core ai qa --fmt-only # Only fix formatting -```