@mrciphersmith/keryx 0.2.97 → 0.2.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +4583 -2702
- package/dist/core.js +40 -2
- package/package.json +1 -1
- package/src/gdskills/bundled/rules/core/api-contracts.mdc +1 -0
- package/src/gdskills/bundled/rules/core/cli-interface-design.mdc +237 -0
- package/src/gdskills/bundled/rules/core/code-style-patterns.mdc +1 -0
- package/src/gdskills/bundled/rules/core/database-patterns.mdc +1 -0
- package/src/gdskills/bundled/rules/core/definition-of-done.mdc +116 -0
- package/src/gdskills/bundled/rules/core/documentation-management.mdc +33 -38
- package/src/gdskills/bundled/rules/core/error-handling.mdc +1 -11
- package/src/gdskills/bundled/rules/core/execution-metrics.md +1 -2
- package/src/gdskills/bundled/rules/core/frontend-assistant.mdc +1 -0
- package/src/gdskills/bundled/rules/core/git-concurrency.mdc +101 -0
- package/src/gdskills/bundled/rules/core/implementation-plans.mdc +23 -11
- package/src/gdskills/bundled/rules/core/mobx-store-template.mdc +1 -0
- package/src/gdskills/bundled/rules/core/nestjs-dto.mdc +1 -0
- package/src/gdskills/bundled/rules/core/playwright-testing.mdc +1 -0
- package/src/gdskills/bundled/rules/core/requirements-management.mdc +15 -11
- package/src/gdskills/bundled/rules/core/rule-management-workflow.mdc +29 -14
- package/src/gdskills/bundled/rules/core/shared-definitions.mdc +1 -1
- package/src/gdskills/bundled/rules/core/skill-lifecycle.mdc +9 -5
- package/src/gdskills/bundled/rules/core/skills-storage-workflow.mdc +156 -23
- package/src/gdskills/bundled/rules/core/storybook-guidelines.mdc +1 -0
- package/src/gdskills/bundled/rules/core/subagent-status-protocol.md +9 -2
- package/src/gdskills/bundled/skills/core/reviewer-skill-creator/SKILL.md +42 -5
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +67 -74
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.md +24 -8
- package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +2 -2
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.detail.md +12 -22
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +44 -31
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.md +2 -2
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.template.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/input-contract.schema.json +4 -4
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +2 -2
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +20 -6
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +67 -9
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +6 -6
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.md +45 -5
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +88 -32
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +52 -41
- package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +32 -1
- package/src/gdskills/bundled/skills/planning/autodoc-analyst/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/autodoc-architect/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/autodoc-assembler/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +17 -0
- package/src/gdskills/bundled/skills/planning/autodoc-scanner/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/autodoc-writer/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +29 -4
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +17 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +17 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +17 -0
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +32 -2
- package/src/gdskills/bundled/skills/planning/docpack-review/SKILL.md +14 -2
- package/src/gdskills/bundled/skills/planning/interview/SKILL.md +30 -8
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +33 -7
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +16 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +16 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +17 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +17 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.md +17 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.md +27 -10
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +16 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +16 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +16 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +16 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +16 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +4 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +4 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +4 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +4 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +4 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +4 -0
- package/src/gdskills/bundled/skills/platform/agent-entrypoint-distiller/SKILL.md +31 -4
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.md +27 -3
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.md +29 -4
- package/src/gdskills/bundled/skills/quality/api-truth/SKILL.md +226 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.md +25 -5
- package/src/gdskills/bundled/skills/quality/commit/SKILL.md +26 -5
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.md +25 -4
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.md +26 -5
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +27 -4
- package/src/gdskills/bundled/skills/quality/deprecation-path/SKILL.md +268 -0
- package/src/gdskills/bundled/skills/quality/fresh-eyes/SKILL.md +190 -0
- package/src/gdskills/bundled/skills/quality/metaproject-security/SKILL.md +24 -3
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.md +30 -9
- package/src/gdskills/bundled/skills/quality/pr/SKILL.md +25 -5
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.md +27 -4
- package/src/gdskills/bundled/skills/quality/push/SKILL.md +25 -4
- package/src/gdskills/bundled/skills/quality/root-cause/SKILL.md +204 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.md +25 -4
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.md +31 -5
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.md +32 -11
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.md +42 -7
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.md +43 -3
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.md +46 -4
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.md +46 -6
- package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +5 -5
- package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +5 -6
- package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +6 -6
- package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +37 -3
- package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +38 -4
- package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +4 -6
- package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +37 -3
- package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +5 -7
- package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +24 -3
- package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +5 -5
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +49 -64
- package/src/gdskills/bundled/skills/review/review-orchestrator/input-contract.schema.json +1 -2
- package/src/gdskills/bundled/skills/review/review-orchestrator/review-context.schema.json +1 -5
- package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-input.schema.json +53 -9
- package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +11 -11
- package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +9 -8
- package/src/gdskills/bundled/skills/review/review-regression/SKILL.md +33 -2
- package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +6 -4
- package/src/gdskills/bundled/skills/review/review-style/SKILL.md +5 -5
- package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +41 -3
- package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +2 -2
- package/src/gdskills/bundled/rules/core/review-agent-profile.mdc +0 -49
- package/src/gdskills/bundled/rules/core/review-strict-profile.mdc +0 -48
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +0 -353
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +0 -353
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +0 -353
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +0 -353
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +0 -655
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +0 -655
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +0 -655
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +0 -655
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +0 -434
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +0 -434
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +0 -434
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +0 -434
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +0 -163
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +0 -163
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +0 -373
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +0 -373
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +0 -373
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +0 -373
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +0 -374
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +0 -374
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +0 -374
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +0 -374
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +0 -2190
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +0 -2190
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +0 -2190
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +0 -2190
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +0 -659
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +0 -659
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +0 -659
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +0 -659
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +0 -90
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +0 -90
- package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +0 -187
- package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +0 -187
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +0 -105
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +0 -105
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +0 -193
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +0 -193
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +0 -193
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +0 -193
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +0 -87
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +0 -87
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +0 -100
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +0 -100
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +0 -84
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +0 -84
- package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +0 -66
- package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +0 -66
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +0 -66
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +0 -66
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +0 -81
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +0 -81
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +0 -70
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +0 -70
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +0 -83
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +0 -83
- package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +0 -75
- package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +0 -75
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +0 -378
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +0 -378
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +0 -378
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +0 -378
- package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +0 -52
- package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +0 -52
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +0 -108
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +0 -108
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +0 -75
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +0 -75
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +0 -339
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +0 -339
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +0 -339
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +0 -339
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +0 -203
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +0 -203
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +0 -203
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +0 -203
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +0 -243
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +0 -243
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +0 -243
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +0 -243
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +0 -259
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +0 -259
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +0 -259
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +0 -259
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +0 -168
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +0 -168
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +0 -168
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +0 -168
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pr
|
|
3
|
-
description: "Use when opening a pull request for the current branch."
|
|
3
|
+
description: "Use when opening a pull request for the current branch. NOT for rewriting the body of a pull request that already exists or its linked issue (use `pr-issue-documenter`)."
|
|
4
4
|
triggers:
|
|
5
|
-
- "
|
|
6
|
-
- "
|
|
5
|
+
- "open PR"
|
|
6
|
+
- "create pull request"
|
|
7
|
+
- "draft PR"
|
|
7
8
|
- "Open pull request"
|
|
8
|
-
- "Create pull request"
|
|
9
9
|
- "Make PR"
|
|
10
10
|
metadata:
|
|
11
11
|
author: "MrCipherSmith"
|
|
12
12
|
version: "1.0.0"
|
|
13
|
-
category: "
|
|
13
|
+
category: "quality"
|
|
14
14
|
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
15
15
|
license: "MIT"
|
|
16
16
|
---
|
|
@@ -73,3 +73,23 @@ Return the PR URL to the user.
|
|
|
73
73
|
- Always analyze ALL commits, not just the last one
|
|
74
74
|
- If the branch has linked GitHub issues, reference them in the body
|
|
75
75
|
- Ask user for confirmation before creating if there are 10+ commits
|
|
76
|
+
|
|
77
|
+
## Red Flags
|
|
78
|
+
|
|
79
|
+
| Rationalization | Why it is wrong |
|
|
80
|
+
|---|---|
|
|
81
|
+
| "The last commit message already summarizes the work, use it as the body" | A PR is the whole branch, not its tip. Read `main...HEAD`; the earliest commits are usually where the design decision a reviewer needs actually happened |
|
|
82
|
+
| "The branch isn't pushed, but `gh pr create` will sort that out" | It either fails or opens a PR against a stale remote head, so the diff a reviewer sees is not the diff you analyzed. Push with `-u origin <branch>` first |
|
|
83
|
+
| "The tree is dirty, but the commits are what get reviewed anyway" | Exactly — which means the uncommitted half of the change quietly does not exist in the PR, and the reviewer approves something incomplete. Ask before opening over a dirty tree |
|
|
84
|
+
| "There's an open issue that sounds like this work, I'll write `Closes #N`" | `Closes` shuts an issue on merge. Reference only issues the branch or its commits actually link to; a guess closes someone else's ticket |
|
|
85
|
+
| "The user asked for a PR, so 40 commits is still just 'create the PR'" | 10+ commits gets a confirmation first. A branch that large is usually two PRs, and saying so is cheaper before the PR exists than after review starts |
|
|
86
|
+
|
|
87
|
+
## Verification
|
|
88
|
+
|
|
89
|
+
Do not report the PR as done until all of the following hold:
|
|
90
|
+
|
|
91
|
+
- `gh pr view --json url,title,body` returns the created PR, with a non-empty body carrying Summary, Changes and Test plan
|
|
92
|
+
- The title is under 70 chars and describes the branch, not the last commit
|
|
93
|
+
- Every commit in `git log <base>..HEAD` is represented somewhere in the body — no area of the diff goes unmentioned
|
|
94
|
+
- The branch has an upstream and the remote head equals local `HEAD`
|
|
95
|
+
- The PR URL is returned to the user
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pr-issue-documenter
|
|
3
|
-
description: "Use when documenting PR changes, adding a PR description, creating a linked issue for a PR, or updating an existing issue body."
|
|
3
|
+
description: "Use when documenting PR changes, adding a PR description, creating a linked issue for a PR, or updating an existing issue body. NOT for opening the pull request in the first place (use `pr`)."
|
|
4
4
|
triggers:
|
|
5
|
+
- "document PR"
|
|
6
|
+
- "PR description"
|
|
7
|
+
- "create issue for PR"
|
|
5
8
|
- "Add PR description"
|
|
6
9
|
- "Document PR changes"
|
|
7
10
|
- "Describe what was done in PR"
|
|
8
|
-
- "Create issue for PR"
|
|
9
11
|
- "Update PR and issue"
|
|
10
12
|
- "Add description to PR"
|
|
11
13
|
- "Write PR summary"
|
|
12
14
|
metadata:
|
|
13
15
|
author: "MrCipherSmith"
|
|
14
16
|
version: "1.0.0"
|
|
15
|
-
category: "
|
|
16
|
-
compatible_harnesses: "cursor,codex,zed,opencode"
|
|
17
|
+
category: "quality"
|
|
18
|
+
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
17
19
|
license: "MIT"
|
|
18
20
|
---
|
|
19
21
|
|
|
@@ -363,6 +365,27 @@ Always present contradictions to user before making changes.
|
|
|
363
365
|
9. **DO NOT** modify PR title unless explicitly asked
|
|
364
366
|
10. **DO NOT** write comments on GitHub PRs/issues (only edit body)
|
|
365
367
|
|
|
368
|
+
## Red Flags
|
|
369
|
+
|
|
370
|
+
| Rationalization | Why it is wrong |
|
|
371
|
+
|---|---|
|
|
372
|
+
| "The existing issue body is stale and mine is better — replace it" | That body is someone's written record, and the parts you think are stale may be the parts they argued for. Present the contradictions, offer the three choices in Step 5.1, apply what the user picks |
|
|
373
|
+
| "The diff is huge; the commit messages describe it well enough" | Commit subjects and the diff disagree constantly — a rename half-finished, a "refactor" that changed behavior. Never write a change you have not seen in `gh pr diff` |
|
|
374
|
+
| "No issue is linked and this clearly deserves one, so I'll create it" | Issue creation needs the user's confirmation every time (Rule 8). An unasked-for issue is noise someone else has to triage and close |
|
|
375
|
+
| "The PR title is wrong too — fixing it while I'm in here is a favour" | Title changes are out of scope unless asked (Rule 9). The author chose it, and a silent retitle is invisible in the notification a reviewer gets |
|
|
376
|
+
| "Leaving a comment is less destructive than editing the body" | This skill edits bodies and never comments (Rule 10). A comment is a notification to every subscriber and does not update the description anyone reads first |
|
|
377
|
+
| "The diff has a hardcoded value, but that's the author's business" | Temporary and hardcoded values get marked for follow-up in the description — that is where the next reader looks, and where it otherwise disappears |
|
|
378
|
+
|
|
379
|
+
## Verification
|
|
380
|
+
|
|
381
|
+
Do not report done until all of the following hold:
|
|
382
|
+
|
|
383
|
+
- `gh pr view {number} --json body` returns the new body, with Summary, Changes and Key Files present, plus `Closes #N` when an issue is linked
|
|
384
|
+
- Every statement in the body maps to something visible in `gh pr diff {number}` — nothing invented, nothing carried over from a stale description
|
|
385
|
+
- If an issue was created or updated, `gh issue view {number} --json body` shows it; if it is a sub-issue, the parent issue body now contains its link
|
|
386
|
+
- Every contradiction found in Step 5.1 was presented to the user and resolved by their choice — none resolved silently
|
|
387
|
+
- The final report lists every PR and issue URL touched, as in Step 7
|
|
388
|
+
|
|
366
389
|
## Job Context Awareness
|
|
367
390
|
|
|
368
391
|
If called within an orchestrator job context, check for job context before starting:
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: push
|
|
3
|
-
description: "Use when pushing the current branch to the remote, especially when upstream tracking or safety checks are needed."
|
|
3
|
+
description: "Use when pushing the current branch to the remote, especially when upstream tracking or safety checks are needed. NOT for creating the commits themselves (use `commit`) or opening a pull request afterwards (use `pr`)."
|
|
4
4
|
triggers:
|
|
5
|
-
- "
|
|
5
|
+
- "push branch"
|
|
6
|
+
- "git push"
|
|
7
|
+
- "publish branch"
|
|
6
8
|
- "Push changes"
|
|
7
9
|
- "Push to remote"
|
|
8
|
-
- "Push branch"
|
|
9
10
|
metadata:
|
|
10
11
|
author: "MrCipherSmith"
|
|
11
12
|
version: "1.0.0"
|
|
12
|
-
category: "
|
|
13
|
+
category: "quality"
|
|
13
14
|
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
14
15
|
license: "MIT"
|
|
15
16
|
---
|
|
@@ -50,3 +51,23 @@ Show result: confirm push success with commit count.
|
|
|
50
51
|
- NEVER force push to main/master without double confirmation
|
|
51
52
|
- NEVER use `--no-verify`
|
|
52
53
|
- If push is rejected (non-fast-forward), suggest `git pull --rebase` first
|
|
54
|
+
|
|
55
|
+
## Red Flags
|
|
56
|
+
|
|
57
|
+
| Rationalization | Why it is wrong |
|
|
58
|
+
|---|---|
|
|
59
|
+
| "It was rejected, but `--force-with-lease` is safe enough here" | The lease only compares against the ref you last fetched. A teammate's push that landed since then is still discarded, silently. Rebase and push normally, or ask |
|
|
60
|
+
| "It's my own feature branch, so a force push hurts nobody" | Open PRs, CI runs, review threads and other worktrees read that ref. Rewriting it invalidates all of them. Force only when the user says "force push" in this conversation |
|
|
61
|
+
| "There are uncommitted changes, but they're unrelated to what I'm pushing" | The push ships what is committed, so unrelated work silently stays behind while the branch looks complete to a reviewer. Warn and ask before pushing over a dirty tree |
|
|
62
|
+
| "No upstream is set, so `git push origin HEAD` will do" | That leaves the branch untracked, and every later `git status` / `git push` has to guess. Use `git push -u origin <branch>` so the tracking is recorded once |
|
|
63
|
+
| "The pre-push hook is slow and this is a tiny change" | `--no-verify` is never the answer here — a tiny change is exactly what an unrun hook lets through |
|
|
64
|
+
|
|
65
|
+
## Verification
|
|
66
|
+
|
|
67
|
+
Do not report the push as done until all of the following hold:
|
|
68
|
+
|
|
69
|
+
- `git status` reports the branch up to date with its upstream
|
|
70
|
+
- `git branch -vv` shows an upstream for the current branch (set with `-u` if it had none)
|
|
71
|
+
- `git log @{upstream}..HEAD --oneline` is empty — nothing left unpushed
|
|
72
|
+
- The report states the commit count pushed and the remote/branch they landed on
|
|
73
|
+
- `--force` was used only if the user asked for it in this conversation, and never against main/master without double confirmation
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: root-cause
|
|
3
|
+
model_tier: deep
|
|
4
|
+
description: |
|
|
5
|
+
Use when a defect exists and nobody can yet say what produces it — a crash, a
|
|
6
|
+
wrong result, a failure a user hits and the suite never sees. The order is
|
|
7
|
+
fixed: reproduce it and write down how, localize before editing anything,
|
|
8
|
+
reduce to the smallest failing case, repair the mechanism rather than the
|
|
9
|
+
symptom, and leave behind a guard that was WATCHED failing without the repair.
|
|
10
|
+
Covers the case the defect refuses to appear: which evidence is admissible,
|
|
11
|
+
when to stop looking, and what to report in place of a fix.
|
|
12
|
+
NOT for: a defect already pinned to a line and a mechanism, where nothing
|
|
13
|
+
remains but writing the patch and its guard.
|
|
14
|
+
triggers:
|
|
15
|
+
- "root cause"
|
|
16
|
+
- "why does this fail"
|
|
17
|
+
- "cannot reproduce"
|
|
18
|
+
- "track down the bug"
|
|
19
|
+
- "debugging"
|
|
20
|
+
- "bisect"
|
|
21
|
+
metadata:
|
|
22
|
+
author: "MrCipherSmith"
|
|
23
|
+
version: "1.0.0"
|
|
24
|
+
category: "quality"
|
|
25
|
+
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
26
|
+
license: "MIT"
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Root Cause
|
|
30
|
+
|
|
31
|
+
A defect exists and nobody knows why. Your job is **not** to make the symptom
|
|
32
|
+
stop. It is to name the mechanism that produces it, change that, and leave
|
|
33
|
+
something behind that fails if it ever comes back.
|
|
34
|
+
|
|
35
|
+
The five steps below are an order, not a menu. Every one of them is skipped by
|
|
36
|
+
agents in the same way — forward, into the edit — and each skip costs the step
|
|
37
|
+
after it.
|
|
38
|
+
|
|
39
|
+
## 1. Reproduce, and write the reproduction down
|
|
40
|
+
|
|
41
|
+
Before any code is read: the exact command, the input, the environment, what you
|
|
42
|
+
expected, what happened, and **how often** — `10/10` and `3/10` are different
|
|
43
|
+
defects with different causes.
|
|
44
|
+
|
|
45
|
+
A fix produced without a reproduction is a guess with a diff attached. It cannot
|
|
46
|
+
be verified, because there is nothing that was failing to stop failing.
|
|
47
|
+
|
|
48
|
+
If the reproduction needs setup (a seeded row, a cleared cache, a second
|
|
49
|
+
process), that setup is part of it. Write it as commands someone else can run.
|
|
50
|
+
|
|
51
|
+
## 2. Localize before you edit
|
|
52
|
+
|
|
53
|
+
Reading a file top to bottom is not localization; it is hoping. Localization is
|
|
54
|
+
a **search that halves**:
|
|
55
|
+
|
|
56
|
+
- over history — `git bisect` between a known-good and known-bad revision;
|
|
57
|
+
- over the call path — `keryx gdgraph affected <file>` for what reaches the
|
|
58
|
+
site, then a probe at the midpoint of the path;
|
|
59
|
+
- over the input — cut the payload in half, keep the failing half;
|
|
60
|
+
- over the environment — one variable, one flag, one version at a time.
|
|
61
|
+
|
|
62
|
+
Two rules hold for the whole step. **Change one thing and record what happened.**
|
|
63
|
+
And **an edit made "to see what happens" is not a fix** — it either goes away or
|
|
64
|
+
it gets named in the diff as instrumentation.
|
|
65
|
+
|
|
66
|
+
Long output (a bisect run, a failing suite, a log) goes through
|
|
67
|
+
`keryx ctx run -- <cmd>` rather than into the reading window whole.
|
|
68
|
+
|
|
69
|
+
## 3. Reduce to the smallest failing case
|
|
70
|
+
|
|
71
|
+
Delete everything that can be deleted while it still fails. Each removal that
|
|
72
|
+
keeps the failure is evidence about what does **not** matter, and the residue is
|
|
73
|
+
usually the cause stated in the shortest possible form.
|
|
74
|
+
|
|
75
|
+
A reduced case is also the guard from step 5, already written.
|
|
76
|
+
|
|
77
|
+
## 4. Name the cause, then repair it
|
|
78
|
+
|
|
79
|
+
Say it in one sentence carrying a **mechanism**, not a location: "the cache key
|
|
80
|
+
omits the tenant id, so the second tenant reads the first tenant's row". "It is
|
|
81
|
+
in `store.ts`" is a location. "It is a race" is a category. Neither is a cause.
|
|
82
|
+
|
|
83
|
+
Then check the repair against that sentence:
|
|
84
|
+
|
|
85
|
+
| The repair | What it actually is |
|
|
86
|
+
|---|---|
|
|
87
|
+
| A guard that returns early when the value is missing | The missing value is the defect; you hid the only thing reporting it |
|
|
88
|
+
| A retry, a longer timeout, a `sleep` | The mechanism is untouched and now it is slower and intermittent |
|
|
89
|
+
| A widened type, a cast, an `any` | The compiler was right; the wrong value is still produced |
|
|
90
|
+
| A changed assertion or an expectation loosened to match | The test was the last thing telling the truth here |
|
|
91
|
+
|
|
92
|
+
Every row above makes the symptom go away. None of them is this skill's output.
|
|
93
|
+
|
|
94
|
+
## 5. Leave a guard that was seen failing
|
|
95
|
+
|
|
96
|
+
A test written after a fix and never observed red proves the test runs. It does
|
|
97
|
+
not prove it catches anything.
|
|
98
|
+
|
|
99
|
+
So: run the new test against the **unfixed** code and watch it fail. If the fix
|
|
100
|
+
is already applied, undo it in place (never `git stash` — a scoped stash takes
|
|
101
|
+
other people's uncommitted work with it), watch the test fail, restore the fix,
|
|
102
|
+
watch it pass. Record both observations.
|
|
103
|
+
|
|
104
|
+
If the defect cannot be reached from a test — it needs a device, a customer's
|
|
105
|
+
data, real concurrency — say so, and say what the guard would be instead: an
|
|
106
|
+
assertion, a counter, a log line at the decision point.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## When it does not reproduce
|
|
111
|
+
|
|
112
|
+
This is the case handled worst, and it is handled worst in one specific way: the
|
|
113
|
+
search for the defect quietly becomes a search for *something wrong*, and a
|
|
114
|
+
plausible-looking repair is shipped for a failure nobody ever saw.
|
|
115
|
+
|
|
116
|
+
### What is admissible
|
|
117
|
+
|
|
118
|
+
In descending strength:
|
|
119
|
+
|
|
120
|
+
1. **A failure you produced yourself.** Nothing else is in this class.
|
|
121
|
+
2. **An artifact of the original failure** — a stack trace, a log line with a
|
|
122
|
+
timestamp, a CI run id, an error string quoted by the reporter, a dump.
|
|
123
|
+
3. **A path you can show reaches the reported state**, with the input that
|
|
124
|
+
drives it *named and shown to exist*.
|
|
125
|
+
4. **A measured environment delta** — a version, a locale, a timezone, a clock
|
|
126
|
+
skew, an ordering, a concurrency level you actually varied and observed.
|
|
127
|
+
|
|
128
|
+
Not admissible, at any strength: this looks wrong; this pattern is usually a
|
|
129
|
+
bug; this is the kind of thing that causes that; two readings of the same file
|
|
130
|
+
agreeing. Reading harder produces no new evidence — the file says the same thing
|
|
131
|
+
the third time.
|
|
132
|
+
|
|
133
|
+
### Widen the attempt before you give up
|
|
134
|
+
|
|
135
|
+
One axis at a time, each attempt and its result recorded: input, environment and
|
|
136
|
+
versions, ordering and concurrency, persisted state (cache, DB, temp files),
|
|
137
|
+
clock and timezone, isolation (the single test vs the whole suite), random seed.
|
|
138
|
+
|
|
139
|
+
For anything intermittent, a count replaces a verdict. Run it 50 times and
|
|
140
|
+
report `1/50`. "It passed when I re-ran it" is not a result.
|
|
141
|
+
|
|
142
|
+
### When to stop
|
|
143
|
+
|
|
144
|
+
Stop when any of these is true, and stop deliberately rather than by drifting
|
|
145
|
+
into a fix:
|
|
146
|
+
|
|
147
|
+
- the next axis is one you cannot control — production data, a customer's
|
|
148
|
+
machine, hardware you do not have;
|
|
149
|
+
- the budget the task set for reproduction is spent;
|
|
150
|
+
- going further requires changing the code under investigation to see anything
|
|
151
|
+
at all. That is instrumentation, and landing it is a separate decision the
|
|
152
|
+
requester gets to make.
|
|
153
|
+
|
|
154
|
+
### Report instead of a fix
|
|
155
|
+
|
|
156
|
+
Not reproducing is a result, and it is reportable. What it is not is permission
|
|
157
|
+
to ship a change. The report carries:
|
|
158
|
+
|
|
159
|
+
- every reproduction attempt, one line each, with what happened;
|
|
160
|
+
- the strongest evidence held, labelled with its class from the list above;
|
|
161
|
+
- the hypotheses that survive that evidence — two or three, each with **the
|
|
162
|
+
observation that would kill it**;
|
|
163
|
+
- the instrumentation that would settle it, and where it goes;
|
|
164
|
+
- what was left unchanged.
|
|
165
|
+
|
|
166
|
+
Landing instrumentation alone and stopping is legitimate work. Landing a
|
|
167
|
+
speculative repair and closing the issue is not: if no experiment can tell your
|
|
168
|
+
change from a no-op, nothing was fixed, and the next person's bisect now
|
|
169
|
+
straddles a commit that did nothing.
|
|
170
|
+
|
|
171
|
+
## Red Flags
|
|
172
|
+
|
|
173
|
+
| Rationalization | Why it is wrong |
|
|
174
|
+
|---|---|
|
|
175
|
+
| "It never reproduced, but I found something that looks wrong — I will fix that." | A smell you found and a defect you never saw are different objects. Repairing the smell closes the ticket with the reported failure still live, and the next report now arrives against code you changed for unrelated reasons. |
|
|
176
|
+
| "It passed when I ran it again, so it is flaky / it is gone." | A single pass is not evidence of absence for a failure that was observed. Run it 50 times and report the rate; `1/50` is a finding, "it passed" is a sentence about one run. |
|
|
177
|
+
| "The stack trace names this line, so this line is the cause." | The trace names where the bad value surfaced, not where it was produced. The throwing frame is usually innocent; walk back to where the value was created and prove it was already wrong there. |
|
|
178
|
+
| "A null check here makes the crash go away." | The crash was the only thing reporting that the value was missing. A guard moves the failure somewhere later, quieter, and further from its cause — and the next report will not mention this file. |
|
|
179
|
+
| "I fixed it and the test I added passes." | A guard never watched failing proves the test executes. Run it against the unfixed code first; if it passes there, it is testing something other than the defect. |
|
|
180
|
+
| "I changed three things and now it works." | You have a working tree and no cause. One of the three was the fix and two are unexplained edits nobody can review. Revert to one change at a time, or the repair is folklore. |
|
|
181
|
+
| "It only breaks in CI, so it is an infrastructure problem." | "Only in CI" is an environment difference you have not named yet — ordering, concurrency, a clock, a locale, a missing file, a cold cache. Name the difference before assigning the defect to somebody else. |
|
|
182
|
+
| "It is obviously a race condition." | "Race" is a category, not a cause. Which two operations, over which piece of state, in which interleaving? Without those three, the word ends the investigation instead of advancing it. |
|
|
183
|
+
| "The reproduction takes too long to write down; I have it in my head." | The reproduction is the artifact the fix is verified against. Unwritten, it cannot be re-run after the change, and "it works now" becomes unfalsifiable. |
|
|
184
|
+
|
|
185
|
+
## Verification
|
|
186
|
+
|
|
187
|
+
Report the defect fixed only when all of these hold:
|
|
188
|
+
|
|
189
|
+
- The reproduction is written down as commands plus expected/observed, and it
|
|
190
|
+
failed before the change.
|
|
191
|
+
- The cause is one sentence naming a mechanism, not a file and not a category.
|
|
192
|
+
- The change alters that mechanism. No symptom was suppressed by a guard, a
|
|
193
|
+
retry, a widened type, or a loosened assertion.
|
|
194
|
+
- A guard exists and was **watched failing** against the unfixed code; the
|
|
195
|
+
report says where that was observed.
|
|
196
|
+
- Everything added to investigate — logging, timeouts, skipped tests, scratch
|
|
197
|
+
edits — is either removed or deliberately kept and named in the diff.
|
|
198
|
+
- If it never reproduced, no fix is claimed: the report carries the attempts,
|
|
199
|
+
the evidence and its class, the surviving hypotheses with their killing
|
|
200
|
+
observations, and the instrumentation that would settle it.
|
|
201
|
+
|
|
202
|
+
Credit: [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills)
|
|
203
|
+
(MIT) is why this set carries a debugging skill at all; the step order, the
|
|
204
|
+
evidence classes and the non-reproduction protocol were written here, not taken.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: security-audit
|
|
3
|
-
description: "Use when checking for dependency vulnerabilities, accidentally committed secrets, or security issues in Docker images."
|
|
3
|
+
description: "Use when checking for dependency vulnerabilities, accidentally committed secrets, or security issues in Docker images. NOT for Metaproject security policy — prompt-injection, redaction and memory/wiki/report writes belong to `metaproject-security` — and NOT for performing the upgrades a finding calls for (use `dependency-update`)."
|
|
4
4
|
triggers:
|
|
5
|
-
- "
|
|
6
|
-
- "
|
|
7
|
-
- "
|
|
5
|
+
- "security audit"
|
|
6
|
+
- "audit dependencies"
|
|
7
|
+
- "scan secrets"
|
|
8
8
|
- "Security scan"
|
|
9
9
|
- "Check for CVEs"
|
|
10
10
|
- "npm audit"
|
|
@@ -106,3 +106,24 @@ Otherwise report `container-scan: NOT RUN — <no Dockerfile | docker unavailabl
|
|
|
106
106
|
selected, could not run, or returned no vulnerability data. Report `not
|
|
107
107
|
measured` and name the reason. In a security report, silence read as "clean"
|
|
108
108
|
is the most expensive defect available.
|
|
109
|
+
|
|
110
|
+
## Red Flags
|
|
111
|
+
|
|
112
|
+
| Rationalization | Why it is wrong |
|
|
113
|
+
|---|---|
|
|
114
|
+
| "The advisory is informational / low severity — ship it" | This skill reports severity, it does not filter it. Accepting a known CVE is the caller's decision to make explicitly, not one you make for them by omission |
|
|
115
|
+
| "`npm audit` returned JSON with no vulnerabilities in it, so the project is clean" | Check for the `vulnerabilities` / `advisories` key before grouping. `ENOLOCK` is ~240 bytes of error that groups to zero in every severity — indistinguishable from clean, and that is the whole point of Step 1 |
|
|
116
|
+
| "No lockfile row matched, but `npm audit` is the usual one" | Falling through to another package manager's audit is a guess dressed as a result. The outcome is `dependency-audit: NOT RUN — no recognised lockfile`, with no totals attached |
|
|
117
|
+
| "There's no Dockerfile, so container scan: 0 issues" | "No Dockerfile" and "scanned, found nothing" are different results and only one of them is evidence. Report `container-scan: NOT RUN — no Dockerfile` |
|
|
118
|
+
| "`npm audit fix --force` clears the whole list" | `--force` installs semver-major upgrades across the tree. Never recommend it without stating which packages it would move and by how much |
|
|
119
|
+
| "That key looks like a test fixture, not a real secret" | A committed credential gets reported with its path and rotated first; whether it was live is decided afterwards, by someone who can check. Never print its value in the report |
|
|
120
|
+
|
|
121
|
+
## Verification
|
|
122
|
+
|
|
123
|
+
Do not report the audit as done until all of the following hold:
|
|
124
|
+
|
|
125
|
+
- Every step carries `RAN` or `NOT RUN — <reason>`, and no step marked NOT RUN carries a numeric total
|
|
126
|
+
- Severity totals appear only for steps that ran; everywhere else the report reads `not measured`, never `0`
|
|
127
|
+
- Every critical/high entry names a CVE or advisory id, the package, and the version range that pulls it in
|
|
128
|
+
- No raw secret value appears anywhere in the report — only path, line, and a redacted preview
|
|
129
|
+
- The report names the package manager and lockfile detected in Step 1, so a reader can tell which tree was audited
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: test-gen
|
|
3
|
-
description: "Use when unit or integration tests need to be written for a specific file or module."
|
|
3
|
+
description: "Use when unit or integration tests need to be written for a specific file or module that already exists. NOT for writing failing test stubs ahead of the implementation (use `tests-creator`)."
|
|
4
4
|
triggers:
|
|
5
|
-
- "
|
|
6
|
-
- "
|
|
5
|
+
- "generate tests"
|
|
6
|
+
- "write tests"
|
|
7
|
+
- "add coverage"
|
|
7
8
|
- "Write tests for"
|
|
8
9
|
- "Add tests"
|
|
9
10
|
- "Create test file"
|
|
10
11
|
metadata:
|
|
11
12
|
author: "MrCipherSmith"
|
|
12
13
|
version: "1.0.0"
|
|
13
|
-
category: "
|
|
14
|
+
category: "quality"
|
|
14
15
|
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
15
16
|
license: "MIT"
|
|
16
17
|
---
|
|
@@ -56,8 +57,13 @@ Auto-generate tests for specified files or modules.
|
|
|
56
57
|
|
|
57
58
|
### Step 5: Verify
|
|
58
59
|
```bash
|
|
59
|
-
|
|
60
|
+
keryx test run --changed --strict
|
|
60
61
|
```
|
|
62
|
+
`src/testing/service.ts` detects the project's own test runner from its
|
|
63
|
+
lockfile/scripts and builds the invocation — do not hard-code a test runner
|
|
64
|
+
or binary here. On a project with no keryx testing config, run the project's
|
|
65
|
+
own configured test command instead (discovered, not hardcoded).
|
|
66
|
+
|
|
61
67
|
Fix failing tests (max 3 iterations) — fix the test, not the source.
|
|
62
68
|
|
|
63
69
|
### Step 6: Report
|
|
@@ -73,3 +79,23 @@ Fix failing tests (max 3 iterations) — fix the test, not the source.
|
|
|
73
79
|
- Mock external dependencies, not internal modules
|
|
74
80
|
- Meaningful test descriptions
|
|
75
81
|
- If no test framework detected, suggest installing one
|
|
82
|
+
|
|
83
|
+
## Red Flags
|
|
84
|
+
|
|
85
|
+
| Rationalization | Why it is wrong |
|
|
86
|
+
|---|---|
|
|
87
|
+
| "The test fails because the source has a bug — I'll fix the source" | This skill writes test files only. A source change buried inside a test-generation run is an unreviewed fix, and it also hides the bug the new test just found. Report the failure instead |
|
|
88
|
+
| "Still failing on iteration four; I'll loosen the assertion until it's green" | A test that asserts nothing covers nothing while reporting coverage — strictly worse than no test. After 3 iterations, stop and report the failing case |
|
|
89
|
+
| "No test framework here, so I'll install vitest and a config" | Choosing a test framework is a project decision with config, CI and convention consequences. Suggest one; do not add it |
|
|
90
|
+
| "Mocking the neighbouring module is easier than building its input" | Mock external dependencies, not internal ones. A test whose collaborators are all mocked asserts that your mocks agree with each other |
|
|
91
|
+
| "One test that exercises the whole file covers more per line written" | It reports one failure for any of a dozen causes, so nobody can tell what broke. One behaviour per test, and let the description name it |
|
|
92
|
+
|
|
93
|
+
## Verification
|
|
94
|
+
|
|
95
|
+
Do not report generation as done until all of the following hold:
|
|
96
|
+
|
|
97
|
+
- The test file sits at the project's own convention path, with the import style, describe/it structure and assertion style of the neighbouring tests read in Step 2
|
|
98
|
+
- `keryx test run --changed --strict` — or, with no keryx testing config, the project's own discovered test command — exits 0 with every generated test passing
|
|
99
|
+
- `git status` shows only test files added or modified; no source file changed
|
|
100
|
+
- Every exported function, component, endpoint or class identified in Step 1 has at least one test, or the report says why it does not
|
|
101
|
+
- The Step 6 report states the file path and the test-case count, and that count matches what the runner reported
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tests-creator
|
|
3
|
-
description: "Use when writing test cases BEFORE implementation — converts acceptance criteria into failing test stubs that task-implementer will make pass. Mandatory step in the TDD pipeline between issue-analyzer and task-implementer."
|
|
3
|
+
description: "Use when writing test cases BEFORE implementation — converts acceptance criteria into failing test stubs that task-implementer will make pass. Mandatory step in the TDD pipeline between issue-analyzer and task-implementer. NOT for adding tests to code that already exists (use `test-gen`)."
|
|
4
4
|
triggers:
|
|
5
|
-
- "
|
|
5
|
+
- "create tests first"
|
|
6
|
+
- "test scenarios"
|
|
7
|
+
- "tdd"
|
|
6
8
|
- "Write tests first"
|
|
7
9
|
- "Generate test specs"
|
|
8
10
|
- "Tests before implementation"
|
|
@@ -11,9 +13,9 @@ triggers:
|
|
|
11
13
|
metadata:
|
|
12
14
|
author: "MrCipherSmith"
|
|
13
15
|
version: "1.0.0"
|
|
14
|
-
category: "
|
|
16
|
+
category: "quality"
|
|
15
17
|
agent_worthy: true
|
|
16
|
-
compatible_harnesses: "cursor,codex,zed,opencode"
|
|
18
|
+
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
17
19
|
license: "MIT"
|
|
18
20
|
---
|
|
19
21
|
|
|
@@ -63,17 +65,23 @@ Identify the test framework and conventions used in the project.
|
|
|
63
65
|
**1.1 Detect framework:**
|
|
64
66
|
|
|
65
67
|
```bash
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
keryx test analyze
|
|
69
|
+
```
|
|
68
70
|
|
|
69
|
-
|
|
70
|
-
ls
|
|
71
|
+
Discovers the framework, test scripts, config files, and existing test file
|
|
72
|
+
paths in one pass — do NOT `cat`/`grep` `package.json`, `ls` config globs, or
|
|
73
|
+
`find` for test files; that is exactly what `keryx test analyze` already
|
|
74
|
+
walks the project for. Read the result compactly:
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
```bash
|
|
77
|
+
keryx ctx read .metaproject/data/testing/context.md
|
|
74
78
|
```
|
|
75
79
|
|
|
76
|
-
|
|
80
|
+
On a project with no keryx testing config, fall back to the project's own
|
|
81
|
+
configured way of finding its test framework and existing tests (discovered,
|
|
82
|
+
not a hardcoded `cat`/`ls`/`find` invocation).
|
|
83
|
+
|
|
84
|
+
**1.2 Read 2-3 existing test files** (from the `context.md` test file list) to understand:
|
|
77
85
|
- Import style (`import { describe, it, expect } from 'vitest'` vs global)
|
|
78
86
|
- Test file location (co-located `*.test.ts` vs `__tests__/` directory)
|
|
79
87
|
- Describe/it/test nesting patterns
|
|
@@ -324,6 +332,19 @@ This ensures the TDD cycle is maintained end-to-end.
|
|
|
324
332
|
|
|
325
333
|
---
|
|
326
334
|
|
|
335
|
+
## Red Flags
|
|
336
|
+
|
|
337
|
+
| Rationalization | Why it is wrong |
|
|
338
|
+
|---|---|
|
|
339
|
+
| "The module doesn't exist, so the import breaks the whole suite — I'll create a stub module first" | That stub is implementation code, and it is exactly what Rule 1 forbids. A failing import IS the RED phase; `task-implementer` creates the module |
|
|
340
|
+
| "A placeholder like `expect(true).toBe(true)` gets the file committed and the pipeline moving" | A test that passes before implementation proves nothing and goes green forever after. RED means failing (Rule 2) — use `it.todo`, or the forward-declared assertion from 3.3 |
|
|
341
|
+
| "I know how this will be built, so I'll assert it calls the repository method" | That tests HOW, not WHAT (Rule 3), and it fails the moment the implementer picks a different — valid — structure. Assert observable behaviour |
|
|
342
|
+
| "This acceptance criterion is too vague to test, so I'll skip it" | Every criterion needs at least one test (Rule 4). Derive from the task description, log the warning, and say in `notes` what you assumed — an untested criterion silently leaves the pipeline |
|
|
343
|
+
| "`verify_red` shows the test passing already; close enough, report DONE" | A test green before implementation is a wrong test, not an early win. Fix the assertion, or report it as a concern — do not pass it downstream as covered |
|
|
344
|
+
| "I'll leave the stubs uncommitted and let `task-implementer` commit everything together" | The handoff assumes committed RED files (Rule 6): the implementer's first step is to run them and confirm they fail. Uncommitted stubs make that step unverifiable |
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
327
348
|
## Job Context Awareness
|
|
328
349
|
|
|
329
350
|
When dispatched by `job-orchestrator`:
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-ai-review
|
|
3
|
-
description: "
|
|
3
|
+
description: "Use when the legacy strict AI review profile (code-review-ai-assistant.mdc) is asked for by name — reviews the current branch from its merge-base, committed and uncommitted changes together. NOT for: a code review request that names no profile (review-orchestrator)."
|
|
4
4
|
triggers:
|
|
5
|
-
- "
|
|
6
|
-
- "
|
|
7
|
-
- "
|
|
8
|
-
- "Review code"
|
|
5
|
+
- "code-ai-review"
|
|
6
|
+
- "AI review baseline"
|
|
7
|
+
- "strict AI review"
|
|
9
8
|
metadata:
|
|
10
9
|
author: "MrCipherSmith"
|
|
11
10
|
version: "1.0.0"
|
|
12
11
|
category: "review"
|
|
13
|
-
compatible_harnesses: "cursor,codex,zed,opencode"
|
|
12
|
+
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
14
13
|
license: "MIT"
|
|
15
14
|
---
|
|
16
15
|
|
|
@@ -56,7 +55,7 @@ This skill does NOT duplicate:
|
|
|
56
55
|
|
|
57
56
|
## Scope Detection
|
|
58
57
|
|
|
59
|
-
See shared script:
|
|
58
|
+
See shared script: `.metaproject/skills/gdskills/shared/git-merge-base.md`
|
|
60
59
|
|
|
61
60
|
Run the script from that file to determine MERGE_BASE and SCOPE before proceeding with the review.
|
|
62
61
|
|
|
@@ -201,3 +200,39 @@ If provided and the file exists, read the context document before starting the r
|
|
|
201
200
|
- Reference context when justifying suggestions
|
|
202
201
|
|
|
203
202
|
If the file does not exist or is not provided, proceed normally — context is optional and non-blocking.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Red Flags
|
|
207
|
+
|
|
208
|
+
This profile is a thin wrapper around `code-review-ai-assistant.mdc`, and it
|
|
209
|
+
predates everything the review domain standardised afterwards. The rows below are
|
|
210
|
+
the ways that gap makes it misfire.
|
|
211
|
+
|
|
212
|
+
| Rationalization | Why it is wrong |
|
|
213
|
+
|----------------|-----------------|
|
|
214
|
+
| "A review was requested, so I will run this profile." | It is a legacy opt-in profile, reached by name or through `review --legacy-profiles`. An unqualified review request belongs to `review-orchestrator`; running this one instead silently drops every specialised lane along with the finding schema. |
|
|
215
|
+
| "The output template has a Severity field, so my report is a review result." | It is not. This profile predates `reviewer-finding.schema.json`: it emits free prose with no machine-readable finding and no class enumeration, so nothing downstream can screen, verify or deduplicate it. Hand the report to a person, never to `keryx review ingest`. |
|
|
216
|
+
| "Half these instructions are in Russian, so the report should be in Russian." | The mixed language is an artefact of when this file was written, not an instruction about the report. Write the report in the language the requester used. |
|
|
217
|
+
| "I noticed a store problem and a naming problem, so I will include them here." | The Scope Boundaries table above routes those to `code-mobx-store-review` and `code-style-review`. A finding filed under the wrong profile is a finding the requester did not ask this profile for, and it arrives without the checks that lane would have applied. |
|
|
218
|
+
| "One entry per occurrence is more thorough." | It is longer, not more thorough. Where one shape repeats, report it once and list every site — ten entries that are one problem hide the other nine. |
|
|
219
|
+
| "I cannot reach the code path, but the pattern is usually wrong." | Then it is an observation, not a finding. Say what input, call or condition would reach it, and let the reader decide. |
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Verification
|
|
224
|
+
|
|
225
|
+
Report done only once all of these hold:
|
|
226
|
+
|
|
227
|
+
- The requester asked for this profile by name, or through
|
|
228
|
+
`review --legacy-profiles`. If they asked for "a review", stop and hand the
|
|
229
|
+
request to `review-orchestrator` instead.
|
|
230
|
+
- The scope block carries the real branch, parent ref, merge-base and scope mode —
|
|
231
|
+
not the template placeholders.
|
|
232
|
+
- Every finding carries Severity, Location (path plus the lines from the diff),
|
|
233
|
+
Problem, Why it matters and a concrete Suggested fix; a patch where the fix is
|
|
234
|
+
a line or two.
|
|
235
|
+
- Every finding is anchored to a line the branch slice actually changed. Nothing
|
|
236
|
+
outside `merge-base..worktree` is discussed.
|
|
237
|
+
- The report is free prose by design, so it is delivered to a person and is not
|
|
238
|
+
fed into the managed-review pipeline.
|