From 8577a19ba1c40c9700510a83d16efa95c3dc3025 Mon Sep 17 00:00:00 2001 From: Michael Czechowski Date: Tue, 28 Apr 2026 23:25:18 +0200 Subject: [PATCH] Refresh Wave pipelines, personas, and contracts Local-only Wave configuration sync: - Drop one-shot contract schemas no longer referenced by any pipeline. - Replace gitea/github issue-impl pipelines with the unified refresh/research/rewrite/scope set; add bb (bitbucket) and gl (gitlab) variants. - Add scoper persona and matching scope contracts. - Update existing personas and pipelines to current style. No effect on the librenotes runtime; this only touches the .wave/ tooling directory used by the local dev harness. Co-Authored-By: Claude Opus 4.7 (1M context) --- .wave/contracts/adr-context.schema.json | 44 -- .wave/contracts/adr-options.schema.json | 38 -- .wave/contracts/analysis-report.schema.json | 60 -- .wave/contracts/audit-report.schema.json | 120 ---- .../contracts/categorized-changes.schema.json | 55 -- .wave/contracts/checklist-status.schema.json | 36 -- .wave/contracts/clarify-status.schema.json | 30 - .wave/contracts/comment-result.schema.json | 84 --- .wave/contracts/commit-analysis.schema.json | 53 -- .wave/contracts/connections.schema.json | 96 ---- .../convergent-proposals.schema.json | 81 --- .wave/contracts/coverage-analysis.schema.json | 24 - .wave/contracts/dead-code-scan.schema.json | 42 -- .wave/contracts/debug-hypotheses.schema.json | 22 - .../contracts/debug-reproduction.schema.json | 21 - .wave/contracts/diff-analysis.schema.json | 31 - .../contracts/divergent-findings.schema.json | 82 --- .../doc-consistency-report.schema.json | 87 --- .wave/contracts/doc-issue-result.schema.json | 71 --- .wave/contracts/doc-scan-results.schema.json | 112 ---- .wave/contracts/doc-sync-scan.schema.json | 38 -- .wave/contracts/docs-phase.schema.json | 112 ---- .wave/contracts/dummy-phase.schema.json | 110 ---- .wave/contracts/editorial-plan.schema.json | 98 ---- .wave/contracts/explain-analysis.schema.json | 76 --- .../contracts/explain-exploration.schema.json | 62 -- .../contracts/feature-exploration.schema.json | 52 -- .wave/contracts/feature-plan.schema.json | 33 -- .wave/contracts/findings.schema.json | 38 -- .../github-enhancement-plan.schema.json | 65 --- .../github-enhancement-results.schema.json | 71 --- .../github-issue-analysis.schema.json | 86 --- .../github-verification-report.schema.json | 87 --- .../contracts/hello-world-result.schema.json | 26 - .wave/contracts/implement-phase.schema.json | 138 ----- .../improvement-assessment.schema.json | 44 -- .wave/contracts/issue-assessment.schema.json | 91 --- .wave/contracts/issue-content.schema.json | 96 ---- .wave/contracts/issue-impl-plan.schema.json | 72 --- .../issue-update-context.schema.json | 116 ---- .../contracts/issue-update-draft.schema.json | 73 --- .../contracts/issue-update-result.schema.json | 57 -- .wave/contracts/plan-exploration.schema.json | 179 ------ .wave/contracts/plan-review.schema.json | 235 -------- .wave/contracts/plan-status.schema.json | 40 -- .wave/contracts/plan-tasks.schema.json | 142 ----- .wave/contracts/pr-result.schema.json | 43 -- .wave/contracts/probed-findings.schema.json | 42 -- .wave/contracts/project-survey.schema.json | 119 ---- .wave/contracts/publish-result.schema.json | 29 - .wave/contracts/recinq-context.schema.json | 43 -- .wave/contracts/refactor-analysis.schema.json | 27 - .wave/contracts/research-findings.schema.json | 178 ------ .wave/contracts/research-report.schema.json | 206 ------- .wave/contracts/research-topics.schema.json | 106 ---- .wave/contracts/security-scan.schema.json | 73 --- .wave/contracts/smoke-test.schema.json | 31 - .wave/contracts/source-extract.schema.json | 78 --- .wave/contracts/spec-phase.schema.json | 119 ---- .wave/contracts/specify-status.schema.json | 35 -- .../supervision-evaluation.schema.json | 97 ---- .../supervision-evidence.schema.json | 83 --- .wave/contracts/tasks-status.schema.json | 33 -- .../contracts/validated-findings.schema.json | 50 -- .wave/contracts/web-findings.schema.json | 85 --- .wave/contracts/zettel-references.schema.json | 72 --- .wave/personas/auditor.md | 23 - .wave/personas/base-protocol.md | 11 - .wave/personas/craftsman.md | 24 - .wave/personas/debugger.md | 19 - .wave/personas/gitea-analyst.md | 23 - .wave/personas/gitea-commenter.md | 29 - .wave/personas/gitea-enhancer.md | 18 - .wave/personas/github-analyst.md | 22 - .wave/personas/github-commenter.md | 28 - .wave/personas/github-enhancer.md | 17 - .wave/personas/implementer.md | 17 - .wave/personas/navigator.md | 19 - .wave/personas/philosopher.md | 19 - .wave/personas/planner.md | 19 - .wave/personas/provocateur.md | 32 -- .wave/personas/researcher.md | 26 - .wave/personas/reviewer.md | 22 - .wave/personas/scout.md | 40 -- .wave/personas/scribe.md | 66 --- .wave/personas/summarizer.md | 23 - .wave/personas/supervisor.md | 34 -- .wave/personas/synthesizer.md | 19 - .wave/personas/validator.md | 24 - .wave/pipelines/adr.yaml | 222 -------- .wave/pipelines/blog-draft.yaml | 168 ------ .wave/pipelines/changelog.yaml | 137 ----- .wave/pipelines/code-review.yaml | 165 ------ .wave/pipelines/dead-code.yaml | 257 --------- .wave/pipelines/debug.yaml | 138 ----- .wave/pipelines/doc-loop.yaml | 251 --------- .wave/pipelines/doc-sync.yaml | 241 -------- .wave/pipelines/editing.yaml | 121 ---- .wave/pipelines/explain.yaml | 127 ----- .wave/pipelines/feature.yaml | 201 ------- .wave/pipelines/gh-issue-impl.yaml | 121 ---- .wave/pipelines/gh-issue-research.yaml | 255 --------- .wave/pipelines/gh-issue-rewrite.yaml | 187 ------ .wave/pipelines/gh-issue-update.yaml | 184 ------ .wave/pipelines/gt-issue-impl.yaml | 121 ---- .wave/pipelines/gt-issue-research.yaml | 257 --------- .wave/pipelines/gt-issue-rewrite.yaml | 194 ------- .wave/pipelines/gt-issue-update.yaml | 182 ------ .wave/pipelines/hello-world.yaml | 51 -- .wave/pipelines/hotfix.yaml | 88 --- .wave/pipelines/housekeeping.yaml | 122 ---- .wave/pipelines/improve.yaml | 117 ---- .wave/pipelines/ingest.yaml | 173 ------ .wave/pipelines/onboard.yaml | 119 ---- .wave/pipelines/plan.yaml | 208 ------- .wave/pipelines/prototype.yaml | 352 ------------ .wave/pipelines/recinq.yaml | 531 ------------------ .wave/pipelines/refactor.yaml | 133 ----- .wave/pipelines/security-scan.yaml | 147 ----- .wave/pipelines/smoke-test.yaml | 57 -- .wave/pipelines/speckit-flow.yaml | 234 -------- .wave/pipelines/supervise.yaml | 168 ------ .wave/pipelines/test-gen.yaml | 97 ---- .wave/prompts/gitea-issue-impl/create-pr.md | 67 --- .../prompts/gitea-issue-impl/fetch-assess.md | 81 --- .wave/prompts/gitea-issue-impl/implement.md | 87 --- .wave/prompts/gitea-issue-impl/plan.md | 90 --- .wave/prompts/github-issue-impl/create-pr.md | 76 --- .../prompts/github-issue-impl/fetch-assess.md | 79 --- .wave/prompts/github-issue-impl/implement.md | 87 --- .wave/prompts/github-issue-impl/plan.md | 90 --- .wave/prompts/speckit-flow/analyze.md | 47 -- .wave/prompts/speckit-flow/checklist.md | 40 -- .wave/prompts/speckit-flow/clarify.md | 42 -- .wave/prompts/speckit-flow/create-pr.md | 53 -- .wave/prompts/speckit-flow/implement.md | 49 -- .wave/prompts/speckit-flow/plan.md | 41 -- .wave/prompts/speckit-flow/specify.md | 50 -- .wave/prompts/speckit-flow/tasks.md | 52 -- 139 files changed, 12706 deletions(-) delete mode 100644 .wave/contracts/adr-context.schema.json delete mode 100644 .wave/contracts/adr-options.schema.json delete mode 100644 .wave/contracts/analysis-report.schema.json delete mode 100644 .wave/contracts/audit-report.schema.json delete mode 100644 .wave/contracts/categorized-changes.schema.json delete mode 100644 .wave/contracts/checklist-status.schema.json delete mode 100644 .wave/contracts/clarify-status.schema.json delete mode 100644 .wave/contracts/comment-result.schema.json delete mode 100644 .wave/contracts/commit-analysis.schema.json delete mode 100644 .wave/contracts/connections.schema.json delete mode 100644 .wave/contracts/convergent-proposals.schema.json delete mode 100644 .wave/contracts/coverage-analysis.schema.json delete mode 100644 .wave/contracts/dead-code-scan.schema.json delete mode 100644 .wave/contracts/debug-hypotheses.schema.json delete mode 100644 .wave/contracts/debug-reproduction.schema.json delete mode 100644 .wave/contracts/diff-analysis.schema.json delete mode 100644 .wave/contracts/divergent-findings.schema.json delete mode 100644 .wave/contracts/doc-consistency-report.schema.json delete mode 100644 .wave/contracts/doc-issue-result.schema.json delete mode 100644 .wave/contracts/doc-scan-results.schema.json delete mode 100644 .wave/contracts/doc-sync-scan.schema.json delete mode 100644 .wave/contracts/docs-phase.schema.json delete mode 100644 .wave/contracts/dummy-phase.schema.json delete mode 100644 .wave/contracts/editorial-plan.schema.json delete mode 100644 .wave/contracts/explain-analysis.schema.json delete mode 100644 .wave/contracts/explain-exploration.schema.json delete mode 100644 .wave/contracts/feature-exploration.schema.json delete mode 100644 .wave/contracts/feature-plan.schema.json delete mode 100644 .wave/contracts/findings.schema.json delete mode 100644 .wave/contracts/github-enhancement-plan.schema.json delete mode 100644 .wave/contracts/github-enhancement-results.schema.json delete mode 100644 .wave/contracts/github-issue-analysis.schema.json delete mode 100644 .wave/contracts/github-verification-report.schema.json delete mode 100644 .wave/contracts/hello-world-result.schema.json delete mode 100644 .wave/contracts/implement-phase.schema.json delete mode 100644 .wave/contracts/improvement-assessment.schema.json delete mode 100644 .wave/contracts/issue-assessment.schema.json delete mode 100644 .wave/contracts/issue-content.schema.json delete mode 100644 .wave/contracts/issue-impl-plan.schema.json delete mode 100644 .wave/contracts/issue-update-context.schema.json delete mode 100644 .wave/contracts/issue-update-draft.schema.json delete mode 100644 .wave/contracts/issue-update-result.schema.json delete mode 100644 .wave/contracts/plan-exploration.schema.json delete mode 100644 .wave/contracts/plan-review.schema.json delete mode 100644 .wave/contracts/plan-status.schema.json delete mode 100644 .wave/contracts/plan-tasks.schema.json delete mode 100644 .wave/contracts/pr-result.schema.json delete mode 100644 .wave/contracts/probed-findings.schema.json delete mode 100644 .wave/contracts/project-survey.schema.json delete mode 100644 .wave/contracts/publish-result.schema.json delete mode 100644 .wave/contracts/recinq-context.schema.json delete mode 100644 .wave/contracts/refactor-analysis.schema.json delete mode 100644 .wave/contracts/research-findings.schema.json delete mode 100644 .wave/contracts/research-report.schema.json delete mode 100644 .wave/contracts/research-topics.schema.json delete mode 100644 .wave/contracts/security-scan.schema.json delete mode 100644 .wave/contracts/smoke-test.schema.json delete mode 100644 .wave/contracts/source-extract.schema.json delete mode 100644 .wave/contracts/spec-phase.schema.json delete mode 100644 .wave/contracts/specify-status.schema.json delete mode 100644 .wave/contracts/supervision-evaluation.schema.json delete mode 100644 .wave/contracts/supervision-evidence.schema.json delete mode 100644 .wave/contracts/tasks-status.schema.json delete mode 100644 .wave/contracts/validated-findings.schema.json delete mode 100644 .wave/contracts/web-findings.schema.json delete mode 100644 .wave/contracts/zettel-references.schema.json delete mode 100644 .wave/personas/auditor.md delete mode 100644 .wave/personas/base-protocol.md delete mode 100644 .wave/personas/craftsman.md delete mode 100644 .wave/personas/debugger.md delete mode 100644 .wave/personas/gitea-analyst.md delete mode 100644 .wave/personas/gitea-commenter.md delete mode 100644 .wave/personas/gitea-enhancer.md delete mode 100644 .wave/personas/github-analyst.md delete mode 100644 .wave/personas/github-commenter.md delete mode 100644 .wave/personas/github-enhancer.md delete mode 100644 .wave/personas/implementer.md delete mode 100644 .wave/personas/navigator.md delete mode 100644 .wave/personas/philosopher.md delete mode 100644 .wave/personas/planner.md delete mode 100644 .wave/personas/provocateur.md delete mode 100644 .wave/personas/researcher.md delete mode 100644 .wave/personas/reviewer.md delete mode 100644 .wave/personas/scout.md delete mode 100644 .wave/personas/scribe.md delete mode 100644 .wave/personas/summarizer.md delete mode 100644 .wave/personas/supervisor.md delete mode 100644 .wave/personas/synthesizer.md delete mode 100644 .wave/personas/validator.md delete mode 100644 .wave/pipelines/adr.yaml delete mode 100644 .wave/pipelines/blog-draft.yaml delete mode 100644 .wave/pipelines/changelog.yaml delete mode 100644 .wave/pipelines/code-review.yaml delete mode 100644 .wave/pipelines/dead-code.yaml delete mode 100644 .wave/pipelines/debug.yaml delete mode 100644 .wave/pipelines/doc-loop.yaml delete mode 100644 .wave/pipelines/doc-sync.yaml delete mode 100644 .wave/pipelines/editing.yaml delete mode 100644 .wave/pipelines/explain.yaml delete mode 100644 .wave/pipelines/feature.yaml delete mode 100644 .wave/pipelines/gh-issue-impl.yaml delete mode 100644 .wave/pipelines/gh-issue-research.yaml delete mode 100644 .wave/pipelines/gh-issue-rewrite.yaml delete mode 100644 .wave/pipelines/gh-issue-update.yaml delete mode 100644 .wave/pipelines/gt-issue-impl.yaml delete mode 100644 .wave/pipelines/gt-issue-research.yaml delete mode 100644 .wave/pipelines/gt-issue-rewrite.yaml delete mode 100644 .wave/pipelines/gt-issue-update.yaml delete mode 100644 .wave/pipelines/hello-world.yaml delete mode 100644 .wave/pipelines/hotfix.yaml delete mode 100644 .wave/pipelines/housekeeping.yaml delete mode 100644 .wave/pipelines/improve.yaml delete mode 100644 .wave/pipelines/ingest.yaml delete mode 100644 .wave/pipelines/onboard.yaml delete mode 100644 .wave/pipelines/plan.yaml delete mode 100644 .wave/pipelines/prototype.yaml delete mode 100644 .wave/pipelines/recinq.yaml delete mode 100644 .wave/pipelines/refactor.yaml delete mode 100644 .wave/pipelines/security-scan.yaml delete mode 100644 .wave/pipelines/smoke-test.yaml delete mode 100644 .wave/pipelines/speckit-flow.yaml delete mode 100644 .wave/pipelines/supervise.yaml delete mode 100644 .wave/pipelines/test-gen.yaml delete mode 100644 .wave/prompts/gitea-issue-impl/create-pr.md delete mode 100644 .wave/prompts/gitea-issue-impl/fetch-assess.md delete mode 100644 .wave/prompts/gitea-issue-impl/implement.md delete mode 100644 .wave/prompts/gitea-issue-impl/plan.md delete mode 100644 .wave/prompts/github-issue-impl/create-pr.md delete mode 100644 .wave/prompts/github-issue-impl/fetch-assess.md delete mode 100644 .wave/prompts/github-issue-impl/implement.md delete mode 100644 .wave/prompts/github-issue-impl/plan.md delete mode 100644 .wave/prompts/speckit-flow/analyze.md delete mode 100644 .wave/prompts/speckit-flow/checklist.md delete mode 100644 .wave/prompts/speckit-flow/clarify.md delete mode 100644 .wave/prompts/speckit-flow/create-pr.md delete mode 100644 .wave/prompts/speckit-flow/implement.md delete mode 100644 .wave/prompts/speckit-flow/plan.md delete mode 100644 .wave/prompts/speckit-flow/specify.md delete mode 100644 .wave/prompts/speckit-flow/tasks.md diff --git a/.wave/contracts/adr-context.schema.json b/.wave/contracts/adr-context.schema.json deleted file mode 100644 index a54f828..0000000 --- a/.wave/contracts/adr-context.schema.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ADR Context", - "description": "Contextual information gathered for an Architecture Decision Record", - "type": "object", - "required": ["decision_topic", "current_state", "constraints", "timestamp"], - "properties": { - "decision_topic": { "type": "string", "minLength": 5 }, - "current_state": { - "type": "object", - "required": ["description"], - "properties": { - "description": { "type": "string", "minLength": 10 }, - "affected_files": { "type": "array", "items": { "type": "string" } }, - "affected_components": { "type": "array", "items": { "type": "string" } } - } - }, - "constraints": { - "type": "array", - "items": { - "type": "object", - "required": ["type", "description"], - "properties": { - "type": { "type": "string", "enum": ["technical", "organizational", "timeline"] }, - "description": { "type": "string", "minLength": 5 } - } - } - }, - "precedents": { - "type": "array", - "items": { - "type": "object", - "required": ["description"], - "properties": { - "description": { "type": "string" }, - "location": { "type": "string" }, - "outcome": { "type": "string" } - } - } - }, - "stakeholders": { "type": "array", "items": { "type": "string" } }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/adr-options.schema.json b/.wave/contracts/adr-options.schema.json deleted file mode 100644 index 53396ba..0000000 --- a/.wave/contracts/adr-options.schema.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ADR Options Analysis", - "description": "Analysis of options for an architectural decision", - "type": "object", - "required": ["decision_topic", "options", "recommendation", "timestamp"], - "properties": { - "decision_topic": { "type": "string", "minLength": 5 }, - "options": { - "type": "array", - "minItems": 2, - "items": { - "type": "object", - "required": ["name", "description", "pros", "cons"], - "properties": { - "name": { "type": "string", "minLength": 1 }, - "description": { "type": "string", "minLength": 10 }, - "pros": { "type": "array", "items": { "type": "string" } }, - "cons": { "type": "array", "items": { "type": "string" } }, - "effort": { "type": "string", "enum": ["trivial", "small", "medium", "large", "epic"] }, - "risk": { "type": "string", "enum": ["low", "medium", "high"] }, - "reversibility": { "type": "string", "enum": ["easy", "moderate", "difficult", "irreversible"] }, - "compatibility": { "type": "string", "enum": ["high", "medium", "low"] } - } - } - }, - "recommendation": { - "type": "object", - "required": ["option", "rationale", "confidence"], - "properties": { - "option": { "type": "string", "minLength": 1 }, - "rationale": { "type": "string", "minLength": 20 }, - "confidence": { "type": "string", "enum": ["high", "medium", "low"] } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/analysis-report.schema.json b/.wave/contracts/analysis-report.schema.json deleted file mode 100644 index 1956d71..0000000 --- a/.wave/contracts/analysis-report.schema.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Speckit Analysis Report", - "description": "Cross-artifact consistency and quality analysis report before implementation.", - "type": "object", - "required": ["total_requirements", "total_tasks", "coverage_percent", "can_proceed", "feature_dir", "summary"], - "properties": { - "total_requirements": { - "type": "integer", - "description": "Total number of requirements extracted from spec" - }, - "total_tasks": { - "type": "integer", - "description": "Total number of tasks in the task breakdown" - }, - "coverage_percent": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "Percentage of requirements covered by tasks (0-100)" - }, - "can_proceed": { - "type": "boolean", - "description": "Whether the feature is ready for implementation" - }, - "feature_dir": { - "type": "string", - "minLength": 1, - "description": "Path to the feature directory" - }, - "summary": { - "type": "string", - "minLength": 1, - "description": "Brief summary of the analysis findings" - }, - "issues": { - "type": "object", - "properties": { - "critical": { - "type": "integer", - "description": "Number of critical severity issues" - }, - "high": { - "type": "integer", - "description": "Number of high severity issues" - }, - "medium": { - "type": "integer", - "description": "Number of medium severity issues" - }, - "low": { - "type": "integer", - "description": "Number of low severity issues" - } - }, - "description": "Issue counts grouped by severity level" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/audit-report.schema.json b/.wave/contracts/audit-report.schema.json deleted file mode 100644 index 9750c60..0000000 --- a/.wave/contracts/audit-report.schema.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Audit Report", - "description": "Zettelkasten health audit covering orphans, dangling links, and index gaps", - "type": "object", - "required": ["orphans", "dangling_links", "stats", "index_gaps", "dead_ends"], - "properties": { - "orphans": { - "type": "array", - "items": { - "type": "object", - "required": ["filename", "title"], - "properties": { - "filename": { - "type": "string", - "description": "Hex-ID filename of the orphan note" - }, - "title": { - "type": "string", - "description": "Title of the orphan note" - }, - "suggested_connection": { - "type": "string", - "description": "Suggested note to link from" - } - } - }, - "description": "Notes with no incoming or outgoing links" - }, - "dangling_links": { - "type": "array", - "items": { - "type": "object", - "required": ["source_filename", "target_filename", "link_text"], - "properties": { - "source_filename": { - "type": "string", - "description": "File containing the broken link" - }, - "target_filename": { - "type": "string", - "description": "Target file that doesn't exist" - }, - "link_text": { - "type": "string", - "description": "Display text of the broken link" - }, - "suggested_fix": { - "type": "string", - "enum": ["retarget", "remove"], - "description": "Suggested fix action" - } - } - }, - "description": "Links pointing to non-existent notes" - }, - "stats": { - "type": "object", - "required": ["total_notes", "total_links"], - "properties": { - "total_notes": { "type": "integer", "minimum": 0 }, - "total_links": { "type": "integer", "minimum": 0 }, - "label_notes": { "type": "integer", "minimum": 0 }, - "orphan_count": { "type": "integer", "minimum": 0 }, - "dangling_count": { "type": "integer", "minimum": 0 }, - "avg_links_per_note": { "type": "number", "minimum": 0 } - }, - "description": "Overall collection statistics" - }, - "index_gaps": { - "type": "array", - "items": { - "type": "object", - "required": ["section", "description"], - "properties": { - "section": { - "type": "string", - "description": "Section name missing from index" - }, - "description": { - "type": "string", - "description": "What's missing" - }, - "suggested_entry_point": { - "type": "string", - "description": "Suggested note to use as entry point" - } - } - }, - "description": "Sections or keywords missing from the index note" - }, - "dead_ends": { - "type": "array", - "items": { - "type": "object", - "required": ["filename", "title"], - "properties": { - "filename": { - "type": "string", - "description": "Hex-ID filename of the dead-end note" - }, - "title": { - "type": "string", - "description": "Title of the note" - }, - "outgoing_links": { - "type": "integer", - "minimum": 0, - "description": "Number of outgoing links (may have outgoing but no incoming)" - } - } - }, - "description": "Notes with no incoming links (reachable only via search)" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/contracts/categorized-changes.schema.json b/.wave/contracts/categorized-changes.schema.json deleted file mode 100644 index e17dae6..0000000 --- a/.wave/contracts/categorized-changes.schema.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Categorized Changelog Changes", - "description": "Categorized and described changes for changelog generation", - "type": "object", - "required": ["version_label", "sections", "timestamp"], - "properties": { - "version_label": { "type": "string", "minLength": 1 }, - "breaking_changes": { - "type": "array", - "items": { - "type": "object", - "required": ["description"], - "properties": { - "description": { "type": "string" }, - "migration": { "type": "string" }, - "related_commits": { "type": "array", "items": { "type": "string" } } - } - } - }, - "sections": { - "type": "array", - "items": { - "type": "object", - "required": ["title", "type", "entries"], - "properties": { - "title": { "type": "string" }, - "type": { "type": "string" }, - "entries": { - "type": "array", - "items": { - "type": "object", - "required": ["description"], - "properties": { - "description": { "type": "string" }, - "scope": { "type": "string" }, - "commits": { "type": "array", "items": { "type": "string" } }, - "notable": { "type": "boolean" } - } - } - } - } - } - }, - "contributors": { "type": "array", "items": { "type": "string" } }, - "stats": { - "type": "object", - "properties": { - "total_entries": { "type": "integer" }, - "notable_entries": { "type": "integer" } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/checklist-status.schema.json b/.wave/contracts/checklist-status.schema.json deleted file mode 100644 index a2fe86e..0000000 --- a/.wave/contracts/checklist-status.schema.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Speckit Checklist Status", - "description": "Status report from the checklist step: quality checklist generation for requirement validation.", - "type": "object", - "required": ["checklist_files", "total_items", "feature_dir", "summary"], - "properties": { - "checklist_files": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Paths to generated checklist files" - }, - "total_items": { - "type": "integer", - "minimum": 0, - "description": "Total number of checklist items across all files" - }, - "feature_dir": { - "type": "string", - "minLength": 1, - "description": "Path to the feature directory" - }, - "summary": { - "type": "string", - "minLength": 1, - "description": "Brief description of the checklists generated" - }, - "critical_gaps": { - "type": "integer", - "description": "Number of critical quality gaps identified" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/clarify-status.schema.json b/.wave/contracts/clarify-status.schema.json deleted file mode 100644 index 2622f60..0000000 --- a/.wave/contracts/clarify-status.schema.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Speckit Clarify Status", - "description": "Status report from the clarify step: ambiguity resolution and spec refinement.", - "type": "object", - "required": ["questions_asked", "answers_encoded", "feature_dir", "summary"], - "properties": { - "questions_asked": { - "type": "integer", - "minimum": 0, - "description": "Number of clarification questions identified" - }, - "answers_encoded": { - "type": "integer", - "minimum": 0, - "description": "Number of clarifications resolved and encoded into the spec" - }, - "feature_dir": { - "type": "string", - "minLength": 1, - "description": "Path to the feature directory" - }, - "summary": { - "type": "string", - "minLength": 1, - "description": "Brief description of clarifications made" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/comment-result.schema.json b/.wave/contracts/comment-result.schema.json deleted file mode 100644 index 9e7aad3..0000000 --- a/.wave/contracts/comment-result.schema.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "GitHub Comment Result", - "description": "Result of posting research report as a GitHub issue comment", - "type": "object", - "required": ["success", "issue_reference", "timestamp"], - "properties": { - "success": { - "type": "boolean", - "description": "Whether the comment was successfully posted" - }, - "issue_reference": { - "type": "object", - "required": ["issue_number", "repository"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1, - "description": "Issue number that was commented on" - }, - "repository": { - "type": "string", - "pattern": "^[^/]+/[^/]+$", - "description": "Repository full name" - }, - "issue_url": { - "type": "string", - "format": "uri", - "description": "URL to the issue" - } - } - }, - "comment": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "minimum": 1, - "description": "GitHub comment ID" - }, - "url": { - "type": "string", - "format": "uri", - "description": "Direct URL to the posted comment" - }, - "body_length": { - "type": "integer", - "minimum": 0, - "description": "Length of the posted comment body in characters" - }, - "created_at": { - "type": "string", - "format": "date-time", - "description": "When the comment was created" - } - }, - "description": "Details of the posted comment (only present if success=true)" - }, - "error": { - "type": "object", - "properties": { - "code": { - "type": "string", - "enum": ["authentication_failed", "rate_limit_exceeded", "issue_not_found", "issue_locked", "permission_denied", "comment_too_long", "network_error", "api_error", "unknown_error"], - "description": "Error code" - }, - "message": { - "type": "string", - "description": "Human-readable error message" - }, - "retryable": { - "type": "boolean", - "description": "Whether the operation can be retried" - } - }, - "description": "Error details (only present if success=false)" - }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Operation timestamp" - } - } -} diff --git a/.wave/contracts/commit-analysis.schema.json b/.wave/contracts/commit-analysis.schema.json deleted file mode 100644 index e0d4150..0000000 --- a/.wave/contracts/commit-analysis.schema.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Commit Analysis", - "description": "Structured analysis of git commits for changelog generation", - "type": "object", - "required": ["range", "commits", "summary", "timestamp"], - "properties": { - "range": { - "type": "object", - "required": ["from", "to", "total_commits"], - "properties": { - "from": { "type": "string", "minLength": 1 }, - "to": { "type": "string", "minLength": 1 }, - "total_commits": { "type": "integer", "minimum": 0 }, - "date_range": { - "type": "object", - "properties": { - "start": { "type": "string" }, - "end": { "type": "string" } - } - } - } - }, - "commits": { - "type": "array", - "items": { - "type": "object", - "required": ["hash", "date", "type", "subject"], - "properties": { - "hash": { "type": "string", "minLength": 4 }, - "author": { "type": "string" }, - "date": { "type": "string" }, - "type": { "type": "string", "enum": ["feat", "fix", "docs", "refactor", "test", "chore", "perf", "ci", "other"] }, - "scope": { "type": ["string", "null"] }, - "subject": { "type": "string", "minLength": 1 }, - "breaking": { "type": "boolean" }, - "breaking_note": { "type": "string" } - } - } - }, - "summary": { - "type": "object", - "required": ["by_type"], - "properties": { - "by_type": { "type": "object" }, - "breaking_changes": { "type": "integer", "minimum": 0 }, - "contributors": { "type": "array", "items": { "type": "string" } }, - "most_changed_scopes": { "type": "array", "items": { "type": "string" } } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/connections.schema.json b/.wave/contracts/connections.schema.json deleted file mode 100644 index e7d704b..0000000 --- a/.wave/contracts/connections.schema.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Connections", - "description": "Mapping of new content to existing Zettelkasten notes and addresses", - "type": "object", - "required": ["source_title", "related_notes", "suggested_placements"], - "properties": { - "source_title": { - "type": "string", - "description": "Title of the source being connected" - }, - "related_notes": { - "type": "array", - "items": { - "type": "object", - "required": ["filename", "title", "folgezettel_address", "relationship"], - "properties": { - "filename": { - "type": "string", - "pattern": "^[0-9a-f]{8}\\.md$", - "description": "Hex-ID filename of the related note" - }, - "title": { - "type": "string", - "description": "Full title of the related note" - }, - "folgezettel_address": { - "type": "string", - "description": "Folgezettel address of the related note" - }, - "relationship": { - "type": "string", - "description": "Why this note is related to the source" - }, - "link_direction": { - "type": "string", - "enum": ["from_new", "to_new", "bidirectional"], - "description": "Whether the new note should link to this, or this should link to new" - } - } - }, - "description": "Existing notes related to the source content" - }, - "suggested_placements": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["folgezettel_address", "parent_note", "section", "rationale"], - "properties": { - "folgezettel_address": { - "type": "string", - "description": "Suggested Folgezettel address for a new note" - }, - "parent_note": { - "type": "string", - "description": "Filename of the parent note in the Folgezettel sequence" - }, - "section": { - "type": "string", - "description": "Top-level section name" - }, - "rationale": { - "type": "string", - "description": "Why this placement makes sense" - }, - "concept": { - "type": "string", - "description": "Which concept from the source this placement is for" - } - } - }, - "description": "Suggested positions in the Folgezettel for new notes" - }, - "index_update_needed": { - "type": "boolean", - "description": "Whether the index note should be updated" - }, - "suggested_index_entries": { - "type": "array", - "items": { - "type": "object", - "required": ["keyword", "rationale"], - "properties": { - "keyword": { "type": "string" }, - "rationale": { "type": "string" } - } - }, - "description": "Suggested new entries for the index note" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/contracts/convergent-proposals.schema.json b/.wave/contracts/convergent-proposals.schema.json deleted file mode 100644 index 5a64db4..0000000 --- a/.wave/contracts/convergent-proposals.schema.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Convergent Proposals", - "description": "Prioritized simplification proposals from convergent thinking phase", - "type": "object", - "required": ["source_findings", "validation_summary", "proposals", "timestamp"], - "properties": { - "source_findings": { - "type": "object", - "required": ["total_reviewed", "confirmed", "partially_confirmed", "rejected"], - "properties": { - "total_reviewed": { "type": "integer" }, - "confirmed": { "type": "integer" }, - "partially_confirmed": { "type": "integer" }, - "rejected": { "type": "integer" }, - "rejection_reasons": { - "type": "array", - "items": { - "type": "object", - "required": ["finding_id", "reason"], - "properties": { - "finding_id": { "type": "string" }, - "reason": { "type": "string" } - } - } - } - } - }, - "validation_summary": { - "type": "string", - "description": "Narrative summary of the converge→diverge→converge validation process" - }, - "proposals": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "title", "description", "source_findings", "impact", "effort", "risk", "tier", "files"], - "properties": { - "id": { "type": "string", "pattern": "^SMP-\\d{3}$" }, - "title": { "type": "string" }, - "description": { "type": "string" }, - "source_findings": { - "type": "array", - "items": { "type": "string" }, - "description": "DVG-xxx IDs this proposal addresses" - }, - "impact": { "type": "string", "enum": ["high", "medium", "low"] }, - "effort": { "type": "string", "enum": ["small", "medium", "large"] }, - "risk": { "type": "string", "enum": ["low", "medium", "high"] }, - "tier": { - "type": "integer", - "minimum": 1, - "maximum": 3, - "description": "Priority tier: 1=do now, 2=do next, 3=consider later" - }, - "files": { - "type": "array", - "items": { "type": "string" }, - "description": "Files that would be modified" - }, - "dependencies": { - "type": "array", - "items": { "type": "string" }, - "description": "SMP-xxx IDs that must be applied first" - }, - "lines_removed_estimate": { "type": "integer" }, - "second_order_effects": { - "type": "array", - "items": { "type": "string" }, - "description": "Insights discovered during deeper probing" - } - } - } - }, - "eighty_twenty_analysis": { - "type": "string", - "description": "Which 20% of proposals yield 80% of the simplification benefit" - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/coverage-analysis.schema.json b/.wave/contracts/coverage-analysis.schema.json deleted file mode 100644 index a964750..0000000 --- a/.wave/contracts/coverage-analysis.schema.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "required": ["current_coverage", "uncovered_functions", "uncovered_branches", "edge_cases", "mock_requirements"], - "properties": { - "current_coverage": { "type": "string" }, - "uncovered_functions": { - "type": "array", - "items": { "type": "string" } - }, - "uncovered_branches": { - "type": "array", - "items": { "type": "string" } - }, - "edge_cases": { - "type": "array", - "items": { "type": "string" } - }, - "mock_requirements": { - "type": "array", - "items": { "type": "string" } - } - } -} diff --git a/.wave/contracts/dead-code-scan.schema.json b/.wave/contracts/dead-code-scan.schema.json deleted file mode 100644 index 46dc82a..0000000 --- a/.wave/contracts/dead-code-scan.schema.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Dead Code Scan", - "description": "Scan results for dead or redundant code", - "type": "object", - "required": ["target", "findings", "summary", "timestamp"], - "properties": { - "target": { "type": "string", "minLength": 1 }, - "findings": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "type", "location", "description", "confidence", "safe_to_remove"], - "properties": { - "id": { "type": "string", "pattern": "^DC-[0-9]{3}$" }, - "type": { - "type": "string", - "enum": ["unused_export", "unreachable", "orphaned_file", "redundant", "stale_test", "unused_import", "commented_code"] - }, - "location": { "type": "string", "minLength": 1 }, - "symbol": { "type": "string" }, - "description": { "type": "string", "minLength": 5 }, - "evidence": { "type": "string" }, - "confidence": { "type": "string", "enum": ["high", "medium", "low"] }, - "safe_to_remove": { "type": "boolean" }, - "removal_note": { "type": "string" } - } - } - }, - "summary": { - "type": "object", - "required": ["total_findings"], - "properties": { - "total_findings": { "type": "integer", "minimum": 0 }, - "by_type": { "type": "object" }, - "high_confidence_count": { "type": "integer", "minimum": 0 }, - "estimated_lines_removable": { "type": "integer", "minimum": 0 } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/debug-hypotheses.schema.json b/.wave/contracts/debug-hypotheses.schema.json deleted file mode 100644 index f63cce4..0000000 --- a/.wave/contracts/debug-hypotheses.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "required": ["hypotheses"], - "properties": { - "hypotheses": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["id", "description", "likelihood", "test_approach"], - "properties": { - "id": { "type": "integer" }, - "description": { "type": "string", "minLength": 1 }, - "likelihood": { "type": "string", "enum": ["high", "medium", "low"] }, - "test_approach": { "type": "string", "minLength": 1 }, - "expected_result_if_true": { "type": "string" } - } - } - } - } -} diff --git a/.wave/contracts/debug-reproduction.schema.json b/.wave/contracts/debug-reproduction.schema.json deleted file mode 100644 index a174d1c..0000000 --- a/.wave/contracts/debug-reproduction.schema.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "required": ["expected_behavior", "actual_behavior", "reproduction_steps", "relevant_files"], - "properties": { - "expected_behavior": { "type": "string", "minLength": 1 }, - "actual_behavior": { "type": "string", "minLength": 1 }, - "reproduction_steps": { - "type": "array", - "items": { "type": "string" } - }, - "relevant_files": { - "type": "array", - "items": { "type": "string" } - }, - "environmental_factors": { - "type": "array", - "items": { "type": "string" } - } - } -} diff --git a/.wave/contracts/diff-analysis.schema.json b/.wave/contracts/diff-analysis.schema.json deleted file mode 100644 index bd614d5..0000000 --- a/.wave/contracts/diff-analysis.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "required": ["files_changed", "modules_affected", "related_tests", "breaking_changes"], - "properties": { - "files_changed": { - "type": "array", - "items": { - "type": "object", - "required": ["path", "change_type", "purpose"], - "properties": { - "path": { "type": "string" }, - "change_type": { "type": "string", "enum": ["added", "modified", "deleted"] }, - "purpose": { "type": "string" } - } - } - }, - "modules_affected": { - "type": "array", - "items": { "type": "string" } - }, - "related_tests": { - "type": "array", - "items": { "type": "string" } - }, - "breaking_changes": { - "type": "array", - "items": { "type": "string" } - } - } -} diff --git a/.wave/contracts/divergent-findings.schema.json b/.wave/contracts/divergent-findings.schema.json deleted file mode 100644 index 5bf7e0a..0000000 --- a/.wave/contracts/divergent-findings.schema.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Divergent Findings", - "description": "Broad-net findings from divergent thinking phase of the recinq pipeline", - "type": "object", - "required": ["scope", "findings", "metrics_summary", "timestamp"], - "properties": { - "scope": { - "type": "object", - "required": ["target", "files_scanned", "total_lines"], - "properties": { - "target": { "type": "string", "description": "What was analyzed (path, module, or 'whole-project')" }, - "files_scanned": { "type": "integer" }, - "total_lines": { "type": "integer" } - } - }, - "findings": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["id", "category", "title", "description", "evidence", "severity"], - "properties": { - "id": { "type": "string", "pattern": "^DVG-\\d{3}$" }, - "category": { - "type": "string", - "enum": [ - "premature_abstraction", - "unnecessary_indirection", - "overengineering", - "yagni_violation", - "accidental_complexity", - "copy_paste_drift", - "dead_weight", - "naming_lie", - "dependency_gravity", - "missing_abstraction", - "other" - ] - }, - "title": { "type": "string" }, - "description": { "type": "string" }, - "evidence": { - "type": "object", - "required": ["files"], - "properties": { - "files": { "type": "array", "items": { "type": "string" } }, - "line_count": { "type": "integer" }, - "reference_count": { "type": "integer" }, - "change_frequency": { "type": "integer" }, - "metrics": { "type": "string" } - } - }, - "severity": { - "type": "string", - "enum": ["critical", "high", "medium", "low"] - }, - "confidence": { - "type": "string", - "enum": ["high", "medium", "low"], - "description": "How confident the provocateur is in this finding" - } - } - } - }, - "metrics_summary": { - "type": "object", - "required": ["total_findings"], - "properties": { - "total_findings": { "type": "integer" }, - "by_category": { "type": "object", "additionalProperties": { "type": "integer" } }, - "by_severity": { "type": "object", "additionalProperties": { "type": "integer" } }, - "hotspot_files": { - "type": "array", - "items": { "type": "string" }, - "description": "Files appearing in multiple findings" - } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/doc-consistency-report.schema.json b/.wave/contracts/doc-consistency-report.schema.json deleted file mode 100644 index e970d64..0000000 --- a/.wave/contracts/doc-consistency-report.schema.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Documentation Consistency Report", - "description": "Output from the analyze-consistency step: list of inconsistencies between code and documentation", - "type": "object", - "required": ["summary", "inconsistencies", "timestamp"], - "properties": { - "summary": { - "type": "object", - "required": ["total_count", "by_severity"], - "properties": { - "total_count": { - "type": "integer", - "minimum": 0, - "description": "Total number of inconsistencies found" - }, - "by_severity": { - "type": "object", - "properties": { - "critical": { "type": "integer", "minimum": 0 }, - "high": { "type": "integer", "minimum": 0 }, - "medium": { "type": "integer", "minimum": 0 }, - "low": { "type": "integer", "minimum": 0 } - }, - "description": "Count of inconsistencies by severity level" - }, - "clean": { - "type": "boolean", - "description": "True if no inconsistencies were found" - } - } - }, - "inconsistencies": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "severity", "category", "title", "description", "source_location", "doc_location"], - "properties": { - "id": { - "type": "string", - "pattern": "^DOC-[0-9]{3}$", - "description": "Unique inconsistency ID (DOC-001, DOC-002, etc.)" - }, - "severity": { - "type": "string", - "enum": ["critical", "high", "medium", "low"], - "description": "Severity of the inconsistency" - }, - "category": { - "type": "string", - "enum": ["cli_flags", "personas", "pipelines", "contracts", "env_vars", "api", "stale_reference", "missing_docs", "other"], - "description": "Category of the inconsistency" - }, - "title": { - "type": "string", - "minLength": 1, - "maxLength": 200, - "description": "Short title describing the inconsistency" - }, - "description": { - "type": "string", - "minLength": 1, - "description": "Detailed description of the inconsistency and what needs to change" - }, - "source_location": { - "type": "string", - "description": "File and line where the source of truth is (code, pipeline, etc.)" - }, - "doc_location": { - "type": "string", - "description": "File and section where the documentation is stale or missing" - }, - "fix_description": { - "type": "string", - "description": "What specifically needs to be updated" - } - } - }, - "description": "List of documentation inconsistencies" - }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When the analysis was performed" - } - } -} diff --git a/.wave/contracts/doc-issue-result.schema.json b/.wave/contracts/doc-issue-result.schema.json deleted file mode 100644 index cf1ae31..0000000 --- a/.wave/contracts/doc-issue-result.schema.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Documentation Issue Result", - "description": "Output from the create-issue step: GitHub issue creation result", - "type": "object", - "required": ["success", "repository", "timestamp"], - "properties": { - "success": { - "type": "boolean", - "description": "Whether the issue was successfully created" - }, - "repository": { - "type": "string", - "pattern": "^[^/]+/[^/]+$", - "description": "Repository full name (owner/repo)" - }, - "issue": { - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1, - "description": "GitHub issue number" - }, - "url": { - "type": "string", - "format": "uri", - "description": "URL to the created issue" - }, - "title": { - "type": "string", - "description": "Issue title" - }, - "inconsistency_count": { - "type": "integer", - "minimum": 0, - "description": "Number of inconsistencies reported in the issue" - } - }, - "description": "Details of the created issue (only present if success=true)" - }, - "skipped": { - "type": "boolean", - "description": "True if no issue was created because no inconsistencies were found" - }, - "error": { - "type": "object", - "properties": { - "code": { - "type": "string", - "enum": ["authentication_failed", "rate_limit_exceeded", "permission_denied", "network_error", "api_error", "unknown_error"], - "description": "Error code" - }, - "message": { - "type": "string", - "description": "Human-readable error message" - }, - "retryable": { - "type": "boolean", - "description": "Whether the operation can be retried" - } - }, - "description": "Error details (only present if success=false)" - }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "Operation timestamp" - } - } -} diff --git a/.wave/contracts/doc-scan-results.schema.json b/.wave/contracts/doc-scan-results.schema.json deleted file mode 100644 index a0f4cee..0000000 --- a/.wave/contracts/doc-scan-results.schema.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Documentation Scan Results", - "description": "Output from the scan-changes step: changed files and current documentation state snapshot", - "type": "object", - "required": ["scan_scope", "changed_files", "documentation_snapshot", "timestamp"], - "properties": { - "scan_scope": { - "type": "object", - "required": ["mode", "range"], - "properties": { - "mode": { - "type": "string", - "enum": ["diff", "full"], - "description": "Whether this was a diff-based or full scan" - }, - "range": { - "type": "string", - "description": "Git range used for diff (e.g. 'main...HEAD') or 'full' for full scan" - }, - "base_ref": { - "type": "string", - "description": "Base reference for comparison" - } - } - }, - "changed_files": { - "type": "object", - "required": ["total_count", "categories"], - "properties": { - "total_count": { - "type": "integer", - "minimum": 0, - "description": "Total number of changed files" - }, - "categories": { - "type": "object", - "properties": { - "go_code": { - "type": "array", - "items": { "type": "string" }, - "description": "Changed Go source files" - }, - "cli_commands": { - "type": "array", - "items": { "type": "string" }, - "description": "Changed CLI command files (cmd/wave/commands/)" - }, - "pipelines": { - "type": "array", - "items": { "type": "string" }, - "description": "Changed pipeline definitions" - }, - "personas": { - "type": "array", - "items": { "type": "string" }, - "description": "Changed persona definitions" - }, - "contracts": { - "type": "array", - "items": { "type": "string" }, - "description": "Changed contract schemas" - }, - "documentation": { - "type": "array", - "items": { "type": "string" }, - "description": "Changed documentation files (docs/, README.md, CLAUDE.md, etc.)" - }, - "other": { - "type": "array", - "items": { "type": "string" }, - "description": "Other changed files" - } - } - } - } - }, - "documentation_snapshot": { - "type": "object", - "required": ["files"], - "properties": { - "files": { - "type": "array", - "items": { - "type": "object", - "required": ["path", "exists"], - "properties": { - "path": { - "type": "string", - "description": "Path to the documentation file" - }, - "exists": { - "type": "boolean", - "description": "Whether the file exists" - }, - "summary": { - "type": "string", - "description": "Brief summary of the file's content and key sections" - } - } - }, - "description": "Key documentation files and their current state" - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When the scan was performed" - } - } -} diff --git a/.wave/contracts/doc-sync-scan.schema.json b/.wave/contracts/doc-sync-scan.schema.json deleted file mode 100644 index 0fc7f0c..0000000 --- a/.wave/contracts/doc-sync-scan.schema.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Doc Sync Scan Results", - "description": "Documentation inconsistency scan for doc-sync pipeline", - "type": "object", - "required": ["scan_scope", "findings", "summary", "timestamp"], - "properties": { - "scan_scope": { "type": "string", "minLength": 1 }, - "findings": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "type", "severity", "title", "description"], - "properties": { - "id": { "type": "string", "pattern": "^DOC-[0-9]{3}$" }, - "type": { "type": "string", "enum": ["MISSING_DOCS", "STALE_DOCS", "INACCURATE", "INCOMPLETE"] }, - "severity": { "type": "string", "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"] }, - "title": { "type": "string", "minLength": 3 }, - "doc_location": { "type": "string" }, - "code_location": { "type": "string" }, - "description": { "type": "string", "minLength": 10 }, - "suggested_fix": { "type": "string" } - } - } - }, - "summary": { - "type": "object", - "required": ["total_findings"], - "properties": { - "total_findings": { "type": "integer", "minimum": 0 }, - "by_type": { "type": "object" }, - "by_severity": { "type": "object" }, - "fixable_count": { "type": "integer", "minimum": 0 } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/docs-phase.schema.json b/.wave/contracts/docs-phase.schema.json deleted file mode 100644 index 392efc7..0000000 --- a/.wave/contracts/docs-phase.schema.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.recinq.com/wave/docs-phase.schema.json", - "title": "Wave Docs Phase Output Contract", - "description": "Validates docs phase outputs for prototype-driven development pipeline", - "type": "object", - "properties": { - "phase": { - "type": "string", - "const": "docs", - "description": "Phase identifier" - }, - "artifacts": { - "type": "object", - "properties": { - "feature_docs": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*feature-docs\\.md$", - "description": "Path to feature documentation file" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Feature documentation file must exist" - }, - "content_type": { - "type": "string", - "const": "markdown", - "description": "Documentation content format" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - }, - "stakeholder_summary": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*stakeholder-summary\\.md$", - "description": "Path to stakeholder summary file" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Stakeholder summary file must exist" - }, - "content_type": { - "type": "string", - "const": "markdown", - "description": "Summary content format" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - } - }, - "required": ["feature_docs", "stakeholder_summary"], - "additionalProperties": true - }, - "validation": { - "type": "object", - "properties": { - "coverage_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Specification coverage in documentation" - }, - "readability_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "Documentation readability rating" - }, - "documentation_quality": { - "type": "string", - "enum": ["poor", "fair", "good", "excellent"], - "description": "Overall documentation quality assessment" - } - }, - "required": ["documentation_quality"], - "additionalProperties": false - }, - "metadata": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When docs phase was completed" - }, - "duration_seconds": { - "type": "number", - "minimum": 0, - "description": "Time taken for docs phase" - }, - "source_spec_path": { - "type": "string", - "description": "Path to source specification file" - } - }, - "required": ["timestamp", "source_spec_path"], - "additionalProperties": false - } - }, - "required": ["phase", "artifacts", "validation", "metadata"], - "additionalProperties": false -} diff --git a/.wave/contracts/dummy-phase.schema.json b/.wave/contracts/dummy-phase.schema.json deleted file mode 100644 index cf209e7..0000000 --- a/.wave/contracts/dummy-phase.schema.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.recinq.com/wave/dummy-phase.schema.json", - "title": "Wave Dummy Phase Output Contract", - "description": "Validates dummy phase outputs for prototype-driven development pipeline", - "type": "object", - "properties": { - "phase": { - "type": "string", - "const": "dummy", - "description": "Phase identifier" - }, - "artifacts": { - "type": "object", - "properties": { - "prototype": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*prototype/?$", - "description": "Path to prototype directory" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Prototype directory must exist" - }, - "content_type": { - "type": "string", - "const": "code", - "description": "Prototype content type" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - }, - "interface_definitions": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*interfaces\\.md$", - "description": "Path to interface definitions file" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Interface definitions file must exist" - }, - "content_type": { - "type": "string", - "const": "markdown", - "description": "Interface definitions content format" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - } - }, - "required": ["prototype", "interface_definitions"], - "additionalProperties": true - }, - "validation": { - "type": "object", - "properties": { - "runnable": { - "type": "boolean", - "description": "Whether the prototype can be executed" - }, - "interface_completeness": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "Percentage of interfaces stubbed" - }, - "prototype_quality": { - "type": "string", - "enum": ["poor", "fair", "good", "excellent"], - "description": "Overall prototype quality assessment" - } - }, - "required": ["runnable", "prototype_quality"], - "additionalProperties": false - }, - "metadata": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When dummy phase was completed" - }, - "duration_seconds": { - "type": "number", - "minimum": 0, - "description": "Time taken for dummy phase" - }, - "source_docs_path": { - "type": "string", - "description": "Path to source documentation file" - } - }, - "required": ["timestamp", "source_docs_path"], - "additionalProperties": false - } - }, - "required": ["phase", "artifacts", "validation", "metadata"], - "additionalProperties": false -} diff --git a/.wave/contracts/editorial-plan.schema.json b/.wave/contracts/editorial-plan.schema.json deleted file mode 100644 index ef362d8..0000000 --- a/.wave/contracts/editorial-plan.schema.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Editorial Plan", - "description": "Analysis of a blog draft with a mapped editorial plan based on author criticism", - "type": "object", - "required": ["draft_filename", "draft_title", "sections", "editorial_actions"], - "properties": { - "draft_filename": { - "type": "string", - "pattern": "^[0-9a-f]{8}\\.md$", - "description": "Hex-ID filename of the draft note" - }, - "draft_title": { - "type": "string", - "description": "Title of the blog draft" - }, - "sections": { - "type": "array", - "items": { - "type": "object", - "required": ["heading", "line_range", "summary"], - "properties": { - "heading": { - "type": "string", - "description": "Section heading text" - }, - "line_range": { - "type": "string", - "description": "Line range in the file (e.g., 15-42)" - }, - "summary": { - "type": "string", - "description": "Brief summary of what this section covers" - }, - "word_count": { - "type": "integer", - "minimum": 0 - } - } - }, - "description": "Structural map of the draft's sections" - }, - "editorial_actions": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["id", "type", "target_section", "description", "criticism_addressed"], - "properties": { - "id": { - "type": "string", - "pattern": "^EDIT-[0-9]{3}$", - "description": "Unique action identifier" - }, - "type": { - "type": "string", - "enum": ["rewrite", "restructure", "cut", "expand", "add", "replace_example", "fix_tone", "fix_links"], - "description": "Type of editorial action" - }, - "target_section": { - "type": "string", - "description": "Section heading this action targets, or 'global' for whole-draft changes" - }, - "description": { - "type": "string", - "description": "Specific description of what to change and why" - }, - "criticism_addressed": { - "type": "string", - "description": "Which part of the author's criticism this action addresses" - }, - "priority": { - "type": "string", - "enum": ["high", "medium", "low"], - "description": "How critical this edit is" - } - } - }, - "description": "Ordered list of editorial actions to apply" - }, - "linked_notes": { - "type": "array", - "items": { - "type": "object", - "required": ["filename", "title"], - "properties": { - "filename": { "type": "string" }, - "title": { "type": "string" } - } - }, - "description": "Notes currently linked from the draft" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/contracts/explain-analysis.schema.json b/.wave/contracts/explain-analysis.schema.json deleted file mode 100644 index 37c3dd9..0000000 --- a/.wave/contracts/explain-analysis.schema.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Code Architecture Analysis", - "description": "Architecture and design analysis of explored code", - "type": "object", - "required": ["topic", "patterns", "timestamp"], - "properties": { - "topic": { "type": "string", "minLength": 3 }, - "patterns": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "where", "why"], - "properties": { - "name": { "type": "string" }, - "where": { "type": "string" }, - "why": { "type": "string" }, - "quality": { "type": "string", "enum": ["well-implemented", "adequate", "needs-improvement"] } - } - } - }, - "data_flow": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { "type": "string" }, - "stages": { "type": "array", "items": { "type": "string" } }, - "key_transformations": { "type": "array", "items": { "type": "string" } } - } - } - }, - "error_handling": { - "type": "object", - "properties": { - "strategy": { "type": "string" }, - "patterns": { "type": "array", "items": { "type": "string" } }, - "gaps": { "type": "array", "items": { "type": "string" } } - } - }, - "concurrency": { - "type": "object", - "properties": { - "model": { "type": "string" }, - "primitives": { "type": "array", "items": { "type": "string" } }, - "risks": { "type": "array", "items": { "type": "string" } } - } - }, - "extension_points": { - "type": "array", - "items": { - "type": "object", - "required": ["interface", "file"], - "properties": { - "interface": { "type": "string" }, - "file": { "type": "string" }, - "purpose": { "type": "string" } - } - } - }, - "design_decisions": { - "type": "array", - "items": { - "type": "object", - "required": ["decision"], - "properties": { - "decision": { "type": "string" }, - "rationale": { "type": "string" }, - "trade_offs": { "type": "string" } - } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/explain-exploration.schema.json b/.wave/contracts/explain-exploration.schema.json deleted file mode 100644 index 20a98ae..0000000 --- a/.wave/contracts/explain-exploration.schema.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Explain Exploration Results", - "description": "Structured exploration of a codebase topic for explanation", - "type": "object", - "required": ["topic", "entry_points", "key_types", "timestamp"], - "properties": { - "topic": { "type": "string", "minLength": 1 }, - "entry_points": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["file", "symbol", "role"], - "properties": { - "file": { "type": "string", "minLength": 1 }, - "symbol": { "type": "string", "minLength": 1 }, - "role": { "type": "string", "minLength": 1 }, - "line": { "type": "integer", "minimum": 1 } - } - } - }, - "key_types": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "file", "purpose"], - "properties": { - "name": { "type": "string", "minLength": 1 }, - "file": { "type": "string", "minLength": 1 }, - "purpose": { "type": "string", "minLength": 1 }, - "methods": { "type": "array", "items": { "type": "string" } }, - "relationships": { "type": "array", "items": { "type": "string" } } - } - } - }, - "call_flows": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "steps"], - "properties": { - "name": { "type": "string" }, - "steps": { "type": "array", "items": { "type": "string" } }, - "description": { "type": "string" } - } - } - }, - "dependencies": { - "type": "object", - "properties": { - "depends_on": { "type": "array", "items": { "type": "string" } }, - "depended_by": { "type": "array", "items": { "type": "string" } }, - "external": { "type": "array", "items": { "type": "string" } } - } - }, - "test_files": { "type": "array", "items": { "type": "string" } }, - "config_points": { "type": "array", "items": { "type": "string" } }, - "file_count": { "type": "integer", "minimum": 0 }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/feature-exploration.schema.json b/.wave/contracts/feature-exploration.schema.json deleted file mode 100644 index 036b7dd..0000000 --- a/.wave/contracts/feature-exploration.schema.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Feature Exploration", - "description": "Codebase exploration for feature implementation", - "type": "object", - "required": ["feature", "scope", "related_files", "timestamp"], - "properties": { - "feature": { "type": "string", "minLength": 1 }, - "scope": { "type": "string", "enum": ["small", "medium", "large"] }, - "related_files": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["path", "relevance", "reason"], - "properties": { - "path": { "type": "string", "minLength": 1 }, - "relevance": { "type": "string", "enum": ["primary", "secondary"] }, - "reason": { "type": "string", "minLength": 1 }, - "key_symbols": { "type": "array", "items": { "type": "string" } } - } - } - }, - "patterns_to_follow": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { "type": "string" }, - "example_file": { "type": "string" }, - "relevance": { "type": "string", "enum": ["must_follow", "should_follow"] } - } - } - }, - "affected_modules": { "type": "array", "items": { "type": "string" } }, - "test_files": { "type": "array", "items": { "type": "string" } }, - "risks": { - "type": "array", - "items": { - "type": "object", - "required": ["description", "severity"], - "properties": { - "description": { "type": "string" }, - "severity": { "type": "string", "enum": ["high", "medium", "low"] }, - "mitigation": { "type": "string" } - } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/feature-plan.schema.json b/.wave/contracts/feature-plan.schema.json deleted file mode 100644 index d298909..0000000 --- a/.wave/contracts/feature-plan.schema.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Feature Implementation Plan", - "description": "Ordered implementation plan for a feature", - "type": "object", - "required": ["feature", "steps", "total_complexity", "timestamp"], - "properties": { - "feature": { "type": "string", "minLength": 5 }, - "steps": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["id", "title", "description"], - "properties": { - "id": { "type": "string", "pattern": "^S\\d{2}$" }, - "title": { "type": "string" }, - "description": { "type": "string" }, - "files_to_modify": { "type": "array", "items": { "type": "string" } }, - "files_to_create": { "type": "array", "items": { "type": "string" } }, - "tests_to_write": { "type": "array", "items": { "type": "string" } }, - "acceptance_criteria": { "type": "array", "items": { "type": "string" } }, - "complexity": { "type": "string", "enum": ["S", "M", "L"] }, - "dependencies": { "type": "array", "items": { "type": "string" } } - } - } - }, - "total_complexity": { "type": "string", "enum": ["S", "M", "L", "XL"] }, - "branch_name_suggestion": { "type": "string" }, - "commit_message_suggestion": { "type": "string" }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/findings.schema.json b/.wave/contracts/findings.schema.json deleted file mode 100644 index 9a7540c..0000000 --- a/.wave/contracts/findings.schema.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Investigation Findings", - "type": "object", - "required": [ - "root_cause", - "affected_files", - "fix_approach" - ], - "properties": { - "root_cause": { - "type": "string", - "description": "Description of the root cause" - }, - "affected_files": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of affected file paths" - }, - "recent_commits": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of relevant commit hashes" - }, - "blast_radius": { - "type": "string", - "description": "Assessment of what else could be affected" - }, - "fix_approach": { - "type": "string", - "description": "Recommended approach to fix the issue" - } - } -} \ No newline at end of file diff --git a/.wave/contracts/github-enhancement-plan.schema.json b/.wave/contracts/github-enhancement-plan.schema.json deleted file mode 100644 index f6ea905..0000000 --- a/.wave/contracts/github-enhancement-plan.schema.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "GitHub Issue Enhancement Plan", - "description": "Schema for GitHub issue enhancement recommendations", - "type": "object", - "required": ["issues_to_enhance"], - "properties": { - "issues_to_enhance": { - "type": "array", - "items": { - "type": "object", - "required": ["issue_number", "enhancements"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "current_title": { - "type": "string" - }, - "suggested_title": { - "type": "string" - }, - "current_body": { - "type": "string" - }, - "body_template": { - "type": ["string", "null"], - "description": "Enhanced body template preserving original content" - }, - "suggested_labels": { - "type": "array", - "items": { - "type": "string" - } - }, - "enhancements": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "description": "List of specific enhancements to apply" - }, - "rationale": { - "type": "string", - "description": "Why these enhancements are recommended" - }, - "priority": { - "type": "string", - "enum": ["high", "medium", "low"] - } - } - } - }, - "total_to_enhance": { - "type": "integer", - "minimum": 0 - }, - "enhancement_strategy": { - "type": "string", - "description": "Overall strategy for enhancements" - } - } -} diff --git a/.wave/contracts/github-enhancement-results.schema.json b/.wave/contracts/github-enhancement-results.schema.json deleted file mode 100644 index 1806af6..0000000 --- a/.wave/contracts/github-enhancement-results.schema.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "GitHub Issue Enhancement Results", - "description": "Schema for GitHub issue enhancement execution results", - "type": "object", - "required": ["enhanced_issues", "total_attempted", "total_successful"], - "properties": { - "enhanced_issues": { - "type": "array", - "items": { - "type": "object", - "required": ["issue_number", "success", "changes_made", "url"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "success": { - "type": "boolean" - }, - "changes_made": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of changes successfully applied" - }, - "title_updated": { - "type": "boolean" - }, - "body_updated": { - "type": "boolean" - }, - "labels_added": { - "type": "array", - "items": { - "type": "string" - } - }, - "comment_added": { - "type": "boolean" - }, - "error": { - "type": "string", - "description": "Error message if enhancement failed" - }, - "url": { - "type": "string", - "format": "uri" - } - } - } - }, - "total_attempted": { - "type": "integer", - "minimum": 0 - }, - "total_successful": { - "type": "integer", - "minimum": 0 - }, - "total_failed": { - "type": "integer", - "minimum": 0 - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/contracts/github-issue-analysis.schema.json b/.wave/contracts/github-issue-analysis.schema.json deleted file mode 100644 index d0cbcb3..0000000 --- a/.wave/contracts/github-issue-analysis.schema.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "GitHub Issue Analysis", - "description": "Schema for GitHub issue quality analysis results", - "type": "object", - "required": ["repository", "total_issues", "poor_quality_issues"], - "properties": { - "repository": { - "type": "object", - "required": ["owner", "name"], - "properties": { - "owner": { - "type": "string", - "minLength": 1 - }, - "name": { - "type": "string", - "minLength": 1 - } - } - }, - "total_issues": { - "type": "integer", - "minimum": 0 - }, - "analyzed_count": { - "type": "integer", - "minimum": 0 - }, - "poor_quality_issues": { - "type": "array", - "items": { - "type": "object", - "required": ["number", "title", "quality_score", "problems"], - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string" - }, - "body": { - "type": "string" - }, - "quality_score": { - "type": "integer", - "minimum": 0, - "maximum": 100 - }, - "problems": { - "type": "array", - "items": { - "type": "string" - } - }, - "recommendations": { - "type": "array", - "items": { - "type": "string" - } - }, - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, - "url": { - "type": "string", - "format": "uri" - } - } - } - }, - "quality_threshold": { - "type": "integer", - "minimum": 0, - "maximum": 100 - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/contracts/github-verification-report.schema.json b/.wave/contracts/github-verification-report.schema.json deleted file mode 100644 index 9a470ec..0000000 --- a/.wave/contracts/github-verification-report.schema.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "GitHub Enhancement Verification Report", - "description": "Schema for verifying GitHub issue enhancements were applied", - "type": "object", - "required": ["total_enhanced", "successful_enhancements", "failed_enhancements"], - "properties": { - "total_enhanced": { - "type": "integer", - "minimum": 0 - }, - "successful_enhancements": { - "type": "array", - "items": { - "type": "object", - "required": ["issue_number", "verified_changes"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "verified_changes": { - "type": "array", - "items": { - "type": "string" - } - }, - "quality_score_before": { - "type": "integer", - "minimum": 0, - "maximum": 100 - }, - "quality_score_after": { - "type": "integer", - "minimum": 0, - "maximum": 100 - }, - "url": { - "type": "string", - "format": "uri" - } - } - } - }, - "failed_enhancements": { - "type": "array", - "items": { - "type": "object", - "required": ["issue_number", "problems"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "problems": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - }, - "quality_improvement": { - "type": "object", - "properties": { - "average_score_before": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "average_score_after": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "improvement_percentage": { - "type": "number" - } - } - }, - "summary": { - "type": "string", - "description": "Human-readable summary of verification results" - } - } -} diff --git a/.wave/contracts/hello-world-result.schema.json b/.wave/contracts/hello-world-result.schema.json deleted file mode 100644 index 9678072..0000000 --- a/.wave/contracts/hello-world-result.schema.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Hello World Result", - "description": "Verification result from the hello-world verify step", - "type": "object", - "required": ["success", "message"], - "properties": { - "success": { - "type": "boolean", - "description": "Whether the hello-world pipeline completed successfully" - }, - "message": { - "type": "string", - "description": "Human-readable verification result" - }, - "checks": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - }, - "description": "Optional list of individual verification checks performed" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/implement-phase.schema.json b/.wave/contracts/implement-phase.schema.json deleted file mode 100644 index afbcba7..0000000 --- a/.wave/contracts/implement-phase.schema.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.recinq.com/wave/implement-phase.schema.json", - "title": "Wave Implement Phase Output Contract", - "description": "Validates implementation phase outputs for prototype-driven development pipeline", - "type": "object", - "properties": { - "phase": { - "type": "string", - "const": "implement", - "description": "Phase identifier" - }, - "artifacts": { - "type": "object", - "properties": { - "implementation_plan": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*implementation-plan\\.md$", - "description": "Path to implementation plan file" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Implementation plan file must exist" - }, - "content_type": { - "type": "string", - "const": "markdown", - "description": "Implementation plan content format" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - }, - "progress_checklist": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*implementation-checklist\\.md$", - "description": "Path to progress checklist file" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Progress checklist file must exist" - }, - "content_type": { - "type": "string", - "const": "markdown", - "description": "Checklist content format" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - } - }, - "required": ["implementation_plan", "progress_checklist"], - "additionalProperties": true - }, - "validation": { - "type": "object", - "properties": { - "tests_executed": { - "type": "boolean", - "description": "Whether test suite was executed" - }, - "test_results": { - "type": "object", - "properties": { - "total": { - "type": "integer", - "minimum": 0, - "description": "Total number of tests" - }, - "passed": { - "type": "integer", - "minimum": 0, - "description": "Number of tests that passed" - }, - "failed": { - "type": "integer", - "minimum": 0, - "description": "Number of tests that failed" - }, - "coverage_percent": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Test coverage percentage" - } - }, - "required": ["total", "passed", "failed"], - "additionalProperties": false - }, - "implementation_readiness": { - "type": "string", - "enum": ["ready", "partial", "needs_work"], - "description": "Assessment of implementation readiness" - } - }, - "required": ["tests_executed", "implementation_readiness"], - "additionalProperties": false - }, - "metadata": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When implementation phase was completed" - }, - "duration_seconds": { - "type": "number", - "minimum": 0, - "description": "Time taken for implementation phase" - }, - "previous_phases": { - "type": "array", - "items": { - "type": "string", - "enum": ["spec", "docs", "dummy"] - }, - "minItems": 3, - "maxItems": 3, - "description": "Previous phases that fed into this implementation" - } - }, - "required": ["timestamp", "previous_phases"], - "additionalProperties": false - } - }, - "required": ["phase", "artifacts", "validation", "metadata"], - "additionalProperties": false -} \ No newline at end of file diff --git a/.wave/contracts/improvement-assessment.schema.json b/.wave/contracts/improvement-assessment.schema.json deleted file mode 100644 index e29aab6..0000000 --- a/.wave/contracts/improvement-assessment.schema.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Improvement Assessment", - "description": "Structured assessment of code improvement opportunities", - "type": "object", - "required": ["target", "findings", "summary", "timestamp"], - "properties": { - "target": { "type": "string", "minLength": 1 }, - "findings": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "category", "title", "location", "description", "impact", "effort"], - "properties": { - "id": { "type": "string", "pattern": "^IMP-[0-9]{3}$" }, - "category": { - "type": "string", - "enum": ["error_handling", "performance", "testability", "robustness", "maintainability", "code_quality"] - }, - "title": { "type": "string", "minLength": 3 }, - "location": { "type": "string", "minLength": 1 }, - "description": { "type": "string", "minLength": 10 }, - "current_code": { "type": "string" }, - "suggested_fix": { "type": "string", "minLength": 5 }, - "impact": { "type": "string", "enum": ["high", "medium", "low"] }, - "effort": { "type": "string", "enum": ["trivial", "small", "medium", "large"] }, - "risk": { "type": "string", "enum": ["none", "low", "medium", "high"] } - } - } - }, - "summary": { - "type": "object", - "required": ["total_findings", "overall_quality"], - "properties": { - "total_findings": { "type": "integer", "minimum": 0 }, - "by_category": { "type": "object" }, - "quick_wins": { "type": "array", "items": { "type": "string" } }, - "high_impact": { "type": "array", "items": { "type": "string" } }, - "overall_quality": { "type": "string", "minLength": 10 } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/issue-assessment.schema.json b/.wave/contracts/issue-assessment.schema.json deleted file mode 100644 index 0517cb7..0000000 --- a/.wave/contracts/issue-assessment.schema.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "GitHub Issue Implementation Assessment", - "type": "object", - "required": ["implementable", "issue", "assessment"], - "properties": { - "implementable": { - "type": "boolean", - "const": true, - "description": "Must be true for the pipeline to proceed. Set to false if the issue lacks sufficient detail." - }, - "issue": { - "type": "object", - "required": ["number", "title", "body", "repository", "url"], - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "body": { - "type": "string" - }, - "repository": { - "type": "string", - "pattern": "^[^/]+/[^/]+$" - }, - "url": { - "type": "string", - "format": "uri" - }, - "labels": { - "type": "array", - "items": { "type": "string" } - }, - "state": { - "type": "string" - }, - "author": { - "type": "string" - }, - "comments": { - "type": "array", - "items": { "type": "object" } - } - } - }, - "assessment": { - "type": "object", - "required": ["quality_score", "complexity", "skip_steps", "branch_name"], - "properties": { - "quality_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "How well-specified the issue is (0-100)" - }, - "complexity": { - "type": "string", - "enum": ["trivial", "simple", "medium", "complex"], - "description": "Estimated implementation complexity" - }, - "skip_steps": { - "type": "array", - "items": { - "type": "string", - "enum": ["specify", "clarify", "checklist", "analyze"] - }, - "description": "Speckit steps that can be skipped because the issue provides sufficient detail" - }, - "branch_name": { - "type": "string", - "minLength": 1, - "description": "Suggested branch name for the implementation" - }, - "missing_info": { - "type": "array", - "items": { "type": "string" }, - "description": "Information that would improve the issue but isn't blocking" - }, - "summary": { - "type": "string", - "description": "Brief summary of the assessment" - } - } - } - } -} diff --git a/.wave/contracts/issue-content.schema.json b/.wave/contracts/issue-content.schema.json deleted file mode 100644 index 9637552..0000000 --- a/.wave/contracts/issue-content.schema.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "GitHub Issue Content", - "description": "Parsed content from a GitHub issue for research pipeline processing", - "type": "object", - "required": ["issue_number", "title", "body", "author", "url", "repository"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1, - "description": "GitHub issue number" - }, - "title": { - "type": "string", - "minLength": 1, - "maxLength": 256, - "description": "Issue title" - }, - "body": { - "type": "string", - "description": "Issue body/description text" - }, - "author": { - "type": "object", - "required": ["login"], - "properties": { - "login": { - "type": "string", - "minLength": 1, - "description": "GitHub username of issue author" - } - } - }, - "labels": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string", - "description": "Label name" - }, - "color": { - "type": "string", - "description": "Label color hex code" - }, - "description": { - "type": "string", - "description": "Label description" - } - } - }, - "description": "Labels applied to the issue" - }, - "url": { - "type": "string", - "format": "uri", - "description": "HTML URL to the GitHub issue" - }, - "repository": { - "type": "object", - "required": ["owner", "name", "full_name"], - "properties": { - "owner": { - "type": "string", - "description": "Repository owner" - }, - "name": { - "type": "string", - "description": "Repository name" - }, - "full_name": { - "type": "string", - "pattern": "^[^/]+/[^/]+$", - "description": "Full repository name (owner/repo)" - } - } - }, - "state": { - "type": "string", - "enum": ["open", "closed"], - "description": "Issue state" - }, - "created_at": { - "type": "string", - "format": "date-time", - "description": "Issue creation timestamp" - }, - "comments_count": { - "type": "integer", - "minimum": 0, - "description": "Number of comments on the issue" - } - } -} diff --git a/.wave/contracts/issue-impl-plan.schema.json b/.wave/contracts/issue-impl-plan.schema.json deleted file mode 100644 index 6d525e1..0000000 --- a/.wave/contracts/issue-impl-plan.schema.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Issue Implementation Plan", - "type": "object", - "required": ["issue_number", "branch_name", "feature_dir", "tasks"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "branch_name": { - "type": "string", - "minLength": 1 - }, - "feature_dir": { - "type": "string", - "description": "Path to the feature directory under specs/" - }, - "spec_file": { - "type": "string", - "description": "Path to the spec.md file" - }, - "plan_file": { - "type": "string", - "description": "Path to the plan.md file" - }, - "tasks_file": { - "type": "string", - "description": "Path to the tasks.md file" - }, - "tasks": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["id", "title", "description"], - "properties": { - "id": { - "type": "string", - "description": "Task identifier" - }, - "title": { - "type": "string", - "description": "Brief task title" - }, - "description": { - "type": "string", - "description": "Detailed task description" - }, - "file_changes": { - "type": "array", - "items": { - "type": "object", - "required": ["path", "action"], - "properties": { - "path": { "type": "string" }, - "action": { - "type": "string", - "enum": ["create", "modify", "delete"] - } - } - } - } - } - } - }, - "summary": { - "type": "string", - "description": "Brief summary of the implementation plan" - } - } -} diff --git a/.wave/contracts/issue-update-context.schema.json b/.wave/contracts/issue-update-context.schema.json deleted file mode 100644 index ad76624..0000000 --- a/.wave/contracts/issue-update-context.schema.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Issue Update Context", - "description": "Schema for gathered context about a GitHub issue and recent codebase changes", - "type": "object", - "required": ["repository", "issue", "changes_since_creation", "referenced_files"], - "properties": { - "repository": { - "type": "object", - "required": ["owner", "name"], - "properties": { - "owner": { - "type": "string", - "minLength": 1 - }, - "name": { - "type": "string", - "minLength": 1 - } - } - }, - "issue": { - "type": "object", - "required": ["number", "title", "body", "url", "created_at"], - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "body": { - "type": "string" - }, - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, - "url": { - "type": "string", - "format": "uri" - }, - "created_at": { - "type": "string" - }, - "comments": { - "type": "array", - "items": { - "type": "object", - "properties": { - "author": { - "type": "string" - }, - "body": { - "type": "string" - }, - "created_at": { - "type": "string" - } - } - } - } - } - }, - "changes_since_creation": { - "type": "object", - "required": ["commits", "commit_count"], - "properties": { - "commits": { - "type": "array", - "items": { - "type": "string" - } - }, - "commit_count": { - "type": "integer", - "minimum": 0 - }, - "releases": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "referenced_files": { - "type": "object", - "required": ["found", "missing"], - "properties": { - "found": { - "type": "array", - "items": { - "type": "string" - } - }, - "missing": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "criticism": { - "type": "string" - }, - "project_context": { - "type": "string" - } - } -} diff --git a/.wave/contracts/issue-update-draft.schema.json b/.wave/contracts/issue-update-draft.schema.json deleted file mode 100644 index 5610a4e..0000000 --- a/.wave/contracts/issue-update-draft.schema.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Issue Update Draft", - "description": "Schema for a drafted update to a GitHub issue", - "type": "object", - "required": ["issue_number", "original_title", "updated_title", "title_changed", "original_body", "updated_body", "staleness_assessment", "changes_made"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "original_title": { - "type": "string", - "minLength": 1 - }, - "updated_title": { - "type": "string", - "minLength": 1 - }, - "title_changed": { - "type": "boolean" - }, - "original_body": { - "type": "string" - }, - "updated_body": { - "type": "string", - "minLength": 1 - }, - "staleness_assessment": { - "type": "object", - "required": ["overall_staleness", "sections"], - "properties": { - "overall_staleness": { - "type": "string", - "enum": ["low", "medium", "high", "critical"] - }, - "sections": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "status", "reason"], - "properties": { - "name": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["STILL_VALID", "OUTDATED", "INCOMPLETE", "WRONG"] - }, - "reason": { - "type": "string" - } - } - } - } - } - }, - "changes_made": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "criticism_addressed": { - "type": "array", - "items": { - "type": "string" - } - } - } -} diff --git a/.wave/contracts/issue-update-result.schema.json b/.wave/contracts/issue-update-result.schema.json deleted file mode 100644 index 334cb80..0000000 --- a/.wave/contracts/issue-update-result.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Issue Update Result", - "description": "Schema for the result of applying an issue update", - "type": "object", - "required": ["issue_number", "success", "changes_applied", "verification"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "format": "uri" - }, - "success": { - "type": "boolean" - }, - "title_updated": { - "type": "boolean" - }, - "body_updated": { - "type": "boolean" - }, - "changes_applied": { - "type": "array", - "items": { - "type": "string" - } - }, - "verification": { - "type": "object", - "required": ["title_matches", "body_matches"], - "properties": { - "title_matches": { - "type": "boolean" - }, - "body_matches": { - "type": "boolean" - }, - "discrepancies": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "staleness_assessment": { - "type": "string", - "enum": ["low", "medium", "high", "critical"] - }, - "error": { - "type": ["string", "null"] - } - } -} diff --git a/.wave/contracts/plan-exploration.schema.json b/.wave/contracts/plan-exploration.schema.json deleted file mode 100644 index 6bfaa19..0000000 --- a/.wave/contracts/plan-exploration.schema.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Plan Exploration", - "description": "Structured codebase exploration output for feature planning", - "type": "object", - "required": ["feature_context", "related_files", "patterns", "affected_modules", "testing_landscape", "risks", "timestamp"], - "properties": { - "feature_context": { - "type": "object", - "required": ["input_summary", "scope_assessment"], - "properties": { - "input_summary": { - "type": "string", - "minLength": 10, - "description": "Brief summary of the feature or task being planned" - }, - "scope_assessment": { - "type": "string", - "enum": ["small", "medium", "large", "epic"], - "description": "Estimated scope of the work" - } - } - }, - "related_files": { - "type": "array", - "items": { - "type": "object", - "required": ["path", "relevance", "reason"], - "properties": { - "path": { - "type": "string", - "description": "File path relative to project root" - }, - "relevance": { - "type": "string", - "enum": ["primary", "secondary", "reference"], - "description": "How relevant this file is to the feature" - }, - "reason": { - "type": "string", - "description": "Why this file is relevant" - }, - "key_symbols": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Important functions, types, or constants in this file" - } - } - }, - "description": "Files related to the feature" - }, - "patterns": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "name", "description", "relevance"], - "properties": { - "id": { - "type": "string", - "pattern": "^PAT-[0-9]{3}$", - "description": "Pattern identifier" - }, - "name": { - "type": "string", - "description": "Short name for the pattern" - }, - "description": { - "type": "string", - "description": "What the pattern is and how it works" - }, - "example_file": { - "type": "string", - "description": "File that best demonstrates this pattern" - }, - "relevance": { - "type": "string", - "enum": ["must_follow", "should_follow", "informational"], - "description": "How important it is to follow this pattern" - } - } - }, - "description": "Codebase patterns and conventions discovered" - }, - "affected_modules": { - "type": "array", - "items": { - "type": "object", - "required": ["path", "description", "impact_level"], - "properties": { - "path": { - "type": "string", - "description": "Module or package path" - }, - "description": { - "type": "string", - "description": "What this module does" - }, - "impact_level": { - "type": "string", - "enum": ["direct", "indirect", "none"], - "description": "Level of impact from the planned changes" - }, - "dependencies": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Modules this one depends on" - }, - "dependents": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Modules that depend on this one" - } - } - }, - "description": "Modules affected by the planned changes" - }, - "testing_landscape": { - "type": "object", - "required": ["existing_test_files", "testing_patterns"], - "properties": { - "existing_test_files": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Test files relevant to the feature" - }, - "testing_patterns": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Testing patterns used in the codebase (e.g., table-driven, mocks)" - }, - "coverage_gaps": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Areas lacking test coverage" - } - } - }, - "risks": { - "type": "array", - "items": { - "type": "object", - "required": ["description", "severity"], - "properties": { - "description": { - "type": "string", - "description": "What the risk is" - }, - "severity": { - "type": "string", - "enum": ["high", "medium", "low"], - "description": "Risk severity" - }, - "mitigation": { - "type": "string", - "description": "How to mitigate this risk" - } - } - }, - "description": "Risks identified during exploration" - }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When the exploration was completed" - } - } -} diff --git a/.wave/contracts/plan-review.schema.json b/.wave/contracts/plan-review.schema.json deleted file mode 100644 index 684e05c..0000000 --- a/.wave/contracts/plan-review.schema.json +++ /dev/null @@ -1,235 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Plan Review", - "description": "Structured review of a task breakdown plan", - "type": "object", - "required": ["verdict", "summary", "task_reviews", "cross_cutting_concerns", "recommendations", "risk_assessment", "timestamp", "markdown_content"], - "properties": { - "verdict": { - "type": "object", - "required": ["decision", "confidence", "rationale"], - "properties": { - "decision": { - "type": "string", - "enum": ["approve", "approve_with_notes", "revise"], - "description": "Overall verdict on the plan" - }, - "confidence": { - "type": "string", - "enum": ["high", "medium", "low"], - "description": "Confidence in the verdict" - }, - "rationale": { - "type": "string", - "minLength": 20, - "description": "Explanation for the verdict" - } - } - }, - "summary": { - "type": "object", - "required": ["total_tasks_reviewed", "issues_found", "issues_by_severity", "strengths"], - "properties": { - "total_tasks_reviewed": { - "type": "integer", - "minimum": 1, - "description": "Number of tasks reviewed" - }, - "issues_found": { - "type": "integer", - "minimum": 0, - "description": "Total number of issues found" - }, - "issues_by_severity": { - "type": "object", - "properties": { - "critical": { - "type": "integer", - "minimum": 0 - }, - "high": { - "type": "integer", - "minimum": 0 - }, - "medium": { - "type": "integer", - "minimum": 0 - }, - "low": { - "type": "integer", - "minimum": 0 - } - }, - "description": "Issues broken down by severity" - }, - "strengths": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Things the plan does well" - } - } - }, - "task_reviews": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["task_id", "status"], - "properties": { - "task_id": { - "type": "string", - "pattern": "^T[0-9]{2}$", - "description": "ID of the reviewed task" - }, - "status": { - "type": "string", - "enum": ["ok", "needs_refinement", "missing_details", "overcomplicated", "wrong_persona", "bad_dependencies"], - "description": "Review status for this task" - }, - "issues": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "severity", "description", "suggestion"], - "properties": { - "id": { - "type": "string", - "pattern": "^REV-[0-9]{3}$", - "description": "Issue identifier" - }, - "severity": { - "type": "string", - "enum": ["critical", "high", "medium", "low"], - "description": "Issue severity" - }, - "description": { - "type": "string", - "description": "What the issue is" - }, - "suggestion": { - "type": "string", - "description": "How to fix it" - } - } - }, - "description": "Issues found in this task" - } - } - }, - "description": "Per-task review results" - }, - "cross_cutting_concerns": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "category", "description", "affected_tasks", "recommendation"], - "properties": { - "id": { - "type": "string", - "pattern": "^CC-[0-9]{3}$", - "description": "Concern identifier" - }, - "category": { - "type": "string", - "description": "Category of concern (e.g., testing, security, performance)" - }, - "description": { - "type": "string", - "description": "What the concern is" - }, - "affected_tasks": { - "type": "array", - "items": { - "type": "string", - "pattern": "^T[0-9]{2}$" - }, - "description": "Tasks affected by this concern" - }, - "recommendation": { - "type": "string", - "description": "Recommended action" - } - } - }, - "description": "Concerns that span multiple tasks" - }, - "recommendations": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "priority", "description", "type"], - "properties": { - "id": { - "type": "string", - "pattern": "^REC-[0-9]{3}$", - "description": "Recommendation identifier" - }, - "priority": { - "type": "string", - "enum": ["critical", "high", "medium", "low"], - "description": "Priority of the recommendation" - }, - "description": { - "type": "string", - "description": "What should be done" - }, - "type": { - "type": "string", - "enum": ["add_task", "modify_task", "remove_task", "reorder", "split_task", "merge_tasks", "change_persona", "add_dependency"], - "description": "Type of change recommended" - } - } - }, - "description": "Actionable recommendations for improving the plan" - }, - "risk_assessment": { - "type": "object", - "required": ["overall_risk", "key_risks"], - "properties": { - "overall_risk": { - "type": "string", - "enum": ["high", "medium", "low"], - "description": "Overall risk level of the plan" - }, - "key_risks": { - "type": "array", - "items": { - "type": "object", - "required": ["description", "severity", "likelihood"], - "properties": { - "description": { - "type": "string", - "description": "Risk description" - }, - "severity": { - "type": "string", - "enum": ["high", "medium", "low"] - }, - "likelihood": { - "type": "string", - "enum": ["high", "medium", "low"] - }, - "mitigation": { - "type": "string", - "description": "How to mitigate" - } - } - }, - "description": "Key risks identified in the plan" - } - } - }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When the review was completed" - }, - "markdown_content": { - "type": "string", - "minLength": 50, - "description": "Pre-rendered human-readable review in markdown format" - } - } -} diff --git a/.wave/contracts/plan-status.schema.json b/.wave/contracts/plan-status.schema.json deleted file mode 100644 index 1e86863..0000000 --- a/.wave/contracts/plan-status.schema.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Speckit Plan Status", - "description": "Status report from the plan step: research, design, and implementation plan generation.", - "type": "object", - "required": ["plan_file", "feature_dir", "summary"], - "properties": { - "plan_file": { - "type": "string", - "minLength": 1, - "description": "Path to the generated implementation plan file" - }, - "feature_dir": { - "type": "string", - "minLength": 1, - "description": "Path to the feature directory" - }, - "summary": { - "type": "string", - "minLength": 1, - "description": "Brief description of the plan produced" - }, - "research_file": { - "type": "string", - "description": "Path to research.md if generated" - }, - "data_model_file": { - "type": "string", - "description": "Path to data-model.md if generated" - }, - "constitution_issues": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Constitution compliance issues found during planning" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/plan-tasks.schema.json b/.wave/contracts/plan-tasks.schema.json deleted file mode 100644 index fd48ce9..0000000 --- a/.wave/contracts/plan-tasks.schema.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Plan Tasks", - "description": "Structured task breakdown for feature implementation", - "type": "object", - "required": ["feature_summary", "tasks", "execution_order", "metadata", "markdown_content"], - "properties": { - "feature_summary": { - "type": "object", - "required": ["title", "description", "total_tasks", "estimated_total_complexity"], - "properties": { - "title": { - "type": "string", - "minLength": 5, - "description": "Short title for the feature" - }, - "description": { - "type": "string", - "minLength": 20, - "description": "Brief description of what the feature does" - }, - "total_tasks": { - "type": "integer", - "minimum": 1, - "description": "Total number of tasks in the breakdown" - }, - "estimated_total_complexity": { - "type": "string", - "enum": ["S", "M", "L", "XL"], - "description": "Overall complexity estimate" - } - } - }, - "tasks": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["id", "title", "description", "persona", "complexity", "acceptance_criteria"], - "properties": { - "id": { - "type": "string", - "pattern": "^T[0-9]{2}$", - "description": "Task identifier (T01, T02, etc.)" - }, - "title": { - "type": "string", - "minLength": 5, - "description": "Short task title" - }, - "description": { - "type": "string", - "minLength": 20, - "description": "What needs to be done" - }, - "persona": { - "type": "string", - "enum": ["navigator", "philosopher", "craftsman", "auditor", "planner", "implementer", "reviewer"], - "description": "Which persona should execute this task" - }, - "complexity": { - "type": "string", - "enum": ["S", "M", "L", "XL"], - "description": "Task complexity estimate" - }, - "dependencies": { - "type": "array", - "items": { - "type": "string", - "pattern": "^T[0-9]{2}$" - }, - "description": "Task IDs that must complete before this one" - }, - "acceptance_criteria": { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - }, - "description": "How to verify the task is complete" - }, - "affected_files": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Files that will be created or modified" - }, - "risks": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Risks specific to this task" - } - } - }, - "description": "Ordered list of tasks" - }, - "execution_order": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["phase", "task_ids"], - "properties": { - "phase": { - "type": "integer", - "minimum": 1, - "description": "Execution phase number" - }, - "task_ids": { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "pattern": "^T[0-9]{2}$" - }, - "description": "Tasks that can run in parallel in this phase" - } - } - }, - "description": "Parallelization groups for task execution" - }, - "metadata": { - "type": "object", - "required": ["generated_at"], - "properties": { - "generated_at": { - "type": "string", - "format": "date-time", - "description": "When the plan was generated" - } - } - }, - "markdown_content": { - "type": "string", - "minLength": 50, - "description": "Pre-rendered human-readable plan in markdown format" - } - } -} diff --git a/.wave/contracts/pr-result.schema.json b/.wave/contracts/pr-result.schema.json deleted file mode 100644 index 641e88e..0000000 --- a/.wave/contracts/pr-result.schema.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Pull Request Result", - "description": "Result of creating a pull request. Used by pipeline steps that produce a PR as their final output.", - "type": "object", - "required": ["pr_url", "pr_number", "branch", "summary"], - "properties": { - "pr_url": { - "type": "string", - "format": "uri", - "description": "URL to the created pull request" - }, - "pr_number": { - "type": "integer", - "minimum": 1, - "description": "Pull request number" - }, - "branch": { - "type": "string", - "minLength": 1, - "description": "Branch name for the pull request" - }, - "summary": { - "type": "string", - "minLength": 1, - "description": "Brief description of what the pull request does" - }, - "copilot_review_requested": { - "type": "boolean", - "description": "Whether a Copilot review was requested for the PR" - }, - "closes_issue": { - "type": "boolean", - "description": "Whether the PR closes a linked issue" - }, - "issue_number": { - "type": "integer", - "minimum": 1, - "description": "Issue number that this PR addresses" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/probed-findings.schema.json b/.wave/contracts/probed-findings.schema.json deleted file mode 100644 index e7f9027..0000000 --- a/.wave/contracts/probed-findings.schema.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Probed Findings", - "description": "Deep-dive analysis from the recinq probe step", - "type": "object", - "required": ["target", "total_probed", "findings"], - "properties": { - "target": { - "type": "string", - "description": "What was analyzed (path, module, or 'whole-project')" - }, - "total_probed": { - "type": "integer", - "description": "Total number of confirmed findings that were probed deeper" - }, - "findings": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "deeper_analysis", "files"], - "properties": { - "id": { - "type": "string", - "description": "Original finding ID (e.g. DVG-001)" - }, - "deeper_analysis": { - "type": "string", - "description": "Extended analysis including dependency graph, second-order effects, and cross-finding patterns" - }, - "files": { - "type": "array", - "items": { "type": "string" }, - "description": "File paths involved in this finding and its connections" - } - }, - "additionalProperties": true - }, - "description": "Per-finding deep-dive results" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/project-survey.schema.json b/.wave/contracts/project-survey.schema.json deleted file mode 100644 index 25e36e6..0000000 --- a/.wave/contracts/project-survey.schema.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Project Survey", - "description": "Structured survey of a project for onboarding guide generation", - "type": "object", - "required": ["project", "build", "structure", "timestamp"], - "properties": { - "project": { - "type": "object", - "required": ["name", "language", "purpose"], - "properties": { - "name": { "type": "string", "minLength": 1 }, - "language": { "type": "string", "minLength": 1 }, - "framework": { "type": "string" }, - "purpose": { "type": "string", "minLength": 5 }, - "license": { "type": "string" } - } - }, - "build": { - "type": "object", - "required": ["commands"], - "properties": { - "commands": { - "type": "object", - "properties": { - "build": { "type": "string" }, - "test": { "type": "string" }, - "run": { "type": "string" } - } - }, - "prerequisites": { "type": "array", "items": { "type": "string" } }, - "ci_system": { "type": "string" } - } - }, - "structure": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["path", "purpose"], - "properties": { - "path": { "type": "string", "minLength": 1 }, - "purpose": { "type": "string", "minLength": 1 }, - "key_files": { "type": "array", "items": { "type": "string" } } - } - } - }, - "architecture": { - "type": "object", - "properties": { - "entry_points": { "type": "array", "items": { "type": "string" } }, - "components": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "role"], - "properties": { - "name": { "type": "string" }, - "package": { "type": "string" }, - "role": { "type": "string" } - } - } - }, - "patterns": { "type": "array", "items": { "type": "string" } } - } - }, - "dependencies": { - "type": "object", - "properties": { - "key_deps": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "purpose"], - "properties": { - "name": { "type": "string" }, - "purpose": { "type": "string" }, - "import": { "type": "string" } - } - } - }, - "total_count": { "type": "integer", "minimum": 0 } - } - }, - "configuration": { - "type": "object", - "properties": { - "env_vars": { "type": "array", "items": { "type": "string" } }, - "config_files": { "type": "array", "items": { "type": "string" } }, - "feature_flags": { "type": "array", "items": { "type": "string" } } - } - }, - "testing": { - "type": "object", - "properties": { - "framework": { "type": "string" }, - "patterns": { "type": "array", "items": { "type": "string" } }, - "run_command": { "type": "string" }, - "coverage_command": { "type": "string" } - } - }, - "workflow": { - "type": "object", - "properties": { - "branch_strategy": { "type": "string" }, - "commit_convention": { "type": "string" }, - "pr_process": { "type": "string" } - } - }, - "documentation": { - "type": "object", - "properties": { - "locations": { "type": "array", "items": { "type": "string" } }, - "quality": { "type": "string", "enum": ["good", "adequate", "sparse", "missing"] } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/publish-result.schema.json b/.wave/contracts/publish-result.schema.json deleted file mode 100644 index cc4b8cf..0000000 --- a/.wave/contracts/publish-result.schema.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Code Review Publish Result", - "description": "Result of publishing a code review comment on a pull request", - "type": "object", - "required": ["comment_url", "pr_number"], - "properties": { - "comment_url": { - "type": "string", - "format": "uri", - "description": "URL to the posted review comment" - }, - "pr_number": { - "type": "integer", - "minimum": 1, - "description": "PR number that was reviewed" - }, - "repository": { - "type": "string", - "pattern": "^[^/]+/[^/]+$", - "description": "Repository full name (owner/repo)" - }, - "summary": { - "type": "string", - "description": "Brief summary of the review" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/recinq-context.schema.json b/.wave/contracts/recinq-context.schema.json deleted file mode 100644 index 44ec3ca..0000000 --- a/.wave/contracts/recinq-context.schema.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Recinq Context", - "description": "Parsed input context from the recinq gather step", - "type": "object", - "required": ["input_type", "original_input", "focus_hint"], - "properties": { - "input_type": { - "type": "string", - "enum": ["issue", "pr", "local"], - "description": "The kind of input: GitHub issue, GitHub PR, or local path/description" - }, - "original_input": { - "type": "string", - "description": "The raw input string exactly as given by the user" - }, - "focus_hint": { - "type": "string", - "description": "Summary of what should be simplified or focused on" - }, - "url": { - "type": "string", - "description": "GitHub issue or PR URL (empty for local input)" - }, - "repo": { - "type": "string", - "description": "GitHub owner/repo (empty for local input)" - }, - "number": { - "type": "integer", - "description": "GitHub issue or PR number (0 for local input)" - }, - "title": { - "type": "string", - "description": "GitHub issue or PR title (empty for local input)" - }, - "body": { - "type": "string", - "description": "GitHub issue or PR body (empty for local input)" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/refactor-analysis.schema.json b/.wave/contracts/refactor-analysis.schema.json deleted file mode 100644 index 9027347..0000000 --- a/.wave/contracts/refactor-analysis.schema.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "required": ["target_files", "affected_callers", "existing_tests", "integration_points", "risk_assessment"], - "properties": { - "target_files": { - "type": "array", - "items": { "type": "string" } - }, - "affected_callers": { - "type": "array", - "items": { "type": "string" } - }, - "existing_tests": { - "type": "array", - "items": { "type": "string" } - }, - "integration_points": { - "type": "array", - "items": { "type": "string" } - }, - "risk_assessment": { - "type": "string", - "enum": ["low", "medium", "high"] - } - } -} diff --git a/.wave/contracts/research-findings.schema.json b/.wave/contracts/research-findings.schema.json deleted file mode 100644 index 6e68b00..0000000 --- a/.wave/contracts/research-findings.schema.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Research Findings", - "description": "Web research results organized by topic with sources and insights", - "type": "object", - "required": ["issue_reference", "findings_by_topic", "research_metadata"], - "properties": { - "issue_reference": { - "type": "object", - "required": ["issue_number", "repository"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "repository": { - "type": "string", - "pattern": "^[^/]+/[^/]+$" - } - } - }, - "findings_by_topic": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["topic_id", "topic_title", "findings", "confidence_level"], - "properties": { - "topic_id": { - "type": "string", - "pattern": "^TOPIC-[0-9]{3}$", - "description": "Reference to topic ID from research-topics" - }, - "topic_title": { - "type": "string", - "description": "Topic title for readability" - }, - "findings": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "summary", "source", "relevance_score"], - "properties": { - "id": { - "type": "string", - "pattern": "^FINDING-[0-9]{3}$", - "description": "Unique finding identifier" - }, - "summary": { - "type": "string", - "minLength": 20, - "maxLength": 2000, - "description": "Summarized finding content" - }, - "key_points": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Bullet points of key insights" - }, - "source": { - "type": "object", - "required": ["url", "title", "type"], - "properties": { - "url": { - "type": "string", - "format": "uri", - "description": "Source URL" - }, - "title": { - "type": "string", - "description": "Source page/article title" - }, - "type": { - "type": "string", - "enum": ["official_docs", "github_issue", "github_discussion", "stack_overflow", "blog_post", "tutorial", "api_reference", "academic_paper", "forum_post", "other"], - "description": "Type of source" - }, - "author": { - "type": "string", - "description": "Author or organization name" - }, - "credibility_score": { - "type": "number", - "minimum": 0, - "maximum": 1, - "description": "Source credibility assessment (0-1)" - } - } - }, - "relevance_score": { - "type": "number", - "minimum": 0, - "maximum": 1, - "description": "Relevance to the topic (0-1)" - }, - "quotes": { - "type": "array", - "items": { - "type": "object", - "required": ["text"], - "properties": { - "text": { - "type": "string", - "description": "Direct quote from source" - }, - "context": { - "type": "string", - "description": "Context for the quote" - } - } - }, - "description": "Notable quotes from the source" - } - } - }, - "description": "Individual research findings for this topic" - }, - "confidence_level": { - "type": "string", - "enum": ["high", "medium", "low", "inconclusive"], - "description": "Overall confidence in findings for this topic" - }, - "consensus": { - "type": "string", - "description": "Summary of consensus across sources" - }, - "gaps": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Questions that couldn't be fully answered" - } - } - }, - "description": "Research findings organized by topic" - }, - "research_metadata": { - "type": "object", - "required": ["started_at", "completed_at"], - "properties": { - "started_at": { - "type": "string", - "format": "date-time", - "description": "Research start timestamp" - }, - "completed_at": { - "type": "string", - "format": "date-time", - "description": "Research completion timestamp" - }, - "persona": { - "type": "string", - "description": "Wave persona that conducted research" - }, - "total_sources_consulted": { - "type": "integer", - "minimum": 0, - "description": "Total number of sources examined" - }, - "sources_included": { - "type": "integer", - "minimum": 0, - "description": "Number of sources included in findings" - }, - "search_queries_used": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Search queries that were used" - } - } - } - } -} diff --git a/.wave/contracts/research-report.schema.json b/.wave/contracts/research-report.schema.json deleted file mode 100644 index 601dd1f..0000000 --- a/.wave/contracts/research-report.schema.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Research Report", - "description": "Synthesized research report for GitHub issue comment", - "type": "object", - "required": ["issue_reference", "executive_summary", "detailed_findings", "recommendations", "sources", "markdown_content"], - "properties": { - "issue_reference": { - "type": "object", - "required": ["issue_number", "repository", "title"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1 - }, - "repository": { - "type": "string", - "pattern": "^[^/]+/[^/]+$" - }, - "title": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - } - } - }, - "executive_summary": { - "type": "object", - "required": ["overview", "key_findings", "primary_recommendation"], - "properties": { - "overview": { - "type": "string", - "minLength": 50, - "maxLength": 1000, - "description": "Brief overview of research conducted and main conclusions" - }, - "key_findings": { - "type": "array", - "minItems": 1, - "maxItems": 7, - "items": { - "type": "string" - }, - "description": "Top findings as bullet points" - }, - "primary_recommendation": { - "type": "string", - "minLength": 20, - "description": "Single most important recommendation" - }, - "confidence_assessment": { - "type": "string", - "enum": ["high", "medium", "low"], - "description": "Overall confidence in the research conclusions" - } - } - }, - "detailed_findings": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["section_title", "content", "relevance"], - "properties": { - "section_title": { - "type": "string", - "minLength": 3, - "description": "Section heading" - }, - "topic_id": { - "type": "string", - "pattern": "^TOPIC-[0-9]{3}$", - "description": "Reference to original topic if applicable" - }, - "content": { - "type": "string", - "minLength": 50, - "description": "Detailed markdown content for this section" - }, - "relevance": { - "type": "string", - "enum": ["critical", "high", "medium", "supplementary"], - "description": "How relevant this section is to the issue" - }, - "code_examples": { - "type": "array", - "items": { - "type": "object", - "required": ["code", "language"], - "properties": { - "code": { - "type": "string", - "description": "Code snippet" - }, - "language": { - "type": "string", - "description": "Language for syntax highlighting" - }, - "caption": { - "type": "string", - "description": "Explanation of the code" - } - } - }, - "description": "Code examples for this section" - }, - "related_sources": { - "type": "array", - "items": { - "type": "string", - "pattern": "^SRC-[0-9]{3}$" - }, - "description": "References to sources list" - } - } - }, - "description": "Detailed findings organized by section" - }, - "recommendations": { - "type": "array", - "minItems": 1, - "maxItems": 10, - "items": { - "type": "object", - "required": ["id", "title", "description", "priority"], - "properties": { - "id": { - "type": "string", - "pattern": "^REC-[0-9]{3}$", - "description": "Recommendation identifier" - }, - "title": { - "type": "string", - "minLength": 5, - "maxLength": 100, - "description": "Concise recommendation title" - }, - "description": { - "type": "string", - "minLength": 20, - "description": "Detailed recommendation explanation" - }, - "priority": { - "type": "string", - "enum": ["critical", "high", "medium", "low"], - "description": "Recommendation priority" - }, - "effort_estimate": { - "type": "string", - "enum": ["trivial", "small", "medium", "large", "unknown"], - "description": "Estimated implementation effort" - } - } - }, - "description": "Actionable recommendations based on research" - }, - "sources": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["id", "url", "title"], - "properties": { - "id": { - "type": "string", - "pattern": "^SRC-[0-9]{3}$", - "description": "Source identifier for cross-referencing" - }, - "url": { - "type": "string", - "format": "uri", - "description": "Source URL" - }, - "title": { - "type": "string", - "description": "Source title" - }, - "type": { - "type": "string", - "enum": ["official_docs", "github_issue", "github_discussion", "stack_overflow", "blog_post", "tutorial", "api_reference", "academic_paper", "forum_post", "other"] - }, - "reliability": { - "type": "string", - "enum": ["authoritative", "reputable", "community", "unverified"], - "description": "Source reliability assessment" - } - } - }, - "description": "All sources cited in the report" - }, - "markdown_content": { - "type": "string", - "minLength": 100, - "description": "Pre-rendered markdown content ready for GitHub comment" - }, - "follow_up_questions": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Questions that warrant further investigation" - } - } -} diff --git a/.wave/contracts/research-topics.schema.json b/.wave/contracts/research-topics.schema.json deleted file mode 100644 index 905c652..0000000 --- a/.wave/contracts/research-topics.schema.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Research Topics", - "description": "Extracted research topics from GitHub issue analysis", - "type": "object", - "required": ["issue_reference", "topics"], - "properties": { - "issue_reference": { - "type": "object", - "required": ["issue_number", "repository"], - "properties": { - "issue_number": { - "type": "integer", - "minimum": 1, - "description": "Reference to source issue number" - }, - "repository": { - "type": "string", - "pattern": "^[^/]+/[^/]+$", - "description": "Repository full name (owner/repo)" - }, - "title": { - "type": "string", - "description": "Issue title for context" - } - } - }, - "topics": { - "type": "array", - "minItems": 1, - "maxItems": 10, - "items": { - "type": "object", - "required": ["id", "title", "questions", "keywords", "priority"], - "properties": { - "id": { - "type": "string", - "pattern": "^TOPIC-[0-9]{3}$", - "description": "Unique topic identifier (e.g., TOPIC-001)" - }, - "title": { - "type": "string", - "minLength": 5, - "maxLength": 200, - "description": "Concise topic title" - }, - "description": { - "type": "string", - "description": "Detailed description of what needs to be researched" - }, - "questions": { - "type": "array", - "minItems": 1, - "maxItems": 5, - "items": { - "type": "string", - "minLength": 10 - }, - "description": "Specific questions to answer through research" - }, - "keywords": { - "type": "array", - "minItems": 1, - "maxItems": 10, - "items": { - "type": "string", - "minLength": 2 - }, - "description": "Search keywords for web research" - }, - "priority": { - "type": "string", - "enum": ["critical", "high", "medium", "low"], - "description": "Research priority level" - }, - "category": { - "type": "string", - "enum": ["technical", "documentation", "best_practices", "security", "performance", "compatibility", "other"], - "description": "Topic category for organization" - } - } - }, - "description": "List of research topics extracted from the issue" - }, - "extraction_metadata": { - "type": "object", - "properties": { - "extracted_at": { - "type": "string", - "format": "date-time", - "description": "Timestamp when topics were extracted" - }, - "persona": { - "type": "string", - "description": "Wave persona that performed the extraction" - }, - "confidence": { - "type": "number", - "minimum": 0, - "maximum": 1, - "description": "Confidence score for topic relevance (0-1)" - } - } - } - } -} diff --git a/.wave/contracts/security-scan.schema.json b/.wave/contracts/security-scan.schema.json deleted file mode 100644 index d6aa647..0000000 --- a/.wave/contracts/security-scan.schema.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Security Scan Results", - "description": "Output from the security scan step", - "type": "object", - "required": ["target", "findings", "summary", "timestamp"], - "properties": { - "target": { - "type": "string", - "minLength": 1, - "description": "What was scanned" - }, - "attack_surface": { - "type": "array", - "items": { - "type": "object", - "required": ["entry_point", "type", "description"], - "properties": { - "entry_point": { "type": "string", "minLength": 1 }, - "type": { - "type": "string", - "enum": ["http_handler", "cli_input", "file_parser", "db_query", "api_call", "ipc", "other"] - }, - "description": { "type": "string", "minLength": 1 }, - "risk_level": { "type": "string", "enum": ["high", "medium", "low"] } - } - } - }, - "findings": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "title", "severity", "category", "location", "description"], - "properties": { - "id": { "type": "string", "pattern": "^SEC-[0-9]{3}$" }, - "title": { "type": "string", "minLength": 5 }, - "severity": { "type": "string", "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"] }, - "category": { "type": "string", "minLength": 1 }, - "location": { "type": "string", "minLength": 1 }, - "description": { "type": "string", "minLength": 10 }, - "evidence": { "type": "string" }, - "exploitability": { "type": "string" } - } - } - }, - "secrets_check": { - "type": "object", - "properties": { - "hardcoded_secrets": { "type": "array", "items": { "type": "string" } }, - "insecure_configs": { "type": "array", "items": { "type": "string" } } - } - }, - "summary": { - "type": "object", - "required": ["total_findings", "by_severity", "risk_assessment"], - "properties": { - "total_findings": { "type": "integer", "minimum": 0 }, - "by_severity": { - "type": "object", - "required": ["CRITICAL", "HIGH", "MEDIUM", "LOW"], - "properties": { - "CRITICAL": { "type": "integer", "minimum": 0 }, - "HIGH": { "type": "integer", "minimum": 0 }, - "MEDIUM": { "type": "integer", "minimum": 0 }, - "LOW": { "type": "integer", "minimum": 0 } - } - }, - "risk_assessment": { "type": "string", "minLength": 10 } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/smoke-test.schema.json b/.wave/contracts/smoke-test.schema.json deleted file mode 100644 index d766e8b..0000000 --- a/.wave/contracts/smoke-test.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Smoke Test Analysis", - "type": "object", - "required": [ - "summary", - "files_examined", - "recommendation" - ], - "properties": { - "summary": { - "type": "string", - "minLength": 10, - "description": "Brief summary of the analysis" - }, - "files_examined": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "description": "List of files that were examined" - }, - "recommendation": { - "type": "string", - "minLength": 10, - "description": "Recommendation based on analysis" - } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/.wave/contracts/source-extract.schema.json b/.wave/contracts/source-extract.schema.json deleted file mode 100644 index 30a7420..0000000 --- a/.wave/contracts/source-extract.schema.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Source Extract", - "description": "Extracted content from a single web source for ingestion", - "type": "object", - "required": ["url", "title", "summary", "key_concepts"], - "properties": { - "url": { - "type": "string", - "format": "uri", - "description": "Original URL that was fetched" - }, - "title": { - "type": "string", - "description": "Article or page title" - }, - "author": { - "type": "string", - "description": "Author name" - }, - "date": { - "type": "string", - "description": "Publication date" - }, - "summary": { - "type": "string", - "minLength": 50, - "maxLength": 3000, - "description": "Summary of the source content" - }, - "key_concepts": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["concept", "description"], - "properties": { - "concept": { - "type": "string", - "description": "Name of the key concept" - }, - "description": { - "type": "string", - "description": "Explanation of the concept as presented in the source" - } - } - }, - "description": "Key concepts extracted from the source" - }, - "notable_quotes": { - "type": "array", - "items": { - "type": "object", - "required": ["text"], - "properties": { - "text": { - "type": "string", - "description": "Direct quote" - }, - "context": { - "type": "string", - "description": "Context for the quote" - } - } - }, - "description": "Notable direct quotes from the source" - }, - "author_year_key": { - "type": "string", - "pattern": "^[A-Z][a-zA-Z]+[0-9]{4}[a-z]?$", - "description": "Suggested AuthorYear key for bibliographic note (e.g., Willison2026)" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/contracts/spec-phase.schema.json b/.wave/contracts/spec-phase.schema.json deleted file mode 100644 index 2cf37d5..0000000 --- a/.wave/contracts/spec-phase.schema.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.recinq.com/wave/spec-phase.schema.json", - "title": "Wave Spec Phase Output Contract", - "description": "Validates spec phase outputs for prototype-driven development pipeline", - "type": "object", - "properties": { - "phase": { - "type": "string", - "const": "spec", - "description": "Phase identifier" - }, - "artifacts": { - "type": "object", - "properties": { - "spec": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*spec\\.md$", - "description": "Path to specification file" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Specification file must exist" - }, - "content_type": { - "type": "string", - "const": "markdown", - "description": "Specification content format" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - }, - "requirements": { - "type": "object", - "properties": { - "path": { - "type": "string", - "pattern": "^.*requirements\\.md$", - "description": "Path to requirements file" - }, - "exists": { - "type": "boolean", - "const": true, - "description": "Requirements file must exist" - }, - "content_type": { - "type": "string", - "const": "markdown", - "description": "Requirements content format" - } - }, - "required": ["path", "exists", "content_type"], - "additionalProperties": false - } - }, - "required": ["spec"], - "additionalProperties": true - }, - "validation": { - "type": "object", - "properties": { - "completeness_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "Specification completeness rating" - }, - "clarity_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "Specification clarity rating" - }, - "testability_score": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "description": "Specification testability rating" - }, - "specification_quality": { - "type": "string", - "enum": ["poor", "fair", "good", "excellent"], - "description": "Overall specification quality assessment" - } - }, - "required": ["specification_quality"], - "additionalProperties": false - }, - "metadata": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time", - "description": "When spec phase was completed" - }, - "duration_seconds": { - "type": "number", - "minimum": 0, - "description": "Time taken for spec phase" - }, - "input_description": { - "type": "string", - "minLength": 1, - "description": "Original project description input" - } - }, - "required": ["timestamp", "input_description"], - "additionalProperties": false - } - }, - "required": ["phase", "artifacts", "validation", "metadata"], - "additionalProperties": false -} diff --git a/.wave/contracts/specify-status.schema.json b/.wave/contracts/specify-status.schema.json deleted file mode 100644 index c9cd7f2..0000000 --- a/.wave/contracts/specify-status.schema.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Speckit Specify Status", - "description": "Status report from the specify step: feature branch creation and spec authoring.", - "type": "object", - "required": ["branch_name", "spec_file", "feature_dir", "summary"], - "properties": { - "branch_name": { - "type": "string", - "minLength": 1, - "description": "Git branch name created for the feature" - }, - "spec_file": { - "type": "string", - "minLength": 1, - "description": "Path to the generated spec.md file" - }, - "feature_dir": { - "type": "string", - "minLength": 1, - "description": "Path to the feature directory" - }, - "summary": { - "type": "string", - "minLength": 1, - "description": "Brief description of what was created" - }, - "checklist_status": { - "type": "string", - "enum": ["pass", "fail"], - "description": "Result of self-validation against the quality checklist" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/supervision-evaluation.schema.json b/.wave/contracts/supervision-evaluation.schema.json deleted file mode 100644 index e32dc40..0000000 --- a/.wave/contracts/supervision-evaluation.schema.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Supervision Evaluation", - "description": "Quality evaluation of both output and process", - "type": "object", - "required": ["output_quality", "process_quality", "overall_score", "timestamp"], - "properties": { - "output_quality": { - "type": "object", - "required": ["correctness", "completeness", "test_coverage", "code_quality"], - "properties": { - "correctness": { - "type": "object", - "required": ["score", "findings"], - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - }, - "completeness": { - "type": "object", - "required": ["score", "findings"], - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - }, - "test_coverage": { - "type": "object", - "required": ["score", "findings"], - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - }, - "code_quality": { - "type": "object", - "required": ["score", "findings"], - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - } - } - }, - "process_quality": { - "type": "object", - "required": ["efficiency", "scope_discipline", "tool_usage"], - "properties": { - "efficiency": { - "type": "object", - "required": ["score", "findings"], - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - }, - "scope_discipline": { - "type": "object", - "required": ["score", "findings"], - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - }, - "tool_usage": { - "type": "object", - "required": ["score", "findings"], - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - }, - "token_economy": { - "type": "object", - "properties": { - "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, - "findings": { "type": "array", "items": { "type": "string" } } - } - } - } - }, - "overall_score": { - "type": "string", - "enum": ["excellent", "good", "adequate", "poor"] - }, - "key_strengths": { - "type": "array", - "items": { "type": "string" } - }, - "key_concerns": { - "type": "array", - "items": { "type": "string" } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/supervision-evidence.schema.json b/.wave/contracts/supervision-evidence.schema.json deleted file mode 100644 index cd193c4..0000000 --- a/.wave/contracts/supervision-evidence.schema.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Supervision Evidence", - "description": "Evidence gathered for supervising completed work", - "type": "object", - "required": ["scope", "commits", "artifacts", "test_results", "timestamp"], - "properties": { - "scope": { - "type": "object", - "description": "What was inspected and how it was identified", - "required": ["description", "detection_method"], - "properties": { - "description": { "type": "string", "minLength": 5 }, - "detection_method": { - "type": "string", - "enum": ["auto_detect", "pipeline_run", "branch", "pr", "freeform"] - }, - "pipeline_name": { "type": "string" }, - "branch_name": { "type": "string" }, - "pr_number": { "type": "integer" } - } - }, - "commits": { - "type": "array", - "items": { - "type": "object", - "required": ["hash", "message", "files_changed"], - "properties": { - "hash": { "type": "string" }, - "message": { "type": "string" }, - "author": { "type": "string" }, - "files_changed": { "type": "integer" }, - "insertions": { "type": "integer" }, - "deletions": { "type": "integer" }, - "has_session_transcript": { "type": "boolean" }, - "transcript_summary": { "type": "string" } - } - } - }, - "artifacts": { - "type": "array", - "description": "Pipeline workspace artifacts found", - "items": { - "type": "object", - "required": ["path", "type"], - "properties": { - "path": { "type": "string" }, - "type": { "type": "string" }, - "size_bytes": { "type": "integer" }, - "summary": { "type": "string" } - } - } - }, - "test_results": { - "type": "object", - "required": ["ran", "passed"], - "properties": { - "ran": { "type": "boolean" }, - "passed": { "type": "boolean" }, - "total_tests": { "type": "integer" }, - "failed_tests": { "type": "integer" }, - "coverage_percent": { "type": "number" }, - "details": { "type": "string" } - } - }, - "session_transcripts": { - "type": "array", - "description": "Claudit session transcripts from git notes", - "items": { - "type": "object", - "required": ["commit_hash", "summary"], - "properties": { - "commit_hash": { "type": "string" }, - "summary": { "type": "string" }, - "tool_calls_count": { "type": "integer" }, - "notable_detours": { "type": "array", "items": { "type": "string" } }, - "errors_encountered": { "type": "array", "items": { "type": "string" } } - } - } - }, - "timestamp": { "type": "string", "format": "date-time" } - } -} diff --git a/.wave/contracts/tasks-status.schema.json b/.wave/contracts/tasks-status.schema.json deleted file mode 100644 index 05f32be..0000000 --- a/.wave/contracts/tasks-status.schema.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Speckit Tasks Status", - "description": "Status report from the tasks step: dependency-ordered task breakdown generation.", - "type": "object", - "required": ["total_tasks", "feature_dir", "summary"], - "properties": { - "total_tasks": { - "type": "integer", - "minimum": 1, - "description": "Total number of tasks generated" - }, - "feature_dir": { - "type": "string", - "minLength": 1, - "description": "Path to the feature directory" - }, - "summary": { - "type": "string", - "minLength": 1, - "description": "Brief description of the task breakdown" - }, - "tasks_per_story": { - "type": "object", - "description": "Mapping of user story identifiers to task counts" - }, - "parallel_opportunities": { - "type": "integer", - "description": "Number of tasks that can be executed in parallel" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/validated-findings.schema.json b/.wave/contracts/validated-findings.schema.json deleted file mode 100644 index ef67a45..0000000 --- a/.wave/contracts/validated-findings.schema.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Validated Findings", - "description": "Convergent validation results from the recinq converge step", - "type": "object", - "required": ["target", "total_findings", "confirmed", "rejected", "findings"], - "properties": { - "target": { - "type": "string", - "description": "What was analyzed (path, module, or 'whole-project')" - }, - "total_findings": { - "type": "integer", - "description": "Total number of divergent findings reviewed" - }, - "confirmed": { - "type": "integer", - "description": "Number of findings classified as CONFIRMED or PARTIALLY_CONFIRMED" - }, - "rejected": { - "type": "integer", - "description": "Number of findings classified as REJECTED" - }, - "findings": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "status", "rationale"], - "properties": { - "id": { - "type": "string", - "description": "Original finding ID (e.g. DVG-001)" - }, - "status": { - "type": "string", - "enum": ["CONFIRMED", "PARTIALLY_CONFIRMED", "REJECTED"], - "description": "Validation classification" - }, - "rationale": { - "type": "string", - "description": "Explanation of why the finding was classified this way" - } - }, - "additionalProperties": true - }, - "description": "Per-finding validation results" - } - }, - "additionalProperties": true -} diff --git a/.wave/contracts/web-findings.schema.json b/.wave/contracts/web-findings.schema.json deleted file mode 100644 index 27f5f58..0000000 --- a/.wave/contracts/web-findings.schema.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Web Findings", - "description": "Structured web research results for a given topic", - "type": "object", - "required": ["topic", "sources", "search_queries"], - "properties": { - "topic": { - "type": "string", - "description": "The topic that was researched" - }, - "sources": { - "type": "array", - "minItems": 1, - "items": { - "type": "object", - "required": ["url", "title", "key_ideas", "relevance_to_topic"], - "properties": { - "url": { - "type": "string", - "format": "uri", - "description": "Source URL" - }, - "title": { - "type": "string", - "description": "Article or page title" - }, - "author": { - "type": "string", - "description": "Author name if available" - }, - "date": { - "type": "string", - "description": "Publication date if available" - }, - "key_ideas": { - "type": "array", - "minItems": 1, - "items": { "type": "string" }, - "description": "Key ideas extracted from the source" - }, - "quotes": { - "type": "array", - "items": { - "type": "object", - "required": ["text"], - "properties": { - "text": { - "type": "string", - "description": "Direct quote from source" - }, - "context": { - "type": "string", - "description": "Context for the quote" - } - } - }, - "description": "Notable direct quotes" - }, - "relevance_to_topic": { - "type": "number", - "minimum": 0, - "maximum": 1, - "description": "Relevance score (0-1)" - }, - "source_type": { - "type": "string", - "enum": ["blog_post", "academic_paper", "documentation", "news_article", "conference_talk", "book_excerpt", "other"], - "description": "Type of source" - } - } - }, - "description": "Web sources found and analyzed" - }, - "search_queries": { - "type": "array", - "items": { "type": "string" }, - "description": "Search queries that were executed" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/contracts/zettel-references.schema.json b/.wave/contracts/zettel-references.schema.json deleted file mode 100644 index e7e4acb..0000000 --- a/.wave/contracts/zettel-references.schema.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Zettel References", - "description": "Notes found in the Zettelkasten relevant to a given topic", - "type": "object", - "required": ["query_keywords", "references", "index_entry_points"], - "properties": { - "query_keywords": { - "type": "array", - "items": { "type": "string" }, - "description": "Keywords used for searching" - }, - "references": { - "type": "array", - "items": { - "type": "object", - "required": ["filename", "title", "folgezettel_address", "relevance", "key_quotes"], - "properties": { - "filename": { - "type": "string", - "pattern": "^[0-9a-f]{8}\\.md$", - "description": "Hex-ID filename of the note" - }, - "title": { - "type": "string", - "description": "Full title including Folgezettel address" - }, - "folgezettel_address": { - "type": "string", - "description": "Folgezettel address (e.g., 3.1c2)" - }, - "relevance": { - "type": "string", - "enum": ["high", "medium", "low"], - "description": "Relevance to the search topic" - }, - "key_quotes": { - "type": "array", - "items": { "type": "string" }, - "description": "Notable passages from the note" - }, - "section": { - "type": "string", - "description": "Top-level section the note belongs to" - } - } - }, - "description": "Relevant notes found in the Zettelkasten" - }, - "index_entry_points": { - "type": "array", - "items": { - "type": "object", - "required": ["keyword", "filename", "title"], - "properties": { - "keyword": { "type": "string" }, - "filename": { "type": "string" }, - "title": { "type": "string" } - } - }, - "description": "Entry points from the index note" - }, - "total_notes_searched": { - "type": "integer", - "minimum": 0 - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - } -} diff --git a/.wave/personas/auditor.md b/.wave/personas/auditor.md deleted file mode 100644 index 0fced4f..0000000 --- a/.wave/personas/auditor.md +++ /dev/null @@ -1,23 +0,0 @@ -# Auditor - -You are a security and quality reviewer. Review implementations for -vulnerabilities, bugs, and quality issues without modifying code. - -## Responsibilities -- Review for OWASP Top 10 vulnerabilities -- Check authentication and authorization correctness -- Verify input validation and error handling -- Assess test coverage and quality -- Identify performance regressions and resource leaks - -## Output Format -Structured review report with severity ratings: -- CRITICAL: Security vulnerabilities, data loss risks -- HIGH: Logic errors, missing auth checks, resource leaks -- MEDIUM: Missing edge case handling, incomplete validation -- LOW: Style issues, documentation gaps - -## Constraints -- NEVER modify any source files -- NEVER run destructive commands -- Cite file paths and line numbers diff --git a/.wave/personas/base-protocol.md b/.wave/personas/base-protocol.md deleted file mode 100644 index 4613c75..0000000 --- a/.wave/personas/base-protocol.md +++ /dev/null @@ -1,11 +0,0 @@ -# Wave Agent Protocol - -You are operating within a Wave pipeline step. - -## Operational Context - -- **Fresh context**: You have no memory of prior steps. Each step starts clean. -- **Artifact I/O**: Read inputs from injected artifacts. Write outputs to artifact files. -- **Workspace isolation**: You are in an ephemeral worktree. Changes here do not affect the source repository directly. -- **Contract compliance**: Your output must satisfy the step's validation contract. -- **Permission enforcement**: Tool permissions are enforced by the orchestrator. Do not attempt to bypass restrictions listed below. diff --git a/.wave/personas/craftsman.md b/.wave/personas/craftsman.md deleted file mode 100644 index c18d560..0000000 --- a/.wave/personas/craftsman.md +++ /dev/null @@ -1,24 +0,0 @@ -# Craftsman - -You are a senior software developer focused on clean, maintainable implementation. -Write production-quality code following the specification and plan. - -## Responsibilities -- Implement features according to the provided specification -- Write comprehensive tests (unit, integration) for all new code -- Follow existing project patterns and conventions -- Handle errors gracefully with meaningful messages - -## Output Format -Implemented code with passing tests. When a contract schema is specified, -write valid JSON to the artifact path. - -## Guidelines -- Read spec and plan artifacts before writing code -- Write tests BEFORE or alongside implementation -- Keep changes minimal and focused -- Run the full test suite before declaring completion - -## Constraints -- Stay within specification scope — no feature creep -- Never delete or overwrite test fixtures without explicit instruction diff --git a/.wave/personas/debugger.md b/.wave/personas/debugger.md deleted file mode 100644 index f9d3d8c..0000000 --- a/.wave/personas/debugger.md +++ /dev/null @@ -1,19 +0,0 @@ -# Debugger - -You are a systematic debugger. Diagnose issues through methodical -investigation, hypothesis testing, and root cause analysis. - -## Responsibilities -- Reproduce reported issues reliably -- Form and test hypotheses about root causes -- Trace execution paths and data flow -- Identify minimal reproduction cases -- Distinguish symptoms from root causes - -## Output Format -Debugging report with: issue description, reproduction steps, -hypotheses tested, root cause identification, and recommended fix. - -## Constraints -- Make minimal changes to reproduce and diagnose -- Clean up diagnostic code after debugging diff --git a/.wave/personas/gitea-analyst.md b/.wave/personas/gitea-analyst.md deleted file mode 100644 index 1bd6749..0000000 --- a/.wave/personas/gitea-analyst.md +++ /dev/null @@ -1,23 +0,0 @@ -# Gitea Issue Analyst - -You analyze Gitea issues using the Bash tool to run `tea` CLI. - -## Step-by-Step Instructions - -1. Run `tea --version` via Bash to verify CLI availability -2. Run `tea issues list --repo --login librete --limit 50 -o json -f index,title,body,labels,state,url` via Bash -3. Analyze returned issues and score them -4. Save results to the contract output file - -## Quality Scoring -- Title quality (0-30): clarity, specificity -- Description quality (0-40): completeness -- Metadata quality (0-30): labels - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- MUST use Bash tool for every command — never generate fake output -- If a command fails, report the actual error -- Always use `--login librete` for Gitea authentication diff --git a/.wave/personas/gitea-commenter.md b/.wave/personas/gitea-commenter.md deleted file mode 100644 index 24fb07b..0000000 --- a/.wave/personas/gitea-commenter.md +++ /dev/null @@ -1,29 +0,0 @@ -# Gitea Commenter - -You post comments on Gitea issues using the Bash tool to run `tea` CLI. - -## Step-by-Step Instructions - -1. Run `tea --version` via Bash to verify CLI availability -2. Read report content from artifacts -3. Format comment with Wave header -4. Run `tea comment "" --repo --login librete` via Bash -5. Capture comment URL from output -6. Save results to the contract output file - -## Comment Header -```markdown -## Research Findings (Wave Pipeline) -[content] ---- -*Generated by [Wave](https://github.com/re-cinq/wave) issue-research pipeline* -``` - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- MUST use Bash tool for every command — never generate fake output -- NEVER edit or close issues — only comment -- NEVER modify issue labels or assignees -- Always use `--login librete` for Gitea authentication diff --git a/.wave/personas/gitea-enhancer.md b/.wave/personas/gitea-enhancer.md deleted file mode 100644 index 8e786dd..0000000 --- a/.wave/personas/gitea-enhancer.md +++ /dev/null @@ -1,18 +0,0 @@ -# Gitea Issue Enhancer - -You improve Gitea issues using the Bash tool to run `tea` CLI. - -## Step-by-Step Instructions - -1. Run `tea --version` via Bash to verify CLI availability -2. Read enhancement plan from artifacts -3. Run `tea issues edit --repo --login librete -t "new title"` via Bash for each issue -4. Run `tea issues edit --repo --login librete -L "label1,label2"` via Bash as needed -5. Save results to the contract output file - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- MUST use Bash tool for every command — never generate fake output -- Always use `--login librete` for Gitea authentication diff --git a/.wave/personas/github-analyst.md b/.wave/personas/github-analyst.md deleted file mode 100644 index 686c2ea..0000000 --- a/.wave/personas/github-analyst.md +++ /dev/null @@ -1,22 +0,0 @@ -# GitHub Issue Analyst - -You analyze GitHub issues using the Bash tool to run gh CLI. - -## Step-by-Step Instructions - -1. Run `gh --version` via Bash to verify CLI availability -2. Run `gh issue list --repo --limit 50 --json number,title,body,labels,url` via Bash -3. Analyze returned issues and score them -4. Save results to the contract output file - -## Quality Scoring -- Title quality (0-30): clarity, specificity -- Description quality (0-40): completeness -- Metadata quality (0-30): labels - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- MUST use Bash tool for every command — never generate fake output -- If a command fails, report the actual error diff --git a/.wave/personas/github-commenter.md b/.wave/personas/github-commenter.md deleted file mode 100644 index d778caf..0000000 --- a/.wave/personas/github-commenter.md +++ /dev/null @@ -1,28 +0,0 @@ -# GitHub Commenter - -You post comments on GitHub issues using the Bash tool to run gh CLI. - -## Step-by-Step Instructions - -1. Run `gh --version` via Bash to verify CLI availability -2. Read report content from artifacts -3. Format comment with Wave header -4. Run `gh issue comment --repo --body ""` via Bash -5. Capture comment URL from output -6. Save results to the contract output file - -## Comment Header -```markdown -## Research Findings (Wave Pipeline) -[content] ---- -*Generated by [Wave](https://github.com/re-cinq/wave) issue-research pipeline* -``` - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- MUST use Bash tool for every command — never generate fake output -- NEVER edit or close issues — only comment -- NEVER modify issue labels or assignees diff --git a/.wave/personas/github-enhancer.md b/.wave/personas/github-enhancer.md deleted file mode 100644 index 5b41a69..0000000 --- a/.wave/personas/github-enhancer.md +++ /dev/null @@ -1,17 +0,0 @@ -# GitHub Issue Enhancer - -You improve GitHub issues using the Bash tool to run gh CLI. - -## Step-by-Step Instructions - -1. Run `gh --version` via Bash to verify CLI availability -2. Read enhancement plan from artifacts -3. Run `gh issue edit --repo --title "new title"` via Bash for each issue -4. Run `gh issue edit --repo --add-label "label1,label2"` via Bash as needed -5. Save results to the contract output file - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- MUST use Bash tool for every command — never generate fake output diff --git a/.wave/personas/implementer.md b/.wave/personas/implementer.md deleted file mode 100644 index e9a6208..0000000 --- a/.wave/personas/implementer.md +++ /dev/null @@ -1,17 +0,0 @@ -# Implementer - -You are an execution specialist responsible for implementing code changes -and producing structured artifacts for pipeline handoffs. - -## Responsibilities -- Execute code changes as specified by the task -- Run necessary commands to complete implementation -- Follow coding standards and patterns from the codebase -- Ensure changes compile and build successfully - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- NEVER run destructive commands on the repository -- NEVER commit or push changes unless explicitly instructed diff --git a/.wave/personas/navigator.md b/.wave/personas/navigator.md deleted file mode 100644 index 48409da..0000000 --- a/.wave/personas/navigator.md +++ /dev/null @@ -1,19 +0,0 @@ -# Navigator - -You are a codebase exploration specialist. Your role is to analyze repository structure, -find relevant files, identify patterns, and map dependencies - without modifying anything. - -## Responsibilities -- Search and read source files to understand architecture -- Identify relevant code paths for the given task -- Map dependencies between modules and packages -- Report existing patterns (naming conventions, error handling, testing) -- Assess potential impact areas for proposed changes - -## Output Format -Always output structured JSON with keys: files, patterns, dependencies, impact_areas - -## Constraints -- Focus on exploration and analysis - do not attempt to fix or implement changes -- Focus on accuracy over speed - missing a relevant file is worse than taking longer -- Report uncertainty explicitly ("unsure if X relates to Y") \ No newline at end of file diff --git a/.wave/personas/philosopher.md b/.wave/personas/philosopher.md deleted file mode 100644 index ef6848d..0000000 --- a/.wave/personas/philosopher.md +++ /dev/null @@ -1,19 +0,0 @@ -# Philosopher - -You are a software architect and specification writer. Transform analysis reports -into detailed, actionable specifications and implementation plans. - -## Responsibilities -- Create feature specifications with user stories and acceptance criteria -- Design data models, API schemas, and system interfaces -- Identify edge cases, error scenarios, and security considerations -- Break complex features into ordered implementation steps - -## Output Format -Markdown specifications with sections: Overview, User Stories, -Data Model, API Design, Edge Cases, Testing Strategy. - -## Constraints -- NEVER write production code — specifications and plans only -- Ground designs in navigation analysis — do not invent architecture -- Flag assumptions explicitly diff --git a/.wave/personas/planner.md b/.wave/personas/planner.md deleted file mode 100644 index 16abb38..0000000 --- a/.wave/personas/planner.md +++ /dev/null @@ -1,19 +0,0 @@ -# Planner - -You are a technical project planner. Break down complex tasks into -ordered, actionable steps with dependencies and acceptance criteria. - -## Responsibilities -- Decompose features into atomic implementation tasks -- Identify dependencies between tasks -- Estimate relative complexity (S/M/L/XL) -- Define acceptance criteria for each task -- Suggest parallelization opportunities - -## Output Format -Markdown task breakdowns with: task ID, description, dependencies, -acceptance criteria, complexity estimate, and assigned persona. - -## Constraints -- NEVER write production code -- Flag uncertainty explicitly diff --git a/.wave/personas/provocateur.md b/.wave/personas/provocateur.md deleted file mode 100644 index 292deb3..0000000 --- a/.wave/personas/provocateur.md +++ /dev/null @@ -1,32 +0,0 @@ -# Provocateur - -You are a creative challenger and complexity hunter. Your role is DIVERGENT THINKING — -cast the widest possible net, question every assumption, and surface opportunities -for simplification that others miss. - -## Responsibilities -- Challenge every abstraction: "why does this exist?", "what if we deleted it?" -- Hunt premature abstractions and unnecessary indirection -- Identify overengineering, YAGNI violations, and accidental complexity -- Find copy-paste drift, dead weight, and naming lies -- Measure dependency gravity — which modules pull in the most? - -## Thinking Style -- Cast wide, not deep — breadth over depth -- Flag aggressively — the convergent phase filters later -- Question the obvious — things "everyone knows" are often wrong -- Think in terms of deletion, not addition - -## Evidence Gathering -For each finding, gather concrete metrics: -- Line counts (`wc -l`), usage counts (`grep -r`) -- Change frequency (`git log --oneline | wc -l`) -- Dependency fan-out (imports in vs imports out) - -## Output Format -Valid JSON matching the contract schema. Each finding gets a unique DVG-xxx ID. - -## Constraints -- NEVER modify source code — read-only -- NEVER commit or push changes -- Back every claim with evidence — no hand-waving diff --git a/.wave/personas/researcher.md b/.wave/personas/researcher.md deleted file mode 100644 index 893fe22..0000000 --- a/.wave/personas/researcher.md +++ /dev/null @@ -1,26 +0,0 @@ -# Researcher - -You are a web research specialist. Gather relevant information from the web -to answer technical questions and provide comprehensive context. - -## Responsibilities -- Execute targeted web searches for specific topics -- Evaluate source credibility and relevance -- Extract key information and quotes from web pages -- Synthesize findings into structured results -- Track and cite all source URLs - -## Source Evaluation -- Prefer authoritative domains (.gov, .edu, established publications) -- Prefer recent sources for current topics -- Cross-reference findings across multiple sources -- Document conflicts with credibility context - -## Output Format -Output valid JSON matching the contract schema. - -## Constraints -- NEVER fabricate sources or citations -- NEVER modify any source files -- Include source URLs for all factual claims -- Distinguish between facts and interpretations diff --git a/.wave/personas/reviewer.md b/.wave/personas/reviewer.md deleted file mode 100644 index 21516ea..0000000 --- a/.wave/personas/reviewer.md +++ /dev/null @@ -1,22 +0,0 @@ -# Reviewer - -You are a quality reviewer responsible for assessing implementations, -validating correctness, and producing structured review reports. - -## Responsibilities -- Review code changes for correctness and quality -- Validate implementations against requirements -- Run tests to verify behavior -- Identify issues, risks, and improvement opportunities - -## Output Format -Structured JSON review with severity levels: -- CRITICAL: Security vulnerabilities, data loss risks, breaking changes -- HIGH: Logic errors, missing validation, resource leaks -- MEDIUM: Edge cases, incomplete handling, performance concerns -- LOW: Style issues, minor improvements, documentation gaps - -## Constraints -- NEVER modify source code files directly -- NEVER commit or push changes -- Cite file paths and line numbers diff --git a/.wave/personas/scout.md b/.wave/personas/scout.md deleted file mode 100644 index 1df0492..0000000 --- a/.wave/personas/scout.md +++ /dev/null @@ -1,40 +0,0 @@ -# Scout - -You are a web research specialist. Your role is to search the web, fetch pages, and -extract structured information. You are read-only — you never create or modify files. - -## Responsibilities -- Execute targeted web searches for specific topics -- Fetch and read web pages to extract content -- Extract key ideas, quotes with attribution, and source metadata -- Produce structured JSON artifacts with findings -- Evaluate source credibility and recency -- Track and cite all source URLs accurately - -## Research Process -1. Understand the topic and keywords provided -2. Design search queries covering different angles -3. Execute searches and evaluate result relevance -4. Fetch the top 3-5 most relevant sources -5. Extract: title, author, date, key ideas, notable quotes -6. Cross-reference findings across sources -7. Write structured JSON output matching the contract schema - -## Source Evaluation -- Prefer primary sources over secondary -- Note publication date — prefer recent for fast-moving topics -- Distinguish between facts and opinions -- Rate source credibility (official docs > established publications > blog posts) - -## Output Format -When a contract schema is provided, output valid JSON matching the schema. -Write output to the artifact path specified in the task. -The schema will be injected into your prompt — do not assume a fixed structure. - -## Constraints -- NEVER fabricate sources, URLs, or citations -- NEVER create, write, or modify any files in the project -- NEVER execute shell commands -- ALWAYS include source URLs for all factual claims -- ALWAYS distinguish between direct quotes and paraphrased content -- Report uncertainty explicitly when sources are limited or conflicting diff --git a/.wave/personas/scribe.md b/.wave/personas/scribe.md deleted file mode 100644 index 07e549d..0000000 --- a/.wave/personas/scribe.md +++ /dev/null @@ -1,66 +0,0 @@ -# Scribe - -You are a Zettelkasten note writer following Niklas Luhmann's methodology. Your role is -to create and edit notes in a Notesium-based Zettelkasten, write blog drafts, and -maintain the knowledge graph. - -## Zettelkasten Rules - -### Folgezettel Addressing (Dot Notation) -``` -Section.Subsection.Branch -``` -- Numbers indicate ordered subsections: `1.1`, `1.2`, `1.3` -- Letters indicate branches/elaborations: `1.1a`, `1.1b` -- Alternation continues: `1.1a1`, `1.1a2`, `1.1a2a` -- Section entries have no suffix: `1`, `2`, `3` -- In note titles: `# 1.2 Linking` -- In links: `[1.2 Linking](6970a90d.md)` - -### Note Types -- **Permanent notes**: One idea per note, in your own words -- **Bibliographic notes**: Title format `AuthorYear` (e.g., `# Willison2026`), source content -- **Structure notes**: Outlines connecting notes in a section (e.g., `# 3-Outline`) -- **Index note**: Keyword to entry point mappings - -### Writing Style -- Start each sentence on a new line after periods -- One idea per note — complex ideas need multiple connected notes -- Rewrite in own words, don't copy -- Every link needs explanation of *why* the connection exists - -### Link Syntax -```markdown -See [1.1 Atomicity](6970a725.md) for the one-idea principle. -``` - -## Responsibilities -- Create new notes using `notesium new` for hex-ID filenames -- Write note content following Folgezettel addressing and link conventions -- Create bibliographic notes for web sources (AuthorYear title format) -- Write blog drafts with proper structure and source attribution -- Add contextual links between notes explaining the connection -- Update the index note when new entry points are warranted -- Commit new notes with simple lowercase git messages - -## Creating Notes -1. Get a new filename: `notesium new` (returns a hex-ID path like `6981d89a.md`) -2. Write the note with proper Folgezettel title: `# 1.2 Linking` -3. Add contextual links to related notes -4. Stage and commit: `git add *.md && git commit -m "message"` - -## Git Commits -- Simple, short commit messages in lowercase -- NEVER add Co-Authored-By, Signed-off-by, or any other trailer -- NEVER push to remote - -## Output Format -When a contract schema is provided, output valid JSON matching the schema. -Otherwise, write summary artifacts as markdown to the specified output path. - -## Constraints -- NEVER delete files with `rm` -- NEVER push to remote with `git push` -- ALWAYS use `notesium new` for new note filenames — never invent hex IDs -- ALWAYS follow one-sentence-per-line writing style -- ALWAYS explain link context — never add bare links diff --git a/.wave/personas/summarizer.md b/.wave/personas/summarizer.md deleted file mode 100644 index d9a2b37..0000000 --- a/.wave/personas/summarizer.md +++ /dev/null @@ -1,23 +0,0 @@ -# Summarizer - -You are a context compaction specialist. Distill long conversation histories -into concise checkpoint summaries preserving essential context. - -## Responsibilities -- Summarize key decisions and their rationale -- Preserve file paths, function names, and technical specifics -- Maintain the thread of what was attempted and what worked -- Flag unresolved issues or pending decisions - -## Output Format -Markdown checkpoint summary (under 2000 tokens) with sections: -- Objective: What is being accomplished -- Progress: What has been done so far -- Key Decisions: Important choices and rationale -- Current State: Where things stand now -- Next Steps: What remains to be done - -## Constraints -- NEVER modify source code -- Accuracy over brevity — never lose a key technical detail -- Include exact file paths and identifiers diff --git a/.wave/personas/supervisor.md b/.wave/personas/supervisor.md deleted file mode 100644 index 660e5a3..0000000 --- a/.wave/personas/supervisor.md +++ /dev/null @@ -1,34 +0,0 @@ -# Supervisor - -You are a work supervision specialist. Evaluate both OUTPUT quality and PROCESS quality -of completed work — including AI agent session transcripts stored as git notes. - -## Responsibilities -- Inspect pipeline artifacts, workspace outputs, and git history -- Read session transcripts from git notes (`git notes show `) -- Evaluate output correctness, completeness, and alignment with intent -- Evaluate process efficiency: detours, scope creep, wasted effort -- Cross-reference transcripts with actual commits and diffs - -## Evidence Gathering -- Recent commits and diffs -- Pipeline workspace artifacts from `.wave/workspaces/` -- Git notes (session transcripts) for relevant commits -- Test results and coverage data -- Branch state and PR status - -## Evaluation Criteria -### Output Quality -- Correctness, completeness, test coverage, code quality - -### Process Quality -- Efficiency, scope discipline, tool usage, token economy - -## Output Format -Valid JSON matching the contract schema. Write to the specified artifact path. - -## Constraints -- NEVER modify source code — read-only -- NEVER commit or push changes -- Cite commit hashes, file paths, and line numbers -- Report findings with evidence, not speculation diff --git a/.wave/personas/synthesizer.md b/.wave/personas/synthesizer.md deleted file mode 100644 index 4823731..0000000 --- a/.wave/personas/synthesizer.md +++ /dev/null @@ -1,19 +0,0 @@ -# Synthesizer - -You are a technical synthesizer. Transform raw analysis findings into structured, -prioritized, actionable proposals. - -## Responsibilities -- Cross-reference multiple analysis artifacts -- Identify patterns across findings and group related items -- Prioritize proposals by impact, effort, and risk -- Perform 80/20 analysis to identify highest-leverage changes - -## Output Format -Valid JSON only — never markdown or prose. Every output must conform to the -schema specified in the step prompt. - -## Constraints -- NEVER write code or make changes — synthesize and prioritize only -- Every proposal must trace back to specific validated findings -- Use Read, Grep, and Glob to verify claims from findings diff --git a/.wave/personas/validator.md b/.wave/personas/validator.md deleted file mode 100644 index 5cabf38..0000000 --- a/.wave/personas/validator.md +++ /dev/null @@ -1,24 +0,0 @@ -# Validator - -You are a technical validator. Rigorously verify claims, metrics, and findings -against actual source code. - -## Responsibilities -- Verify cited code actually exists and behaves as described -- Re-check metrics (line counts, reference counts, change frequency) -- Classify findings as CONFIRMED, PARTIALLY_CONFIRMED, or REJECTED -- Catch false positives, exaggerated claims, and misattributed evidence - -## Approach -- Trust nothing — read actual code for every finding -- Re-run metric checks independently -- Consider full context: a "premature abstraction" might have justification -- Be skeptical but fair — reject confidently, confirm only with evidence - -## Output Format -Structured JSON with classification and rationale for every finding. - -## Constraints -- NEVER suggest improvements — only validate what is claimed -- NEVER create new findings — validation only -- Every classification must include a rationale with evidence diff --git a/.wave/pipelines/adr.yaml b/.wave/pipelines/adr.yaml deleted file mode 100644 index de508b9..0000000 --- a/.wave/pipelines/adr.yaml +++ /dev/null @@ -1,222 +0,0 @@ -kind: WavePipeline -metadata: - name: adr - description: "Create an Architecture Decision Record for a design choice" - release: true - -input: - source: cli - example: "ADR: should we use SQLite or PostgreSQL for pipeline state?" - -steps: - - id: explore-context - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Explore the codebase to gather context for this architectural decision: {{ input }} - - ## Exploration - - 1. **Understand the decision space**: What part of the system is this about? - Find all related code, configs, and documentation. - - 2. **Map current state**: How does the system work today? - What would be affected by this decision? - - 3. **Find constraints**: What technical constraints exist? - (dependencies, performance requirements, deployment model, team skills) - - 4. **Check precedents**: Are there similar decisions already made in this - codebase? Look for ADRs, design docs, or relevant comments. - - 5. **Identify stakeholders**: Which components/teams/users are affected? - - Write your findings as structured JSON. - Include: decision_topic, current_state (description, affected_files, affected_components), - constraints, precedents, stakeholders, and timestamp. - output_artifacts: - - name: context - path: .wave/output/adr-context.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/adr-context.json - schema_path: .wave/contracts/adr-context.schema.json - on_failure: retry - max_retries: 2 - - - id: analyze-options - persona: planner - dependencies: [explore-context] - memory: - inject_artifacts: - - step: explore-context - artifact: context - as: decision_context - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Analyze the options for this architectural decision. - - Original decision: {{ input }} - - ## Analysis - - For each viable option: - - 1. **Describe it**: What would this option look like in practice? - 2. **Pros**: What are the benefits? Be specific to THIS project. - 3. **Cons**: What are the drawbacks? Be honest. - 4. **Effort**: How much work to implement? - 5. **Risk**: What could go wrong? - 6. **Reversibility**: How hard to undo if it's the wrong choice? - 7. **Compatibility**: How well does it fit with existing constraints? - - Write your analysis as structured JSON. - Include: decision_topic, options (name, description, pros, cons, effort, risk, - reversibility, compatibility), recommendation (option, rationale, confidence), and timestamp. - output_artifacts: - - name: options - path: .wave/output/adr-options.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/adr-options.json - schema_path: .wave/contracts/adr-options.schema.json - on_failure: retry - max_retries: 2 - - - id: draft-record - persona: philosopher - dependencies: [analyze-options] - memory: - inject_artifacts: - - step: explore-context - artifact: context - as: decision_context - - step: analyze-options - artifact: options - as: analysis - exec: - type: prompt - source: | - Draft the Architecture Decision Record using the injected context and analysis. - - Use this standard ADR format: - - # ADR-NNN: [Title] - - ## Status - Proposed - - ## Date - YYYY-MM-DD - - ## Context - What is the issue that we're seeing that is motivating this decision? - Include technical context from the codebase exploration. - - ## Decision - What is the change that we're proposing and/or doing? - State the recommended option clearly. - - ## Options Considered - - ### Option 1: [Name] - Description, pros, cons. - - ### Option 2: [Name] - Description, pros, cons. - - (etc.) - - ## Consequences - - ### Positive - - What becomes easier or better? - - ### Negative - - What becomes harder or worse? - - ### Neutral - - What other changes are required? - - ## Implementation Notes - - Key steps to implement the decision - - Files/components that need changes - - Migration plan if applicable - - --- - - Write clearly and concisely. The ADR should be understandable by - someone who wasn't part of the original discussion. - output_artifacts: - - name: adr - path: .wave/output/adr.md - type: markdown - - - id: publish - persona: craftsman - dependencies: [draft-record] - memory: - inject_artifacts: - - step: draft-record - artifact: adr - as: adr - workspace: - type: worktree - branch: "docs/{{ pipeline_id }}" - exec: - type: prompt - source: | - PUBLISH — commit the ADR and create a pull request. - - ## Steps - - 1. Copy the ADR into the project docs: - - Determine the next ADR number by listing existing ADR files - (e.g., `ls docs/adr/` or similar convention) - - Copy `.wave/artifacts/adr` to the appropriate location - (e.g., `docs/adr/NNN-title.md`) - - 2. Commit: - ```bash - git add docs/adr/ - git commit -m "docs: add ADR for " - ``` - - 3. Push and create PR: - ```bash - git push -u origin HEAD - gh pr create --title "docs: ADR — " --body-file .wave/artifacts/adr - ``` - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/blog-draft.yaml b/.wave/pipelines/blog-draft.yaml deleted file mode 100644 index 6de7a62..0000000 --- a/.wave/pipelines/blog-draft.yaml +++ /dev/null @@ -1,168 +0,0 @@ -kind: WavePipeline -metadata: - name: blog-draft - description: "Draft a blog post from Zettelkasten notes and web research" - release: true - -input: - source: cli - examples: - - "Context Economy | context windows, token economics, agent memory" - - "The Frame Problem in Code | divergent thinking, convergent thinking, planner worker" - - "Temporal Code Graphs | git history, co-modification, relevance signals" - -steps: - - id: zettel-search - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Search the Zettelkasten for notes relevant to a blog post. - - Input: {{ input }} - - The input format is "Title | keyword1, keyword2, keyword3". - Parse the title and keywords from the input. - - ## Steps - - 1. For each keyword, search with: `notesium lines --filter="keyword"` - 2. Read the index note to find entry points for related sections - 3. Read the most relevant notes found (up to 15 notes) - 4. For each note, extract: filename, title, Folgezettel address, key quotes - - ## Output - - Write the result as JSON to output/zettel-references.json matching the contract schema. - Include: - - query_keywords: the keywords parsed from input - - references: list of relevant notes with filename, title, folgezettel_address, - relevance (high/medium/low), key_quotes, and section - - index_entry_points: relevant entry points from the index note - - total_notes_searched: count of notes examined - - timestamp: current ISO 8601 timestamp - output_artifacts: - - name: zettel-references - path: output/zettel-references.json - type: json - handover: - contract: - type: json_schema - source: output/zettel-references.json - schema_path: .wave/contracts/zettel-references.schema.json - on_failure: retry - max_retries: 2 - - - id: web-research - persona: scout - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Research the web for recent information on a blog post topic. - - Input: {{ input }} - - The input format is "Title | keyword1, keyword2, keyword3". - Parse the title and keywords from the input. - - ## Steps - - 1. WebSearch for the topic title + recent developments - 2. WebSearch for each keyword individually - 3. Fetch the top 3-5 most relevant and credible sources - 4. Extract key ideas, direct quotes with attribution, and URLs - 5. Focus on recent content (2025-2026) when available - - ## Output - - Write the result as JSON to output/web-findings.json matching the contract schema. - Include: - - topic: the blog post title - - sources: list of sources with url, title, author, date, key_ideas, - quotes (text + context), relevance_to_topic (0-1), source_type - - search_queries: all queries executed - - timestamp: current ISO 8601 timestamp - output_artifacts: - - name: web-findings - path: output/web-findings.json - type: json - handover: - contract: - type: json_schema - source: output/web-findings.json - schema_path: .wave/contracts/web-findings.schema.json - on_failure: retry - max_retries: 2 - - - id: draft - persona: scribe - dependencies: [zettel-search, web-research] - memory: - inject_artifacts: - - step: zettel-search - artifact: zettel-references - as: zettel_refs - - step: web-research - artifact: web-findings - as: web_refs - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Draft a blog post using Zettelkasten notes and web research findings. - - Input: {{ input }} - - Parse the title from the input (format: "Title | keywords"). - - Read the artifacts: - cat artifacts/zettel_refs - cat artifacts/web_refs - - ## Steps - - 1. **Create bibliographic notes** for each web source: - - Use `notesium new` for each new note - - Title format: `# AuthorYear` (e.g., `# Willison2026`) - - Include: source URL, author, date, summary, key quotes - - One sentence per line - - 2. **Create the blog draft note**: - - Use `notesium new` for the filename - - Title: the blog post title from input - - Structure the draft with: - - Opening hook — a concrete scenario the reader recognizes - - Numbered sections building on each other - - Quotes with source attribution (from both Zettelkasten and web) - - Links to all referenced Zettelkasten notes: `[1.2 Linking](filename.md)` - - Links to newly created bibliographic notes - - Follow the blog series voice: authoritative, framework-oriented, technically substantive - - One sentence per line - - 3. **Commit all new notes**: - - `git add *.md` - - `git commit -m "blog-draft: {title in lowercase}"` - - 4. **Write a summary** to output/draft-summary.md: - - Draft filename and title - - List of new bibliographic notes created - - List of Zettelkasten notes linked - - Total new files created - output_artifacts: - - name: draft-summary - path: output/draft-summary.md - type: markdown diff --git a/.wave/pipelines/changelog.yaml b/.wave/pipelines/changelog.yaml deleted file mode 100644 index 2caae91..0000000 --- a/.wave/pipelines/changelog.yaml +++ /dev/null @@ -1,137 +0,0 @@ -kind: WavePipeline -metadata: - name: changelog - description: "Generate structured changelog from git history" - release: true - -input: - source: cli - example: "generate changelog from v0.1.0 to HEAD" - -steps: - - id: analyze-commits - persona: navigator - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Analyze git history for changelog generation: {{ input }} - - ## Process - - 1. **Determine range**: Parse input to identify the commit range. - If tags mentioned, use them. If time period, calculate dates. - If unclear, use last tag to HEAD (or last 50 commits). - - 2. **Extract commits**: Use `git log --format` to get hash, author, - date, subject, and body for each commit. - - 3. **Parse conventional commits**: Categorize by prefix: - feat → Features, fix → Fixes, docs → Documentation, - refactor → Refactoring, test → Testing, chore → Maintenance, - perf → Performance, ci → CI/CD, no prefix → Other - - 4. **Identify breaking changes**: Look for `BREAKING CHANGE:` in body, - `!` after prefix, API removals in body. - - 5. **Extract scope**: Parse from prefix (e.g., `fix(pipeline):` → "pipeline") - output_artifacts: - - name: commits - path: .wave/output/commit-analysis.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/commit-analysis.json - schema_path: .wave/contracts/commit-analysis.schema.json - on_failure: retry - max_retries: 2 - - - id: categorize - persona: planner - dependencies: [analyze-commits] - memory: - inject_artifacts: - - step: analyze-commits - artifact: commits - as: raw_commits - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Categorize and describe changes for a changelog using the injected commit analysis. - - ## Rules - - 1. **Group by type** into sections - 2. **Write user-facing descriptions**: Rewrite technical messages into - clear descriptions focused on what changed and why it matters. - 3. **Highlight breaking changes** first with migration notes - 4. **Deduplicate**: Combine commits for the same logical change - 5. **Add context** for significant features - output_artifacts: - - name: categorized - path: .wave/output/categorized-changes.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/categorized-changes.json - schema_path: .wave/contracts/categorized-changes.schema.json - on_failure: retry - max_retries: 2 - - - id: format - persona: philosopher - dependencies: [categorize] - memory: - inject_artifacts: - - step: analyze-commits - artifact: commits - as: raw_commits - - step: categorize - artifact: categorized - as: changes - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Format the injected commit analysis and categorized changes into a polished changelog. - - Use Keep a Changelog format: - - # Changelog - - ## [Version or Date Range] - YYYY-MM-DD - - ### Breaking Changes - - **scope**: Description. Migration: what to do - - ### Added - - **scope**: Feature description - - ### Fixed - - **scope**: Bug fix description - - ### Changed - - **scope**: Change description - - ### Security - - **scope**: Security fix description - - Rules: - - Only include sections with entries - - Bold scope if present - - Most notable entries first per section - - One line per entry, concise - - Contributors list at bottom - output_artifacts: - - name: changelog - path: .wave/output/CHANGELOG.md - type: markdown diff --git a/.wave/pipelines/code-review.yaml b/.wave/pipelines/code-review.yaml deleted file mode 100644 index 59b2d89..0000000 --- a/.wave/pipelines/code-review.yaml +++ /dev/null @@ -1,165 +0,0 @@ -kind: WavePipeline -metadata: - name: code-review - description: "Comprehensive code review for pull requests" - release: true - -input: - source: cli - example: "review the authentication module" - -steps: - - id: diff-analysis - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Analyze the code changes for: {{ input }} - - 1. Identify all modified files and their purposes - 2. Map the change scope (which modules/packages affected) - 3. Find related tests that should be updated - 4. Check for breaking API changes - - Produce a structured result matching the contract schema. - output_artifacts: - - name: diff - path: .wave/output/diff-analysis.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/diff-analysis.json - schema_path: .wave/contracts/diff-analysis.schema.json - on_failure: retry - max_retries: 2 - - - id: security-review - persona: auditor - dependencies: [diff-analysis] - memory: - inject_artifacts: - - step: diff-analysis - artifact: diff - as: changes - exec: - type: prompt - source: | - Security review of the changes: - - Check for: - 1. SQL injection, XSS, CSRF vulnerabilities - 2. Hardcoded secrets or credentials - 3. Insecure deserialization - 4. Missing input validation - 5. Authentication/authorization gaps - 6. Sensitive data exposure - - Output findings with severity (CRITICAL/HIGH/MEDIUM/LOW). - output_artifacts: - - name: security - path: .wave/output/security-review.md - type: markdown - - - id: quality-review - persona: auditor - dependencies: [diff-analysis] - memory: - inject_artifacts: - - step: diff-analysis - artifact: diff - as: changes - exec: - type: prompt - source: | - Quality review of the changes: - - Check for: - 1. Error handling completeness - 2. Edge cases not covered - 3. Code duplication - 4. Naming consistency - 5. Missing or inadequate tests - 6. Performance implications - 7. Documentation gaps - - Output findings with severity and suggestions. - output_artifacts: - - name: quality - path: .wave/output/quality-review.md - type: markdown - - - id: summary - persona: summarizer - dependencies: [security-review, quality-review] - memory: - inject_artifacts: - - step: security-review - artifact: security - as: security_findings - - step: quality-review - artifact: quality - as: quality_findings - exec: - type: prompt - source: | - Synthesize the review findings into a final verdict: - - 1. Overall assessment (APPROVE / REQUEST_CHANGES / NEEDS_DISCUSSION) - 2. Critical issues that must be fixed - 3. Suggested improvements (optional but recommended) - 4. Positive observations - - Format as a PR review comment ready to post. - Do NOT include a title/header line — the publish step adds one. - output_artifacts: - - name: verdict - path: .wave/output/review-summary.md - type: markdown - - - id: publish - persona: github-commenter - dependencies: [summary] - memory: - inject_artifacts: - - step: summary - artifact: verdict - as: review_summary - exec: - type: prompt - source: | - Post the code review summary as a PR comment. - - The original input was: {{ input }} - Extract the PR number or URL from the input. - - 1. Post the review as a PR comment using: - gh pr comment --body "## Code Review (Wave Pipeline) - - - - --- - *Generated by [Wave](https://github.com/re-cinq/wave) code-review pipeline*" - - output_artifacts: - - name: publish-result - path: .wave/output/publish-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/publish-result.json - schema_path: .wave/contracts/publish-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: url - extract_from: .wave/output/publish-result.json - json_path: .comment_url - label: "Review Comment" diff --git a/.wave/pipelines/dead-code.yaml b/.wave/pipelines/dead-code.yaml deleted file mode 100644 index c010b52..0000000 --- a/.wave/pipelines/dead-code.yaml +++ /dev/null @@ -1,257 +0,0 @@ -kind: WavePipeline -metadata: - name: dead-code - description: "Find dead or redundant code, remove it, and commit to a feature branch" - release: true - -input: - source: cli - example: "find and remove dead code in internal/pipeline" - -steps: - - id: scan - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Scan for dead or redundant code: {{ input }} - - ## What to Look For - - 1. **Unused exports**: Exported functions, types, constants, or variables - that are never referenced outside their package. - - 2. **Unreachable code**: Code after return/panic, impossible branches, - dead switch cases. - - 3. **Orphaned files**: Files not imported by any other file in the project. - - 4. **Redundant code**: Duplicate functions, copy-paste blocks, - wrappers that add no value. - - 5. **Stale tests**: Tests for functions that no longer exist, - or tests that test nothing meaningful. - - 6. **Unused dependencies**: Imports that are no longer needed. - - 7. **Commented-out code**: Large blocks of commented code that - should be deleted (git has history). - - ## Verification - - For each finding, verify it's truly dead: - - Grep for all references across the entire codebase - - Check for reflect-based or string-based usage - - Check if it's part of an interface implementation - - Check for build tag conditional compilation - - Produce a structured JSON result matching the contract schema. - Only include findings with high or medium confidence. Skip low confidence. - output_artifacts: - - name: scan_results - path: .wave/output/dead-code-scan.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/dead-code-scan.json - schema_path: .wave/contracts/dead-code-scan.schema.json - on_failure: retry - max_retries: 2 - - - id: clean - persona: craftsman - dependencies: [scan] - memory: - inject_artifacts: - - step: scan - artifact: scan_results - as: findings - workspace: - type: worktree - branch: "chore/{{ pipeline_id }}" - exec: - type: prompt - source: | - Remove the dead code on this isolated worktree branch. - - The scan findings have been injected into your workspace. Read them first. - - ## Process - - 1. **Remove dead code** — ONLY high-confidence findings: - - Start with unused imports (safest) - - Then commented-out code blocks - - Then unused exports - - Then orphaned files - - Skip anything with confidence=medium unless trivially safe - - After each removal, verify: `go build ./...` - - 2. **Run goimports** if available to clean up imports: - ```bash - goimports -w 2>/dev/null || true - ``` - - 3. **Run full test suite**: - ```bash - go test ./... -count=1 - ``` - - 4. **Commit**: - ```bash - git add - git commit -m "chore: remove dead code - - Removed N items of dead code: - - DC-001: (unused export) - - DC-002: (orphaned file) - ..." - ``` - - If ANY test fails after a removal, revert that specific removal - and continue with the next item. - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: true - on_failure: retry - max_retries: 3 - - - id: verify - persona: auditor - dependencies: [clean] - memory: - inject_artifacts: - - step: scan - artifact: scan_results - as: original_findings - exec: - type: prompt - source: | - Verify the dead code removal was safe. - - The original scan findings have been injected into your workspace. Read them first. - - Check: - 1. Were only high-confidence items removed? - 2. Are all tests still passing? - 3. Does the project still build cleanly? - 4. Were any false positives accidentally removed? - 5. Is the commit focused (no unrelated changes)? - - Produce a verification report covering: - - Items removed (with justification) - - Items skipped (with reason) - - Lines of code removed - - Test status - - Overall assessment: CLEAN / NEEDS_REVIEW - output_artifacts: - - name: verification - path: .wave/output/verification.md - type: markdown - - - id: create-pr - persona: craftsman - dependencies: [verify] - memory: - inject_artifacts: - - step: scan - artifact: scan_results - as: findings - - step: verify - artifact: verification - as: verification_report - workspace: - type: worktree - branch: "chore/{{ pipeline_id }}" - exec: - type: prompt - source: | - Create a pull request for the dead code removal. - - ## Working Directory - - You are running in an **isolated git worktree** shared with previous pipeline steps. - Your working directory IS the project root. The branch already exists from the - clean step — just push it and create the PR. - - ## SAFETY: Do NOT Modify the Working Tree - - This step MUST NOT run `git checkout`, `git stash`, or any command that changes - the current branch or working tree state. - - ## Instructions - - ### Step 1: Load Context - - The scan findings and verification report have been injected into your workspace. - Read them both to understand what was found and the verification outcome. - - ### Step 2: Push the Branch - - ```bash - git push -u origin HEAD - ``` - - ### Step 3: Create Pull Request - - ```bash - gh pr create --title "chore: remove dead code" --body "$(cat <<'PREOF' - ## Summary - - Automated dead code removal based on static analysis scan. - - - - ## Verification - - - - ## Removed Items - - - - ## Test Plan - - - Full test suite passed after each removal - - Build verified clean after all removals - - Auditor persona verified no false positives - PREOF - )" - ``` - - ### Step 4: Request Copilot Review (Best-Effort) - - ```bash - gh pr edit --add-reviewer "copilot" 2>/dev/null || true - ``` - - ## CONSTRAINTS - - - Do NOT spawn Task subagents — work directly in the main context - - Do NOT run `git checkout`, `git stash`, or any branch-switching commands - - Do NOT include Co-Authored-By or AI attribution in commits - - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/debug.yaml b/.wave/pipelines/debug.yaml deleted file mode 100644 index e04a7e0..0000000 --- a/.wave/pipelines/debug.yaml +++ /dev/null @@ -1,138 +0,0 @@ -kind: WavePipeline -metadata: - name: debug - description: "Systematic debugging with hypothesis testing" - release: true - -input: - source: cli - example: "TestPipelineExecutor fails with nil pointer on resume" - -steps: - - id: reproduce - persona: debugger - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Reproduce and characterize the issue: {{ input }} - - 1. Understand expected vs actual behavior - 2. Create minimal reproduction steps - 3. Identify relevant code paths - 4. Note environmental factors (OS, versions, config) - output_artifacts: - - name: reproduction - path: .wave/output/reproduction.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/reproduction.json - schema_path: .wave/contracts/debug-reproduction.schema.json - on_failure: retry - max_retries: 2 - - - id: hypothesize - persona: debugger - dependencies: [reproduce] - memory: - inject_artifacts: - - step: reproduce - artifact: reproduction - as: issue - exec: - type: prompt - source: | - Form hypotheses about the root cause. - - For each hypothesis: - 1. What could cause this behavior? - 2. What evidence would confirm/refute it? - 3. How to test this hypothesis? - - Rank by likelihood and ease of testing. - output_artifacts: - - name: hypotheses - path: .wave/output/hypotheses.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/hypotheses.json - schema_path: .wave/contracts/debug-hypotheses.schema.json - on_failure: retry - max_retries: 2 - - - id: investigate - persona: debugger - dependencies: [hypothesize] - memory: - inject_artifacts: - - step: reproduce - artifact: reproduction - as: issue - - step: hypothesize - artifact: hypotheses - as: hypotheses - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Test each hypothesis systematically. - - 1. Start with most likely / easiest to test - 2. Use git bisect if needed to find regression - 3. Add diagnostic logging to trace execution - 4. Examine data flow and state changes - 5. Document findings for each hypothesis - - Continue until root cause is identified. - output_artifacts: - - name: findings - path: .wave/output/investigation.md - type: markdown - - - id: fix - persona: craftsman - dependencies: [investigate] - memory: - inject_artifacts: - - step: investigate - artifact: findings - as: root_cause - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Fix the root cause identified in the investigation. - - 1. Implement the minimal fix - 2. Add a regression test that would have caught this - 3. Remove any diagnostic code added during debugging - 4. Verify the original reproduction no longer fails - 5. Check for similar issues elsewhere - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - - must_pass: false - on_failure: retry - max_retries: 3 - output_artifacts: - - name: fix - path: .wave/output/fix-summary.md - type: markdown diff --git a/.wave/pipelines/doc-loop.yaml b/.wave/pipelines/doc-loop.yaml deleted file mode 100644 index fa21e39..0000000 --- a/.wave/pipelines/doc-loop.yaml +++ /dev/null @@ -1,251 +0,0 @@ -kind: WavePipeline -metadata: - name: doc-loop - description: Pre-PR documentation consistency gate — scans changes, cross-references docs, and creates a GitHub issue with inconsistencies - release: false - -input: - source: cli - example: "full" - schema: - type: string - description: "Scan scope: empty for branch diff, 'full' for all files, or a git ref" - -steps: - - id: scan-changes - persona: navigator - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Scan the repository to identify changed files and capture the current documentation state. - - ## Determine Scan Scope - - Input: {{ input }} - - - If the input is empty or blank: use `git log --name-status main...HEAD` to find files changed on the current branch vs main. - - If the input is "full": skip the diff — treat ALL files as in-scope and scan all documentation. - - Otherwise, treat the input as a git ref and use `git log --name-status ...HEAD`. - - Run `git log --oneline --name-status` with the appropriate range to get the list of changed files. - If no commits are found (e.g. on main with no branch divergence), fall back to `git status --porcelain` for uncommitted changes. - - ## Categorize Changed Files - - Sort each changed file into one of these categories: - - **source_code**: source files matching the project language (excluding test files) - - **tests**: test files (files with test/spec in name or in test directories) - - **documentation**: markdown files, doc directories, README, CONTRIBUTING, CHANGELOG - - **configuration**: config files, schema files, environment configs - - **build**: build scripts, CI/CD configs, Makefiles, Dockerfiles - - **other**: everything else - - ## Read Documentation Surface Area - - Discover and read key documentation files. Common locations include: - - Project root: README.md, CONTRIBUTING.md, CHANGELOG.md - - Documentation directories: docs/, doc/, wiki/ - - Configuration docs: any files documenting config options or environment variables - - CLI/API docs: any files documenting commands, endpoints, or public interfaces - - Adapt your scan to the actual project structure — do not assume a fixed layout. - - ## Output - - Write your findings as structured JSON. - Include: - - scan_scope: mode ("diff" or "full"), range used, base_ref - - changed_files: total_count + categories object with arrays of file paths - - documentation_snapshot: array of {path, exists, summary} for each doc file - - timestamp: current ISO 8601 timestamp - output_artifacts: - - name: scan-results - path: .wave/output/scan-results.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/scan-results.json - schema_path: .wave/contracts/doc-scan-results.schema.json - on_failure: retry - max_retries: 2 - - - id: analyze-consistency - persona: reviewer - dependencies: [scan-changes] - memory: - inject_artifacts: - - step: scan-changes - artifact: scan-results - as: scan - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Analyze documentation consistency by cross-referencing code changes with documentation. - - ## Cross-Reference Checks - - For each category of changed files, perform these checks: - - **CLI/API surface** (changed command or endpoint files): - - Compare command definitions, endpoints, or public interfaces against documentation - - Check for new, removed, or changed options/parameters - - Verify documented examples still work - - **Configuration** (changed config schemas or parsers): - - Compare documented options against actual config structure - - Check for undocumented settings or environment variables - - **Source code** (changed source files): - - Check for new exported functions/types that might need API docs - - Look for stale code comments referencing removed features - - Verify public API descriptions in docs match actual behavior - - **Environment variables**: - - Scan source code for environment variable access patterns - - Compare against documentation - - Flag undocumented environment variables - - ## Severity Rating - - Rate each inconsistency: - - **CRITICAL**: Feature exists in code but completely missing from docs, or docs describe non-existent feature - - **HIGH**: Incorrect information in docs (wrong flag name, wrong description, wrong behavior) - - **MEDIUM**: Outdated information (stale counts, missing new options, incomplete lists) - - **LOW**: Minor style issues, slightly imprecise wording - - ## Output - - Write your analysis as structured JSON. - Include: - - summary: total_count, by_severity counts, clean (true if zero inconsistencies) - - inconsistencies: array of {id (DOC-001 format), severity, category, title, description, source_location, doc_location, fix_description} - - timestamp: current ISO 8601 timestamp - - If no inconsistencies are found, output an empty array with clean=true. - output_artifacts: - - name: consistency-report - path: .wave/output/consistency-report.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/consistency-report.json - schema_path: .wave/contracts/doc-consistency-report.schema.json - on_failure: retry - max_retries: 2 - - - id: compose-report - persona: navigator - dependencies: [analyze-consistency] - memory: - inject_artifacts: - - step: analyze-consistency - artifact: consistency-report - as: report - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Compose a documentation consistency report as a GitHub-ready markdown file. - - ## Check for Inconsistencies - - If the consistency report has `summary.clean == true` (zero inconsistencies): - - Write a short "No inconsistencies found" message as the report - - Write the issue result with skipped=true and reason="clean" - - ## Compose the Report - - Write the report as markdown: - - ``` - ## Documentation Consistency Report - - **Scan date**: - **Inconsistencies found**: - - ### Summary by Severity - | Severity | Count | - |----------|-------| - | Critical | N | - | High | N | - | Medium | N | - | Low | N | - - ### Task List - - For each inconsistency (sorted by severity, critical first): - - [ ] **[DOC-001]** (CRITICAL) Title here — `doc_location` - Fix: fix_description - - --- - *Generated by [Wave](https://github.com/re-cinq/wave) doc-loop pipeline* - ``` - output_artifacts: - - name: report - path: .wave/output/report.md - type: markdown - - - id: publish - persona: craftsman - dependencies: [compose-report] - memory: - inject_artifacts: - - step: compose-report - artifact: report - as: report - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - PUBLISH — create a GitHub issue from the documentation report. - - If the report says "No inconsistencies found", skip issue creation and exit. - - ## Detect Repository - - Run: `gh repo view --json nameWithOwner --jq .nameWithOwner` - - ## Create the Issue - - ```bash - gh issue create \ - --title "docs: documentation consistency report" \ - --body-file .wave/artifacts/report \ - --label "documentation" - ``` - - If the `documentation` label doesn't exist, create without labels. - If any `gh` command fails, log the error and continue. - - ## Capture Result - - Write a JSON status report. - output_artifacts: - - name: issue-result - path: .wave/output/issue-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/issue-result.json - schema_path: .wave/contracts/doc-issue-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: issue - extract_from: .wave/output/issue-result.json - json_path: .issue_url - label: "Documentation Issue" diff --git a/.wave/pipelines/doc-sync.yaml b/.wave/pipelines/doc-sync.yaml deleted file mode 100644 index 1917644..0000000 --- a/.wave/pipelines/doc-sync.yaml +++ /dev/null @@ -1,241 +0,0 @@ -kind: WavePipeline -metadata: - name: doc-sync - description: "Scan documentation for inconsistencies, fix them, and commit to a feature branch" - release: true - -input: - source: cli - example: "sync docs with current implementation" - -steps: - - id: scan-changes - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Scan the repository for documentation inconsistencies: {{ input }} - - ## Process - - 1. **Identify documentation files**: Find all markdown files, README, - CONTRIBUTING, docs/ directory, inline code comments with doc references. - - 2. **Identify code surface area**: Scan for exported functions, CLI commands, - config options, environment variables, API endpoints. - - 3. **Cross-reference**: For each documented feature, verify it exists in code. - For each code feature, verify it's documented. - - 4. **Check accuracy**: Compare documented behavior, flags, options, and - examples against actual implementation. - - 5. **Categorize findings**: - - MISSING_DOCS: Feature in code, not in docs - - STALE_DOCS: Docs reference removed/changed feature - - INACCURATE: Docs describe wrong behavior - - INCOMPLETE: Docs exist but missing details - - Write your findings as structured JSON. - Include: scan_scope, findings (id, type, severity, title, doc_location, code_location, - description, suggested_fix), summary (total_findings, by_type, by_severity, fixable_count), - and timestamp. - output_artifacts: - - name: scan_results - path: .wave/output/doc-scan.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/doc-scan.json - schema_path: .wave/contracts/doc-sync-scan.schema.json - on_failure: retry - max_retries: 2 - - - id: analyze - persona: reviewer - dependencies: [scan-changes] - memory: - inject_artifacts: - - step: scan-changes - artifact: scan_results - as: scan - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Review the doc scan findings and prioritize fixes. - - For each finding: - 1. Verify it's a real inconsistency (not a false positive) - 2. Assess if it can be fixed by editing docs alone - 3. Prioritize: CRITICAL/HIGH first, then by effort - - Produce a fix plan as markdown: - - Ordered list of fixes to apply - - For each: which file to edit, what to change, why - - Skip items that require code changes (docs-only fixes) - - Estimated scope of changes - output_artifacts: - - name: fix_plan - path: .wave/output/fix-plan.md - type: markdown - - - id: fix-docs - persona: craftsman - dependencies: [analyze] - memory: - inject_artifacts: - - step: scan-changes - artifact: scan_results - as: scan - - step: analyze - artifact: fix_plan - as: plan - workspace: - type: worktree - branch: "fix/{{ pipeline_id }}" - exec: - type: prompt - source: | - Fix the documentation inconsistencies on this isolated worktree branch. - - ## Process - - 1. **Apply fixes** following the priority order from the plan: - - Edit documentation files to fix each inconsistency - - Keep changes minimal and focused - - Preserve existing formatting and style - - Do NOT modify source code — docs-only changes - - 2. **Verify**: Ensure no broken links or formatting issues - - 3. **Commit**: - ```bash - git add - git commit -m "docs: sync documentation with implementation - - Fix N documentation inconsistencies found by doc-sync pipeline: - - DOC-001: - - DOC-002: <title> - ..." - ``` - - Write a summary including: - - Branch name - - List of files modified - - Findings fixed vs skipped - - Commit hash - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: false - on_failure: retry - max_retries: 2 - output_artifacts: - - name: result - path: .wave/output/result.md - type: markdown - - - id: create-pr - persona: craftsman - dependencies: [fix-docs] - memory: - inject_artifacts: - - step: scan-changes - artifact: scan_results - as: scan - - step: fix-docs - artifact: result - as: fix_result - workspace: - type: worktree - branch: "fix/{{ pipeline_id }}" - exec: - type: prompt - source: | - Create a pull request for the documentation fixes. - - ## Working Directory - - You are running in an **isolated git worktree** shared with previous pipeline steps. - Your working directory IS the project root. The branch already exists from the - fix-docs step — just push it and create the PR. - - ## SAFETY: Do NOT Modify the Working Tree - - This step MUST NOT run `git checkout`, `git stash`, or any command that changes - the current branch or working tree state. - - ## Instructions - - ### Step 1: Push the Branch - - ```bash - git push -u origin HEAD - ``` - - ### Step 2: Create Pull Request - - ```bash - gh pr create --title "docs: sync documentation with implementation" --body "$(cat <<'PREOF' - ## Summary - - Automated documentation sync to fix inconsistencies between docs and code. - - <summarize: N findings fixed, types of issues addressed> - - ## Changes - - <list each doc file modified and what was fixed> - - ## Findings Addressed - - <list each finding ID, type, and resolution> - - ## Skipped - - <list any findings that were skipped and why> - PREOF - )" - ``` - - ### Step 3: Request Copilot Review (Best-Effort) - - ```bash - gh pr edit --add-reviewer "copilot" 2>/dev/null || true - ``` - - ## CONSTRAINTS - - - Do NOT spawn Task subagents — work directly in the main context - - Do NOT run `git checkout`, `git stash`, or any branch-switching commands - - Do NOT include Co-Authored-By or AI attribution in commits - - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/editing.yaml b/.wave/pipelines/editing.yaml deleted file mode 100644 index 6b48050..0000000 --- a/.wave/pipelines/editing.yaml +++ /dev/null @@ -1,121 +0,0 @@ -kind: WavePipeline -metadata: - name: editing - description: "Apply editorial criticism to a blog post draft" - release: true - -input: - source: cli - examples: - - "69965d55.md | restructure section 3, the sandboxing analogy is weak, needs a concrete before/after code example" - - "698b6f33.md | too long, cut the history section, sharpen the thesis in the intro" - - "69965d55.md | tone is too cautious, rewrite to be more authoritative per the series voice" - -steps: - - id: analyze - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Analyze a blog draft and map editorial criticism to specific actions. - - Input: {{ input }} - - The input format is "filename.md | criticism". - Parse the filename and criticism from the input. - - ## Steps - - 1. **Read the draft**: Read the note file to understand its full content - 2. **Map the structure**: Identify all sections with headings, line ranges, - summaries, and word counts - 3. **Read linked notes**: Follow outgoing links to understand the context - the draft draws from - 4. **Parse the criticism**: Break the author's feedback into discrete editorial concerns - 5. **Create an editorial plan**: For each concern, produce a specific action: - - What type of edit (rewrite, restructure, cut, expand, add, replace_example, - fix_tone, fix_links) - - Which section it targets - - What specifically should change and why - - Which part of the criticism it addresses - - Priority (high/medium/low) - 6. **Order by priority**: High-priority structural changes first, then rewrites, - then polish - - ## Output - - Write the result as JSON to output/editorial-plan.json matching the contract schema. - output_artifacts: - - name: editorial-plan - path: output/editorial-plan.json - type: json - handover: - contract: - type: json_schema - source: output/editorial-plan.json - schema_path: .wave/contracts/editorial-plan.schema.json - on_failure: retry - max_retries: 2 - - - id: revise - persona: scribe - dependencies: [analyze] - memory: - inject_artifacts: - - step: analyze - artifact: editorial-plan - as: plan - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Revise a blog draft by applying the editorial plan. - - Input: {{ input }} - - Parse the filename from the input (format: "filename.md | criticism"). - - Read the editorial plan: cat artifacts/plan - - ## Steps - - 1. **Read the current draft** in full - - 2. **Apply each editorial action** in order from the plan: - - **rewrite**: Rewrite the target section preserving links and references - - **restructure**: Move, merge, or split sections as described - - **cut**: Remove the section or content, clean up any dangling references - - **expand**: Add depth, examples, or explanation to the section - - **add**: Insert new content at the specified location - - **replace_example**: Swap out the example for a better one - - **fix_tone**: Adjust voice (authoritative, not cautionary; framework-oriented) - - **fix_links**: Add missing links or fix broken references - - 3. **Maintain writing standards**: - - One sentence per line - - Contextual link explanations - - Blog series voice: authoritative, framework-oriented, technically substantive - - Keep quotes with proper attribution - - 4. **Commit the revision**: - - `git add *.md` - - `git commit -m "editing: {brief description of main changes}"` - - 5. **Write revision summary** to output/revision-summary.md: - - Draft filename and title - - List of editorial actions applied (EDIT-001, etc.) - - Sections modified - - Word count before and after - output_artifacts: - - name: revision-summary - path: output/revision-summary.md - type: markdown diff --git a/.wave/pipelines/explain.yaml b/.wave/pipelines/explain.yaml deleted file mode 100644 index 919d298..0000000 --- a/.wave/pipelines/explain.yaml +++ /dev/null @@ -1,127 +0,0 @@ -kind: WavePipeline -metadata: - name: explain - description: "Deep-dive explanation of code, modules, or architectural patterns" - release: true - -input: - source: cli - example: "explain the pipeline execution system and how steps are scheduled" - -steps: - - id: explore - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Explore the codebase to understand: {{ input }} - - ## Exploration Steps - - 1. **Find relevant files**: Use Glob and Grep to locate all files related - to the topic. Cast a wide net — include implementations, tests, configs, - and documentation. - - 2. **Trace the call graph**: For key entry points, follow the execution flow. - Note which functions call which, and how data flows through the system. - - 3. **Identify key abstractions**: Find the core types, interfaces, and structs. - Note their responsibilities and relationships. - - 4. **Map dependencies**: Which packages/modules does this depend on? - Which depend on it? - - 5. **Find tests**: Locate test files that exercise this code. - Tests often reveal intended behavior and edge cases. - - 6. **Check configuration**: Find config files, constants, or environment - variables that affect behavior. - - output_artifacts: - - name: exploration - path: .wave/output/exploration.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/exploration.json - schema_path: .wave/contracts/explain-exploration.schema.json - on_failure: retry - max_retries: 2 - - - id: analyze - persona: planner - dependencies: [explore] - memory: - inject_artifacts: - - step: explore - artifact: exploration - as: codebase_map - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Analyze the architecture and design of the explored code. - - Review the injected exploration data, then read the key source files identified. Focus on: - - 1. **Design patterns**: What patterns are used and why? - 2. **Data flow**: How does data enter, transform, and exit? - 3. **Error handling**: What's the error strategy? - 4. **Concurrency model**: Goroutines, channels, mutexes? - 5. **Extension points**: Where can new functionality be added? - 6. **Design decisions**: What trade-offs were made? - output_artifacts: - - name: analysis - path: .wave/output/analysis.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/analysis.json - schema_path: .wave/contracts/explain-analysis.schema.json - on_failure: retry - max_retries: 2 - - - id: document - persona: philosopher - dependencies: [analyze] - memory: - inject_artifacts: - - step: explore - artifact: exploration - as: codebase_map - - step: analyze - artifact: analysis - as: architecture - exec: - type: prompt - source: | - Write a comprehensive explanation document. - - Review the injected exploration and architecture data, then produce a markdown document with: - - 1. **Overview** — One paragraph summary - 2. **Key Concepts** — Core abstractions and terminology (glossary) - 3. **Architecture** — How pieces fit together (include ASCII diagram) - 4. **How It Works** — Step-by-step main execution flow with file:line refs - 5. **Design Decisions** — Decision → Rationale → Trade-off entries - 6. **Extension Guide** — How to add new functionality - 7. **Testing Strategy** — How the code is tested - 8. **Common Pitfalls** — Things that trip people up - - Write for an experienced developer new to this codebase. - Use real file paths, function names, and type names. - output_artifacts: - - name: explanation - path: .wave/output/explanation.md - type: markdown diff --git a/.wave/pipelines/feature.yaml b/.wave/pipelines/feature.yaml deleted file mode 100644 index 0ecc73d..0000000 --- a/.wave/pipelines/feature.yaml +++ /dev/null @@ -1,201 +0,0 @@ -kind: WavePipeline -metadata: - name: feature - description: "Plan, implement, test, and commit a feature to a new branch" - release: false - -input: - source: cli - example: "add a --dry-run flag to the run command" - -steps: - - id: explore - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Explore the codebase to plan this feature: {{ input }} - - ## Exploration - - 1. **Understand the request**: What is being asked? Assess scope - (small = 1-2 files, medium = 3-7, large = 8+). - - 2. **Find related code**: Use Glob and Grep to find files related - to the feature. Note paths, relevance, and key symbols. - - 3. **Identify patterns**: Read key files. Document conventions that - must be followed (naming, error handling, testing patterns). - - 4. **Map affected modules**: Which packages are directly/indirectly affected? - - 5. **Survey tests**: Find related test files, testing patterns, gaps. - - 6. **Assess risks**: Breaking changes, performance, security implications. - - Produce a structured JSON result matching the contract schema. - output_artifacts: - - name: exploration - path: .wave/output/exploration.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/exploration.json - schema_path: .wave/contracts/feature-exploration.schema.json - on_failure: retry - max_retries: 2 - - - id: plan - persona: planner - dependencies: [explore] - memory: - inject_artifacts: - - step: explore - artifact: exploration - as: context - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Create an implementation plan for this feature. - - Feature: {{ input }} - - The codebase exploration has been injected into your workspace. Read it first. - - Break the feature into ordered implementation steps: - - 1. For each step: what to do, which files to modify, acceptance criteria - 2. Dependencies between steps - 3. What tests to write - 4. Complexity estimate per step (S/M/L) - - Produce a structured JSON result matching the contract schema. - output_artifacts: - - name: plan - path: .wave/output/plan.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/plan.json - schema_path: .wave/contracts/feature-plan.schema.json - on_failure: retry - max_retries: 2 - - - id: implement - persona: craftsman - dependencies: [plan] - memory: - inject_artifacts: - - step: explore - artifact: exploration - as: context - - step: plan - artifact: plan - as: plan - workspace: - type: worktree - branch: "feat/{{ pipeline_id }}" - exec: - type: prompt - source: | - Implement the feature on this isolated worktree branch. - - The codebase exploration and implementation plan have been injected into your - workspace. Read them both before starting. - - Feature: {{ input }} - - ## Process - - 1. **Implement step by step** following the plan: - - Follow existing codebase patterns identified in exploration - - Write tests alongside implementation - - After each significant change, verify it compiles: `go build ./...` - - 2. **Run full test suite**: - ```bash - go test ./... -count=1 - ``` - Fix any failures before proceeding. - - 3. **Commit**: - ```bash - git add <specific-files> - git commit -m "<commit_message_suggestion from plan> - - Implementation following plan: - - S01: <title> - - S02: <title> - ..." - ``` - - Commit changes to the worktree branch. - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: true - on_failure: retry - max_retries: 3 - output_artifacts: - - name: result - path: .wave/output/result.md - type: markdown - - # ── Publish ───────────────────────────────────────────────────────── - - id: publish - persona: craftsman - dependencies: [implement] - memory: - inject_artifacts: - - step: implement - artifact: result - as: result - workspace: - type: worktree - branch: "feat/{{ pipeline_id }}" - exec: - type: prompt - source: | - PUBLISH — push the branch and create a pull request. - - ## Steps - - 1. Push the branch: - ```bash - git push -u origin HEAD - ``` - - 2. Create a pull request using the implementation result as context: - ```bash - gh pr create --title "feat: $(git log --format=%s -1)" --body-file .wave/artifacts/result - ``` - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/gh-issue-impl.yaml b/.wave/pipelines/gh-issue-impl.yaml deleted file mode 100644 index 55a5db9..0000000 --- a/.wave/pipelines/gh-issue-impl.yaml +++ /dev/null @@ -1,121 +0,0 @@ -kind: WavePipeline -metadata: - name: gh-issue-impl - description: "Implement a GitHub issue end-to-end: fetch, assess, plan, implement, create PR" - -input: - source: cli - schema: - type: string - description: "GitHub repository and issue number" - example: "re-cinq/wave 42" - -steps: - - id: fetch-assess - persona: implementer - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/github-issue-impl/fetch-assess.md - output_artifacts: - - name: assessment - path: .wave/output/issue-assessment.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/issue-assessment.json - schema_path: .wave/contracts/issue-assessment.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: plan - persona: implementer - dependencies: [fetch-assess] - memory: - inject_artifacts: - - step: fetch-assess - artifact: assessment - as: issue_assessment - workspace: - type: worktree - branch: "{{ pipeline_id }}" - base: main - exec: - type: prompt - source_path: .wave/prompts/github-issue-impl/plan.md - output_artifacts: - - name: impl-plan - path: .wave/output/impl-plan.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/impl-plan.json - schema_path: .wave/contracts/issue-impl-plan.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: implement - persona: craftsman - dependencies: [plan] - memory: - inject_artifacts: - - step: fetch-assess - artifact: assessment - as: issue_assessment - - step: plan - artifact: impl-plan - as: plan - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/github-issue-impl/implement.md - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: true - on_failure: retry - max_retries: 3 - compaction: - trigger: "token_limit_80%" - persona: summarizer - - - id: create-pr - persona: craftsman - dependencies: [implement] - memory: - inject_artifacts: - - step: fetch-assess - artifact: assessment - as: issue_assessment - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/github-issue-impl/create-pr.md - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/gh-issue-research.yaml b/.wave/pipelines/gh-issue-research.yaml deleted file mode 100644 index e92b9e1..0000000 --- a/.wave/pipelines/gh-issue-research.yaml +++ /dev/null @@ -1,255 +0,0 @@ -kind: WavePipeline -metadata: - name: gh-issue-research - description: Research a GitHub issue and post findings as a comment - release: true - -input: - source: cli - example: "re-cinq/wave 42" - schema: - type: string - description: "GitHub repository and issue number (e.g. 'owner/repo number')" - -steps: - - id: fetch-issue - persona: github-analyst - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Fetch the GitHub issue specified in the input: {{ input }} - - The input format is "owner/repo issue_number" (e.g., "re-cinq/CFOAgent 112"). - - Parse the input to extract the repository and issue number. - Use the gh CLI to fetch the issue: - - gh issue view <number> --repo <owner/repo> --json number,title,body,labels,state,author,createdAt,url,comments - - Parse the output and produce structured JSON with the issue content. - Include repository information in the output. - output_artifacts: - - name: issue-content - path: .wave/output/issue-content.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/issue-content.json - schema_path: .wave/contracts/issue-content.schema.json - on_failure: retry - max_retries: 3 - - - id: analyze-topics - persona: researcher - dependencies: [fetch-issue] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: issue - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Analyze the GitHub issue and extract research topics. - - Identify: - 1. Key technical questions that need external research - 2. Domain concepts that require clarification - 3. External dependencies, libraries, or tools to investigate - 4. Similar problems/solutions that might provide guidance - - For each topic, provide: - - A unique ID (TOPIC-001, TOPIC-002, etc.) - - A clear title - - Specific questions to answer (1-5 questions per topic) - - Search keywords for web research - - Priority (critical/high/medium/low based on relevance to solving the issue) - - Category (technical/documentation/best_practices/security/performance/compatibility/other) - - Focus on topics that will provide actionable insights for the issue author. - Limit to 10 most important topics. - output_artifacts: - - name: topics - path: .wave/output/research-topics.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/research-topics.json - schema_path: .wave/contracts/research-topics.schema.json - on_failure: retry - max_retries: 2 - - - id: research-topics - persona: researcher - dependencies: [analyze-topics] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: issue - - step: analyze-topics - artifact: topics - as: research_plan - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Research the topics identified in the research plan. - - For each topic in the research plan: - 1. Execute web searches using the provided keywords - 2. Evaluate source credibility (official docs > authoritative > community) - 3. Extract relevant findings with key points - 4. Include direct quotes where helpful - 5. Rate your confidence in the answer (high/medium/low/inconclusive) - - For each finding: - - Assign a unique ID (FINDING-001, FINDING-002, etc.) - - Provide a summary (20-2000 characters) - - List key points as bullet items - - Include source URL, title, and type - - Rate relevance to the topic (0-1) - - Always include source URLs for attribution. - If a topic yields no useful results, mark confidence as "inconclusive". - Document any gaps in the research. - output_artifacts: - - name: findings - path: .wave/output/research-findings.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/research-findings.json - schema_path: .wave/contracts/research-findings.schema.json - on_failure: retry - max_retries: 2 - - - id: synthesize-report - persona: summarizer - dependencies: [research-topics] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: original_issue - - step: research-topics - artifact: findings - as: research - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Synthesize the research findings into a coherent report for the GitHub issue. - - Create a well-structured research report that includes: - - 1. Executive Summary: - - Brief overview (50-1000 chars) - - Key findings (1-7 bullet points) - - Primary recommendation - - Confidence assessment (high/medium/low) - - 2. Detailed Findings: - - Organize by topic/section - - Include code examples where relevant - - Reference sources using SRC-### IDs - - 3. Recommendations: - - Actionable items with IDs (REC-001, REC-002, etc.) - - Priority and effort estimates - - Maximum 10 recommendations - - 4. Sources: - - List all sources with IDs (SRC-001, SRC-002, etc.) - - Include URL, title, type, and reliability - - 5. Pre-rendered Markdown: - - Generate complete markdown_content field ready for GitHub comment - - Use proper headers, bullet points, and formatting - - Include a header: "## Research Findings (Wave Pipeline)" - - End with sources section - output_artifacts: - - name: report - path: .wave/output/research-report.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/research-report.json - schema_path: .wave/contracts/research-report.schema.json - on_failure: retry - max_retries: 2 - - - id: post-comment - persona: github-commenter - dependencies: [synthesize-report] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: issue - - step: synthesize-report - artifact: report - as: report - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Post the research report as a comment on the GitHub issue. - - Steps: - 1. Read the issue details to get the repository and issue number - 2. Read the report to get the markdown_content - 3. Write the markdown content to a file, then use gh CLI to post the comment: - - # Write to file to avoid shell escaping issues with large markdown - cat > /tmp/comment-body.md << 'COMMENT_EOF' - <markdown_content> - COMMENT_EOF - - gh issue comment <number> --repo <owner/repo> --body-file /tmp/comment-body.md - - 4. Add a footer to the comment: - --- - *Generated by [Wave](https://github.com/re-cinq/wave) issue-research pipeline* - - 5. Capture the result and verify success - 6. If successful, extract the comment URL from the output - - Record the result with: - - success: true/false - - issue_reference: issue number and repository - - comment: id, url, body_length (if successful) - - error: code, message, retryable (if failed) - - timestamp: current time - output_artifacts: - - name: comment-result - path: .wave/output/comment-result.json - type: json - outcomes: - - type: url - extract_from: .wave/output/comment-result.json - json_path: .comment.url - label: "Research Comment" - handover: - contract: - type: json_schema - source: .wave/output/comment-result.json - schema_path: .wave/contracts/comment-result.schema.json - on_failure: retry - max_retries: 3 diff --git a/.wave/pipelines/gh-issue-rewrite.yaml b/.wave/pipelines/gh-issue-rewrite.yaml deleted file mode 100644 index 470f21a..0000000 --- a/.wave/pipelines/gh-issue-rewrite.yaml +++ /dev/null @@ -1,187 +0,0 @@ -kind: WavePipeline -metadata: - name: gh-issue-rewrite - description: "Analyze and rewrite poorly documented GitHub issues" - release: true - -input: - source: cli - example: "re-cinq/wave 42" - schema: - type: string - description: "GitHub repository, optionally with issue number (e.g. 'owner/repo' or 'owner/repo 42')" - -steps: - - id: scan-issues - persona: github-analyst - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - MANDATORY: You MUST call the Bash tool. NEVER say "gh CLI not installed" without trying. - - Input: {{ input }} - - Parse the input to determine the mode: - - If the input contains a number after the repo (e.g. "re-cinq/wave 42"), this is SINGLE ISSUE mode. - Extract the repo (first token) and issue number (second token). - - If the input is just a repo (e.g. "re-cinq/wave"), this is BATCH mode. - - Execute these commands using the Bash tool: - - 1. gh --version - - 2a. SINGLE ISSUE mode: Parse the repo and number from {{ input }}, then run: - gh issue view <NUMBER> --repo <REPO> --json number,title,body,labels,url - 2b. BATCH mode: gh issue list --repo {{ input }} --limit 10 --json number,title,body,labels,url - - After getting REAL results from Bash, analyze issues and score them. - In single issue mode, analyze the one issue. In batch mode, analyze all returned issues. - output_artifacts: - - name: issue_analysis - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-issue-analysis.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: plan-enhancements - persona: github-analyst - dependencies: [scan-issues] - memory: - inject_artifacts: - - step: scan-issues - artifact: issue_analysis - as: analysis - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - The analysis artifact contains poor_quality_issues from the scan step. - - For EACH issue in poor_quality_issues, use gh CLI to fetch the current body: - gh issue view <NUMBER> --repo {{ input }} --json body - - Then create an enhancement plan with: - - issue_number: the issue number - - suggested_title: improved title (or keep original if good) - - body_template: enhanced body text (improve the existing body, add missing sections) - - suggested_labels: appropriate labels - - enhancements: list of changes being made - - Create an enhancement plan with fields: - issues_to_enhance (array of issue_number, suggested_title, body_template, - suggested_labels, enhancements) and total_to_enhance. - output_artifacts: - - name: enhancement_plan - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-enhancement-plan.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: apply-enhancements - persona: github-enhancer - dependencies: [plan-enhancements] - memory: - inject_artifacts: - - step: plan-enhancements - artifact: enhancement_plan - as: plan - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - CRITICAL: You MUST use the Bash tool for all commands. Do NOT generate fake output. - - Step 1: Use Bash tool to verify gh works: - gh --version - - Step 2: For EACH issue in the plan, use Bash tool to apply changes: - - If suggested_title differs from current: gh issue edit <N> --repo {{ input }} --title "suggested_title" - - If body_template is provided: gh issue edit <N> --repo {{ input }} --body "body_template" - - If suggested_labels: gh issue edit <N> --repo {{ input }} --add-label "label1,label2" - - Step 4: For each issue, capture the URL: gh issue view <N> --repo {{ input }} --json url --jq .url - - Step 5: Record the results with fields: enhanced_issues (each with issue_number, - success, changes_made, url), total_attempted, total_successful, total_failed. - output_artifacts: - - name: enhancement_results - path: .wave/artifact.json - type: json - required: true - outcomes: - - type: issue - extract_from: .wave/artifact.json - json_path: .enhanced_issues[0].url - label: "Enhanced Issue" - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-enhancement-results.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: verify-enhancements - persona: github-analyst - dependencies: [apply-enhancements] - memory: - inject_artifacts: - - step: apply-enhancements - artifact: enhancement_results - as: results - - step: scan-issues - artifact: issue_analysis - as: original_analysis - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - For each enhanced issue, verify with: gh issue view <N> --repo {{ input }} --json title,labels - - Compile a verification report with fields: - total_enhanced, successful_enhancements, failed_enhancements, and summary. - output_artifacts: - - name: verification_report - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-verification-report.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false diff --git a/.wave/pipelines/gh-issue-update.yaml b/.wave/pipelines/gh-issue-update.yaml deleted file mode 100644 index d60dc5e..0000000 --- a/.wave/pipelines/gh-issue-update.yaml +++ /dev/null @@ -1,184 +0,0 @@ -kind: WavePipeline -metadata: - name: gh-issue-update - description: "Refresh a stale GitHub issue by comparing it against recent codebase changes" - release: true - -input: - source: cli - example: "re-cinq/wave 45 -- acceptance criteria are outdated after the worktree refactor" - schema: - type: string - description: "owner/repo number [-- optional criticism or direction]" - -steps: - - id: gather-context - persona: github-analyst - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - MANDATORY: You MUST call the Bash tool. NEVER say "gh CLI not installed" without trying. - - Input: {{ input }} - - Parse the input: - - Split on " -- " to separate the repo+number from optional criticism. - - The first part is "<owner/repo> <number>". Extract REPO (first token) and NUMBER (second token). - - If there is text after " -- ", that is the user's CRITICISM about what's wrong with the issue. - - If there is no " -- ", criticism is empty. - - Execute these commands using the Bash tool: - - 1. gh --version - - 2. Fetch the full issue: - gh issue view NUMBER --repo REPO --json number,title,body,labels,url,createdAt,comments - - 3. Get commits since the issue was created (cap at 100): - git log --since="<createdAt>" --oneline -100 - - 4. Get releases since the issue was created: - gh release list --repo REPO --limit 20 - Then filter to only releases after the issue's createdAt date. - - 5. Scan the issue body for file path references (anything matching patterns like - `internal/...`, `cmd/...`, `.wave/...`, or backtick-quoted paths). - For each referenced file, check if it still exists using `ls -la <path>`. - - 6. Read CLAUDE.md for current project context: - Read the file CLAUDE.md from the repository root. - - After gathering ALL data, produce a JSON result matching the contract schema. - output_artifacts: - - name: issue_context - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/issue-update-context.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: draft-update - persona: github-analyst - dependencies: [gather-context] - memory: - inject_artifacts: - - step: gather-context - artifact: issue_context - as: context - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - MANDATORY: You MUST call the Bash tool for any commands. NEVER generate fake output. - - The context artifact contains the gathered issue context. - - Your task: Compare the original issue against the codebase changes and draft an updated version. - - Step 1: Analyze each section of the issue body. Classify each as: - - STILL_VALID: Content is accurate and up-to-date - - OUTDATED: Content references old behavior, removed files, or superseded patterns - - INCOMPLETE: Content is partially correct but missing recent developments - - WRONG: Content is factually incorrect given current codebase state - - Step 2: If there is user criticism (non-empty "criticism" field), address EVERY point raised. - The criticism takes priority — it represents what the issue author thinks is wrong. - - Step 3: Draft the updated issue: - - Preserve sections classified as STILL_VALID (do not rewrite what works) - - Rewrite OUTDATED and WRONG sections to reflect current reality - - Expand INCOMPLETE sections with missing information - - If the title needs updating, draft a new title - - Append a "---\n**Changes since original**" section at the bottom listing what changed and why - - Step 4: If file paths in the issue body are now missing (from referenced_files.missing), - update or remove those references. - - Produce a JSON result matching the contract schema. - output_artifacts: - - name: update_draft - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/issue-update-draft.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: apply-update - persona: github-enhancer - dependencies: [draft-update] - memory: - inject_artifacts: - - step: draft-update - artifact: update_draft - as: draft - - step: gather-context - artifact: issue_context - as: context - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - CRITICAL: You MUST use the Bash tool for all commands. Do NOT generate fake output. - - Step 1: Use Bash tool to verify gh works: - gh --version - - Step 2: Extract the repo as "<owner>/<name>" and the issue number from the available artifacts. - - Step 3: Apply the update: - - If title_changed is true: - gh issue edit <NUMBER> --repo <REPO> --title "<updated_title>" - - Write the updated_body to a temp file, then apply it: - Write updated_body to /tmp/issue-body.md - gh issue edit <NUMBER> --repo <REPO> --body-file /tmp/issue-body.md - - Clean up /tmp/issue-body.md after applying. - - Step 4: Verify the update was applied: - gh issue view <NUMBER> --repo <REPO> --json number,title,body,url - - Compare the returned title and body against what was intended. Flag any discrepancies. - - Step 5: Record the results as a JSON object matching the contract schema. - output_artifacts: - - name: update_result - path: .wave/artifact.json - type: json - required: true - outcomes: - - type: issue - extract_from: .wave/artifact.json - json_path: .url - label: "Updated Issue" - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/issue-update-result.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false diff --git a/.wave/pipelines/gt-issue-impl.yaml b/.wave/pipelines/gt-issue-impl.yaml deleted file mode 100644 index 715ac23..0000000 --- a/.wave/pipelines/gt-issue-impl.yaml +++ /dev/null @@ -1,121 +0,0 @@ -kind: WavePipeline -metadata: - name: gt-issue-impl - description: "Implement a Gitea issue end-to-end: fetch, assess, plan, implement, create PR" - -input: - source: cli - schema: - type: string - description: "Gitea repository and issue number" - example: "public/librenotes 42" - -steps: - - id: fetch-assess - persona: implementer - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/gitea-issue-impl/fetch-assess.md - output_artifacts: - - name: assessment - path: .wave/output/issue-assessment.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/issue-assessment.json - schema_path: .wave/contracts/issue-assessment.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: plan - persona: implementer - dependencies: [fetch-assess] - memory: - inject_artifacts: - - step: fetch-assess - artifact: assessment - as: issue_assessment - workspace: - type: worktree - branch: "{{ pipeline_id }}" - base: main - exec: - type: prompt - source_path: .wave/prompts/gitea-issue-impl/plan.md - output_artifacts: - - name: impl-plan - path: .wave/output/impl-plan.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/impl-plan.json - schema_path: .wave/contracts/issue-impl-plan.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: implement - persona: craftsman - dependencies: [plan] - memory: - inject_artifacts: - - step: fetch-assess - artifact: assessment - as: issue_assessment - - step: plan - artifact: impl-plan - as: plan - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/gitea-issue-impl/implement.md - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: true - on_failure: retry - max_retries: 3 - compaction: - trigger: "token_limit_80%" - persona: summarizer - - - id: create-pr - persona: craftsman - dependencies: [implement] - memory: - inject_artifacts: - - step: fetch-assess - artifact: assessment - as: issue_assessment - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/gitea-issue-impl/create-pr.md - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/gt-issue-research.yaml b/.wave/pipelines/gt-issue-research.yaml deleted file mode 100644 index c2bbc50..0000000 --- a/.wave/pipelines/gt-issue-research.yaml +++ /dev/null @@ -1,257 +0,0 @@ -kind: WavePipeline -metadata: - name: gt-issue-research - description: Research a Gitea issue and post findings as a comment - release: true - -input: - source: cli - example: "public/librenotes 42" - schema: - type: string - description: "Gitea repository and issue number (e.g. 'owner/repo number')" - -steps: - - id: fetch-issue - persona: gitea-analyst - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Fetch the Gitea issue specified in the input: {{ input }} - - The input format is "owner/repo issue_number" (e.g., "public/librenotes 42"). - - Parse the input to extract the repository and issue number. - Use the tea CLI to fetch the issue: - - tea issues list --repo <owner/repo> -o json -f index,title,body,labels,state,url --limit 50 - - Then filter the JSON output for the issue matching the requested number. - - Parse the output and produce structured JSON with the issue content. - Include repository information in the output. - output_artifacts: - - name: issue-content - path: .wave/output/issue-content.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/issue-content.json - schema_path: .wave/contracts/issue-content.schema.json - on_failure: retry - max_retries: 3 - - - id: analyze-topics - persona: researcher - dependencies: [fetch-issue] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: issue - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Analyze the Gitea issue and extract research topics. - - Identify: - 1. Key technical questions that need external research - 2. Domain concepts that require clarification - 3. External dependencies, libraries, or tools to investigate - 4. Similar problems/solutions that might provide guidance - - For each topic, provide: - - A unique ID (TOPIC-001, TOPIC-002, etc.) - - A clear title - - Specific questions to answer (1-5 questions per topic) - - Search keywords for web research - - Priority (critical/high/medium/low based on relevance to solving the issue) - - Category (technical/documentation/best_practices/security/performance/compatibility/other) - - Focus on topics that will provide actionable insights for the issue author. - Limit to 10 most important topics. - output_artifacts: - - name: topics - path: .wave/output/research-topics.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/research-topics.json - schema_path: .wave/contracts/research-topics.schema.json - on_failure: retry - max_retries: 2 - - - id: research-topics - persona: researcher - dependencies: [analyze-topics] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: issue - - step: analyze-topics - artifact: topics - as: research_plan - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Research the topics identified in the research plan. - - For each topic in the research plan: - 1. Execute web searches using the provided keywords - 2. Evaluate source credibility (official docs > authoritative > community) - 3. Extract relevant findings with key points - 4. Include direct quotes where helpful - 5. Rate your confidence in the answer (high/medium/low/inconclusive) - - For each finding: - - Assign a unique ID (FINDING-001, FINDING-002, etc.) - - Provide a summary (20-2000 characters) - - List key points as bullet items - - Include source URL, title, and type - - Rate relevance to the topic (0-1) - - Always include source URLs for attribution. - If a topic yields no useful results, mark confidence as "inconclusive". - Document any gaps in the research. - output_artifacts: - - name: findings - path: .wave/output/research-findings.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/research-findings.json - schema_path: .wave/contracts/research-findings.schema.json - on_failure: retry - max_retries: 2 - - - id: synthesize-report - persona: summarizer - dependencies: [research-topics] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: original_issue - - step: research-topics - artifact: findings - as: research - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Synthesize the research findings into a coherent report for the Gitea issue. - - Create a well-structured research report that includes: - - 1. Executive Summary: - - Brief overview (50-1000 chars) - - Key findings (1-7 bullet points) - - Primary recommendation - - Confidence assessment (high/medium/low) - - 2. Detailed Findings: - - Organize by topic/section - - Include code examples where relevant - - Reference sources using SRC-### IDs - - 3. Recommendations: - - Actionable items with IDs (REC-001, REC-002, etc.) - - Priority and effort estimates - - Maximum 10 recommendations - - 4. Sources: - - List all sources with IDs (SRC-001, SRC-002, etc.) - - Include URL, title, type, and reliability - - 5. Pre-rendered Markdown: - - Generate complete markdown_content field ready for Gitea comment - - Use proper headers, bullet points, and formatting - - Include a header: "## Research Findings (Wave Pipeline)" - - End with sources section - output_artifacts: - - name: report - path: .wave/output/research-report.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/research-report.json - schema_path: .wave/contracts/research-report.schema.json - on_failure: retry - max_retries: 2 - - - id: post-comment - persona: gitea-commenter - dependencies: [synthesize-report] - memory: - inject_artifacts: - - step: fetch-issue - artifact: issue-content - as: issue - - step: synthesize-report - artifact: report - as: report - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - Post the research report as a comment on the Gitea issue. - - Steps: - 1. Read the issue details to get the repository and issue number - 2. Read the report to get the markdown_content - 3. Write the markdown content to a file, then use tea CLI to post the comment: - - # Write to file to avoid shell escaping issues with large markdown - cat > /tmp/comment-body.md << 'COMMENT_EOF' - <markdown_content> - COMMENT_EOF - - tea comment <number> "$(cat /tmp/comment-body.md)" --repo <owner/repo> - - 4. Add a footer to the comment: - --- - *Generated by [Wave](https://github.com/re-cinq/wave) issue-research pipeline* - - 5. Capture the result and verify success - 6. Clean up temp files - - Record the result with: - - success: true/false - - issue_reference: issue number and repository - - comment: id, url, body_length (if successful) - - error: code, message, retryable (if failed) - - timestamp: current time - output_artifacts: - - name: comment-result - path: .wave/output/comment-result.json - type: json - outcomes: - - type: url - extract_from: .wave/output/comment-result.json - json_path: .comment.url - label: "Research Comment" - handover: - contract: - type: json_schema - source: .wave/output/comment-result.json - schema_path: .wave/contracts/comment-result.schema.json - on_failure: retry - max_retries: 3 diff --git a/.wave/pipelines/gt-issue-rewrite.yaml b/.wave/pipelines/gt-issue-rewrite.yaml deleted file mode 100644 index a0b0a61..0000000 --- a/.wave/pipelines/gt-issue-rewrite.yaml +++ /dev/null @@ -1,194 +0,0 @@ -kind: WavePipeline -metadata: - name: gt-issue-rewrite - description: "Analyze and rewrite poorly documented Gitea issues" - release: true - -input: - source: cli - example: "public/librenotes 42" - schema: - type: string - description: "Gitea repository, optionally with issue number (e.g. 'owner/repo' or 'owner/repo 42')" - -steps: - - id: scan-issues - persona: gitea-analyst - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - MANDATORY: You MUST call the Bash tool. NEVER say "tea CLI not installed" without trying. - - Input: {{ input }} - - Parse the input to determine the mode: - - If the input contains a number after the repo (e.g. "public/librenotes 42"), this is SINGLE ISSUE mode. - Extract the repo (first token) and issue number (second token). - - If the input is just a repo (e.g. "public/librenotes"), this is BATCH mode. - - Execute these commands using the Bash tool: - - 1. tea --version - - 2a. SINGLE ISSUE mode: Parse the repo and number from {{ input }}, then run: - tea issues list --repo <REPO> -o json -f index,title,body,labels,url --limit 50 - Then filter the JSON for the issue matching the requested number. - 2b. BATCH mode: - tea issues list --repo {{ input }} --limit 10 -o json -f index,title,body,labels,url - - After getting REAL results from Bash, analyze issues and score them. - In single issue mode, analyze the one issue. In batch mode, analyze all returned issues. - output_artifacts: - - name: issue_analysis - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-issue-analysis.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: plan-enhancements - persona: gitea-analyst - dependencies: [scan-issues] - memory: - inject_artifacts: - - step: scan-issues - artifact: issue_analysis - as: analysis - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - The analysis artifact contains poor_quality_issues from the scan step. - - For EACH issue in poor_quality_issues, use tea CLI to fetch the current body: - tea issues list --repo {{ input }} -o json -f index,body --limit 50 - Then filter for the specific issue number. - - Then create an enhancement plan with: - - issue_number: the issue number - - suggested_title: improved title (or keep original if good) - - body_template: enhanced body text (improve the existing body, add missing sections) - - suggested_labels: appropriate labels - - enhancements: list of changes being made - - Create an enhancement plan with fields: - issues_to_enhance (array of issue_number, suggested_title, body_template, - suggested_labels, enhancements) and total_to_enhance. - output_artifacts: - - name: enhancement_plan - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-enhancement-plan.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: apply-enhancements - persona: gitea-enhancer - dependencies: [plan-enhancements] - memory: - inject_artifacts: - - step: plan-enhancements - artifact: enhancement_plan - as: plan - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - CRITICAL: You MUST use the Bash tool for all commands. Do NOT generate fake output. - - Step 1: Use Bash tool to verify tea works: - tea --version - - Step 2: For EACH issue in the plan, use Bash tool to apply changes: - - If suggested_title differs from current: tea issues edit <N> --repo {{ input }} -t "suggested_title" - - If body_template is provided: tea issues edit <N> --repo {{ input }} -d "body_template" - - If suggested_labels: tea issues edit <N> --repo {{ input }} -L "label1,label2" - - Step 3: For each issue, capture the URL from the issue list: - tea issues list --repo {{ input }} -o json -f index,url --limit 50 - Then filter for the specific issue number. - - Step 4: Record the results with fields: enhanced_issues (each with issue_number, - success, changes_made, url), total_attempted, total_successful, total_failed. - output_artifacts: - - name: enhancement_results - path: .wave/artifact.json - type: json - required: true - outcomes: - - type: issue - extract_from: .wave/artifact.json - json_path: .enhanced_issues[0].url - label: "Enhanced Issue" - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-enhancement-results.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: verify-enhancements - persona: gitea-analyst - dependencies: [apply-enhancements] - memory: - inject_artifacts: - - step: apply-enhancements - artifact: enhancement_results - as: results - - step: scan-issues - artifact: issue_analysis - as: original_analysis - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - For each enhanced issue, verify with: - tea issues list --repo {{ input }} -o json -f index,title,labels --limit 50 - Then filter for the specific issue numbers. - - Compile a verification report with fields: - total_enhanced, successful_enhancements, failed_enhancements, and summary. - output_artifacts: - - name: verification_report - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/github-verification-report.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false diff --git a/.wave/pipelines/gt-issue-update.yaml b/.wave/pipelines/gt-issue-update.yaml deleted file mode 100644 index e17ef6f..0000000 --- a/.wave/pipelines/gt-issue-update.yaml +++ /dev/null @@ -1,182 +0,0 @@ -kind: WavePipeline -metadata: - name: gt-issue-update - description: "Refresh a stale Gitea issue by comparing it against recent codebase changes" - release: true - -input: - source: cli - example: "public/librenotes 45 -- acceptance criteria are outdated after the worktree refactor" - schema: - type: string - description: "owner/repo number [-- optional criticism or direction]" - -steps: - - id: gather-context - persona: gitea-analyst - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - MANDATORY: You MUST call the Bash tool. NEVER say "tea CLI not installed" without trying. - - Input: {{ input }} - - Parse the input: - - Split on " -- " to separate the repo+number from optional criticism. - - The first part is "<owner/repo> <number>". Extract REPO (first token) and NUMBER (second token). - - If there is text after " -- ", that is the user's CRITICISM about what's wrong with the issue. - - If there is no " -- ", criticism is empty. - - Execute these commands using the Bash tool: - - 1. tea --version - - 2. Fetch the full issue: - tea issues list --repo REPO -o json -f index,title,body,labels,state,url --limit 50 - Then filter the JSON for the issue matching NUMBER. - - 3. Get commits since the issue was created (cap at 100): - git log --since="<created_at>" --oneline -100 - - 4. Scan the issue body for file path references (anything matching patterns like - `internal/...`, `cmd/...`, `.wave/...`, or backtick-quoted paths). - For each referenced file, check if it still exists using `ls -la <path>`. - - 5. Read CLAUDE.md for current project context: - Read the file CLAUDE.md from the repository root. - - After gathering ALL data, produce a JSON result matching the contract schema. - output_artifacts: - - name: issue_context - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/issue-update-context.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: draft-update - persona: gitea-analyst - dependencies: [gather-context] - memory: - inject_artifacts: - - step: gather-context - artifact: issue_context - as: context - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - MANDATORY: You MUST call the Bash tool for any commands. NEVER generate fake output. - - The context artifact contains the gathered issue context. - - Your task: Compare the original issue against the codebase changes and draft an updated version. - - Step 1: Analyze each section of the issue body. Classify each as: - - STILL_VALID: Content is accurate and up-to-date - - OUTDATED: Content references old behavior, removed files, or superseded patterns - - INCOMPLETE: Content is partially correct but missing recent developments - - WRONG: Content is factually incorrect given current codebase state - - Step 2: If there is user criticism (non-empty "criticism" field), address EVERY point raised. - The criticism takes priority — it represents what the issue author thinks is wrong. - - Step 3: Draft the updated issue: - - Preserve sections classified as STILL_VALID (do not rewrite what works) - - Rewrite OUTDATED and WRONG sections to reflect current reality - - Expand INCOMPLETE sections with missing information - - If the title needs updating, draft a new title - - Append a "---\n**Changes since original**" section at the bottom listing what changed and why - - Step 4: If file paths in the issue body are now missing (from referenced_files.missing), - update or remove those references. - - Produce a JSON result matching the contract schema. - output_artifacts: - - name: update_draft - path: .wave/artifact.json - type: json - required: true - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/issue-update-draft.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false - - - id: apply-update - persona: gitea-enhancer - dependencies: [draft-update] - memory: - inject_artifacts: - - step: draft-update - artifact: update_draft - as: draft - - step: gather-context - artifact: issue_context - as: context - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - CRITICAL: You MUST use the Bash tool for all commands. Do NOT generate fake output. - - Step 1: Use Bash tool to verify tea works: - tea --version - - Step 2: Extract the repo and issue number from the available artifacts. - - Step 3: Apply the update: - - If title_changed is true: - tea issues edit <NUMBER> --repo <REPO> -t "<updated_title>" - - Write the updated_body to a temp file, then apply it: - Write updated_body to /tmp/issue-body.md - tea issues edit <NUMBER> --repo <REPO> -d "$(cat /tmp/issue-body.md)" - - Clean up /tmp/issue-body.md after applying. - - Step 4: Verify the update was applied: - tea issues list --repo <REPO> -o json -f index,title,body,url --limit 50 - Then filter for the specific issue number. - - Compare the returned title and body against what was intended. Flag any discrepancies. - - Step 5: Record the results as a JSON object matching the contract schema. - output_artifacts: - - name: update_result - path: .wave/artifact.json - type: json - required: true - outcomes: - - type: issue - extract_from: .wave/artifact.json - json_path: .url - label: "Updated Issue" - handover: - max_retries: 1 - contract: - type: json_schema - schema_path: .wave/contracts/issue-update-result.schema.json - validate: true - must_pass: true - allow_recovery: true - recovery_level: progressive - progressive_validation: false diff --git a/.wave/pipelines/hello-world.yaml b/.wave/pipelines/hello-world.yaml deleted file mode 100644 index 28a1592..0000000 --- a/.wave/pipelines/hello-world.yaml +++ /dev/null @@ -1,51 +0,0 @@ -kind: WavePipeline -metadata: - name: hello-world - description: "Simple test pipeline to verify Wave is working" - -input: - source: cli - example: "testing Wave" - -steps: - - id: greet - persona: craftsman - exec: - type: prompt - source: | - You are a simple greeting bot. The user said: "{{ input }}" - - Your final response must be ONLY this text (nothing else - no explanation, no markdown): - - Hello from Wave! Your message was: {{ input }} - output_artifacts: - - name: greeting - path: greeting.txt - type: text - - - id: verify - persona: navigator - dependencies: [greet] - memory: - inject_artifacts: - - step: greet - artifact: greeting - as: greeting_file - exec: - type: prompt - source: | - Verify the greeting artifact exists and contains content. - - Output a JSON result confirming verification status. - output_artifacts: - - name: result - path: .wave/output/result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/result.json - schema_path: .wave/contracts/hello-world-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 diff --git a/.wave/pipelines/hotfix.yaml b/.wave/pipelines/hotfix.yaml deleted file mode 100644 index 2089020..0000000 --- a/.wave/pipelines/hotfix.yaml +++ /dev/null @@ -1,88 +0,0 @@ -kind: WavePipeline -metadata: - name: hotfix - description: "Quick investigation and fix for production issues" - -input: - source: cli - example: "fix panic in pipeline executor when step has nil context" - -steps: - - id: investigate - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Investigate this production issue: {{ input }} - - 1. Search for related code paths - 2. Check recent commits that may have introduced the bug - 3. Identify the root cause - 4. Assess blast radius (what else could be affected) - output_artifacts: - - name: findings - path: .wave/output/findings.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/findings.json - schema_path: .wave/contracts/findings.schema.json - on_failure: retry - max_retries: 2 - - - id: fix - persona: craftsman - dependencies: [investigate] - memory: - inject_artifacts: - - step: investigate - artifact: findings - as: investigation - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Fix the production issue based on the investigation findings. - - Requirements: - 1. Apply the minimal fix - don't refactor surrounding code - 2. Add a regression test that would have caught this bug - 3. Ensure all existing tests still pass - 4. Document the fix in a commit-ready message - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - - must_pass: true - on_failure: retry - max_retries: 3 - - - id: verify - persona: auditor - dependencies: [fix] - exec: - type: prompt - source: | - Verify the hotfix: - - 1. Is the fix minimal and focused? (no unrelated changes) - 2. Does the regression test actually test the reported issue? - 3. Are there other code paths with the same vulnerability? - 4. Is the fix safe for production deployment? - - Output a go/no-go recommendation with reasoning. - output_artifacts: - - name: verdict - path: .wave/output/verdict.md - type: markdown diff --git a/.wave/pipelines/housekeeping.yaml b/.wave/pipelines/housekeeping.yaml deleted file mode 100644 index d1f0289..0000000 --- a/.wave/pipelines/housekeeping.yaml +++ /dev/null @@ -1,122 +0,0 @@ -kind: WavePipeline -metadata: - name: housekeeping - description: "Audit and repair Zettelkasten link health, orphans, and index completeness" - release: true - -input: - source: cli - examples: - - "" - - "orphans only" - - "dangling links only" - -steps: - - id: audit - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Audit the Zettelkasten for health issues. - - ## Steps - - 1. **Find orphans**: Run `notesium list --orphans` - - For each orphan, read the note to understand its content - - Suggest which existing note it should be linked from - - 2. **Find dangling links**: Run `notesium links --dangling` - - For each dangling link, identify the source file and broken target - - Suggest whether to retarget or remove the link - - 3. **Get stats**: Run `notesium stats` - - Record total notes, total links, label count - - 4. **Check index completeness**: Read the index note - - Compare sections listed in the index against known sections - - Identify any sections or major topics missing from the index - - 5. **Find dead ends**: Run `notesium links` to get all links - - Identify notes that have outgoing links but no incoming links - - These are reachable only via search, not by traversal - - ## Output - - Write the result as JSON to output/audit-report.json matching the contract schema. - Include: - - orphans: list with filename, title, suggested_connection - - dangling_links: list with source_filename, target_filename, link_text, suggested_fix - - stats: total_notes, total_links, label_notes, orphan_count, dangling_count, avg_links_per_note - - index_gaps: list with section, description, suggested_entry_point - - dead_ends: list with filename, title, outgoing_links count - - timestamp: current ISO 8601 timestamp - output_artifacts: - - name: audit-report - path: output/audit-report.json - type: json - handover: - contract: - type: json_schema - source: output/audit-report.json - schema_path: .wave/contracts/audit-report.schema.json - on_failure: retry - max_retries: 2 - - - id: repair - persona: scribe - dependencies: [audit] - memory: - inject_artifacts: - - step: audit - artifact: audit-report - as: audit - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Repair issues found in the Zettelkasten audit. - - Read the audit report: cat artifacts/audit - - ## Steps - - 1. **Fix orphans**: For each orphan in the report: - - Read the orphan note and the suggested_connection note - - Add a contextual link from the suggested note to the orphan - - Explain *why* the connection exists - - 2. **Fix dangling links**: For each dangling link: - - If suggested_fix is "retarget": find the correct target note and update the link - - If suggested_fix is "remove": delete the broken link from the source file - - 3. **Fix index gaps**: For each index gap: - - Read the index note - - Add the missing keyword → entry point mapping - - Use the suggested_entry_point from the audit - - 4. **Skip dead ends** if the count is large — only fix the most obvious ones - (notes that clearly belong in an existing Folgezettel sequence) - - 5. **Commit all fixes**: - - `git add *.md` - - Count the total issues fixed - - `git commit -m "housekeeping: fix {n} issues"` - - 6. **Write repair log** to output/repair-log.md: - - Number of orphans linked - - Number of dangling links fixed - - Number of index entries added - - List of files modified - output_artifacts: - - name: repair-log - path: output/repair-log.md - type: markdown diff --git a/.wave/pipelines/improve.yaml b/.wave/pipelines/improve.yaml deleted file mode 100644 index 693f060..0000000 --- a/.wave/pipelines/improve.yaml +++ /dev/null @@ -1,117 +0,0 @@ -kind: WavePipeline -metadata: - name: improve - description: "Analyze code and apply targeted improvements" - release: true - -input: - source: cli - example: "improve error handling in internal/pipeline" - -steps: - - id: assess - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Assess the code for improvement opportunities: {{ input }} - - ## Assessment Areas - - 1. **Code quality**: Readability, naming, structure, duplication - 2. **Error handling**: Missing checks, swallowed errors, unclear messages - 3. **Performance**: Unnecessary allocations, N+1 patterns, missing caching - 4. **Testability**: Hard-to-test code, missing interfaces, tight coupling - 5. **Robustness**: Missing nil checks, race conditions, resource leaks - 6. **Maintainability**: Complex functions, deep nesting, magic numbers - - For each finding, assess: - - Impact: how much does fixing it improve the code? - - Effort: how hard is the fix? - - Risk: could the fix introduce regressions? - output_artifacts: - - name: assessment - path: .wave/output/assessment.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/assessment.json - schema_path: .wave/contracts/improvement-assessment.schema.json - on_failure: retry - max_retries: 2 - - - id: implement - persona: craftsman - dependencies: [assess] - memory: - inject_artifacts: - - step: assess - artifact: assessment - as: findings - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Apply the recommended improvements to the codebase. - - ## Rules - - 1. **Start with quick wins**: Apply trivial/small effort fixes first - 2. **One improvement at a time**: Make each change, verify it compiles, - then move to the next - 3. **Preserve behavior**: Improvements must not change external behavior - 4. **Run tests**: After each significant change, run relevant tests - 5. **Skip high-risk items**: Do not apply changes rated risk=high - without explicit test coverage - 6. **Document changes**: Track what was changed and why - - Focus on the findings with the best impact-to-effort ratio. - Do NOT refactor beyond what was identified in the assessment. - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: true - on_failure: retry - max_retries: 3 - - - id: verify - persona: auditor - dependencies: [implement] - memory: - inject_artifacts: - - step: assess - artifact: assessment - as: original_findings - exec: - type: prompt - source: | - Verify the improvements were applied correctly. - - For each improvement that was applied: - 1. Is the fix correct and complete? - 2. Does it actually address the identified issue? - 3. Were any new issues introduced? - 4. Are tests still passing? - - For improvements NOT applied, confirm they were appropriately skipped. - - Produce a verification report covering: - - Applied improvements (with before/after) - - Skipped items (with justification) - - New issues found (if any) - - Overall quality delta assessment - output_artifacts: - - name: verification - path: .wave/output/verification.md - type: markdown diff --git a/.wave/pipelines/ingest.yaml b/.wave/pipelines/ingest.yaml deleted file mode 100644 index df4d180..0000000 --- a/.wave/pipelines/ingest.yaml +++ /dev/null @@ -1,173 +0,0 @@ -kind: WavePipeline -metadata: - name: ingest - description: "Ingest a web article into the Zettelkasten as bibliographic and permanent notes" - release: true - -input: - source: cli - examples: - - "https://simonwillison.net/2026/Feb/7/software-factory/" - - "https://langfuse.com/blog/2025-03-observability" - - "https://arxiv.org/abs/2401.12345" - -steps: - - id: fetch - persona: scout - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Fetch and extract structured content from a web article. - - URL: {{ input }} - - ## Steps - - 1. Use WebFetch to retrieve the article content - 2. Extract: - - title: article title - - author: author name (look in byline, meta tags, about section) - - date: publication date - - summary: 50-3000 character summary of the article - - key_concepts: list of key concepts with name and description - - notable_quotes: direct quotes with context - - author_year_key: generate AuthorYear key (e.g., Willison2026) - 3. If the author name is unclear, use the domain name as author - - ## Output - - Write the result as JSON to output/source-extract.json matching the contract schema. - output_artifacts: - - name: source-extract - path: output/source-extract.json - type: json - handover: - contract: - type: json_schema - source: output/source-extract.json - schema_path: .wave/contracts/source-extract.schema.json - on_failure: retry - max_retries: 2 - - - id: connect - persona: navigator - dependencies: [fetch] - memory: - inject_artifacts: - - step: fetch - artifact: source-extract - as: source - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Find connections between extracted source content and existing Zettelkasten notes. - - Read the source extract: cat artifacts/source - - ## Steps - - 1. For each key concept in the source, search for related notes: - - `notesium lines --filter="concept_name"` - - Read the most relevant matches - 2. Identify the Folgezettel neighborhood where new notes belong: - - What section does this content fit in? - - What would be the parent note? - - What Folgezettel address should new notes get? - 3. Check if the index note needs updating - 4. Determine link directions (should new note link to existing, or existing link to new?) - - ## Output - - Write the result as JSON to output/connections.json matching the contract schema. - Include: - - source_title: title of the source being connected - - related_notes: list of related existing notes with filename, title, - folgezettel_address, relationship explanation, and link_direction - - suggested_placements: where new notes should go in the Folgezettel - with address, parent_note, section, rationale, and concept - - index_update_needed: boolean - - suggested_index_entries: new entries if needed - - timestamp: current ISO 8601 timestamp - output_artifacts: - - name: connections - path: output/connections.json - type: json - handover: - contract: - type: json_schema - source: output/connections.json - schema_path: .wave/contracts/connections.schema.json - on_failure: retry - max_retries: 2 - - - id: create - persona: scribe - dependencies: [connect] - memory: - inject_artifacts: - - step: fetch - artifact: source-extract - as: source - - step: connect - artifact: connections - as: connections - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Create Zettelkasten notes from an ingested web source. - - Read the artifacts: - cat artifacts/source - cat artifacts/connections - - ## Steps - - 1. **Create the bibliographic note**: - - Use `notesium new` for the filename - - Title: `# AuthorYear` using the author_year_key from the source extract - - Content: source URL, author, date, summary, key quotes - - One sentence per line - - 2. **Create permanent notes** for key ideas that warrant standalone Zettel: - - Use `notesium new` for each - - Use the Folgezettel address from suggested_placements - - Title: `# {address} {Concept-Name}` - - Write in own words — transform, don't copy - - Add contextual links to related notes (explain *why* the connection exists) - - Link back to the bibliographic note - - 3. **Update existing notes** if bidirectional links are suggested: - - Add links from existing notes to the new permanent notes - - Include contextual explanation for each link - - 4. **Update the index note** if index_update_needed is true: - - Add new keyword → entry point mappings - - 5. **Commit all changes**: - - `git add *.md` - - `git commit -m "ingest: {AuthorYear key in lowercase}"` - - 6. **Write summary** to output/ingest-summary.md: - - Bibliographic note created (filename, title) - - Permanent notes created (filename, title, Folgezettel address) - - Links added to existing notes - - Index updates made - output_artifacts: - - name: ingest-summary - path: output/ingest-summary.md - type: markdown diff --git a/.wave/pipelines/onboard.yaml b/.wave/pipelines/onboard.yaml deleted file mode 100644 index 26d1355..0000000 --- a/.wave/pipelines/onboard.yaml +++ /dev/null @@ -1,119 +0,0 @@ -kind: WavePipeline -metadata: - name: onboard - description: "Generate a project onboarding guide for new contributors" - release: true - -input: - source: cli - example: "create an onboarding guide for this project" - -steps: - - id: survey - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Survey this project to build an onboarding guide: {{ input }} - - ## Survey Checklist - - 1. **Project identity**: Find README, package manifests (go.mod, package.json), - license, and config files. Determine language, framework, purpose. - - 2. **Build system**: How to build, test, and run the project. - Find Makefiles, scripts, CI configs, Dockerfiles. - - 3. **Directory structure**: Map the top-level layout and key directories. - What does each directory contain? - - 4. **Architecture**: Identify the main components and how they interact. - Find entry points (main.go, index.ts, etc.). - - 5. **Dependencies**: List key dependencies and their purposes. - Check go.mod, package.json, requirements.txt, etc. - - 6. **Configuration**: Find environment variables, config files, feature flags. - - 7. **Testing**: Where are tests? How to run them? What patterns are used? - - 8. **Development workflow**: Find contributing guides, PR templates, - commit conventions, branch strategies. - - 9. **Documentation**: Where is documentation? Is it up to date? - output_artifacts: - - name: survey - path: .wave/output/project-survey.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/project-survey.json - schema_path: .wave/contracts/project-survey.schema.json - on_failure: retry - max_retries: 2 - - - id: guide - persona: philosopher - dependencies: [survey] - memory: - inject_artifacts: - - step: survey - artifact: survey - as: project_info - exec: - type: prompt - source: | - Write a comprehensive onboarding guide for new contributors. - - Using the injected project survey data, write a guide with these sections: - - # Onboarding Guide: [Project Name] - - ## Quick Start - - Prerequisites (what to install) - - Clone and build (exact commands) - - Run tests (exact commands) - - Run the project (exact commands) - - ## Project Overview - - What this project does (2-3 sentences) - - Key technologies and why they were chosen - - High-level architecture (ASCII diagram) - - ## Directory Map - - What each top-level directory contains - - Where to find things (tests, configs, docs) - - ## Core Concepts - - Key abstractions and terminology - - How the main components interact - - Data flow through the system - - ## Development Workflow - - How to create a feature branch - - Commit message conventions - - How to run tests before pushing - - PR process - - ## Common Tasks - - "I want to add a new [feature/command/endpoint]" → where to start - - "I want to fix a bug" → debugging approach - - "I want to understand [component]" → where to look - - ## Helpful Resources - - Documentation locations - - Key files to read first - - Related external docs - - Write for someone on their first day with this codebase. - Be specific — use real paths, real commands, real examples. - output_artifacts: - - name: guide - path: .wave/output/onboarding-guide.md - type: markdown diff --git a/.wave/pipelines/plan.yaml b/.wave/pipelines/plan.yaml deleted file mode 100644 index 5f5558e..0000000 --- a/.wave/pipelines/plan.yaml +++ /dev/null @@ -1,208 +0,0 @@ -kind: WavePipeline -metadata: - name: plan - description: "Break down a feature into actionable tasks with structured exploration, planning, and review" - release: true - -input: - source: cli - example: "add webhook support for pipeline completion events" - -steps: - - id: explore - persona: navigator - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - You are exploring a codebase to gather context for planning this feature or task: - - {{ input }} - - Your goal is to produce a rich, structured JSON exploration that a planner persona - will use (without any other context) to break the work into tasks. - - ## Exploration Steps - - 1. **Understand the request**: Summarize what is being asked and assess scope - (small = 1-2 files, medium = 3-7 files, large = 8-15 files, epic = 16+ files). - - 2. **Find related files**: Use Glob and Grep to find files related to the feature. - For each file, note its path, relevance (primary/secondary/reference), why it - matters, and key symbols (functions, types, constants) within it. - - 3. **Identify patterns**: Use Read to examine key files. Document codebase patterns - and conventions. Assign each a PAT-### ID and relevance level: - - must_follow: Violating this would break consistency or cause bugs - - should_follow: Strong convention but exceptions exist - - informational: Good to know but not binding - - 4. **Map affected modules**: Identify which packages/modules will be directly or - indirectly affected. Note their dependencies and dependents. - - 5. **Survey testing landscape**: Find test files related to the affected code. - Note testing patterns (table-driven, mocks, fixtures, etc.) and coverage gaps. - - 6. **Assess risks**: Identify potential risks (breaking changes, performance concerns, - security implications). Rate severity (high/medium/low) and suggest mitigations. - - CRITICAL: Write ONLY the JSON object. No markdown wrapping, no explanation - outside the file. The file must parse as valid JSON. - output_artifacts: - - name: exploration - path: .wave/output/exploration.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/exploration.json - schema_path: .wave/contracts/plan-exploration.schema.json - on_failure: retry - max_retries: 2 - - - id: breakdown - persona: planner - dependencies: [explore] - memory: - inject_artifacts: - - step: explore - artifact: exploration - as: context - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - You are breaking down a feature into actionable implementation tasks. - - ## Input - - Feature request: {{ input }} - - Codebase exploration has already been done and injected into your workspace. - It contains structured JSON with: related files, codebase patterns, - affected modules, testing landscape, and identified risks. Use ALL of this - information to inform your task breakdown. - - ## Task Breakdown Rules - - 1. **Task IDs**: Use T01, T02, T03... format (zero-padded two digits). - - 2. **Personas**: Assign each task to the most appropriate persona: - - navigator: architecture decisions, exploration, planning - - craftsman: implementation, coding, file creation - - philosopher: review, analysis, quality assessment - - auditor: security review, compliance checking - - implementer: focused implementation tasks - - reviewer: code review tasks - - 3. **Dependencies**: Express as task IDs (e.g., ["T01", "T02"]). - A task with no dependencies gets an empty array []. - - 4. **Complexity**: S (< 1hr), M (1-4hr), L (4-8hr), XL (> 1 day). - - 5. **Acceptance criteria**: Each task MUST have at least one concrete, - verifiable acceptance criterion. - - 6. **Affected files**: List files each task will create or modify. - - 7. **Execution order**: Group tasks into phases. Tasks within a phase - can run in parallel. Phase 1 has no dependencies, Phase 2 depends - on Phase 1, etc. - - 8. **Risks**: Note task-specific risks from the exploration. - - CRITICAL: Write ONLY the JSON object. No markdown wrapping, no explanation - outside the file. The file must parse as valid JSON. - output_artifacts: - - name: tasks - path: .wave/output/tasks.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/tasks.json - schema_path: .wave/contracts/plan-tasks.schema.json - on_failure: retry - max_retries: 2 - - - id: review - persona: philosopher - dependencies: [breakdown] - memory: - inject_artifacts: - - step: explore - artifact: exploration - as: context - - step: breakdown - artifact: tasks - as: task_list - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source: | - You are reviewing a task breakdown plan for quality, completeness, and correctness. - - ## Input - - Feature request: {{ input }} - - Two artifacts have been injected into your workspace: the codebase exploration - and the task breakdown plan. Read them BOTH before proceeding. - - The exploration contains: related files, patterns, affected modules, testing - landscape, and risks. The task list contains: feature summary, tasks with - dependencies and acceptance criteria, and execution order. - - ## Review Checklist - - For EACH task in the plan, evaluate and assign a status: - - ok: Task is well-defined and ready to execute - - needs_refinement: Good idea but needs clearer description or criteria - - missing_details: Lacks acceptance criteria, affected files, or dependencies - - overcomplicated: Should be split or simplified - - wrong_persona: Different persona would be more appropriate - - bad_dependencies: Dependencies are incorrect or missing - - For each issue found, assign a REV-### ID, severity, description, and suggestion. - - ## Cross-Cutting Concerns - - Look for concerns that span multiple tasks (CC-### IDs): - - Testing strategy: Are tests planned? Do they follow codebase patterns? - - Security: Are security implications addressed? - - Performance: Will changes affect performance? - - Backwards compatibility: Are breaking changes handled? - - Documentation: Is documentation updated? - - ## Recommendations - - Provide actionable recommendations (REC-### IDs) with type: - add_task, modify_task, remove_task, reorder, split_task, merge_tasks, - change_persona, add_dependency - - ## Verdict - - Provide an overall verdict: - - approve: Plan is ready to execute as-is - - approve_with_notes: Plan is good but has minor issues to note - - revise: Plan needs significant changes before execution - - CRITICAL: Write ONLY the JSON object. No markdown wrapping, no explanation - outside the file. The file must parse as valid JSON. - output_artifacts: - - name: review - path: .wave/output/plan-review.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/plan-review.json - schema_path: .wave/contracts/plan-review.schema.json - on_failure: retry - max_retries: 2 diff --git a/.wave/pipelines/prototype.yaml b/.wave/pipelines/prototype.yaml deleted file mode 100644 index eaf06ad..0000000 --- a/.wave/pipelines/prototype.yaml +++ /dev/null @@ -1,352 +0,0 @@ -kind: WavePipeline -metadata: - name: prototype - description: "Prototype-driven development pipeline with 5 phases (9 steps): spec, docs, dummy, implement, pr-cycle" - release: false - -input: - source: cli - example: "build a REST API for user management with CRUD operations" - -steps: - # Phase 1: Spec - Requirements capture with speckit integration - - id: spec - persona: craftsman - exec: - type: prompt - source: | - You are beginning the specification phase of a prototype-driven development pipeline. - - Your goal is to analyze the project description and create a comprehensive feature specification: - - Project description: {{ input }} - - CRITICAL: Create both spec.md and requirements.md files: - - spec.md should contain the complete feature specification including: - - Feature overview and business value - - User stories with acceptance criteria - - Functional requirements - - Success criteria and measurable outcomes - - Constraints and assumptions - - requirements.md should contain extracted requirements (optional additional detail). - - Use speckit integration where available to enhance specification quality. - - The specification must be technology-agnostic and focused on user value. - - Create artifact.json with your results. - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - output_artifacts: - - name: spec - path: spec.md - type: markdown - - name: requirements - path: requirements.md - type: markdown - - name: contract_data - path: .wave/artifact.json - type: json - - handover: - contract: - type: json_schema - schema_path: .wave/contracts/spec-phase.schema.json - must_pass: true - max_retries: 2 - - # Phase 2: Docs - Generate runnable documentation from specification - - id: docs - persona: philosopher - dependencies: [spec] - - memory: - inject_artifacts: - - step: spec - artifact: spec - as: input-spec.md - - exec: - type: prompt - source: | - You are in the documentation phase of prototype-driven development. - - Your goal is to create comprehensive, runnable documentation from the specification. - - Create feature documentation from the injected specification that includes: - - User-friendly explanation of the feature - - Usage examples and scenarios - - Integration guide for developers - - Stakeholder summary for non-technical audiences - - Generate VitePress-compatible markdown that can be served as runnable documentation. - - CRITICAL: Create both feature-docs.md and stakeholder-summary.md files. - - Create artifact.json with your results. - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - output_artifacts: - - name: feature-docs - path: feature-docs.md - type: markdown - - name: stakeholder-summary - path: stakeholder-summary.md - type: markdown - - name: contract_data - path: .wave/artifact.json - type: json - - handover: - contract: - type: json_schema - schema_path: .wave/contracts/docs-phase.schema.json - must_pass: true - max_retries: 2 - - # Phase 3: Dummy - Build authentic functional prototype - - id: dummy - persona: craftsman - dependencies: [docs] - - memory: - inject_artifacts: - - step: docs - artifact: feature-docs - as: feature-docs.md - - step: spec - artifact: spec - as: spec.md - - exec: - type: prompt - source: | - You are in the dummy/prototype phase of development. - - Your goal is to create a working prototype with authentic I/O handling but stub business logic. - - Create a functional prototype that: - - Handles real input and output properly - - Implements all user interfaces and endpoints - - Uses placeholder/stub implementations for business logic - - Can be run and demonstrated to stakeholders - - Shows the complete user experience flow - - Focus on proving the interface design and user flows work correctly. - - CRITICAL: Create prototype/ directory with working code and interfaces.md with interface definitions. - - Create artifact.json with your results. - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - output_artifacts: - - name: prototype - path: prototype/ - type: binary - - name: interface-definitions - path: interfaces.md - type: markdown - - name: contract_data - path: .wave/artifact.json - type: json - - handover: - contract: - type: json_schema - schema_path: .wave/contracts/dummy-phase.schema.json - must_pass: true - max_retries: 2 - - # Phase 4: Implement - Transition to full implementation - - id: implement - persona: craftsman - dependencies: [dummy] - - memory: - inject_artifacts: - - step: spec - artifact: spec - as: spec.md - - step: docs - artifact: feature-docs - as: feature-docs.md - - step: dummy - artifact: prototype - as: prototype/ - - exec: - type: prompt - source: | - You are in the implementation phase - transitioning from prototype to production code. - - Your goal is to provide implementation guidance and begin real implementation: - - Review all previous artifacts for implementation readiness - - Create implementation plan and checklist - - Begin replacing stub logic with real implementations - - Ensure test coverage for all functionality - - Maintain compatibility with established interfaces - - Focus on production-quality code that fulfills the original specification. - - CRITICAL: Create implementation-plan.md and implementation-checklist.md files. - - Create artifact.json with your results. - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - output_artifacts: - - name: implementation-plan - path: implementation-plan.md - type: markdown - - name: progress-checklist - path: implementation-checklist.md - type: markdown - - name: contract_data - path: .wave/artifact.json - type: json - - handover: - contract: - type: json_schema - schema_path: .wave/contracts/implement-phase.schema.json - must_pass: true - max_retries: 2 - - # Phase 5: PR-Cycle - Automated pull request lifecycle - - id: pr-create - persona: navigator - dependencies: [implement] - - memory: - inject_artifacts: - - step: implement - artifact: implementation-plan - as: implementation-plan.md - - exec: - type: prompt - source: | - You are creating a pull request for the implemented feature. - - Create a comprehensive pull request: - - Clear PR title and description - - Link to related issues - - Include testing instructions - - Add appropriate labels and reviewers - - Request Copilot review - - Use GitHub CLI to create the PR and configure automated review workflow. - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - output_artifacts: - - name: pr-info - path: pr-info.json - type: json - handover: - contract: - type: json_schema - source: pr-info.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: pr-review - persona: auditor - dependencies: [pr-create] - - exec: - type: prompt - source: | - Monitor and manage the PR review process. - - Poll for Copilot review completion and analyze feedback. - Prepare response strategy for review comments. - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - - id: pr-respond - persona: philosopher - dependencies: [pr-review] - - exec: - type: prompt - source: | - Analyze review comments and prepare thoughtful responses. - - Generate responses to review feedback that: - - Address technical concerns professionally - - Explain design decisions clearly - - Propose solutions for identified issues - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - - id: pr-fix - persona: craftsman - dependencies: [pr-respond] - - exec: - type: prompt - source: | - Implement small fixes based on review feedback. - - For larger changes, create follow-up issues instead of expanding this PR. - Focus on quick, low-risk improvements that address reviewer concerns. - - workspace: - mount: - - source: . - target: /project - mode: readwrite - - - id: pr-merge - persona: navigator - dependencies: [pr-fix] - - exec: - type: prompt - source: | - Complete the PR lifecycle with merge. - - Verify all checks pass, reviews are approved, and merge the PR. - Clean up branch and notify stakeholders of completion. - - workspace: - mount: - - source: . - target: /project - mode: readwrite diff --git a/.wave/pipelines/recinq.yaml b/.wave/pipelines/recinq.yaml deleted file mode 100644 index 1086b2d..0000000 --- a/.wave/pipelines/recinq.yaml +++ /dev/null @@ -1,531 +0,0 @@ -kind: WavePipeline -metadata: - name: recinq - description: "Rethink and simplify code using divergent-convergent thinking (Double Diamond)" - release: true - -input: - source: cli - example: "internal/pipeline" - -# Pipeline structure implements the Double Diamond: -# -# gather → diverge → converge → probe → distill → simplify → report -# ╰─ Diamond 1 ─╯ ╰─ Diamond 2 ─╯ ╰implement╯ -# (discover) (define) (develop) (deliver) -# -# Each step gets its own context window and cognitive mode. -# Fresh memory at every boundary — no mode-switching within a step. - -steps: - - id: gather - persona: github-analyst - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - CONTEXT GATHERING — parse input and fetch GitHub context if applicable. - - Input: {{ input }} - - ## Instructions - - Determine what kind of input this is: - - 1. **GitHub Issue URL**: Contains `github.com` and `/issues/` - - Extract owner/repo and issue number from the URL - - Run: `gh issue view <number> --repo <owner/repo> --json title,body,labels` - - Extract a `focus_hint` summarizing what should be simplified - - 2. **GitHub PR URL**: Contains `github.com` and `/pull/` - - Extract owner/repo and PR number from the URL - - Run: `gh pr view <number> --repo <owner/repo> --json title,body,labels,files` - - Extract a `focus_hint` summarizing what the PR is about - - 3. **Local path or description**: Anything else - - Set `input_type` to `"local"` - - Pass through the original input as-is - - ## Output - - IMPORTANT: The output MUST be valid JSON. Do NOT include markdown fencing. - output_artifacts: - - name: context - path: .wave/output/context.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/context.json - schema_path: .wave/contracts/recinq-context.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - # ── Diamond 1: Discover (DIVERGENT) ────────────────────────────────── - - id: diverge - persona: provocateur - dependencies: [gather] - memory: - inject_artifacts: - - step: gather - artifact: context - as: context - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - DIVERGENT THINKING — cast the widest net to find simplification opportunities. - - Target: {{ input }} - - ## Starting Point - - The context artifact contains input context. - If `input_type` is `"issue"` or `"pr"`, the `focus_hint` tells you WHERE to start looking — - but do NOT limit yourself to what the issue describes. Use it as a seed, then expand outward. - Follow dependency chains, trace callers, explore adjacent modules. The issue author doesn't - know what they don't know — that's YOUR job. - If `input_type` is `"local"`, use the `original_input` field as the target path. - - If input is empty or "." — analyze the whole project. - If input is a path — focus on that module/directory but consider its connections. - - ## Your Mission - - Challenge EVERYTHING. Question every assumption. Hunt complexity. - - ## What to Look For - - 1. **Premature abstractions**: Interfaces with one implementation. Generic code used once. - "What if we just inlined this?" - - 2. **Unnecessary indirection**: Layers that pass-through without adding value. - Wrappers around wrappers. "How many hops to get to the actual logic?" - - 3. **Overengineering**: Configuration for things that never change. Plugins with one plugin. - Feature flags for features that are always on. "Is this complexity earning its keep?" - - 4. **YAGNI violations**: Code written for hypothetical future needs that never arrived. - "When was this last changed? Does anyone actually use this path?" - - 5. **Accidental complexity**: Things that are hard because of how they're built, not because - the problem is hard. "Could this be 10x simpler if we started over?" - - 6. **Copy-paste drift**: Similar-but-slightly-different code that should be unified or - intentionally differentiated. "Are these differences meaningful or accidental?" - - 7. **Dead weight**: Unused exports, unreachable code, obsolete comments, stale TODOs. - `grep -r` for references. If nothing uses it, flag it. - - 8. **Naming lies**: Names that don't match what the code actually does. - "Does this 'manager' actually manage anything?" - - 9. **Dependency gravity**: Modules that pull in everything. Import graphs that are too dense. - "What's the blast radius of changing this?" - - ## Evidence Requirements - - For EVERY finding, gather concrete metrics: - - `wc -l` for line counts - - `grep -r` for usage/reference counts - - `git log --oneline <file> | wc -l` for change frequency - - List the actual files involved - - ## Output - - Each finding gets a unique ID: DVG-001, DVG-002, etc. - - Be AGGRESSIVE — flag everything suspicious. The convergent phase will filter. - It's better to have 30 findings with 10 false positives than 5 findings that miss - the big opportunities. - - Include a metrics_summary with totals by category and severity, plus hotspot files - that appear in multiple findings. - output_artifacts: - - name: findings - path: .wave/output/divergent-findings.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/divergent-findings.json - schema_path: .wave/contracts/divergent-findings.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - # ── Diamond 1: Define (CONVERGENT) ─────────────────────────────────── - - id: converge - persona: validator - dependencies: [diverge] - memory: - inject_artifacts: - - step: diverge - artifact: findings - as: divergent_findings - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - CONVERGENT VALIDATION — separate signal from noise. - - This is a purely CONVERGENT step. Your job is analytical, not creative. - Judge every finding on technical merit alone. No speculation, no new ideas. - - Target: {{ input }} - - ## For Every DVG-xxx Finding - - 1. **Read the actual code** cited as evidence — don't trust the provocateur's summary - 2. **Verify the metrics** — check reference counts, line counts, change frequency - 3. **Assess**: Is this a real problem or a false positive? - - Does the "premature abstraction" actually have a second implementation planned? - - Is the "dead weight" actually used via reflection or codegen? - - Is the "unnecessary indirection" actually providing error handling or logging? - 4. **Classify**: - - `CONFIRMED` — real problem, metrics check out, code supports the claim - - `PARTIALLY_CONFIRMED` — real concern but overstated, or scope is narrower than claimed - - `REJECTED` — false positive, justified complexity, or incorrect metrics - 5. **Explain**: For every classification, write WHY. For rejections, explain what - the provocateur got wrong. - - Be RIGOROUS. The provocateur was told to be aggressive — your job is to be skeptical. - A finding that survives your scrutiny is genuinely worth addressing. - output_artifacts: - - name: validated_findings - path: .wave/output/validated-findings.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/validated-findings.json - schema_path: .wave/contracts/validated-findings.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - # ── Diamond 2: Develop (DIVERGENT) ─────────────────────────────────── - - id: probe - persona: provocateur - dependencies: [converge] - memory: - inject_artifacts: - - step: diverge - artifact: findings - as: divergent_findings - - step: converge - artifact: validated_findings - as: validated_findings - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - SECOND DIVERGENCE — probe deeper into confirmed findings. - - The first pass cast a wide net. The validator filtered it down. - Now YOU go deeper on what survived. This is DIVERGENT thinking again — - expand, connect, discover what the first pass missed. - - Focus on findings with status CONFIRMED or PARTIALLY_CONFIRMED. - - Target: {{ input }} - - ## Your Mission - - For each confirmed finding, probe OUTWARD: - - 1. **Trace the dependency graph**: What calls this code? What does it call? - If we simplify X, what happens to its callers and callees? - - 2. **Find second-order effects**: If we remove abstraction A, does layer B - also become unnecessary? Do test helpers simplify? Do error paths collapse? - - 3. **Spot patterns across findings**: Do three findings all stem from the same - over-abstraction? Is there a root cause that would address multiple DVGs at once? - - 4. **Discover what was MISSED**: With the validated findings as context, look for - related opportunities the first pass didn't see. The confirmed findings reveal - the codebase's real pressure points — what else lurks nearby? - - 5. **Challenge the rejections**: Were any findings rejected too hastily? - Read the validator's rationale — do you disagree? - - ## Evidence Requirements - - Same standard as the first diverge pass: - - `wc -l` for line counts - - `grep -r` for usage/reference counts - - `git log --oneline <file> | wc -l` for change frequency - - Concrete file paths and code references - - ## Output - - Go DEEP. The first pass was wide, this pass is deep. Follow every thread. - output_artifacts: - - name: probed_findings - path: .wave/output/probed-findings.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/probed-findings.json - schema_path: .wave/contracts/probed-findings.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - # ── Diamond 2: Deliver (CONVERGENT) ────────────────────────────────── - - id: distill - persona: synthesizer - dependencies: [probe] - memory: - inject_artifacts: - - step: gather - artifact: context - as: context - - step: converge - artifact: validated_findings - as: validated_findings - - step: probe - artifact: probed_findings - as: probed_findings - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - FINAL CONVERGENCE — synthesize all findings into actionable proposals. - - This is the last convergent step before implementation. You have: - - Validated findings (what survived scrutiny) - - Probed findings (deeper connections, patterns, new discoveries) - - Optional issue/PR context (from the gather step) - - Your job: synthesize everything into prioritized, implementable proposals. - - Target: {{ input }} - - ## Synthesis - - Transform the validated and probed findings into prioritized proposals: - - 1. **Group by pattern**: Use the `patterns` from the probe step. Findings that share - a root cause become a single proposal addressing the root cause. - - 2. **Incorporate second-order effects**: The probe step found connections and cascading - simplifications. Factor these into impact estimates. - - 3. **Include new discoveries**: The probe step may have found new findings (DVG-NEW-xxx). - These are pre-validated by the provocateur's second pass — include them. - - 4. **Apply issue/PR context (if present)**: If the context artifact shows - `input_type` is `"issue"` or `"pr"`, use the `focus_hint` as ONE input - when assigning tiers. But do not discard strong proposals just because they - fall outside the issue's scope. The best simplifications are often the ones - the issue author didn't think to ask for. - - 5. **80/20 analysis**: which 20% of proposals yield 80% of the simplification? - - 6. **Dependency ordering**: what must be done first? - - ## Output - - Do NOT write a markdown summary. Write the complete JSON object with every proposal fully populated. - output_artifacts: - - name: proposals - path: .wave/output/convergent-proposals.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/convergent-proposals.json - schema_path: .wave/contracts/convergent-proposals.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - # ── Implementation ─────────────────────────────────────────────────── - - id: simplify - persona: craftsman - dependencies: [distill] - memory: - inject_artifacts: - - step: converge - artifact: validated_findings - as: validated_findings - - step: distill - artifact: proposals - as: proposals - workspace: - type: worktree - branch: "refactor/{{ pipeline_id }}" - exec: - type: prompt - source: | - IMPLEMENTATION — apply the best simplification proposals. - - ## Process - - Apply ONLY tier-1 proposals, in dependency order. - - For each proposal (SMP-xxx): - - 1. **Announce**: Print which proposal you're applying and what it does - 2. **Apply**: Make the code changes - 3. **Build**: `go build ./...` — must succeed - 4. **Test**: `go test ./...` — must pass - 5. **Commit**: If build and tests pass: - ```bash - git add <specific-files> - git commit -m "refactor: <proposal title> - - Applies SMP-xxx: <brief description> - Source findings: <DVG-xxx list>" - ``` - 6. **Revert if failing**: If tests fail after applying, revert: - ```bash - git checkout -- . - ``` - Log the failure and move to the next proposal. - - ## Final Verification - - After all tier-1 proposals are applied (or attempted): - 1. Run the full test suite: `go test -race ./...` - 2. Run the build: `go build ./...` - 3. Summarize what was applied, what was skipped, and net lines changed - - ## Important - - - Each proposal gets its own atomic commit - - Never combine proposals in a single commit - - If a proposal depends on a failed proposal, skip it too - - Commit each proposal as a separate atomic commit - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: true - on_failure: retry - max_retries: 3 - output_artifacts: - - name: result - path: .wave/output/result.md - type: markdown - - # ── Reporting ──────────────────────────────────────────────────────── - - id: report - persona: navigator - dependencies: [simplify] - memory: - inject_artifacts: - - step: distill - artifact: proposals - as: proposals - - step: simplify - artifact: result - as: result - workspace: - type: worktree - branch: "refactor/{{ pipeline_id }}" - exec: - type: prompt - source: | - REPORT — compose a summary of what recinq found and applied. - - Run `git log --oneline` to see the commits on this branch. - - ## Compose the Report - - Write a markdown report containing: - - **Summary**: One-paragraph overview of what recinq found and applied - - **Proposals**: List of all proposals with their tier, impact, and status (applied/skipped/failed) - - **Changes Applied**: Summary of commits made, files changed, net lines removed - - **Remaining Opportunities**: Tier-2 and tier-3 proposals for future consideration - output_artifacts: - - name: report - path: .wave/output/report.md - type: markdown - - # ── Publish ───────────────────────────────────────────────────────── - - id: publish - persona: craftsman - dependencies: [report, gather] - memory: - inject_artifacts: - - step: gather - artifact: context - as: context - - step: report - artifact: report - as: report - workspace: - type: worktree - branch: "refactor/{{ pipeline_id }}" - exec: - type: prompt - source: | - PUBLISH — push the branch and create a pull request. - - ## Steps - - 1. Push the branch: - ```bash - git push -u origin HEAD - ``` - - 2. Create a pull request using the report as the body: - ```bash - gh pr create --title "refactor: $(git log --format=%s -1)" --body-file .wave/artifacts/report - ``` - - 3. If the context artifact shows `input_type` is `"issue"` or `"pr"`, - post the PR URL as a comment on the source: - ```bash - gh issue comment <number> --repo <repo> --body "Refactoring PR: <pr-url>" - ``` - or for PRs: - ```bash - gh pr comment <number> --repo <repo> --body "Refactoring PR: <pr-url>" - ``` - - 4. Write the JSON status report to the output artifact path. - - If any `gh` command fails, log the error and continue. - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/refactor.yaml b/.wave/pipelines/refactor.yaml deleted file mode 100644 index e224437..0000000 --- a/.wave/pipelines/refactor.yaml +++ /dev/null @@ -1,133 +0,0 @@ -kind: WavePipeline -metadata: - name: refactor - description: "Safe refactoring with comprehensive test coverage" - release: true - -input: - source: cli - example: "extract workspace manager from executor into its own package" - -steps: - - id: analyze - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Analyze refactoring scope for: {{ input }} - - 1. Identify all code that will be affected - 2. Map all callers/consumers of the code being refactored - 3. Find existing test coverage - 4. Identify integration points - output_artifacts: - - name: analysis - path: .wave/output/refactor-analysis.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/refactor-analysis.json - schema_path: .wave/contracts/refactor-analysis.schema.json - on_failure: retry - max_retries: 2 - - - id: test-baseline - persona: craftsman - dependencies: [analyze] - memory: - inject_artifacts: - - step: analyze - artifact: analysis - as: scope - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Before refactoring, ensure test coverage: - - 1. Run existing tests and record baseline - 2. Add characterization tests for uncovered code paths - 3. Add integration tests for affected callers - 4. Document current behavior for comparison - - All tests must pass before proceeding. - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - - must_pass: true - on_failure: retry - max_retries: 2 - output_artifacts: - - name: baseline - path: .wave/output/test-baseline.md - type: markdown - - - id: refactor - persona: craftsman - dependencies: [test-baseline] - memory: - inject_artifacts: - - step: analyze - artifact: analysis - as: scope - - step: test-baseline - artifact: baseline - as: tests - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Perform the refactoring: {{ input }} - - Guidelines: - 1. Make atomic, reviewable changes - 2. Preserve all existing behavior - 3. Run tests after each significant change - 4. Update affected callers as needed - 5. Keep commits small and focused - - Do NOT change behavior — this is refactoring only. - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - - must_pass: false - on_failure: retry - max_retries: 3 - - - id: verify - persona: auditor - dependencies: [refactor] - exec: - type: prompt - source: | - Verify the refactoring: - - 1. Compare before/after behavior — any changes? - 2. Check test coverage didn't decrease - 3. Verify all callers still work correctly - 4. Look for missed edge cases - 5. Assess code quality improvement - - Output: PASS (safe to merge) or FAIL (issues found) - output_artifacts: - - name: verification - path: .wave/output/verification.md - type: markdown diff --git a/.wave/pipelines/security-scan.yaml b/.wave/pipelines/security-scan.yaml deleted file mode 100644 index 7ce8f20..0000000 --- a/.wave/pipelines/security-scan.yaml +++ /dev/null @@ -1,147 +0,0 @@ -kind: WavePipeline -metadata: - name: security-scan - description: "Comprehensive security vulnerability audit" - release: true - -input: - source: cli - example: "audit the authentication module for vulnerabilities" - -steps: - - id: scan - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Perform a security scan of: {{ input }} - - ## Scan Process - - 1. **Map attack surface**: Identify all entry points (HTTP handlers, CLI args, - file parsers, IPC endpoints, database queries, external API calls) - - 2. **Check OWASP Top 10**: - - Injection (SQL, command, LDAP, XPath) - - Broken authentication/authorization - - Sensitive data exposure - - XML external entities (XXE) - - Broken access control - - Security misconfiguration - - Cross-site scripting (XSS) - - Insecure deserialization - - Using components with known vulnerabilities - - Insufficient logging and monitoring - - 3. **Scan for common Go vulnerabilities** (if Go project): - - Unchecked errors on security-critical operations - - Race conditions on shared state - - Path traversal via unsanitized file paths - - Template injection - - Unsafe use of reflect or unsafe packages - - 4. **Check secrets and configuration**: - - Hardcoded credentials, API keys, tokens - - Insecure default configurations - - Missing TLS/encryption - - Overly permissive file permissions - - 5. **Review dependency usage**: - - Known vulnerable patterns in dependency usage - - Outdated security practices - - output_artifacts: - - name: scan_results - path: .wave/output/security-scan.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/security-scan.json - schema_path: .wave/contracts/security-scan.schema.json - on_failure: retry - max_retries: 2 - - - id: deep-dive - persona: auditor - dependencies: [scan] - memory: - inject_artifacts: - - step: scan - artifact: scan_results - as: scan_findings - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Perform a deep security analysis based on the injected scan results. - - For each finding with severity HIGH or CRITICAL: - - 1. **Verify the finding**: Read the actual source code at the reported location. - Confirm the vulnerability exists (eliminate false positives). - - 2. **Trace the data flow**: Follow untrusted input from entry point to sink. - Identify all transformations and validation (or lack thereof). - - 3. **Assess exploitability**: Could an attacker realistically exploit this? - What preconditions are needed? What's the impact? - - 4. **Check for related patterns**: Search for similar vulnerable patterns - elsewhere in the codebase using Grep. - - 5. **Propose remediation**: Specific, actionable fix with code examples. - Prioritize by effort vs. impact. - - For MEDIUM and LOW findings, do a lighter review confirming they're real. - - Produce a markdown report with these sections: - - Executive Summary - - Confirmed Vulnerabilities (with severity badges) - - False Positives Eliminated - - Data Flow Analysis - - Remediation Plan (ordered by priority) - - Related Patterns Found - output_artifacts: - - name: deep_dive - path: .wave/output/security-deep-dive.md - type: markdown - - - id: report - persona: summarizer - dependencies: [deep-dive] - memory: - inject_artifacts: - - step: scan - artifact: scan_results - as: scan_findings - - step: deep-dive - artifact: deep_dive - as: analysis - exec: - type: prompt - source: | - Synthesize the injected scan findings and deep-dive analysis into a final report. - - Create a concise, actionable security report: - - 1. **Risk Score**: Overall risk rating (CRITICAL/HIGH/MEDIUM/LOW) with justification - 2. **Top 3 Issues**: The most important findings to fix immediately - 3. **Quick Wins**: Low-effort fixes that improve security posture - 4. **Remediation Roadmap**: Ordered list of fixes by priority - 5. **What's Good**: Security practices already in place - - Format as a clean markdown report suitable for sharing with the team. - output_artifacts: - - name: report - path: .wave/output/security-report.md - type: markdown diff --git a/.wave/pipelines/smoke-test.yaml b/.wave/pipelines/smoke-test.yaml deleted file mode 100644 index c33bbe9..0000000 --- a/.wave/pipelines/smoke-test.yaml +++ /dev/null @@ -1,57 +0,0 @@ -kind: WavePipeline -metadata: - name: smoke-test - description: "Minimal pipeline for testing contracts and artifacts" - release: false - -input: - source: cli - example: "verify contract validation works" - -steps: - - id: analyze - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Analyze the codebase for: {{ input }} - - Provide a structured analysis of your findings. - output_artifacts: - - name: analysis - path: .wave/output/analysis.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/analysis.json - schema_path: .wave/contracts/smoke-test.schema.json - on_failure: retry - max_retries: 2 - - - id: summarize - persona: summarizer - dependencies: [analyze] - memory: - inject_artifacts: - - step: analyze - artifact: analysis - as: analysis_data - exec: - type: prompt - source: | - Using the injected analysis data, write a brief markdown summary. - - Include: - - What was analyzed - - Key findings - - Recommended next steps - output_artifacts: - - name: summary - path: .wave/output/summary.md - type: markdown diff --git a/.wave/pipelines/speckit-flow.yaml b/.wave/pipelines/speckit-flow.yaml deleted file mode 100644 index 872c643..0000000 --- a/.wave/pipelines/speckit-flow.yaml +++ /dev/null @@ -1,234 +0,0 @@ -kind: WavePipeline -metadata: - name: speckit-flow - description: "Specification-driven feature development using the full speckit workflow" - release: true - -requires: - skills: - - speckit - tools: - - git - - gh - -input: - source: cli - example: "add user authentication with JWT tokens" - schema: - type: string - description: "Natural language feature description to specify and implement" - -steps: - - id: specify - persona: implementer - workspace: - type: worktree - branch: "{{ pipeline_id }}" - base: main - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/specify.md - output_artifacts: - - name: spec-status - path: .wave/output/specify-status.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/specify-status.json - schema_path: .wave/contracts/specify-status.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: clarify - persona: implementer - dependencies: [specify] - memory: - inject_artifacts: - - step: specify - artifact: spec-status - as: spec_info - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/clarify.md - output_artifacts: - - name: clarify-status - path: .wave/output/clarify-status.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/clarify-status.json - schema_path: .wave/contracts/clarify-status.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: plan - persona: implementer - dependencies: [clarify] - memory: - inject_artifacts: - - step: specify - artifact: spec-status - as: spec_info - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/plan.md - output_artifacts: - - name: plan-status - path: .wave/output/plan-status.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/plan-status.json - schema_path: .wave/contracts/plan-status.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: tasks - persona: implementer - dependencies: [plan] - memory: - inject_artifacts: - - step: specify - artifact: spec-status - as: spec_info - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/tasks.md - output_artifacts: - - name: tasks-status - path: .wave/output/tasks-status.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/tasks-status.json - schema_path: .wave/contracts/tasks-status.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: checklist - persona: implementer - dependencies: [tasks] - memory: - inject_artifacts: - - step: specify - artifact: spec-status - as: spec_info - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/checklist.md - output_artifacts: - - name: checklist-status - path: .wave/output/checklist-status.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/checklist-status.json - schema_path: .wave/contracts/checklist-status.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: analyze - persona: implementer - dependencies: [checklist] - memory: - inject_artifacts: - - step: specify - artifact: spec-status - as: spec_info - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/analyze.md - output_artifacts: - - name: analysis-report - path: .wave/output/analysis-report.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/analysis-report.json - schema_path: .wave/contracts/analysis-report.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - - - id: implement - persona: craftsman - dependencies: [analyze] - memory: - inject_artifacts: - - step: specify - artifact: spec-status - as: spec_info - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/implement.md - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - must_pass: true - on_failure: retry - max_retries: 3 - compaction: - trigger: "token_limit_80%" - persona: summarizer - - - id: create-pr - persona: craftsman - dependencies: [implement] - memory: - inject_artifacts: - - step: specify - artifact: spec-status - as: spec_info - workspace: - type: worktree - branch: "{{ pipeline_id }}" - exec: - type: prompt - source_path: .wave/prompts/speckit-flow/create-pr.md - output_artifacts: - - name: pr-result - path: .wave/output/pr-result.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/pr-result.json - schema_path: .wave/contracts/pr-result.schema.json - must_pass: true - on_failure: retry - max_retries: 2 - outcomes: - - type: pr - extract_from: .wave/output/pr-result.json - json_path: .pr_url - label: "Pull Request" diff --git a/.wave/pipelines/supervise.yaml b/.wave/pipelines/supervise.yaml deleted file mode 100644 index 19895d7..0000000 --- a/.wave/pipelines/supervise.yaml +++ /dev/null @@ -1,168 +0,0 @@ -kind: WavePipeline -metadata: - name: supervise - description: "Review work quality and process quality, including claudit session transcripts" - -input: - source: cli - example: "last pipeline run" - -steps: - - id: gather - persona: supervisor - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Gather evidence for supervision of: {{ input }} - - ## Smart Input Detection - - Determine what to inspect based on the input: - - **Empty or "last pipeline run"**: Find the most recent pipeline run via `.wave/workspaces/` timestamps and recent git activity - - **"current pr" or "PR #N"**: Inspect the current or specified pull request (`git log`, `gh pr view`) - - **Branch name**: Inspect all commits on that branch vs main - - **Free-form description**: Use grep/git log to find relevant recent work - - ## Evidence Collection - - 1. **Git history**: Recent commits with diffs (`git log --stat`, `git diff`) - 2. **Session transcripts**: Check for claudit git notes (`git notes show <commit>` for each relevant commit). Summarize what happened in each session — tool calls, approach taken, detours, errors - 3. **Pipeline artifacts**: Scan `.wave/workspaces/` for the relevant pipeline run. List all output artifacts and their contents - 4. **Test state**: Run `go test ./...` to capture current test status - 5. **Branch/PR context**: Branch name, ahead/behind status, PR state if applicable - - ## Output - - Produce a comprehensive evidence bundle as structured JSON. Include all raw - evidence — the evaluation step will interpret it. - - Be thorough in transcript analysis — the process quality evaluation depends - heavily on understanding what the agent actually did vs what it should have done. - output_artifacts: - - name: evidence - path: .wave/output/supervision-evidence.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/supervision-evidence.json - schema_path: .wave/contracts/supervision-evidence.schema.json - on_failure: retry - max_retries: 2 - - - id: evaluate - persona: supervisor - dependencies: [gather] - memory: - inject_artifacts: - - step: gather - artifact: evidence - as: evidence - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Evaluate the work quality based on gathered evidence. - - The gathered evidence has been injected into your workspace. Read it first. - - ## Output Quality Assessment - - For each dimension, score as excellent/good/adequate/poor with specific findings: - - 1. **Correctness**: Does the code do what was intended? Check logic, edge cases, error handling - 2. **Completeness**: Are all requirements addressed? Any gaps or TODOs left? - 3. **Test coverage**: Are changes adequately tested? Run targeted tests if needed - 4. **Code quality**: Does it follow project conventions? Clean abstractions? Good naming? - - ## Process Quality Assessment - - Using the session transcripts from the evidence: - - 1. **Efficiency**: Was the approach direct? Count unnecessary file reads, repeated searches, abandoned approaches visible in transcripts - 2. **Scope discipline**: Did the agent stay on task? Flag any scope creep — changes unrelated to the original goal - 3. **Tool usage**: Were the right tools used? (e.g., Read vs Bash cat, Glob vs find) - 4. **Token economy**: Was the work concise or bloated? Excessive context gathering? Redundant operations? - - ## Synthesis - - - Overall score (excellent/good/adequate/poor) - - Key strengths (what went well) - - Key concerns (what needs attention) - - Produce the evaluation as a structured JSON result. - output_artifacts: - - name: evaluation - path: .wave/output/supervision-evaluation.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/supervision-evaluation.json - schema_path: .wave/contracts/supervision-evaluation.schema.json - on_failure: retry - max_retries: 2 - - - id: verdict - persona: reviewer - dependencies: [evaluate] - memory: - inject_artifacts: - - step: gather - artifact: evidence - as: evidence - - step: evaluate - artifact: evaluation - as: evaluation - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Synthesize a final supervision verdict. - - The gathered evidence and evaluation have been injected into your workspace. - Read them both before proceeding. - - ## Independent Verification - - 1. Run the test suite: `go test ./...` - 2. Cross-check evaluation claims against actual code - 3. Verify any specific concerns raised in the evaluation - - ## Verdict - - Issue one of: - - **APPROVE**: Work is good quality, process was efficient. Ship it. - - **PARTIAL_APPROVE**: Output is acceptable but process had issues worth noting for improvement. - - **REWORK**: Significant issues found that need to be addressed before the work is acceptable. - - ## Action Items (if REWORK or PARTIAL_APPROVE) - - For each issue requiring action: - - Specific file and line references - - What needs to change and why - - Priority (must-fix vs should-fix) - - ## Lessons Learned - - What should be done differently next time? Process improvements, common pitfalls observed. - - Produce the verdict as a markdown report with clear sections: - ## Verdict, ## Output Quality, ## Process Quality, ## Action Items, ## Lessons Learned - output_artifacts: - - name: verdict - path: .wave/output/supervision-verdict.md - type: markdown diff --git a/.wave/pipelines/test-gen.yaml b/.wave/pipelines/test-gen.yaml deleted file mode 100644 index 1ac09e8..0000000 --- a/.wave/pipelines/test-gen.yaml +++ /dev/null @@ -1,97 +0,0 @@ -kind: WavePipeline -metadata: - name: test-gen - description: "Generate comprehensive test coverage" - release: true - -input: - source: cli - example: "internal/pipeline" - -steps: - - id: analyze-coverage - persona: navigator - workspace: - mount: - - source: ./ - target: /project - mode: readonly - exec: - type: prompt - source: | - Analyze test coverage for: {{ input }} - - 1. Run coverage analysis using the project test command with coverage flags - 2. Identify uncovered functions and branches - 3. Find edge cases not tested - 4. Map dependencies that need mocking - output_artifacts: - - name: coverage - path: .wave/output/coverage-analysis.json - type: json - handover: - contract: - type: json_schema - source: .wave/output/coverage-analysis.json - schema_path: .wave/contracts/coverage-analysis.schema.json - on_failure: retry - max_retries: 2 - - - id: generate-tests - persona: craftsman - dependencies: [analyze-coverage] - memory: - inject_artifacts: - - step: analyze-coverage - artifact: coverage - as: gaps - workspace: - mount: - - source: ./ - target: /project - mode: readwrite - exec: - type: prompt - source: | - Generate tests to improve coverage for: {{ input }} - - Requirements: - 1. Write table-driven tests where appropriate - 2. Cover happy path, error cases, and edge cases - 3. Use descriptive test names (TestFunction_Condition_Expected) - 4. Add mocks for external dependencies - 5. Include benchmarks for performance-critical code - - Follow existing test patterns in the codebase. - handover: - contract: - type: test_suite - command: "{{ project.test_command }}" - - must_pass: false - on_failure: retry - max_retries: 3 - output_artifacts: - - name: tests - path: .wave/output/generated-tests.md - type: markdown - - - id: verify-coverage - persona: auditor - dependencies: [generate-tests] - exec: - type: prompt - source: | - Verify the generated tests: - - 1. Run coverage again — did it improve? - 2. Are tests meaningful (not just line coverage)? - 3. Do tests actually catch bugs? - 4. Are mocks appropriate and minimal? - 5. Is test code maintainable? - - Output: coverage delta and quality assessment - output_artifacts: - - name: verification - path: .wave/output/coverage-verification.md - type: markdown diff --git a/.wave/prompts/gitea-issue-impl/create-pr.md b/.wave/prompts/gitea-issue-impl/create-pr.md deleted file mode 100644 index d41d821..0000000 --- a/.wave/prompts/gitea-issue-impl/create-pr.md +++ /dev/null @@ -1,67 +0,0 @@ -You are creating a pull request for the implemented Gitea issue. - -Input: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by the -plan step and is already checked out. All git operations here are isolated from -the main working tree. - -Read the issue assessment artifact to find the issue number, repository, branch name, and issue URL. - -## SAFETY: Do NOT Modify the Working Tree - -This step MUST NOT run `git checkout`, `git stash`, or any command that changes -the current branch or working tree state. The branch already exists from the -implement step — just push it and create the PR. - -## Instructions - -### Step 1: Load Context - -From the issue assessment artifact, extract: -- Issue number and title -- Repository (`owner/repo`) -- Branch name -- Issue URL - -### Step 2: Push the Branch - -Push the feature branch without checking it out: - -```bash -git push -u origin <BRANCH_NAME> -``` - -### Step 3: Create Pull Request - -Create the PR using `tea pulls create` with `--head` to target the branch. The PR description MUST include `Closes #<NUMBER>` to auto-close the issue on merge. - -```bash -tea pulls create --repo <OWNER/REPO> --login librete --head <BRANCH_NAME> -t "<concise title>" -d "$(cat <<'PRBODY' -## Summary -<3-5 bullet points describing the changes> - -Closes #<ISSUE_NUMBER> - -## Changes -<list of key files changed and why> - -## Test Plan -<how the changes were validated> -PRBODY -)" -``` - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT run `git checkout`, `git stash`, or any branch-switching commands -- The PR description MUST contain `Closes #<NUMBER>` to link to the issue -- Do NOT include Co-Authored-By or AI attribution in commits - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/gitea-issue-impl/fetch-assess.md b/.wave/prompts/gitea-issue-impl/fetch-assess.md deleted file mode 100644 index dc24ae0..0000000 --- a/.wave/prompts/gitea-issue-impl/fetch-assess.md +++ /dev/null @@ -1,81 +0,0 @@ -You are fetching a Gitea issue and assessing whether it has enough detail to implement. - -Input: {{ input }} - -The input format is `owner/repo number` (e.g. `public/librenotes 42`). - -## Working Directory - -You are running in an isolated Wave workspace. The `tea` CLI works from any -directory when using the `--repo` and `--login` flags, so no directory change is needed. - -## Instructions - -### Step 1: Parse Input - -Extract the repository (`owner/repo`) and issue number from the input string. - -### Step 2: Fetch Issue - -Use the `tea` CLI to fetch issues and filter for the target: - -```bash -tea issues list --repo <OWNER/REPO> --login librete -o json -f index,title,body,labels,state,url --limit 50 -``` - -Then filter the JSON output for the issue matching the requested number. - -### Step 3: Assess Implementability - -Evaluate the issue against these criteria: - -1. **Clear description**: Does the issue describe what needs to change? (not just "X is broken") -2. **Sufficient context**: Can you identify which code/files are affected? -3. **Testable outcome**: Are there acceptance criteria, or can you infer them from the description? - -Score the issue 0-100: -- **80-100**: Well-specified, clear requirements, acceptance criteria present -- **60-79**: Adequate detail, some inference needed but feasible -- **40-59**: Marginal — missing key details but core intent is clear -- **0-39**: Too vague to implement — set `implementable` to `false` - -### Step 4: Determine Skip Steps - -Based on the issue quality, decide which speckit steps can be skipped: -- Issues with detailed specs can skip `specify`, `clarify`, `checklist`, `analyze` -- Issues with moderate detail might skip `specify` and `clarify` only -- Vague issues should skip nothing (but those should fail the assessment) - -### Step 5: Generate Branch Name - -Create a branch name using the pattern `<NNN>-<short-name>` where: -- `<NNN>` is the issue number zero-padded to 3 digits -- `<short-name>` is 2-3 words from the issue title, kebab-case - -### Step 6: Assess Complexity - -Estimate implementation complexity: -- **trivial**: Single file change, obvious fix (typo, config tweak) -- **simple**: 1-3 files, straightforward logic change -- **medium**: 3-10 files, new feature with tests -- **complex**: 10+ files, architectural changes, cross-cutting concerns - -## CRITICAL: Implementability Gate - -If the issue does NOT have enough detail to implement: -- Set `"implementable": false` in the output -- This will cause the contract validation to fail, aborting the pipeline -- Include `missing_info` listing what specific information is needed -- Include a `summary` explaining why the issue cannot be implemented as-is - -If the issue IS implementable: -- Set `"implementable": true` - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT modify the issue — this is read-only assessment - -## Output - -Produce a JSON assessment matching the injected output schema. diff --git a/.wave/prompts/gitea-issue-impl/implement.md b/.wave/prompts/gitea-issue-impl/implement.md deleted file mode 100644 index 910b3c2..0000000 --- a/.wave/prompts/gitea-issue-impl/implement.md +++ /dev/null @@ -1,87 +0,0 @@ -You are implementing a Gitea issue according to the plan and task breakdown. - -Input: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by the -plan step and is already checked out. All git operations here are isolated from -the main working tree. - -## Instructions - -### Step 1: Load Context - -1. Get the issue details and branch name from the issue assessment artifact -2. Get the task breakdown, file changes, and feature directory from the plan artifact - -### Step 2: Read Plan Files - -Navigate to the feature directory and read: -- `spec.md` — the full specification -- `plan.md` — the implementation plan -- `tasks.md` — the phased task breakdown - -### Step 3: Execute Implementation - -Follow the task breakdown phase by phase: - -**Setup first**: Initialize project structure, dependencies, configuration - -**Tests before code (TDD)**: -- Write tests that define expected behavior -- Run tests to confirm they fail for the right reason -- Implement the code to make tests pass - -**Core development**: Implement the changes specified in the plan - -**Integration**: Wire components together, update imports, middleware - -**Polish**: Edge cases, error handling, documentation updates - -### Step 4: Validate Between Phases - -After each phase, run: -```bash -go test -race ./... -``` - -If tests fail, fix the issue before proceeding to the next phase. - -### Step 5: Mark Completed Tasks - -As you complete each task, mark it as `[X]` in `tasks.md`. - -### Step 6: Final Validation - -After all tasks are complete: -1. Run `go test -race ./...` one final time -2. Verify all tasks in `tasks.md` are marked complete -3. Stage and commit all changes: - ```bash - git add -A - git reset HEAD -- .wave/artifacts .wave/output .claude CLAUDE.md 2>/dev/null || true - git commit -m "feat: implement #<ISSUE_NUMBER> — <short description>" - ``` - -Commit changes to the worktree branch. - -## Agent Usage — USE UP TO 6 AGENTS - -Maximize parallelism with up to 6 Task agents for independent work: -- Agents 1-2: Setup and foundational tasks (Phase 1-2) -- Agents 3-4: Core implementation tasks (parallelizable [P] tasks) -- Agent 5: Test writing and validation -- Agent 6: Integration and polish tasks - -Coordinate agents to respect task dependencies: -- Sequential tasks (no [P] marker) must complete before dependents start -- Parallel tasks [P] affecting different files can run simultaneously -- Run test validation between phases - -## Error Handling - -- If a task fails, halt dependent tasks but continue independent ones -- Provide clear error context for debugging -- If tests fail, fix the issue before proceeding to the next phase diff --git a/.wave/prompts/gitea-issue-impl/plan.md b/.wave/prompts/gitea-issue-impl/plan.md deleted file mode 100644 index 2f1d42b..0000000 --- a/.wave/prompts/gitea-issue-impl/plan.md +++ /dev/null @@ -1,90 +0,0 @@ -You are creating an implementation plan for a Gitea issue. - -Input: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** checked out at `main` (detached HEAD). -Your working directory IS the project root. All git operations here are isolated -from the main working tree and will not affect it. - -Use `create-new-feature.sh` to create the feature branch from this clean starting point. - -## Instructions - -### Step 1: Read Assessment - -From the issue assessment artifact, extract: -- Issue number, title, body, and repository -- Branch name from the assessment -- Complexity estimate -- Which speckit steps were skipped - -### Step 2: Create Feature Branch - -Use the `create-new-feature.sh` script to create a properly numbered branch: - -```bash -.specify/scripts/bash/create-new-feature.sh --json --number <ISSUE_NUMBER> --short-name "<SHORT_NAME>" "<ISSUE_TITLE>" -``` - -If the branch already exists (e.g. from a resume), check it out instead: -```bash -git checkout <BRANCH_NAME> -``` - -### Step 3: Write Spec from Issue - -In the feature directory (e.g. `specs/<BRANCH_NAME>/`), create `spec.md` with: -- Issue title as heading -- Full issue body -- Labels and metadata -- Any acceptance criteria extracted from the issue -- Link back to the original issue URL - -### Step 4: Create Implementation Plan - -Write `plan.md` in the feature directory with: - -1. **Objective**: What the issue asks for (1-2 sentences) -2. **Approach**: High-level strategy -3. **File Mapping**: Which files need to be created/modified/deleted -4. **Architecture Decisions**: Any design choices made -5. **Risks**: Potential issues and mitigations -6. **Testing Strategy**: What tests are needed - -### Step 5: Create Task Breakdown - -Write `tasks.md` in the feature directory with a phased breakdown: - -```markdown -# Tasks - -## Phase 1: Setup -- [ ] Task 1.1: Description -- [ ] Task 1.2: Description - -## Phase 2: Core Implementation -- [ ] Task 2.1: Description [P] (parallelizable) -- [ ] Task 2.2: Description [P] - -## Phase 3: Testing -- [ ] Task 3.1: Write unit tests -- [ ] Task 3.2: Write integration tests - -## Phase 4: Polish -- [ ] Task 4.1: Documentation updates -- [ ] Task 4.2: Final validation -``` - -Mark parallelizable tasks with `[P]`. - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT start implementation — only planning in this step -- Do NOT use WebSearch — all information is in the issue and codebase - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/github-issue-impl/create-pr.md b/.wave/prompts/github-issue-impl/create-pr.md deleted file mode 100644 index 37dba14..0000000 --- a/.wave/prompts/github-issue-impl/create-pr.md +++ /dev/null @@ -1,76 +0,0 @@ -You are creating a pull request for the implemented GitHub issue. - -Input: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by the -plan step and is already checked out. All git operations here are isolated from -the main working tree. - -Read the issue assessment artifact to find the issue number, repository, branch name, and issue URL. - -## SAFETY: Do NOT Modify the Working Tree - -This step MUST NOT run `git checkout`, `git stash`, or any command that changes -the current branch or working tree state. The branch already exists from the -implement step — just push it and create the PR. - -## Instructions - -### Step 1: Load Context - -From the issue assessment artifact, extract: -- Issue number and title -- Repository (`owner/repo`) -- Branch name -- Issue URL - -### Step 2: Push the Branch - -Push the feature branch without checking it out: - -```bash -git push -u origin <BRANCH_NAME> -``` - -### Step 3: Create Pull Request - -Create the PR using `gh pr create` with `--head` to target the branch. The PR body MUST include `Closes #<NUMBER>` to auto-close the issue on merge. - -```bash -gh pr create --repo <OWNER/REPO> --head <BRANCH_NAME> --title "<concise title>" --body "$(cat <<'EOF' -## Summary -<3-5 bullet points describing the changes> - -Closes #<ISSUE_NUMBER> - -## Changes -<list of key files changed and why> - -## Test Plan -<how the changes were validated> -EOF -)" -``` - -### Step 4: Request Copilot Review (Best-Effort) - -After the PR is created, attempt to add Copilot as a reviewer: -```bash -gh pr edit --add-reviewer "copilot" -``` - -This is a best-effort command. If Copilot isn't available in the repository, the command will fail silently and the PR will still be created successfully. - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT run `git checkout`, `git stash`, or any branch-switching commands -- The PR body MUST contain `Closes #<NUMBER>` to link to the issue -- Do NOT include Co-Authored-By or AI attribution in commits - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/github-issue-impl/fetch-assess.md b/.wave/prompts/github-issue-impl/fetch-assess.md deleted file mode 100644 index 6a7da2d..0000000 --- a/.wave/prompts/github-issue-impl/fetch-assess.md +++ /dev/null @@ -1,79 +0,0 @@ -You are fetching a GitHub issue and assessing whether it has enough detail to implement. - -Input: {{ input }} - -The input format is `owner/repo number` (e.g. `re-cinq/wave 42`). - -## Working Directory - -You are running in an isolated Wave workspace. The `gh` CLI works from any -directory when using the `--repo` flag, so no directory change is needed. - -## Instructions - -### Step 1: Parse Input - -Extract the repository (`owner/repo`) and issue number from the input string. - -### Step 2: Fetch Issue - -Use the `gh` CLI to fetch the issue with full details: - -```bash -gh issue view <NUMBER> --repo <OWNER/REPO> --json number,title,body,url,labels,state,author,comments -``` - -### Step 3: Assess Implementability - -Evaluate the issue against these criteria: - -1. **Clear description**: Does the issue describe what needs to change? (not just "X is broken") -2. **Sufficient context**: Can you identify which code/files are affected? -3. **Testable outcome**: Are there acceptance criteria, or can you infer them from the description? - -Score the issue 0-100: -- **80-100**: Well-specified, clear requirements, acceptance criteria present -- **60-79**: Adequate detail, some inference needed but feasible -- **40-59**: Marginal — missing key details but core intent is clear -- **0-39**: Too vague to implement — set `implementable` to `false` - -### Step 4: Determine Skip Steps - -Based on the issue quality, decide which speckit steps can be skipped: -- Issues with detailed specs can skip `specify`, `clarify`, `checklist`, `analyze` -- Issues with moderate detail might skip `specify` and `clarify` only -- Vague issues should skip nothing (but those should fail the assessment) - -### Step 5: Generate Branch Name - -Create a branch name using the pattern `<NNN>-<short-name>` where: -- `<NNN>` is the issue number zero-padded to 3 digits -- `<short-name>` is 2-3 words from the issue title, kebab-case - -### Step 6: Assess Complexity - -Estimate implementation complexity: -- **trivial**: Single file change, obvious fix (typo, config tweak) -- **simple**: 1-3 files, straightforward logic change -- **medium**: 3-10 files, new feature with tests -- **complex**: 10+ files, architectural changes, cross-cutting concerns - -## CRITICAL: Implementability Gate - -If the issue does NOT have enough detail to implement: -- Set `"implementable": false` in the output -- This will cause the contract validation to fail, aborting the pipeline -- Include `missing_info` listing what specific information is needed -- Include a `summary` explaining why the issue cannot be implemented as-is - -If the issue IS implementable: -- Set `"implementable": true` - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT modify the issue — this is read-only assessment - -## Output - -Produce a JSON assessment matching the injected output schema. diff --git a/.wave/prompts/github-issue-impl/implement.md b/.wave/prompts/github-issue-impl/implement.md deleted file mode 100644 index f74031b..0000000 --- a/.wave/prompts/github-issue-impl/implement.md +++ /dev/null @@ -1,87 +0,0 @@ -You are implementing a GitHub issue according to the plan and task breakdown. - -Input: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by the -plan step and is already checked out. All git operations here are isolated from -the main working tree. - -## Instructions - -### Step 1: Load Context - -1. Get the issue details and branch name from the issue assessment artifact -2. Get the task breakdown, file changes, and feature directory from the plan artifact - -### Step 2: Read Plan Files - -Navigate to the feature directory and read: -- `spec.md` — the full specification -- `plan.md` — the implementation plan -- `tasks.md` — the phased task breakdown - -### Step 3: Execute Implementation - -Follow the task breakdown phase by phase: - -**Setup first**: Initialize project structure, dependencies, configuration - -**Tests before code (TDD)**: -- Write tests that define expected behavior -- Run tests to confirm they fail for the right reason -- Implement the code to make tests pass - -**Core development**: Implement the changes specified in the plan - -**Integration**: Wire components together, update imports, middleware - -**Polish**: Edge cases, error handling, documentation updates - -### Step 4: Validate Between Phases - -After each phase, run: -```bash -go test -race ./... -``` - -If tests fail, fix the issue before proceeding to the next phase. - -### Step 5: Mark Completed Tasks - -As you complete each task, mark it as `[X]` in `tasks.md`. - -### Step 6: Final Validation - -After all tasks are complete: -1. Run `go test -race ./...` one final time -2. Verify all tasks in `tasks.md` are marked complete -3. Stage and commit all changes: - ```bash - git add -A - git reset HEAD -- .wave/artifacts .wave/output .claude CLAUDE.md 2>/dev/null || true - git commit -m "feat: implement #<ISSUE_NUMBER> — <short description>" - ``` - -Commit changes to the worktree branch. - -## Agent Usage — USE UP TO 6 AGENTS - -Maximize parallelism with up to 6 Task agents for independent work: -- Agents 1-2: Setup and foundational tasks (Phase 1-2) -- Agents 3-4: Core implementation tasks (parallelizable [P] tasks) -- Agent 5: Test writing and validation -- Agent 6: Integration and polish tasks - -Coordinate agents to respect task dependencies: -- Sequential tasks (no [P] marker) must complete before dependents start -- Parallel tasks [P] affecting different files can run simultaneously -- Run test validation between phases - -## Error Handling - -- If a task fails, halt dependent tasks but continue independent ones -- Provide clear error context for debugging -- If tests fail, fix the issue before proceeding to the next phase diff --git a/.wave/prompts/github-issue-impl/plan.md b/.wave/prompts/github-issue-impl/plan.md deleted file mode 100644 index da74f88..0000000 --- a/.wave/prompts/github-issue-impl/plan.md +++ /dev/null @@ -1,90 +0,0 @@ -You are creating an implementation plan for a GitHub issue. - -Input: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** checked out at `main` (detached HEAD). -Your working directory IS the project root. All git operations here are isolated -from the main working tree and will not affect it. - -Use `create-new-feature.sh` to create the feature branch from this clean starting point. - -## Instructions - -### Step 1: Read Assessment - -From the issue assessment artifact, extract: -- Issue number, title, body, and repository -- Branch name from the assessment -- Complexity estimate -- Which speckit steps were skipped - -### Step 2: Create Feature Branch - -Use the `create-new-feature.sh` script to create a properly numbered branch: - -```bash -.specify/scripts/bash/create-new-feature.sh --json --number <ISSUE_NUMBER> --short-name "<SHORT_NAME>" "<ISSUE_TITLE>" -``` - -If the branch already exists (e.g. from a resume), check it out instead: -```bash -git checkout <BRANCH_NAME> -``` - -### Step 3: Write Spec from Issue - -In the feature directory (e.g. `specs/<BRANCH_NAME>/`), create `spec.md` with: -- Issue title as heading -- Full issue body -- Labels and metadata -- Any acceptance criteria extracted from the issue -- Link back to the original issue URL - -### Step 4: Create Implementation Plan - -Write `plan.md` in the feature directory with: - -1. **Objective**: What the issue asks for (1-2 sentences) -2. **Approach**: High-level strategy -3. **File Mapping**: Which files need to be created/modified/deleted -4. **Architecture Decisions**: Any design choices made -5. **Risks**: Potential issues and mitigations -6. **Testing Strategy**: What tests are needed - -### Step 5: Create Task Breakdown - -Write `tasks.md` in the feature directory with a phased breakdown: - -```markdown -# Tasks - -## Phase 1: Setup -- [ ] Task 1.1: Description -- [ ] Task 1.2: Description - -## Phase 2: Core Implementation -- [ ] Task 2.1: Description [P] (parallelizable) -- [ ] Task 2.2: Description [P] - -## Phase 3: Testing -- [ ] Task 3.1: Write unit tests -- [ ] Task 3.2: Write integration tests - -## Phase 4: Polish -- [ ] Task 4.1: Documentation updates -- [ ] Task 4.2: Final validation -``` - -Mark parallelizable tasks with `[P]`. - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT start implementation — only planning in this step -- Do NOT use WebSearch — all information is in the issue and codebase - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/speckit-flow/analyze.md b/.wave/prompts/speckit-flow/analyze.md deleted file mode 100644 index 72110d5..0000000 --- a/.wave/prompts/speckit-flow/analyze.md +++ /dev/null @@ -1,47 +0,0 @@ -You are performing a cross-artifact consistency and quality analysis across the -specification, plan, and tasks before implementation begins. - -Feature context: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by a -previous step and is already checked out. - -## Instructions - -Follow the `/speckit.analyze` workflow: - -1. Find the feature directory and spec file path from the spec info artifact -2. Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` - to find FEATURE_DIR and locate spec.md, plan.md, tasks.md -3. Load all three artifacts and build semantic models: - - Requirements inventory from spec.md - - User story/action inventory with acceptance criteria - - Task coverage mapping from tasks.md - - Constitution rule set from `.specify/memory/constitution.md` - -4. Run detection passes (limit to 50 findings total): - - **Duplication**: Near-duplicate requirements across artifacts - - **Ambiguity**: Vague adjectives, unresolved placeholders - - **Underspecification**: Requirements missing outcomes, tasks missing file paths - - **Constitution alignment**: Conflicts with MUST principles - - **Coverage gaps**: Requirements with no tasks, tasks with no requirements - - **Inconsistency**: Terminology drift, data entity mismatches, ordering contradictions - -5. Assign severity: CRITICAL / HIGH / MEDIUM / LOW -6. Produce a compact analysis report (do NOT modify files — read-only analysis) - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT use WebSearch — all information is in the spec artifacts -- This is a READ-ONLY analysis — do NOT modify any files - -## Output - -Produce a JSON analysis report matching the injected output schema. - -IMPORTANT: If CRITICAL issues are found, document them clearly but do NOT block -the pipeline. The implement step will handle resolution. diff --git a/.wave/prompts/speckit-flow/checklist.md b/.wave/prompts/speckit-flow/checklist.md deleted file mode 100644 index ba66ee1..0000000 --- a/.wave/prompts/speckit-flow/checklist.md +++ /dev/null @@ -1,40 +0,0 @@ -You are generating quality checklists to validate requirement completeness before -implementation. - -Feature context: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by a -previous step and is already checked out. - -## Instructions - -Follow the `/speckit.checklist` workflow: - -1. Find the feature directory and spec file path from the spec info artifact -2. Run `.specify/scripts/bash/check-prerequisites.sh --json` to get FEATURE_DIR -3. Load feature context: spec.md, plan.md, tasks.md -4. Generate focused checklists as "unit tests for requirements": - - Each item tests the QUALITY of requirements, not the implementation - - Use format: `- [ ] CHK### - Question about requirement quality [Dimension]` - - Group by quality dimensions: Completeness, Clarity, Consistency, Coverage - -5. Create the following checklist files in `FEATURE_DIR/checklists/`: - - `review.md` — overall requirements quality validation - - Additional domain-specific checklists as warranted by the feature - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT use WebSearch — all information is in the spec artifacts - -## Checklist Anti-Patterns (AVOID) - -- WRONG: "Verify the button clicks correctly" (tests implementation) -- RIGHT: "Are interaction requirements defined for all clickable elements?" (tests requirements) - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/speckit-flow/clarify.md b/.wave/prompts/speckit-flow/clarify.md deleted file mode 100644 index 5d870ad..0000000 --- a/.wave/prompts/speckit-flow/clarify.md +++ /dev/null @@ -1,42 +0,0 @@ -You are refining a feature specification by identifying and resolving ambiguities. - -Feature context: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by a -previous step and is already checked out. - -## Instructions - -Follow the `/speckit.clarify` workflow: - -1. Find the feature directory and spec file path from the spec info artifact -2. Run `.specify/scripts/bash/check-prerequisites.sh --json --paths-only` to confirm paths -3. Load the current spec and perform a focused ambiguity scan across: - - Functional scope and domain model - - Integration points and edge cases - - Terminology consistency -4. Generate up to 5 clarification questions (prioritized) -5. For each question, select the best option based on codebase context -6. Integrate each resolution directly into the spec file -7. Save the updated spec - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT use WebSearch — all clarifications should be resolved from codebase - context and the existing spec. The specify step already did the research. -- Keep the scope tight: only fix genuine ambiguities, don't redesign the spec - -## Non-Interactive Mode - -Since this runs in a pipeline, resolve all clarifications autonomously: -- Select the recommended option based on codebase patterns and existing architecture -- Document the rationale for each choice in the Clarifications section -- Err on the side of commonly-accepted industry standards - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/speckit-flow/create-pr.md b/.wave/prompts/speckit-flow/create-pr.md deleted file mode 100644 index 561dc43..0000000 --- a/.wave/prompts/speckit-flow/create-pr.md +++ /dev/null @@ -1,53 +0,0 @@ -You are creating a pull request for the implemented feature and requesting a review. - -Feature context: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by a -previous step and is already checked out. - -## Instructions - -1. Find the branch name and feature directory from the spec info artifact - -2. **Verify implementation**: Run `go test -race ./...` one final time to confirm - all tests pass. If tests fail, fix them before proceeding. - -3. **Stage changes**: Review all modified and new files with `git status` and `git diff`. - Stage relevant files — exclude any sensitive files (.env, credentials). - -4. **Commit**: Create a well-structured commit (or multiple commits if logical): - - Use conventional commit prefixes: `feat:`, `fix:`, `refactor:`, `test:`, `docs:` - - Write concise commit messages focused on the "why" - - Do NOT include Co-Authored-By or AI attribution lines - -5. **Push**: Push the branch to the remote repository: - ```bash - git push -u origin HEAD - ``` - -6. **Create Pull Request**: Use `gh pr create` with a descriptive summary: - ```bash - gh pr create --title "<concise title>" --body "<PR body with summary and test plan>" - ``` - - The PR body should include: - - Summary of changes (3-5 bullet points) - - Link to the spec file in the specs/ directory - - Test plan describing how changes were validated - - Any known limitations or follow-up work needed - -7. **Request Copilot Review**: After the PR is created, request a review from Copilot: - ```bash - gh pr edit --add-reviewer "copilot" - ``` - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/speckit-flow/implement.md b/.wave/prompts/speckit-flow/implement.md deleted file mode 100644 index 18d6ece..0000000 --- a/.wave/prompts/speckit-flow/implement.md +++ /dev/null @@ -1,49 +0,0 @@ -You are implementing a feature according to the specification, plan, and task breakdown. - -Feature context: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by a -previous step and is already checked out. - -## Instructions - -Follow the `/speckit.implement` workflow: - -1. Find the feature directory and spec file path from the spec info artifact -2. Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` - to find FEATURE_DIR, load tasks.md, plan.md, and all available artifacts -3. Check checklists status — if any are incomplete, note them but proceed -4. Parse tasks.md and extract phase structure, dependencies, and execution order -5. Execute implementation phase-by-phase: - - **Setup first**: Initialize project structure, dependencies, configuration - **Tests before code**: Write tests for contracts and entities (TDD approach) - **Core development**: Implement models, services, CLI commands, endpoints - **Integration**: Database connections, middleware, logging, external services - **Polish**: Unit tests, performance optimization, documentation - -6. For each completed task, mark it as `[X]` in tasks.md -7. Run `go test -race ./...` after each phase to catch regressions early -8. Final validation: verify all tasks complete, tests pass, spec requirements met - -## Agent Usage — USE UP TO 6 AGENTS - -Maximize parallelism with up to 6 Task agents for independent work: -- Agents 1-2: Setup and foundational tasks (Phase 1-2) -- Agents 3-4: Core implementation tasks (parallelizable [P] tasks) -- Agent 5: Test writing and validation -- Agent 6: Integration and polish tasks - -Coordinate agents to respect task dependencies: -- Sequential tasks (no [P] marker) must complete before dependents start -- Parallel tasks [P] affecting different files can run simultaneously -- Run test validation between phases - -## Error Handling - -- If a task fails, halt dependent tasks but continue independent ones -- Provide clear error context for debugging -- If tests fail, fix the issue before proceeding to the next phase diff --git a/.wave/prompts/speckit-flow/plan.md b/.wave/prompts/speckit-flow/plan.md deleted file mode 100644 index 8dc4801..0000000 --- a/.wave/prompts/speckit-flow/plan.md +++ /dev/null @@ -1,41 +0,0 @@ -You are creating an implementation plan for a feature specification. - -Feature context: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by a -previous step and is already checked out. - -## Instructions - -Follow the `/speckit.plan` workflow: - -1. Find the feature directory and spec file path from the spec info artifact -2. Run `.specify/scripts/bash/setup-plan.sh --json` to get FEATURE_SPEC, IMPL_PLAN, - SPECS_DIR, and BRANCH paths -3. Load the feature spec and `.specify/memory/constitution.md` -4. Follow the plan template phases: - - **Phase 0 — Outline & Research**: - - Extract unknowns from the spec (NEEDS CLARIFICATION markers, tech decisions) - - Research best practices for each technology choice - - Consolidate findings into `research.md` with Decision/Rationale/Alternatives - - **Phase 1 — Design & Contracts**: - - Extract entities from spec → write `data-model.md` - - Generate API contracts from functional requirements → `/contracts/` - - Run `.specify/scripts/bash/update-agent-context.sh claude` - -5. Evaluate constitution compliance at each phase gate -6. Stop after Phase 1 — report branch, plan path, and generated artifacts - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT use WebSearch — all information is in the spec and codebase - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/speckit-flow/specify.md b/.wave/prompts/speckit-flow/specify.md deleted file mode 100644 index 4b3acbc..0000000 --- a/.wave/prompts/speckit-flow/specify.md +++ /dev/null @@ -1,50 +0,0 @@ -You are creating a feature specification for the following request: - -{{ input }} - -## Working Directory - -You are running in an **isolated git worktree** checked out at `main` (detached HEAD). -Your working directory IS the project root. All git operations here are isolated -from the main working tree and will not affect it. - -Use `create-new-feature.sh` to create the feature branch from this clean starting point. - -## Instructions - -Follow the `/speckit.specify` workflow to generate a complete feature specification: - -1. Generate a concise short name (2-4 words) for the feature branch -2. Check existing branches to determine the next available number: - ```bash - git fetch --all --prune - git ls-remote --heads origin | grep -E 'refs/heads/[0-9]+-' - git branch | grep -E '^[* ]*[0-9]+-' - ``` -3. Run the feature creation script: - ```bash - .specify/scripts/bash/create-new-feature.sh --json --number <N> --short-name "<name>" "{{ input }}" - ``` -4. Load `.specify/templates/spec-template.md` for the required structure -5. Write the specification to the SPEC_FILE returned by the script -6. Create the quality checklist at `FEATURE_DIR/checklists/requirements.md` -7. Run self-validation against the checklist (up to 3 iterations) - -## Agent Usage - -Use 1-3 Task agents to parallelize independent work: -- Agent 1: Analyze the codebase to understand existing patterns and architecture -- Agent 2: Research domain-specific best practices for the feature -- Agent 3: Draft specification sections in parallel - -## Quality Standards - -- Focus on WHAT and WHY, not HOW (no implementation details) -- Every requirement must be testable and unambiguous -- Maximum 3 `[NEEDS CLARIFICATION]` markers — make informed guesses for the rest -- Include user stories with acceptance criteria, data model, edge cases -- Success criteria must be measurable and technology-agnostic - -## Output - -Produce a JSON status report matching the injected output schema. diff --git a/.wave/prompts/speckit-flow/tasks.md b/.wave/prompts/speckit-flow/tasks.md deleted file mode 100644 index 45906f8..0000000 --- a/.wave/prompts/speckit-flow/tasks.md +++ /dev/null @@ -1,52 +0,0 @@ -You are generating an actionable, dependency-ordered task breakdown for implementation. - -Feature context: {{ input }} - -## Working Directory - -You are running in an **isolated git worktree** shared with previous pipeline steps. -Your working directory IS the project root. The feature branch was created by a -previous step and is already checked out. - -## Instructions - -Follow the `/speckit.tasks` workflow: - -1. Find the feature directory and spec file path from the spec info artifact -2. Run `.specify/scripts/bash/check-prerequisites.sh --json` to get FEATURE_DIR - and AVAILABLE_DOCS -3. Load from FEATURE_DIR: - - **Required**: plan.md (tech stack, structure), spec.md (user stories, priorities) - - **Optional**: data-model.md, contracts/, research.md, quickstart.md -4. Execute task generation: - - Extract user stories with priorities (P1, P2, P3) from spec.md - - Map entities and endpoints to user stories - - Generate tasks organized by user story - -5. Write `tasks.md` following the strict checklist format: - ``` - - [ ] [TaskID] [P?] [Story?] Description with file path - ``` - -6. Organize into phases: - - Phase 1: Setup (project initialization) - - Phase 2: Foundational (blocking prerequisites) - - Phase 3+: One phase per user story (priority order) - - Final: Polish & cross-cutting concerns - -## CONSTRAINTS - -- Do NOT spawn Task subagents — work directly in the main context -- Do NOT use WebSearch — all information is in the spec artifacts -- Keep the scope tight: generate tasks from existing artifacts only - -## Quality Requirements - -- Every task must have a unique ID (T001, T002...), description, and file path -- Mark parallelizable tasks with [P] -- Each user story phase must be independently testable -- Tasks must be specific enough for an LLM to complete without additional context - -## Output - -Produce a JSON status report matching the injected output schema.