@esoteric-logic/praxis-harness 2.6.0 → 2.8.0
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/README.md +48 -48
- package/base/CLAUDE.md +23 -23
- package/base/configs/ci/lint-stack.yml +126 -0
- package/base/configs/linters/.markdownlint.json +7 -0
- package/base/configs/linters/.pre-commit-config.yaml +63 -0
- package/base/configs/linters/biome.json +41 -0
- package/base/configs/linters/clippy.toml +4 -0
- package/base/configs/linters/ruff.toml +26 -0
- package/base/configs/linters/rustfmt.toml +7 -0
- package/base/configs/linters/semgrep.yml +65 -0
- package/base/configs/registry.json +9 -1
- package/base/hooks/quality-check.sh +36 -0
- package/base/skills/{architecture-patterns → px-architecture-patterns}/SKILL.md +1 -1
- package/base/skills/{code-gc → px-code-gc}/SKILL.md +1 -1
- package/base/skills/{communication-standards → px-communication-standards}/SKILL.md +1 -1
- package/base/skills/{context-probe → px-context-probe}/SKILL.md +1 -1
- package/base/skills/{context-reset → px-context-reset}/SKILL.md +1 -1
- package/base/skills/{context7-lookup → px-context7-lookup}/SKILL.md +1 -1
- package/base/skills/{debug → px-debug}/SKILL.md +1 -1
- package/base/skills/{deliberate → px-deliberate}/SKILL.md +1 -1
- package/base/skills/{discover → px-discover}/SKILL.md +1 -1
- package/base/skills/{discuss → px-discuss}/SKILL.md +1 -1
- package/base/skills/{execute → px-execute}/SKILL.md +1 -1
- package/base/skills/{fast → px-fast}/SKILL.md +1 -1
- package/base/skills/{kit → px-kit}/SKILL.md +1 -1
- package/base/skills/{managing-git-identities → px-managing-git-identities}/SKILL.md +1 -1
- package/base/skills/{next → px-next}/SKILL.md +1 -1
- package/base/skills/{plan → px-plan}/SKILL.md +1 -1
- package/base/skills/{plan-writer → px-plan-writer}/SKILL.md +1 -1
- package/base/skills/{pre-commit-lint → px-pre-commit-lint}/SKILL.md +1 -1
- package/base/skills/{quick → px-quick}/SKILL.md +1 -1
- package/base/skills/{repair → px-repair}/SKILL.md +1 -1
- package/base/skills/{research → px-research}/SKILL.md +1 -1
- package/base/skills/{review → px-review}/SKILL.md +1 -1
- package/base/skills/{risk → px-risk}/SKILL.md +1 -1
- package/base/skills/{scaffold-exist → px-scaffold-exist}/SKILL.md +1 -1
- package/base/skills/{scaffold-new → px-scaffold-new}/SKILL.md +1 -1
- package/base/skills/{secret-scan → px-secret-scan}/SKILL.md +1 -1
- package/base/skills/{session-retro → px-session-retro}/SKILL.md +1 -1
- package/base/skills/{ship → px-ship}/SKILL.md +1 -1
- package/base/skills/{simplify → px-simplify}/SKILL.md +1 -1
- package/base/skills/{spec → px-spec}/SKILL.md +1 -1
- package/base/skills/{standup → px-standup}/SKILL.md +1 -1
- package/base/skills/{status-update → px-status-update}/SKILL.md +1 -1
- package/base/skills/{subagent → px-subagent}/SKILL.md +1 -1
- package/base/skills/{sync-memory → px-sync-memory}/SKILL.md +1 -1
- package/base/skills/{vault-gc → px-vault-gc}/SKILL.md +1 -1
- package/base/skills/{verify → px-verify}/SKILL.md +1 -1
- package/base/skills/{verify-app → px-verify-app}/SKILL.md +1 -1
- package/package.json +1 -1
- package/scripts/test-harness.sh +6 -6
- /package/base/skills/{blind-judge → px-blind-judge}/SKILL.md +0 -0
- /package/base/skills/{dep-hygiene → px-dep-hygiene}/SKILL.md +0 -0
- /package/base/skills/{scaffold-new → px-scaffold-new}/references/claude-progress-template.json +0 -0
- /package/base/skills/{scaffold-new → px-scaffold-new}/references/gitignore-template.txt +0 -0
- /package/base/skills/{scaffold-new → px-scaffold-new}/references/repo-CLAUDE-md-template.md +0 -0
- /package/base/skills/{scaffold-new → px-scaffold-new}/references/vault-index-template.md +0 -0
- /package/base/skills/{scaffold-new → px-scaffold-new}/references/vault-learnings-template.md +0 -0
- /package/base/skills/{scaffold-new → px-scaffold-new}/references/vault-status-template.md +0 -0
- /package/base/skills/{scaffold-new → px-scaffold-new}/references/vault-tasks-template.md +0 -0
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ Praxis gives Claude Code a three-layer operating system:
|
|
|
10
10
|
|
|
11
11
|
**Universal base** — always loaded. Praxis structures work (discuss → plan → execute → verify → simplify → ship). Built-in quality enforcement (debugging, code review, simplification).
|
|
12
12
|
|
|
13
|
-
**AI-Kits** — activated on demand via `/kit:<name>`. Each kit bundles domain-specific rules, skills, MCP servers, and slash commands. Activate the web-designer kit and your components get design system enforcement, accessibility auditing, and production lint. Deactivate with `/kit:off`.
|
|
13
|
+
**AI-Kits** — activated on demand via `/px-kit:<name>`. Each kit bundles domain-specific rules, skills, MCP servers, and slash commands. Activate the web-designer kit and your components get design system enforcement, accessibility auditing, and production lint. Deactivate with `/px-kit:off`.
|
|
14
14
|
|
|
15
15
|
**Project config** — per-repo rules that fire automatically based on file paths. Terraform rules load when you touch `.tf` files. GitHub Actions rules load when you touch workflow YAML. No manual switching.
|
|
16
16
|
|
|
@@ -33,51 +33,51 @@ npx @esoteric-logic/praxis-harness@latest uninstall # remove Praxis-owned file
|
|
|
33
33
|
|
|
34
34
|
## After install
|
|
35
35
|
|
|
36
|
-
Verify with `/help` — you should see Praxis commands (`/discuss`, `/execute`, `/verify`, `/plan`, `/ship`, `/kit:*`).
|
|
36
|
+
Verify with `/help` — you should see Praxis commands (`/px-discuss`, `/px-execute`, `/px-verify`, `/px-plan`, `/px-ship`, `/px-kit:*`).
|
|
37
37
|
|
|
38
38
|
## Workflow
|
|
39
39
|
|
|
40
40
|
The standard Praxis workflow for feature development:
|
|
41
41
|
|
|
42
42
|
```
|
|
43
|
-
/standup → orient (reads status.md, surfaces stale state)
|
|
44
|
-
/discuss
|
|
45
|
-
/discover
|
|
46
|
-
/plan
|
|
47
|
-
/execute
|
|
48
|
-
/verify
|
|
49
|
-
/session-retro
|
|
43
|
+
/px-standup → orient (reads status.md, surfaces stale state)
|
|
44
|
+
/px-discuss → frame the problem (conversational, scope guard)
|
|
45
|
+
/px-discover → research options with confidence levels (before /px-spec)
|
|
46
|
+
/px-plan → plan milestones (with dependency ordering + boundaries)
|
|
47
|
+
/px-execute → implement one milestone at a time (file-group isolation)
|
|
48
|
+
/px-verify → validate (test/lint/typecheck/build, self-review, UNIFY)
|
|
49
|
+
/px-session-retro → capture learnings, update vault
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
For pure bugfixes: `/debug` (test-first debugging, skips the full loop).
|
|
53
|
-
For code review: `/review` (launches subagent review at any time).
|
|
54
|
-
For technical research: `/discover` (structured options evaluation before decisions).
|
|
52
|
+
For pure bugfixes: `/px-debug` (test-first debugging, skips the full loop).
|
|
53
|
+
For code review: `/px-review` (launches subagent review at any time).
|
|
54
|
+
For technical research: `/px-discover` (structured options evaluation before decisions).
|
|
55
55
|
|
|
56
56
|
## Commands
|
|
57
57
|
|
|
58
58
|
| Command | Purpose |
|
|
59
59
|
|---------|---------|
|
|
60
|
-
| `discuss` | Conversational problem framing, SPEC synthesis, scope guard |
|
|
61
|
-
| `execute` | Implement one milestone with file-group isolation + boundary enforcement |
|
|
62
|
-
| `verify` | Validate milestone (test/lint/build), self-review, UNIFY phase summary |
|
|
63
|
-
|
|
64
|
-
| `plan` | Create a dated work plan with milestone dependencies + checkpoints |
|
|
65
|
-
| `spec` | Create a structured spec or ADR with conflict detection |
|
|
66
|
-
| `discover` | Structured technical discovery with confidence-rated options |
|
|
67
|
-
| `standup` | Session-start orientation from vault state |
|
|
68
|
-
| `risk` | Add a risk register entry to the vault |
|
|
69
|
-
| `kit` | Activate/deactivate an AI-Kit |
|
|
70
|
-
| `review` | Manual code review via subagent |
|
|
71
|
-
| `simplify` | Post-implementation code simplification via subagent |
|
|
72
|
-
| `debug` | Structured test-first debugging |
|
|
73
|
-
| `ship` | Commit, push, and PR in one command with pre-flight checks |
|
|
74
|
-
| `verify-app` | End-to-end verification with regression analysis |
|
|
75
|
-
| `session-retro` | End-of-session retrospective with learnings extraction |
|
|
76
|
-
| `status-update` | Manual vault status.md update |
|
|
77
|
-
| `repair` | Structured 3-attempt fix-and-verify loop for failed milestones |
|
|
78
|
-
| `sync-memory` | Bridge auto-memory insights to Obsidian vault |
|
|
79
|
-
| `context-probe` | Assess context health and recommend action |
|
|
80
|
-
| `context-reset` | Reload context from vault without clearing session |
|
|
60
|
+
| `px-discuss` | Conversational problem framing, SPEC synthesis, scope guard |
|
|
61
|
+
| `px-execute` | Implement one milestone with file-group isolation + boundary enforcement |
|
|
62
|
+
| `px-verify` | Validate milestone (test/lint/build), self-review, UNIFY phase summary |
|
|
63
|
+
|
|
64
|
+
| `px-plan` | Create a dated work plan with milestone dependencies + checkpoints |
|
|
65
|
+
| `px-spec` | Create a structured spec or ADR with conflict detection |
|
|
66
|
+
| `px-discover` | Structured technical discovery with confidence-rated options |
|
|
67
|
+
| `px-standup` | Session-start orientation from vault state |
|
|
68
|
+
| `px-risk` | Add a risk register entry to the vault |
|
|
69
|
+
| `px-kit` | Activate/deactivate an AI-Kit |
|
|
70
|
+
| `px-review` | Manual code review via subagent |
|
|
71
|
+
| `px-simplify` | Post-implementation code simplification via subagent |
|
|
72
|
+
| `px-debug` | Structured test-first debugging |
|
|
73
|
+
| `px-ship` | Commit, push, and PR in one command with pre-flight checks |
|
|
74
|
+
| `px-verify-app` | End-to-end verification with regression analysis |
|
|
75
|
+
| `px-session-retro` | End-of-session retrospective with learnings extraction |
|
|
76
|
+
| `px-status-update` | Manual vault status.md update |
|
|
77
|
+
| `px-repair` | Structured 3-attempt fix-and-verify loop for failed milestones |
|
|
78
|
+
| `px-sync-memory` | Bridge auto-memory insights to Obsidian vault |
|
|
79
|
+
| `px-context-probe` | Assess context health and recommend action |
|
|
80
|
+
| `px-context-reset` | Reload context from vault without clearing session |
|
|
81
81
|
|
|
82
82
|
## Rules
|
|
83
83
|
|
|
@@ -114,11 +114,11 @@ Key additions in this version:
|
|
|
114
114
|
|
|
115
115
|
| Kit | Activate | What it does |
|
|
116
116
|
|-----|----------|-------------|
|
|
117
|
-
| web-designer | `/kit:web-designer` | Design system init → component build → accessibility audit → production lint |
|
|
118
|
-
| infrastructure | `/kit:infrastructure` | Terraform plan → apply → drift detection → compliance check |
|
|
119
|
-
| api | `/kit:api` | RESTful conventions → OpenAPI specs → contract testing |
|
|
120
|
-
| security | `/kit:security` | Threat modeling → IAM review → OWASP audit |
|
|
121
|
-
| data | `/kit:data` | Schema design → migration planning → query optimization |
|
|
117
|
+
| web-designer | `/px-kit:web-designer` | Design system init → component build → accessibility audit → production lint |
|
|
118
|
+
| infrastructure | `/px-kit:infrastructure` | Terraform plan → apply → drift detection → compliance check |
|
|
119
|
+
| api | `/px-kit:api` | RESTful conventions → OpenAPI specs → contract testing |
|
|
120
|
+
| security | `/px-kit:security` | Threat modeling → IAM review → OWASP audit |
|
|
121
|
+
| data | `/px-kit:data` | Schema design → migration planning → query optimization |
|
|
122
122
|
|
|
123
123
|
More kits coming. See `docs/creating-a-kit.md` to build your own.
|
|
124
124
|
|
|
@@ -158,13 +158,13 @@ Praxis auto-documents your work in the vault with zero manual effort. Two indepe
|
|
|
158
158
|
|
|
159
159
|
| Skill | Auto-writes to vault |
|
|
160
160
|
|-------|---------------------|
|
|
161
|
-
| `/execute` | `status.md` loop position, `decision-log.md` scope events |
|
|
162
|
-
| `/verify` | `claude-progress.json` milestones[] |
|
|
163
|
-
| `/review` | `specs/review-{date}-{slug}.md` (full findings breakdown) |
|
|
164
|
-
| `/simplify` | `notes/{date}_simplify-findings.md` |
|
|
165
|
-
| `/debug` | `notes/{date}_debug-trace.md` |
|
|
166
|
-
| `/verify-app` | `specs/verify-app-{date}-{slug}.md` |
|
|
167
|
-
| `/ship` | `claude-progress.json` features[] |
|
|
161
|
+
| `/px-execute` | `status.md` loop position, `decision-log.md` scope events |
|
|
162
|
+
| `/px-verify` | `claude-progress.json` milestones[] |
|
|
163
|
+
| `/px-review` | `specs/review-{date}-{slug}.md` (full findings breakdown) |
|
|
164
|
+
| `/px-simplify` | `notes/{date}_simplify-findings.md` |
|
|
165
|
+
| `/px-debug` | `notes/{date}_debug-trace.md` |
|
|
166
|
+
| `/px-verify-app` | `specs/verify-app-{date}-{slug}.md` |
|
|
167
|
+
| `/px-ship` | `claude-progress.json` features[] |
|
|
168
168
|
|
|
169
169
|
**On context compaction** (automatic fallback):
|
|
170
170
|
- `plans/{date}-compact-checkpoint.md` — git state, active plan, loop position
|
|
@@ -184,14 +184,14 @@ Re-copies all hooks, skills, rules, and kits from the latest npm package version
|
|
|
184
184
|
|
|
185
185
|
### Updating existing projects
|
|
186
186
|
|
|
187
|
-
After a harness update that adds new vault files (like `decision-log.md`), run `/scaffold-exist` in a Claude Code session to audit your vault and add any missing files. This is non-destructive — it never overwrites existing content.
|
|
187
|
+
After a harness update that adds new vault files (like `decision-log.md`), run `/px-scaffold-exist` in a Claude Code session to audit your vault and add any missing files. This is non-destructive — it never overwrites existing content.
|
|
188
188
|
|
|
189
189
|
```
|
|
190
190
|
Step 1: npx @esoteric-logic/praxis-harness@latest update → deploys new hooks, skills, rules
|
|
191
|
-
Step 2: /scaffold-exist
|
|
191
|
+
Step 2: /px-scaffold-exist → audits vault, adds missing files
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
-
New projects get everything automatically via `/scaffold-new`.
|
|
194
|
+
New projects get everything automatically via `/px-scaffold-new`.
|
|
195
195
|
|
|
196
196
|
## Uninstalling
|
|
197
197
|
|
package/base/CLAUDE.md
CHANGED
|
@@ -14,20 +14,20 @@ You are a senior engineering partner. Think before you build. Verify before you
|
|
|
14
14
|
|
|
15
15
|
## Workflow Hierarchy
|
|
16
16
|
- **Praxis** owns the outer loop: discuss → plan → execute → verify → simplify → ship.
|
|
17
|
-
Always start feature work with `/discuss` or `/next`.
|
|
17
|
+
Always start feature work with `/px-discuss` or `/px-next`.
|
|
18
18
|
- **Kits** inject domain context into this workflow — they don't replace it.
|
|
19
|
-
- Pure bugfixes: skip the full loop, use `/debug` directly.
|
|
20
|
-
- Trivial changes (typos, config): use `/fast` to skip planning.
|
|
21
|
-
- After every implementation: run `/simplify` to clean up code before verify.
|
|
22
|
-
- Use `/verify-app` for end-to-end checks, `/ship` when ready to commit+push+PR.
|
|
19
|
+
- Pure bugfixes: skip the full loop, use `/px-debug` directly.
|
|
20
|
+
- Trivial changes (typos, config): use `/px-fast` to skip planning.
|
|
21
|
+
- After every implementation: run `/px-simplify` to clean up code before verify.
|
|
22
|
+
- Use `/px-verify-app` for end-to-end checks, `/px-ship` when ready to commit+push+PR.
|
|
23
23
|
|
|
24
24
|
## Plan Mode Protocol
|
|
25
25
|
For non-trivial tasks (3+ steps):
|
|
26
26
|
1. Start in Plan Mode — iterate on the plan until it's solid
|
|
27
27
|
2. Switch to auto-accept edits and let Claude one-shot the implementation
|
|
28
|
-
3. Run `/simplify` after implementation
|
|
29
|
-
4. Run `/verify-app` to confirm everything works
|
|
30
|
-
5. Run `/ship` to commit, push, and PR
|
|
28
|
+
3. Run `/px-simplify` after implementation
|
|
29
|
+
4. Run `/px-verify-app` to confirm everything works
|
|
30
|
+
5. Run `/px-ship` to commit, push, and PR
|
|
31
31
|
|
|
32
32
|
## Error Learning
|
|
33
33
|
When a mistake is corrected: update project CLAUDE.md `## Error Learning` section
|
|
@@ -85,7 +85,7 @@ Registered via `claude mcp add`. Persist globally across sessions.
|
|
|
85
85
|
|
|
86
86
|
| Server | Purpose | Install | Degrades without |
|
|
87
87
|
|--------|---------|---------|-----------------|
|
|
88
|
-
| perplexity | AI web search | `bash scripts/onboard-mcp.sh perplexity` | No web research in `/discover` |
|
|
88
|
+
| perplexity | AI web search | `bash scripts/onboard-mcp.sh perplexity` | No web research in `/px-discover` |
|
|
89
89
|
| filesystem | Direct vault file access | `claude mcp add filesystem` | Uses shell for vault reads |
|
|
90
90
|
| sequential-thinking | Multi-step reasoning | `claude mcp add sequential-thinking` | Standard reasoning only |
|
|
91
91
|
|
|
@@ -101,8 +101,8 @@ Missing servers are non-blocking — features degrade gracefully.
|
|
|
101
101
|
- GitHub Actions → `~/.claude/rules/github-actions.md`
|
|
102
102
|
- PowerShell scripts → `~/.claude/rules/powershell.md`
|
|
103
103
|
- Git operation → `~/.claude/rules/git-workflow.md`
|
|
104
|
-
- Client-facing writing → auto-loaded by `communication-standards` skill
|
|
105
|
-
- Architecture/specs → auto-loaded by `architecture-patterns` skill
|
|
104
|
+
- Client-facing writing → auto-loaded by `px-communication-standards` skill
|
|
105
|
+
- Architecture/specs → auto-loaded by `px-architecture-patterns` skill
|
|
106
106
|
5. Quality re-anchor: read most recent `compact-checkpoint.md` → check the Quality State section.
|
|
107
107
|
- If lint findings existed before compaction: re-run `golangci-lint run`, confirm status.
|
|
108
108
|
- If tests were failing before compaction: re-run test command, confirm status.
|
|
@@ -120,15 +120,15 @@ Missing servers are non-blocking — features degrade gracefully.
|
|
|
120
120
|
- Use vault search when Obsidian is not running (obsidian backend requires Obsidian open)
|
|
121
121
|
|
|
122
122
|
## AI-Kit Registry
|
|
123
|
-
Kits activate via `/kit:<n>` slash command. Kits are idempotent — double-activate is a no-op.
|
|
123
|
+
Kits activate via `/px-kit:<n>` slash command. Kits are idempotent — double-activate is a no-op.
|
|
124
124
|
|
|
125
125
|
| Kit | Activate | Domain |
|
|
126
126
|
|-----|----------|--------|
|
|
127
|
-
| web-designer | `/kit:web-designer` | Design system → components → accessibility → production lint |
|
|
128
|
-
| infrastructure | `/kit:infrastructure` | Terraform → Azure → GitHub Actions → compliance |
|
|
129
|
-
| api | `/kit:api` | RESTful conventions → OpenAPI specs → contract testing |
|
|
130
|
-
| security | `/kit:security` | Threat modeling → IAM review → OWASP audit |
|
|
131
|
-
| data | `/kit:data` | Schema design → migration planning → query optimization |
|
|
127
|
+
| web-designer | `/px-kit:web-designer` | Design system → components → accessibility → production lint |
|
|
128
|
+
| infrastructure | `/px-kit:infrastructure` | Terraform → Azure → GitHub Actions → compliance |
|
|
129
|
+
| api | `/px-kit:api` | RESTful conventions → OpenAPI specs → contract testing |
|
|
130
|
+
| security | `/px-kit:security` | Threat modeling → IAM review → OWASP audit |
|
|
131
|
+
| data | `/px-kit:data` | Schema design → migration planning → query optimization |
|
|
132
132
|
|
|
133
133
|
Kit manifests live in `~/.claude/kits/<name>/KIT.md`.
|
|
134
134
|
|
|
@@ -159,17 +159,17 @@ Kit manifests live in `~/.claude/kits/<name>/KIT.md`.
|
|
|
159
159
|
### Auto-invocable skills (replace former universal rules)
|
|
160
160
|
| Skill | Triggers when |
|
|
161
161
|
|-------|--------------|
|
|
162
|
-
| `communication-standards` | Writing client-facing docs, proposals, status reports, commits, PRs |
|
|
163
|
-
| `architecture-patterns` | Writing ADRs, specs, system design, risk docs, blocker reports |
|
|
162
|
+
| `px-communication-standards` | Writing client-facing docs, proposals, status reports, commits, PRs |
|
|
163
|
+
| `px-architecture-patterns` | Writing ADRs, specs, system design, risk docs, blocker reports |
|
|
164
164
|
|
|
165
165
|
## Judgment & Research Commands
|
|
166
166
|
|
|
167
167
|
| Command | Purpose |
|
|
168
168
|
|---------|---------|
|
|
169
|
-
| `/duel` | Parallel Alpha/Beta implementation → blind scoring → synthesis |
|
|
170
|
-
| `/deliberate` | Multi-perspective decision analysis with scored option matrix |
|
|
171
|
-
| `/freshness` | Full dependency audit — CVEs, outdated packages, maintenance status |
|
|
172
|
-
| `/research <pkg>` | Live docs (Context7) + CVE/version/maintenance check (Perplexity Sonar) |
|
|
169
|
+
| `/px-duel` | Parallel Alpha/Beta implementation → blind scoring → synthesis |
|
|
170
|
+
| `/px-deliberate` | Multi-perspective decision analysis with scored option matrix |
|
|
171
|
+
| `/px-freshness` | Full dependency audit — CVEs, outdated packages, maintenance status |
|
|
172
|
+
| `/px-research <pkg>` | Live docs (Context7) + CVE/version/maintenance check (Perplexity Sonar) |
|
|
173
173
|
|
|
174
174
|
MCP server templates: `base/configs/mcp-servers.json` — declarative config for context7, github, perplexity-sonar.
|
|
175
175
|
Dependency registry: `base/configs/registry.json` — single source of truth for all tools, auth, hooks.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Polyglot Lint Stack — 3-Layer CI Template
|
|
2
|
+
# Copy to: .github/workflows/lint-stack.yml
|
|
3
|
+
# Conditional: each tool runs only if its language files exist in the repo.
|
|
4
|
+
# Pin actions to SHA — update hashes when upgrading versions.
|
|
5
|
+
|
|
6
|
+
name: Lint Stack
|
|
7
|
+
on:
|
|
8
|
+
pull_request:
|
|
9
|
+
branches: [main, develop]
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
pull-requests: write
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
# ─────────────────────────────────────────────
|
|
17
|
+
# LAYER 1: Fast Feedback (~10s per tool)
|
|
18
|
+
# ─────────────────────────────────────────────
|
|
19
|
+
lint:
|
|
20
|
+
name: L1 — Lint + Format
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
24
|
+
|
|
25
|
+
# Python — Ruff
|
|
26
|
+
- name: Ruff check
|
|
27
|
+
if: hashFiles('**/*.py') != ''
|
|
28
|
+
uses: astral-sh/ruff-action@9700c1666704e06e2cf8f9046755e3dfc6297e40 # v3.2.1
|
|
29
|
+
with:
|
|
30
|
+
args: "check"
|
|
31
|
+
- name: Ruff format check
|
|
32
|
+
if: hashFiles('**/*.py') != ''
|
|
33
|
+
uses: astral-sh/ruff-action@9700c1666704e06e2cf8f9046755e3dfc6297e40 # v3.2.1
|
|
34
|
+
with:
|
|
35
|
+
args: "format --check"
|
|
36
|
+
|
|
37
|
+
# JS/TS — Biome
|
|
38
|
+
- name: Setup Biome
|
|
39
|
+
if: hashFiles('**/*.js', '**/*.ts', '**/*.jsx', '**/*.tsx') != ''
|
|
40
|
+
uses: biomejs/setup-biome@1cbe33ead22c7a2fded3b52fa2893611c815c3d2 # v2.5.0
|
|
41
|
+
- name: Biome CI
|
|
42
|
+
if: hashFiles('**/*.js', '**/*.ts', '**/*.jsx', '**/*.tsx') != ''
|
|
43
|
+
run: biome ci .
|
|
44
|
+
|
|
45
|
+
# Go — golangci-lint
|
|
46
|
+
- name: golangci-lint
|
|
47
|
+
if: hashFiles('go.mod') != ''
|
|
48
|
+
uses: golangci/golangci-lint-action@1481404843c368bc19ca9406f87d6e0fc97bdcfd # v7.0.0
|
|
49
|
+
with:
|
|
50
|
+
version: v2.1
|
|
51
|
+
|
|
52
|
+
# Rust — Clippy
|
|
53
|
+
- name: Setup Rust toolchain
|
|
54
|
+
if: hashFiles('Cargo.toml') != ''
|
|
55
|
+
uses: dtolnay/rust-toolchain@56f84321dbccf38fb67ce29ab63e4754056677e0 # stable
|
|
56
|
+
with:
|
|
57
|
+
toolchain: stable
|
|
58
|
+
components: clippy, rustfmt
|
|
59
|
+
- name: Clippy
|
|
60
|
+
if: hashFiles('Cargo.toml') != ''
|
|
61
|
+
run: cargo clippy --all-targets --all-features -- -D warnings
|
|
62
|
+
- name: rustfmt check
|
|
63
|
+
if: hashFiles('Cargo.toml') != ''
|
|
64
|
+
run: cargo fmt --all -- --check
|
|
65
|
+
|
|
66
|
+
# Shell — ShellCheck
|
|
67
|
+
- name: ShellCheck
|
|
68
|
+
if: hashFiles('**/*.sh') != ''
|
|
69
|
+
run: |
|
|
70
|
+
sudo apt-get install -y shellcheck
|
|
71
|
+
find . -name '*.sh' -not -path './node_modules/*' -not -path './vendor/*' | xargs shellcheck -s bash
|
|
72
|
+
|
|
73
|
+
# ─────────────────────────────────────────────
|
|
74
|
+
# LAYER 2: Quality Gates (~2min)
|
|
75
|
+
# ─────────────────────────────────────────────
|
|
76
|
+
security-scan:
|
|
77
|
+
name: L2 — Semgrep
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
needs: lint
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
82
|
+
- uses: semgrep/semgrep-action@713efdd345ae26c72e79b5b32927be8e0e6bab83 # v1
|
|
83
|
+
with:
|
|
84
|
+
config: >-
|
|
85
|
+
p/default
|
|
86
|
+
p/secrets
|
|
87
|
+
p/owasp-top-ten
|
|
88
|
+
env:
|
|
89
|
+
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
|
|
90
|
+
|
|
91
|
+
# Uncomment to add SonarQube quality gate (requires self-hosted server)
|
|
92
|
+
# sonarqube:
|
|
93
|
+
# name: L2 — SonarQube
|
|
94
|
+
# runs-on: ubuntu-latest
|
|
95
|
+
# needs: lint
|
|
96
|
+
# steps:
|
|
97
|
+
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
98
|
+
# with:
|
|
99
|
+
# fetch-depth: 0
|
|
100
|
+
# - uses: SonarSource/sonarqube-scan-action@0e1a25e90571a34e2ec5c72ee40ba45cc73a1e6e # v4
|
|
101
|
+
# env:
|
|
102
|
+
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
103
|
+
# SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
|
|
104
|
+
# - uses: SonarSource/sonarqube-quality-gate-action@dc2f7b0dd95544cd550de3066f25f47e3fc20894 # v1.1.0
|
|
105
|
+
# timeout-minutes: 5
|
|
106
|
+
# env:
|
|
107
|
+
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
108
|
+
|
|
109
|
+
# ─────────────────────────────────────────────
|
|
110
|
+
# LAYER 3: AI Review (~2min, optional)
|
|
111
|
+
# ─────────────────────────────────────────────
|
|
112
|
+
# Uncomment to enable AI-powered PR review.
|
|
113
|
+
# Requires OPENAI_API_KEY secret or self-hosted Ollama.
|
|
114
|
+
#
|
|
115
|
+
# ai-review:
|
|
116
|
+
# name: L3 — AI Review
|
|
117
|
+
# runs-on: ubuntu-latest
|
|
118
|
+
# needs: [security-scan]
|
|
119
|
+
# steps:
|
|
120
|
+
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
121
|
+
# - uses: Codium-ai/pr-agent@main
|
|
122
|
+
# env:
|
|
123
|
+
# OPENAI_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
124
|
+
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
125
|
+
# with:
|
|
126
|
+
# command: review
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
# General file hygiene
|
|
3
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
4
|
+
rev: v5.0.0
|
|
5
|
+
hooks:
|
|
6
|
+
- id: trailing-whitespace
|
|
7
|
+
- id: end-of-file-fixer
|
|
8
|
+
- id: check-yaml
|
|
9
|
+
- id: check-json
|
|
10
|
+
- id: check-added-large-files
|
|
11
|
+
args: ['--maxkb=500']
|
|
12
|
+
- id: detect-private-key
|
|
13
|
+
- id: check-merge-conflict
|
|
14
|
+
|
|
15
|
+
# Layer 1: Python — Ruff
|
|
16
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
17
|
+
rev: v0.11.6
|
|
18
|
+
hooks:
|
|
19
|
+
- id: ruff
|
|
20
|
+
args: [--fix]
|
|
21
|
+
- id: ruff-format
|
|
22
|
+
|
|
23
|
+
# Layer 1: JS/TS — Biome
|
|
24
|
+
- repo: https://github.com/biomejs/pre-commit
|
|
25
|
+
rev: v2.0.0
|
|
26
|
+
hooks:
|
|
27
|
+
- id: biome-check
|
|
28
|
+
additional_dependencies: ["@biomejs/biome@2.0.0"]
|
|
29
|
+
|
|
30
|
+
# Layer 1: Shell — ShellCheck
|
|
31
|
+
- repo: https://github.com/shellcheck-py/shellcheck-py
|
|
32
|
+
rev: v0.10.0.1
|
|
33
|
+
hooks:
|
|
34
|
+
- id: shellcheck
|
|
35
|
+
args: [-s, bash]
|
|
36
|
+
|
|
37
|
+
# Layer 1: Go — golangci-lint
|
|
38
|
+
- repo: https://github.com/golangci/golangci-lint
|
|
39
|
+
rev: v2.1.0
|
|
40
|
+
hooks:
|
|
41
|
+
- id: golangci-lint
|
|
42
|
+
|
|
43
|
+
# Layer 1: Rust — rustfmt + clippy
|
|
44
|
+
- repo: local
|
|
45
|
+
hooks:
|
|
46
|
+
- id: rustfmt
|
|
47
|
+
name: rustfmt
|
|
48
|
+
entry: rustfmt
|
|
49
|
+
language: system
|
|
50
|
+
types: [rust]
|
|
51
|
+
- id: clippy
|
|
52
|
+
name: clippy
|
|
53
|
+
entry: cargo clippy -- -D warnings
|
|
54
|
+
language: system
|
|
55
|
+
types: [rust]
|
|
56
|
+
pass_filenames: false
|
|
57
|
+
|
|
58
|
+
# Layer 2: Semgrep security scan
|
|
59
|
+
- repo: https://github.com/semgrep/semgrep
|
|
60
|
+
rev: v1.120.0
|
|
61
|
+
hooks:
|
|
62
|
+
- id: semgrep
|
|
63
|
+
args: ['--config', 'auto', '--error']
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.0.0/schema.json",
|
|
3
|
+
"organizeImports": { "enabled": true },
|
|
4
|
+
"linter": {
|
|
5
|
+
"enabled": true,
|
|
6
|
+
"rules": {
|
|
7
|
+
"recommended": true,
|
|
8
|
+
"complexity": {
|
|
9
|
+
"noExcessiveCognitiveComplexity": {
|
|
10
|
+
"level": "warn",
|
|
11
|
+
"options": { "maxAllowedComplexity": 15 }
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"suspicious": {
|
|
15
|
+
"noExplicitAny": "warn",
|
|
16
|
+
"noConsoleLog": "warn"
|
|
17
|
+
},
|
|
18
|
+
"correctness": {
|
|
19
|
+
"noUnusedVariables": "error",
|
|
20
|
+
"noUnusedImports": "error"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"formatter": {
|
|
25
|
+
"enabled": true,
|
|
26
|
+
"indentStyle": "space",
|
|
27
|
+
"indentWidth": 2,
|
|
28
|
+
"lineWidth": 100
|
|
29
|
+
},
|
|
30
|
+
"javascript": {
|
|
31
|
+
"formatter": {
|
|
32
|
+
"quoteStyle": "single",
|
|
33
|
+
"semicolons": "always"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"json": {
|
|
37
|
+
"formatter": {
|
|
38
|
+
"indentWidth": 2
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
target-version = "py312"
|
|
2
|
+
line-length = 100
|
|
3
|
+
fix = true
|
|
4
|
+
|
|
5
|
+
[lint]
|
|
6
|
+
select = [
|
|
7
|
+
"E", "W", # pycodestyle
|
|
8
|
+
"F", # pyflakes
|
|
9
|
+
"I", # isort
|
|
10
|
+
"N", # pep8-naming
|
|
11
|
+
"UP", # pyupgrade
|
|
12
|
+
"S", # bandit (security)
|
|
13
|
+
"B", # flake8-bugbear
|
|
14
|
+
"A", # flake8-builtins
|
|
15
|
+
"C4", # flake8-comprehensions
|
|
16
|
+
"SIM", # flake8-simplify
|
|
17
|
+
"RUF", # ruff-specific
|
|
18
|
+
]
|
|
19
|
+
ignore = ["E501"] # line length handled by formatter
|
|
20
|
+
|
|
21
|
+
[lint.per-file-ignores]
|
|
22
|
+
"tests/**" = ["S101"] # allow assert in tests
|
|
23
|
+
|
|
24
|
+
[format]
|
|
25
|
+
quote-style = "double"
|
|
26
|
+
indent-style = "space"
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
rules:
|
|
2
|
+
# Usage:
|
|
3
|
+
# semgrep --config auto (recommended community rules)
|
|
4
|
+
# semgrep --config p/owasp-top-ten (OWASP Top 10)
|
|
5
|
+
# semgrep --config p/secrets (secret detection)
|
|
6
|
+
# semgrep --config .semgrep.yml (this file — custom rules)
|
|
7
|
+
|
|
8
|
+
# Custom: ban f-string SQL queries
|
|
9
|
+
- id: no-fstring-sql-execute
|
|
10
|
+
patterns:
|
|
11
|
+
- pattern: cursor.execute($QUERY, ...)
|
|
12
|
+
- pattern-not: cursor.execute("...", ...)
|
|
13
|
+
- metavariable-pattern:
|
|
14
|
+
metavariable: $QUERY
|
|
15
|
+
pattern: |
|
|
16
|
+
f"..."
|
|
17
|
+
message: "Use parameterized queries instead of f-strings in SQL"
|
|
18
|
+
severity: ERROR
|
|
19
|
+
languages: [python]
|
|
20
|
+
|
|
21
|
+
# Custom: no hardcoded secrets in source
|
|
22
|
+
- id: hardcoded-secret-assignment
|
|
23
|
+
pattern-either:
|
|
24
|
+
- pattern: $KEY = "..."
|
|
25
|
+
metavariable-regex:
|
|
26
|
+
metavariable: $KEY
|
|
27
|
+
regex: ".*(secret|password|token|api_key|apikey|auth_token).*"
|
|
28
|
+
message: "Possible hardcoded secret — use environment variables"
|
|
29
|
+
severity: WARNING
|
|
30
|
+
languages: [python, javascript, typescript, java, go, rust]
|
|
31
|
+
|
|
32
|
+
# Custom: no unsafe unwrap in Rust production code
|
|
33
|
+
- id: rust-no-unwrap
|
|
34
|
+
pattern: $X.unwrap()
|
|
35
|
+
message: "Avoid .unwrap() — use .expect() with context or propagate with ?"
|
|
36
|
+
severity: WARNING
|
|
37
|
+
languages: [rust]
|
|
38
|
+
paths:
|
|
39
|
+
exclude:
|
|
40
|
+
- "*_test.rs"
|
|
41
|
+
- "tests/**"
|
|
42
|
+
- "benches/**"
|
|
43
|
+
|
|
44
|
+
# Custom: no fmt.Println in Go production code
|
|
45
|
+
- id: go-no-fmt-println
|
|
46
|
+
pattern: fmt.Println(...)
|
|
47
|
+
message: "Use structured logging instead of fmt.Println"
|
|
48
|
+
severity: WARNING
|
|
49
|
+
languages: [go]
|
|
50
|
+
paths:
|
|
51
|
+
exclude:
|
|
52
|
+
- "*_test.go"
|
|
53
|
+
- "cmd/**"
|
|
54
|
+
|
|
55
|
+
# Paths to exclude from scanning
|
|
56
|
+
paths:
|
|
57
|
+
exclude:
|
|
58
|
+
- node_modules
|
|
59
|
+
- vendor
|
|
60
|
+
- .terraform
|
|
61
|
+
- target
|
|
62
|
+
- dist
|
|
63
|
+
- build
|
|
64
|
+
- "*.min.js"
|
|
65
|
+
- "*.generated.*"
|
|
@@ -30,7 +30,15 @@
|
|
|
30
30
|
{"name": "gitleaks", "feature": "secret-scanning", "install": "brew install gitleaks"},
|
|
31
31
|
{"name": "osv-scanner", "feature": "dep-audit", "install": "go install github.com/google/osv-scanner/cmd/osv-scanner@latest"},
|
|
32
32
|
{"name": "pip-audit", "feature": "dep-audit-python", "install": "pip install pip-audit"},
|
|
33
|
-
{"name": "docker", "feature": "docker-sandbox", "install": "brew install --cask docker"}
|
|
33
|
+
{"name": "docker", "feature": "docker-sandbox", "install": "brew install --cask docker"},
|
|
34
|
+
{"name": "biome", "feature": "lint-js", "install": "npm install -g @biomejs/biome"},
|
|
35
|
+
{"name": "ruff", "feature": "lint-python", "install": "pip install ruff"},
|
|
36
|
+
{"name": "semgrep", "feature": "security-scan", "install": "pip install semgrep"},
|
|
37
|
+
{"name": "markdownlint", "feature": "lint-markdown", "install": "npm install -g markdownlint-cli"},
|
|
38
|
+
{"name": "pre-commit", "feature": "pre-commit-hooks", "install": "pip install pre-commit"},
|
|
39
|
+
{"name": "golangci-lint", "feature": "lint-go", "install": "brew install golangci-lint"},
|
|
40
|
+
{"name": "rustfmt", "feature": "format-rust", "install": "rustup component add rustfmt"},
|
|
41
|
+
{"name": "clippy", "feature": "lint-rust", "install": "rustup component add clippy"}
|
|
34
42
|
]
|
|
35
43
|
},
|
|
36
44
|
"env_vars": {
|
|
@@ -61,6 +61,18 @@ case "$EXT" in
|
|
|
61
61
|
taplo format "$FILE_PATH" 2>/dev/null
|
|
62
62
|
fi
|
|
63
63
|
;;
|
|
64
|
+
js|jsx|ts|tsx)
|
|
65
|
+
if command -v biome &>/dev/null; then
|
|
66
|
+
biome format --write "$FILE_PATH" 2>/dev/null
|
|
67
|
+
elif command -v prettier &>/dev/null; then
|
|
68
|
+
prettier --write "$FILE_PATH" 2>/dev/null
|
|
69
|
+
fi
|
|
70
|
+
;;
|
|
71
|
+
rs)
|
|
72
|
+
if command -v rustfmt &>/dev/null; then
|
|
73
|
+
rustfmt "$FILE_PATH" 2>/dev/null
|
|
74
|
+
fi
|
|
75
|
+
;;
|
|
64
76
|
md)
|
|
65
77
|
if command -v prettier &>/dev/null; then
|
|
66
78
|
prettier --write --prose-wrap always "$FILE_PATH" 2>/dev/null
|
|
@@ -111,6 +123,30 @@ case "$EXT" in
|
|
|
111
123
|
fi
|
|
112
124
|
fi
|
|
113
125
|
;;
|
|
126
|
+
js|jsx|ts|tsx)
|
|
127
|
+
if command -v biome &>/dev/null; then
|
|
128
|
+
LINT_OUT=$(biome lint "$FILE_PATH" 2>&1) || true
|
|
129
|
+
if [ -n "$LINT_OUT" ] && ! echo "$LINT_OUT" | grep -q "No diagnostics"; then
|
|
130
|
+
ISSUES+=("biome: $LINT_OUT")
|
|
131
|
+
fi
|
|
132
|
+
fi
|
|
133
|
+
;;
|
|
134
|
+
rs)
|
|
135
|
+
if command -v cargo &>/dev/null; then
|
|
136
|
+
DIR=$(dirname "$FILE_PATH")
|
|
137
|
+
# Walk up to find Cargo.toml for crate context
|
|
138
|
+
CRATE_DIR="$DIR"
|
|
139
|
+
while [ "$CRATE_DIR" != "/" ] && [ ! -f "$CRATE_DIR/Cargo.toml" ]; do
|
|
140
|
+
CRATE_DIR=$(dirname "$CRATE_DIR")
|
|
141
|
+
done
|
|
142
|
+
if [ -f "$CRATE_DIR/Cargo.toml" ]; then
|
|
143
|
+
LINT_OUT=$(cd "$CRATE_DIR" && cargo clippy --quiet -- -D warnings 2>&1) || true
|
|
144
|
+
if [ -n "$LINT_OUT" ]; then
|
|
145
|
+
ISSUES+=("clippy: $LINT_OUT")
|
|
146
|
+
fi
|
|
147
|
+
fi
|
|
148
|
+
fi
|
|
149
|
+
;;
|
|
114
150
|
yml|yaml)
|
|
115
151
|
if command -v yamllint &>/dev/null; then
|
|
116
152
|
LINT_OUT=$(yamllint -f parsable "$FILE_PATH" 2>&1) || true
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: architecture-patterns
|
|
2
|
+
name: px-architecture-patterns
|
|
3
3
|
description: "Architecture decision and design documentation standards. Auto-triggers when writing ADRs, technical specs, risk register entries, system design documents, or any decision that affects system design, network topology, identity model, data residency, security posture, or compliance scope. Also triggers when writing status updates, blocker reports, or spec summaries that require What/So What/Now What structure."
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: code-gc
|
|
2
|
+
name: px-code-gc
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Detect code entropy in the current repo: dead code, test debt, stale TODOs, oversized functions, commented-out blocks, unused deps. Two modes: lightweight (called by session-retro) and full audit (manual /code-gc). Never auto-deletes or auto-fixes."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: communication-standards
|
|
2
|
+
name: px-communication-standards
|
|
3
3
|
description: "Client-facing writing standards. Auto-triggers when writing proposals, status reports, executive summaries, SOWs, deliverable documents, or any content targeting a non-technical audience. Also triggers when writing git commit messages, PR descriptions, or any text where AI attribution must be avoided. Covers executive-summary-first rule, What/So What/Now What structure, proposal format, audience calibration, and no-AI-attribution policy."
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: context-reset
|
|
2
|
+
name: px-context-reset
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: Checkpoint current session state to vault files before a context reset. Use when context degradation is detected (repeated corrections, loop behavior, instruction drift).
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: context7-lookup
|
|
2
|
+
name: px-context7-lookup
|
|
3
3
|
description: "Enforces the docs-first mandate from coding.md. Before implementing with any external library, framework, or API, use Context7 to retrieve current documentation. Activates when code references an external package, imports a third-party library, or calls an API that releases frequently."
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: managing-git-identities
|
|
2
|
+
name: px-managing-git-identities
|
|
3
3
|
description: "Guides setup and troubleshooting of multiple Git identities (SSH keys, commit author, GitHub CLI auth, includeIf directory routing). Activates when user discusses git accounts, commit identity mismatch, SSH key management, or gh auth switching."
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: plan-writer
|
|
2
|
+
name: px-plan-writer
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Writes a dated work plan to the vault plans/ directory. Creates the plan file with YAML frontmatter, milestones, and acceptance criteria. Updates status.md current_plan field. Called by /plan and /discuss workflows."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: pre-commit-lint
|
|
2
|
+
name: px-pre-commit-lint
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Generate a stack-aware pre-commit hook script for a repo. Use when setting up a new repo, when asked to install pre-commit checks, add linting to commits, or wire pre-commit-lint. Also invoked by scaffold-new Phase 5.5. NOT invoked at commit time — generates a shell script that runs at commit time."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: scaffold-exist
|
|
2
|
+
name: px-scaffold-exist
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Scaffold an existing project into the full harness. Invoke with /scaffold-exist only. Adds missing harness files to projects that predate the scaffold standard. Non-destructive — never overwrites without confirmation. Side-effect skill — never auto-triggers."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: scaffold-new
|
|
2
|
+
name: px-scaffold-new
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Scaffold a brand new project into the full harness. Invoke with /scaffold-new only. Creates repo CLAUDE.md, vault subtree, git identity verification, gitignore, pre-commit hook, and Project Registry entry. Side-effect skill — never auto-triggers."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: secret-scan
|
|
2
|
+
name: px-secret-scan
|
|
3
3
|
description: "Canonical secret scanning skill. Scans files for credential patterns (API keys, tokens, connection strings). Called by pre-commit-lint and ship workflows. Also usable standalone for repo-wide audits. Replaces all inline secret scan regex instances with a single authoritative source."
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: session-retro
|
|
2
|
+
name: px-session-retro
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "End-of-session retrospective. Invoke manually with /session-retro only. Writes [LEARN:tag] entries, proposes rule updates, updates claude-progress.json, triggers vault-gc lightweight check. Side-effect skill — never auto-triggers."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: ship
|
|
2
|
+
name: px-ship
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: Commit, push, and open a PR in one shot. Runs pre-commit checks, crafts a commit message, pushes, and creates a PR with structured description. Use when a milestone or feature is complete and verified.
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: simplify
|
|
2
|
+
name: px-simplify
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Post-implementation code simplification. Launches a subagent to review recent changes for unnecessary complexity, over-abstraction, and opportunities to simplify. Runs after any implementation phase. Side-effect skill — never auto-triggers."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: spec
|
|
2
|
+
name: px-spec
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: Create a structured spec or ADR for the current project. Writes to vault specs/ directory. Use for architecture decisions, technical designs, and risk documentation — NOT for task framing (use /discuss for that).
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: status-update
|
|
2
|
+
name: px-status-update
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Atomic update to vault status.md. Ensures consistent format, enforces the 100-line limit, and archives resolved items. Called at milestone boundaries, session end, and phase transitions."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: subagent
|
|
2
|
+
name: px-subagent
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Reference protocol for subagent dispatch. Defines how to package context, spawn, interpret results, and escalate findings. Not invoked directly — referenced by review, simplify, verify-app, and verify skills."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: sync-memory
|
|
2
|
+
name: px-sync-memory
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Bridge auto-memory insights to Obsidian vault. Reads MEMORY.md and topic files, syncs durable entries to vault learnings, prunes stale content. Side-effect skill — never auto-triggers."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: vault-gc
|
|
2
|
+
name: px-vault-gc
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "Audit vault health and detect entropy. Invoke manually with /vault-gc only. Two modes — full audit (manual) and lightweight staleness check (called inline by session-retro). Never auto-deletes. Side-effect skill — never auto-triggers."
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: verify-app
|
|
2
|
+
name: px-verify-app
|
|
3
3
|
disable-model-invocation: true
|
|
4
4
|
description: "End-to-end application verification. Launches a subagent to run the full test suite, check build, verify runtime behavior, and confirm acceptance criteria. Use after implementation to catch integration issues that unit tests miss. Side-effect skill — never auto-triggers."
|
|
5
5
|
---
|
package/package.json
CHANGED
package/scripts/test-harness.sh
CHANGED
|
@@ -94,12 +94,12 @@ echo "Cross-skill references:"
|
|
|
94
94
|
|
|
95
95
|
# Skills that reference other skills — verify targets exist
|
|
96
96
|
declare -A SKILL_REFS
|
|
97
|
-
SKILL_REFS["verify"]="repair subagent"
|
|
98
|
-
SKILL_REFS["review"]="subagent"
|
|
99
|
-
SKILL_REFS["simplify"]="subagent"
|
|
100
|
-
SKILL_REFS["verify-app"]="subagent"
|
|
101
|
-
SKILL_REFS["repair"]="verify"
|
|
102
|
-
SKILL_REFS["execute"]="verify discuss"
|
|
97
|
+
SKILL_REFS["px-verify"]="px-repair px-subagent"
|
|
98
|
+
SKILL_REFS["px-review"]="px-subagent"
|
|
99
|
+
SKILL_REFS["px-simplify"]="px-subagent"
|
|
100
|
+
SKILL_REFS["px-verify-app"]="px-subagent"
|
|
101
|
+
SKILL_REFS["px-repair"]="px-verify"
|
|
102
|
+
SKILL_REFS["px-execute"]="px-verify px-discuss"
|
|
103
103
|
|
|
104
104
|
for caller in "${!SKILL_REFS[@]}"; do
|
|
105
105
|
for target in ${SKILL_REFS[$caller]}; do
|
|
File without changes
|
|
File without changes
|
/package/base/skills/{scaffold-new → px-scaffold-new}/references/claude-progress-template.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/base/skills/{scaffold-new → px-scaffold-new}/references/vault-learnings-template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|