safeword 0.2.3 → 0.2.4
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/.claude/commands/arch-review.md +32 -0
- package/.claude/commands/lint.md +6 -0
- package/.claude/commands/quality-review.md +13 -0
- package/.claude/commands/setup-linting.md +6 -0
- package/.claude/hooks/auto-lint.sh +6 -0
- package/.claude/hooks/auto-quality-review.sh +170 -0
- package/.claude/hooks/check-linting-sync.sh +17 -0
- package/.claude/hooks/inject-timestamp.sh +6 -0
- package/.claude/hooks/question-protocol.sh +12 -0
- package/.claude/hooks/run-linters.sh +8 -0
- package/.claude/hooks/run-quality-review.sh +76 -0
- package/.claude/hooks/version-check.sh +10 -0
- package/.claude/mcp/README.md +96 -0
- package/.claude/mcp/arcade.sample.json +9 -0
- package/.claude/mcp/context7.sample.json +7 -0
- package/.claude/mcp/playwright.sample.json +7 -0
- package/.claude/settings.json +62 -0
- package/.claude/skills/quality-reviewer/SKILL.md +190 -0
- package/.claude/skills/safeword-quality-reviewer/SKILL.md +13 -0
- package/.env.arcade.example +4 -0
- package/.env.example +11 -0
- package/.gitmodules +4 -0
- package/.safeword/SAFEWORD.md +33 -0
- package/.safeword/eslint/eslint-base.mjs +101 -0
- package/.safeword/guides/architecture-guide.md +404 -0
- package/.safeword/guides/code-philosophy.md +174 -0
- package/.safeword/guides/context-files-guide.md +405 -0
- package/.safeword/guides/data-architecture-guide.md +183 -0
- package/.safeword/guides/design-doc-guide.md +165 -0
- package/.safeword/guides/learning-extraction.md +515 -0
- package/.safeword/guides/llm-instruction-design.md +239 -0
- package/.safeword/guides/llm-prompting.md +95 -0
- package/.safeword/guides/tdd-best-practices.md +570 -0
- package/.safeword/guides/test-definitions-guide.md +243 -0
- package/.safeword/guides/testing-methodology.md +573 -0
- package/.safeword/guides/user-story-guide.md +237 -0
- package/.safeword/guides/zombie-process-cleanup.md +214 -0
- package/{templates → .safeword}/hooks/agents-md-check.sh +0 -0
- package/{templates → .safeword}/hooks/post-tool.sh +0 -0
- package/{templates → .safeword}/hooks/pre-commit.sh +0 -0
- package/.safeword/planning/002-user-story-quality-evaluation.md +1840 -0
- package/.safeword/planning/003-langsmith-eval-setup-prompt.md +363 -0
- package/.safeword/planning/004-llm-eval-test-cases.md +3226 -0
- package/.safeword/planning/005-architecture-enforcement-system.md +169 -0
- package/.safeword/planning/006-reactive-fix-prevention-research.md +135 -0
- package/.safeword/planning/011-cli-ux-vision.md +330 -0
- package/.safeword/planning/012-project-structure-cleanup.md +154 -0
- package/.safeword/planning/README.md +39 -0
- package/.safeword/planning/automation-plan-v2.md +1225 -0
- package/.safeword/planning/automation-plan-v3.md +1291 -0
- package/.safeword/planning/automation-plan.md +3058 -0
- package/.safeword/planning/design/005-cli-implementation.md +343 -0
- package/.safeword/planning/design/013-cli-self-contained-templates.md +596 -0
- package/.safeword/planning/design/013a-eslint-plugin-suite.md +256 -0
- package/.safeword/planning/design/013b-implementation-snippets.md +385 -0
- package/.safeword/planning/design/013c-config-isolation-strategy.md +242 -0
- package/.safeword/planning/design/code-philosophy-improvements.md +60 -0
- package/.safeword/planning/mcp-analysis.md +545 -0
- package/.safeword/planning/phase2-subagents-vs-skills-analysis.md +451 -0
- package/.safeword/planning/settings-improvements.md +970 -0
- package/.safeword/planning/test-definitions/005-cli-implementation.md +1301 -0
- package/.safeword/planning/test-definitions/cli-self-contained-templates.md +205 -0
- package/.safeword/planning/user-stories/001-guides-review-user-stories.md +1381 -0
- package/.safeword/planning/user-stories/003-reactive-fix-prevention.md +132 -0
- package/.safeword/planning/user-stories/004-technical-constraints.md +86 -0
- package/.safeword/planning/user-stories/005-cli-implementation.md +311 -0
- package/.safeword/planning/user-stories/cli-self-contained-templates.md +172 -0
- package/.safeword/planning/versioned-distribution.md +740 -0
- package/.safeword/prompts/arch-review.md +43 -0
- package/.safeword/prompts/quality-review.md +11 -0
- package/.safeword/scripts/arch-review.sh +235 -0
- package/.safeword/scripts/check-linting-sync.sh +58 -0
- package/.safeword/scripts/setup-linting.sh +559 -0
- package/.safeword/templates/architecture-template.md +136 -0
- package/.safeword/templates/ci/architecture-check.yml +79 -0
- package/.safeword/templates/design-doc-template.md +127 -0
- package/.safeword/templates/test-definitions-feature.md +100 -0
- package/.safeword/templates/ticket-template.md +74 -0
- package/.safeword/templates/user-stories-template.md +82 -0
- package/.safeword/tickets/001-guides-review-user-stories.md +83 -0
- package/.safeword/tickets/002-architecture-enforcement.md +211 -0
- package/.safeword/tickets/003-reactive-fix-prevention.md +57 -0
- package/.safeword/tickets/004-technical-constraints-in-user-stories.md +39 -0
- package/.safeword/tickets/005-cli-implementation.md +248 -0
- package/.safeword/tickets/006-flesh-out-skills.md +43 -0
- package/.safeword/tickets/007-flesh-out-questioning.md +44 -0
- package/.safeword/tickets/008-upgrade-questioning.md +58 -0
- package/.safeword/tickets/009-naming-conventions.md +41 -0
- package/.safeword/tickets/010-safeword-md-cleanup.md +34 -0
- package/.safeword/tickets/011-cursor-setup.md +86 -0
- package/.safeword/tickets/README.md +73 -0
- package/.safeword/version +1 -0
- package/AGENTS.md +59 -0
- package/CLAUDE.md +12 -0
- package/README.md +347 -0
- package/docs/001-cli-implementation-plan.md +856 -0
- package/docs/elite-dx-implementation-plan.md +1034 -0
- package/framework/README.md +131 -0
- package/framework/mcp/README.md +96 -0
- package/framework/mcp/arcade.sample.json +8 -0
- package/framework/mcp/context7.sample.json +6 -0
- package/framework/mcp/playwright.sample.json +6 -0
- package/framework/scripts/arch-review.sh +235 -0
- package/framework/scripts/check-linting-sync.sh +58 -0
- package/framework/scripts/load-env.sh +49 -0
- package/framework/scripts/setup-claude.sh +223 -0
- package/framework/scripts/setup-linting.sh +559 -0
- package/framework/scripts/setup-quality.sh +477 -0
- package/framework/scripts/setup-safeword.sh +550 -0
- package/framework/templates/ci/architecture-check.yml +78 -0
- package/learnings/ai-sdk-v5-breaking-changes.md +178 -0
- package/learnings/e2e-test-zombie-processes.md +231 -0
- package/learnings/milkdown-crepe-editor-property.md +96 -0
- package/learnings/prosemirror-fragment-traversal.md +119 -0
- package/package.json +19 -43
- package/packages/cli/AGENTS.md +1 -0
- package/packages/cli/ARCHITECTURE.md +279 -0
- package/packages/cli/package.json +51 -0
- package/packages/cli/src/cli.ts +63 -0
- package/packages/cli/src/commands/check.ts +166 -0
- package/packages/cli/src/commands/diff.ts +209 -0
- package/packages/cli/src/commands/reset.ts +190 -0
- package/packages/cli/src/commands/setup.ts +325 -0
- package/packages/cli/src/commands/upgrade.ts +163 -0
- package/packages/cli/src/index.ts +3 -0
- package/packages/cli/src/templates/config.ts +58 -0
- package/packages/cli/src/templates/content.ts +18 -0
- package/packages/cli/src/templates/index.ts +12 -0
- package/packages/cli/src/utils/agents-md.ts +66 -0
- package/packages/cli/src/utils/fs.ts +179 -0
- package/packages/cli/src/utils/git.ts +124 -0
- package/packages/cli/src/utils/hooks.ts +29 -0
- package/packages/cli/src/utils/output.ts +60 -0
- package/packages/cli/src/utils/project-detector.test.ts +185 -0
- package/packages/cli/src/utils/project-detector.ts +44 -0
- package/packages/cli/src/utils/version.ts +28 -0
- package/packages/cli/src/version.ts +6 -0
- package/packages/cli/templates/SAFEWORD.md +776 -0
- package/packages/cli/templates/doc-templates/architecture-template.md +136 -0
- package/packages/cli/templates/doc-templates/design-doc-template.md +134 -0
- package/packages/cli/templates/doc-templates/test-definitions-feature.md +131 -0
- package/packages/cli/templates/doc-templates/ticket-template.md +82 -0
- package/packages/cli/templates/doc-templates/user-stories-template.md +92 -0
- package/packages/cli/templates/guides/architecture-guide.md +423 -0
- package/packages/cli/templates/guides/code-philosophy.md +195 -0
- package/packages/cli/templates/guides/context-files-guide.md +457 -0
- package/packages/cli/templates/guides/data-architecture-guide.md +200 -0
- package/packages/cli/templates/guides/design-doc-guide.md +171 -0
- package/packages/cli/templates/guides/learning-extraction.md +552 -0
- package/packages/cli/templates/guides/llm-instruction-design.md +248 -0
- package/packages/cli/templates/guides/llm-prompting.md +102 -0
- package/packages/cli/templates/guides/tdd-best-practices.md +615 -0
- package/packages/cli/templates/guides/test-definitions-guide.md +334 -0
- package/packages/cli/templates/guides/testing-methodology.md +618 -0
- package/packages/cli/templates/guides/user-story-guide.md +256 -0
- package/packages/cli/templates/guides/zombie-process-cleanup.md +219 -0
- package/packages/cli/templates/hooks/agents-md-check.sh +27 -0
- package/packages/cli/templates/hooks/post-tool.sh +4 -0
- package/packages/cli/templates/hooks/pre-commit.sh +10 -0
- package/packages/cli/templates/prompts/arch-review.md +43 -0
- package/packages/cli/templates/prompts/quality-review.md +10 -0
- package/packages/cli/templates/skills/safeword-quality-reviewer/SKILL.md +207 -0
- package/packages/cli/tests/commands/check.test.ts +129 -0
- package/packages/cli/tests/commands/cli.test.ts +89 -0
- package/packages/cli/tests/commands/diff.test.ts +115 -0
- package/packages/cli/tests/commands/reset.test.ts +310 -0
- package/packages/cli/tests/commands/self-healing.test.ts +170 -0
- package/packages/cli/tests/commands/setup-blocking.test.ts +71 -0
- package/packages/cli/tests/commands/setup-core.test.ts +135 -0
- package/packages/cli/tests/commands/setup-git.test.ts +139 -0
- package/packages/cli/tests/commands/setup-hooks.test.ts +334 -0
- package/packages/cli/tests/commands/setup-linting.test.ts +189 -0
- package/packages/cli/tests/commands/setup-noninteractive.test.ts +80 -0
- package/packages/cli/tests/commands/setup-templates.test.ts +181 -0
- package/packages/cli/tests/commands/upgrade.test.ts +215 -0
- package/packages/cli/tests/helpers.ts +243 -0
- package/packages/cli/tests/npm-package.test.ts +83 -0
- package/packages/cli/tests/technical-constraints.test.ts +96 -0
- package/packages/cli/tsconfig.json +25 -0
- package/packages/cli/tsup.config.ts +11 -0
- package/packages/cli/vitest.config.ts +23 -0
- package/promptfoo.yaml +3270 -0
- package/dist/check-3NGQ4NR5.js +0 -129
- package/dist/check-3NGQ4NR5.js.map +0 -1
- package/dist/chunk-2XWIUEQK.js +0 -190
- package/dist/chunk-2XWIUEQK.js.map +0 -1
- package/dist/chunk-GZRQL3SX.js +0 -146
- package/dist/chunk-GZRQL3SX.js.map +0 -1
- package/dist/chunk-ORQHKDT2.js +0 -10
- package/dist/chunk-ORQHKDT2.js.map +0 -1
- package/dist/chunk-W66Z3C5H.js +0 -21
- package/dist/chunk-W66Z3C5H.js.map +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -34
- package/dist/cli.js.map +0 -1
- package/dist/diff-Y6QTAW4O.js +0 -166
- package/dist/diff-Y6QTAW4O.js.map +0 -1
- package/dist/index.d.ts +0 -11
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/reset-3ACTIYYE.js +0 -143
- package/dist/reset-3ACTIYYE.js.map +0 -1
- package/dist/setup-RR4M334C.js +0 -266
- package/dist/setup-RR4M334C.js.map +0 -1
- package/dist/upgrade-6AR3DHUV.js +0 -134
- package/dist/upgrade-6AR3DHUV.js.map +0 -1
- /package/{templates → framework}/SAFEWORD.md +0 -0
- /package/{templates → framework}/guides/architecture-guide.md +0 -0
- /package/{templates → framework}/guides/code-philosophy.md +0 -0
- /package/{templates → framework}/guides/context-files-guide.md +0 -0
- /package/{templates → framework}/guides/data-architecture-guide.md +0 -0
- /package/{templates → framework}/guides/design-doc-guide.md +0 -0
- /package/{templates → framework}/guides/learning-extraction.md +0 -0
- /package/{templates → framework}/guides/llm-instruction-design.md +0 -0
- /package/{templates → framework}/guides/llm-prompting.md +0 -0
- /package/{templates → framework}/guides/tdd-best-practices.md +0 -0
- /package/{templates → framework}/guides/test-definitions-guide.md +0 -0
- /package/{templates → framework}/guides/testing-methodology.md +0 -0
- /package/{templates → framework}/guides/user-story-guide.md +0 -0
- /package/{templates → framework}/guides/zombie-process-cleanup.md +0 -0
- /package/{templates → framework}/prompts/arch-review.md +0 -0
- /package/{templates → framework}/prompts/quality-review.md +0 -0
- /package/{templates/skills/safeword-quality-reviewer → framework/skills/quality-reviewer}/SKILL.md +0 -0
- /package/{templates/doc-templates → framework/templates}/architecture-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/design-doc-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/test-definitions-feature.md +0 -0
- /package/{templates/doc-templates → framework/templates}/ticket-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/user-stories-template.md +0 -0
- /package/{templates → packages/cli/templates}/commands/arch-review.md +0 -0
- /package/{templates → packages/cli/templates}/commands/lint.md +0 -0
- /package/{templates → packages/cli/templates}/commands/quality-review.md +0 -0
- /package/{templates → packages/cli/templates}/hooks/inject-timestamp.sh +0 -0
- /package/{templates → packages/cli/templates}/lib/common.sh +0 -0
- /package/{templates → packages/cli/templates}/lib/jq-fallback.sh +0 -0
- /package/{templates → packages/cli/templates}/markdownlint.jsonc +0 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quality-reviewer
|
|
3
|
+
description: Deep code quality review with web research. Use when user explicitly requests verification against latest docs ('double check against latest', 'verify versions', 'check security'), needs deeper analysis beyond automatic hook, or is working on projects without SAFEWORD.md/CLAUDE.md. Fetches current documentation (WebFetch), checks latest versions (WebSearch), and provides deep analysis (performance, security, alternatives).
|
|
4
|
+
allowed-tools: "*"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Quality Reviewer
|
|
8
|
+
|
|
9
|
+
Deep quality review with web research to verify code against the latest ecosystem state.
|
|
10
|
+
|
|
11
|
+
**Primary differentiator**: Web research (WebSearch, WebFetch) to verify against current versions, documentation, and best practices.
|
|
12
|
+
|
|
13
|
+
**Triggers**:
|
|
14
|
+
- **Explicit web research request**: "double check against latest docs", "verify we're using latest version", "check for security issues"
|
|
15
|
+
- **Deep dive needed**: User wants analysis beyond automatic hook (performance, architecture alternatives, trade-offs)
|
|
16
|
+
- **No SAFEWORD.md/CLAUDE.md**: Projects without context files (automatic hook won't run, manual review needed)
|
|
17
|
+
- **Pre-change review**: User wants review before making changes (automatic hook only triggers after changes)
|
|
18
|
+
- **Model-invoked**: Claude determines web research would be valuable
|
|
19
|
+
|
|
20
|
+
**Relationship to automatic quality hook**:
|
|
21
|
+
- **Automatic hook**: Fast quality check using existing knowledge + project context (guaranteed, runs on every change)
|
|
22
|
+
- **This skill**: Deep review with web research when verification against current ecosystem is needed (on-demand, 2-3 min)
|
|
23
|
+
|
|
24
|
+
## Review Protocol
|
|
25
|
+
|
|
26
|
+
### 1. Identify What Changed
|
|
27
|
+
|
|
28
|
+
Understand context:
|
|
29
|
+
- What files were just modified?
|
|
30
|
+
- What problem is being solved?
|
|
31
|
+
- What was the implementation approach?
|
|
32
|
+
|
|
33
|
+
### 2. Read Project Standards
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
ls CLAUDE.md SAFEWORD.md ARCHITECTURE.md .claude/
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Read relevant standards:
|
|
40
|
+
- `CLAUDE.md` or `SAFEWORD.md` - Project-specific guidelines
|
|
41
|
+
- `ARCHITECTURE.md` - Architectural principles
|
|
42
|
+
- `@./.safeword/guides/code-philosophy.md` - Core coding principles
|
|
43
|
+
|
|
44
|
+
### 3. Evaluate Correctness
|
|
45
|
+
|
|
46
|
+
**Will it work?**
|
|
47
|
+
- Does the logic make sense?
|
|
48
|
+
- Are there obvious bugs?
|
|
49
|
+
|
|
50
|
+
**Edge cases:**
|
|
51
|
+
- Empty inputs, null/undefined, boundary conditions (0, -1, max)?
|
|
52
|
+
- Concurrent access, network failures?
|
|
53
|
+
|
|
54
|
+
**Error handling:**
|
|
55
|
+
- Are errors caught appropriately?
|
|
56
|
+
- Helpful error messages?
|
|
57
|
+
- Cleanup handled (resources, connections)?
|
|
58
|
+
|
|
59
|
+
**Logic errors:**
|
|
60
|
+
- Off-by-one errors, race conditions, wrong assumptions?
|
|
61
|
+
|
|
62
|
+
### 4. Evaluate Anti-Bloat
|
|
63
|
+
|
|
64
|
+
- Are all dependencies necessary? Could we use stdlib/built-ins?
|
|
65
|
+
- Are abstractions solving real problems or imaginary ones?
|
|
66
|
+
- YAGNI: Is this feature actually needed now?
|
|
67
|
+
|
|
68
|
+
### 5. Evaluate Elegance
|
|
69
|
+
|
|
70
|
+
- Is the code easy to understand?
|
|
71
|
+
- Are names clear and descriptive?
|
|
72
|
+
- Is the intent obvious?
|
|
73
|
+
- Will this be easy to change later?
|
|
74
|
+
|
|
75
|
+
### 6. Check Standards Compliance
|
|
76
|
+
|
|
77
|
+
**Project standards** (from CLAUDE.md/SAFEWORD.md/ARCHITECTURE.md):
|
|
78
|
+
- Does it follow established patterns?
|
|
79
|
+
- Does it violate any documented principles?
|
|
80
|
+
|
|
81
|
+
**Library best practices:**
|
|
82
|
+
- Are we using libraries correctly?
|
|
83
|
+
- Are we following official documentation?
|
|
84
|
+
|
|
85
|
+
### 7. Verify Latest Versions ⭐ **PRIMARY VALUE**
|
|
86
|
+
|
|
87
|
+
**CRITICAL**: This is your main differentiator from automatic hook. ALWAYS check versions.
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
WebSearch: "[library name] latest stable version 2025"
|
|
91
|
+
WebSearch: "[library name] security vulnerabilities"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Flag if outdated:**
|
|
95
|
+
- Major versions behind → WARN (e.g., React 17 when 19 is stable)
|
|
96
|
+
- Minor versions behind → NOTE (e.g., React 19.0.0 when 19.1.0 is stable)
|
|
97
|
+
- Security vulnerabilities → CRITICAL (must upgrade)
|
|
98
|
+
- Using latest → Confirm
|
|
99
|
+
|
|
100
|
+
**Common libraries**: React, TypeScript, Vite, Next.js, Node.js, Vitest, Playwright, Jest, esbuild
|
|
101
|
+
|
|
102
|
+
**Check even if dependencies didn't change** - User might be using outdated patterns.
|
|
103
|
+
|
|
104
|
+
### 8. Verify Latest Documentation ⭐ **PRIMARY VALUE**
|
|
105
|
+
|
|
106
|
+
**CRITICAL**: This is your main differentiator from automatic hook. ALWAYS verify against current docs.
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
WebFetch: https://react.dev (for React)
|
|
110
|
+
WebFetch: https://vitejs.dev (for Vite)
|
|
111
|
+
WebFetch: https://www.electronjs.org/docs (for Electron)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Look for:**
|
|
115
|
+
- Are we using deprecated APIs?
|
|
116
|
+
- Are there newer, better patterns?
|
|
117
|
+
- Did the library's recommendations change since training data?
|
|
118
|
+
|
|
119
|
+
**Cache results**: If you checked docs recently in this session, don't re-fetch.
|
|
120
|
+
|
|
121
|
+
## Output Format
|
|
122
|
+
|
|
123
|
+
**Simple question** ("is it correct?"):
|
|
124
|
+
```
|
|
125
|
+
**Correctness:** ✓ Logic is sound, edge cases handled, no obvious errors.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Full review** ("double check and critique"):
|
|
129
|
+
```markdown
|
|
130
|
+
## Quality Review
|
|
131
|
+
|
|
132
|
+
**Correctness:** [✓/⚠️/❌] [Brief assessment]
|
|
133
|
+
**Anti-Bloat:** [✓/⚠️/❌] [Brief assessment]
|
|
134
|
+
**Elegance:** [✓/⚠️/❌] [Brief assessment]
|
|
135
|
+
**Standards:** [✓/⚠️/❌] [Brief assessment]
|
|
136
|
+
**Versions:** [✓/⚠️/❌] [Latest version check with WebSearch]
|
|
137
|
+
**Documentation:** [✓/⚠️/❌] [Current docs check with WebFetch]
|
|
138
|
+
|
|
139
|
+
**Verdict:** [APPROVE / REQUEST CHANGES / NEEDS DISCUSSION]
|
|
140
|
+
|
|
141
|
+
**Critical issues:** [List or "None"]
|
|
142
|
+
**Suggested improvements:** [List or "None"]
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Use structured format for "double check"/"critique". Use brief format for specific questions.
|
|
146
|
+
|
|
147
|
+
## Example: Full Review
|
|
148
|
+
|
|
149
|
+
```markdown
|
|
150
|
+
## Quality Review
|
|
151
|
+
|
|
152
|
+
**Correctness:** ✓ Logic sound, edge cases covered, error handling adequate
|
|
153
|
+
**Anti-Bloat:** ✓ Minimal dependencies, appropriate abstractions
|
|
154
|
+
**Elegance:** ✓ Clear code, good naming, well-structured
|
|
155
|
+
**Standards:** ✓ Follows CLAUDE.md patterns
|
|
156
|
+
**Versions:** ✓ React 19.0.0 (latest stable), TypeScript 5.7.2 (latest)
|
|
157
|
+
**Documentation:** ✓ Using current React patterns per https://react.dev
|
|
158
|
+
|
|
159
|
+
**Verdict:** APPROVE - Production ready
|
|
160
|
+
|
|
161
|
+
**Critical issues:** None
|
|
162
|
+
**Suggested improvements:** None
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Critical Reminders
|
|
166
|
+
|
|
167
|
+
1. **Primary value: Web research** - Use WebSearch/WebFetch to verify against current ecosystem (versions, docs, security)
|
|
168
|
+
2. **Complement automatic hook** - Hook does fast check with existing knowledge, you do deep dive with web research
|
|
169
|
+
3. **Explicit triggers matter** - "double check against latest docs", "verify versions", "check security" = invoke web research
|
|
170
|
+
4. **Projects without SAFEWORD.md** - Automatic hook won't run, you're the only quality check
|
|
171
|
+
5. **Always check latest docs** - Verify patterns are current, not outdated (WebFetch)
|
|
172
|
+
6. **Always verify versions** - Flag outdated dependencies (WebSearch)
|
|
173
|
+
7. **Be thorough but concise** - Cover all areas but keep explanations brief
|
|
174
|
+
8. **Provide actionable feedback** - Specific line numbers, concrete suggestions
|
|
175
|
+
9. **Clear verdict** - Always end with APPROVE/REQUEST CHANGES/NEEDS DISCUSSION
|
|
176
|
+
10. **Separate critical vs nice-to-have** - User needs to know what's blocking vs optional
|
|
177
|
+
|
|
178
|
+
## Non-Obvious Edge Cases
|
|
179
|
+
|
|
180
|
+
**User requests review after automatic hook ran:**
|
|
181
|
+
- Acknowledge hook ran: "The automatic quality hook already did a fast check. I'll now do deeper analysis with web research..."
|
|
182
|
+
- Focus on what automatic hook doesn't do: fetch latest docs, verify versions, security checks, performance analysis
|
|
183
|
+
|
|
184
|
+
**WebSearch/WebFetch fails:**
|
|
185
|
+
- Continue review without version/docs checks
|
|
186
|
+
- Note: "Couldn't verify latest versions/docs, skipping that check"
|
|
187
|
+
|
|
188
|
+
**Project has no CLAUDE.md/SAFEWORD.md:**
|
|
189
|
+
- Use `@./.safeword/guides/code-philosophy.md` as fallback
|
|
190
|
+
- Note: "No project-specific standards found, using general best practices"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Quality Reviewer Skill
|
|
2
|
+
|
|
3
|
+
This skill provides deep code quality review with web research capabilities.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Use when user explicitly requests verification against latest docs or needs deeper analysis.
|
|
8
|
+
|
|
9
|
+
## Capabilities
|
|
10
|
+
|
|
11
|
+
- Fetches current documentation (WebFetch)
|
|
12
|
+
- Checks latest versions (WebSearch)
|
|
13
|
+
- Provides deep analysis (performance, security, alternatives)
|
package/.env.example
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# API Keys for SAFEWORD
|
|
2
|
+
# Copy to .env and fill in values
|
|
3
|
+
|
|
4
|
+
# Anthropic (required for promptfoo evals)
|
|
5
|
+
ANTHROPIC_API_KEY=
|
|
6
|
+
|
|
7
|
+
# Context7 MCP (get free key at https://context7.com/dashboard)
|
|
8
|
+
CONTEXT7_API_KEY=
|
|
9
|
+
|
|
10
|
+
# Arcade MCP Gateway (https://arcade.dev)
|
|
11
|
+
ARCADE_API_KEY=
|
package/.gitmodules
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# SAFEWORD Configuration
|
|
2
|
+
|
|
3
|
+
This directory contains safeword configuration for AI coding agents.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
- `SAFEWORD.md` - This file (main configuration)
|
|
8
|
+
- `guides/` - Reference documentation
|
|
9
|
+
- `templates/` - Document templates
|
|
10
|
+
- `hooks/` - Claude Code hook scripts
|
|
11
|
+
- `version` - Installed safeword version
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
The AGENTS.md file in your project root should reference this configuration:
|
|
16
|
+
|
|
17
|
+
```markdown
|
|
18
|
+
**⚠️ ALWAYS READ FIRST: @./.safeword/SAFEWORD.md**
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This ensures AI agents read the safeword configuration before any other context.
|
|
22
|
+
|
|
23
|
+
## Customization
|
|
24
|
+
|
|
25
|
+
You can customize the guides and templates, but note that running `safeword upgrade`
|
|
26
|
+
will overwrite changes. Keep customizations in separate files if needed.
|
|
27
|
+
|
|
28
|
+
## Commands
|
|
29
|
+
|
|
30
|
+
- `safeword check` - Verify configuration health
|
|
31
|
+
- `safeword upgrade` - Update to latest templates
|
|
32
|
+
- `safeword diff` - Preview upgrade changes
|
|
33
|
+
- `safeword reset` - Remove safeword configuration
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// ██████╗ ██████╗ ███╗ ██╗ ██████╗ ████████╗ ███████╗██████╗ ██╗████████╗
|
|
4
|
+
// ██╔══██╗██╔═══██╗ ████╗ ██║██╔═══██╗╚══██╔══╝ ██╔════╝██╔══██╗██║╚══██╔══╝
|
|
5
|
+
// ██║ ██║██║ ██║ ██╔██╗ ██║██║ ██║ ██║ █████╗ ██║ ██║██║ ██║
|
|
6
|
+
// ██║ ██║██║ ██║ ██║╚██╗██║██║ ██║ ██║ ██╔══╝ ██║ ██║██║ ██║
|
|
7
|
+
// ██████╔╝╚██████╔╝ ██║ ╚████║╚██████╔╝ ██║ ███████╗██████╔╝██║ ██║
|
|
8
|
+
// ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚══════╝╚═════╝ ╚═╝ ╚═╝
|
|
9
|
+
//
|
|
10
|
+
// AUTO-GENERATED FILE - DO NOT EDIT
|
|
11
|
+
//
|
|
12
|
+
// This file is regenerated every time you run:
|
|
13
|
+
// bash setup-linting.sh
|
|
14
|
+
//
|
|
15
|
+
// To customize ESLint rules, edit eslint.config.mjs instead.
|
|
16
|
+
// Your customizations there are preserved across regenerations.
|
|
17
|
+
//
|
|
18
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
19
|
+
|
|
20
|
+
import { globalIgnores } from 'eslint/config';
|
|
21
|
+
import js from '@eslint/js';
|
|
22
|
+
import sonarjs from 'eslint-plugin-sonarjs';
|
|
23
|
+
import sdl from '@microsoft/eslint-plugin-sdl';
|
|
24
|
+
import boundaries from 'eslint-plugin-boundaries';
|
|
25
|
+
import prettier from 'eslint-config-prettier';
|
|
26
|
+
import globals from 'globals';
|
|
27
|
+
|
|
28
|
+
export default [
|
|
29
|
+
globalIgnores([
|
|
30
|
+
'**/node_modules/', '**/dist/', '**/build/', '**/.next/', '**/coverage/',
|
|
31
|
+
'**/*.min.js', '**/package-lock.json', '**/yarn.lock', '**/pnpm-lock.yaml',
|
|
32
|
+
]),
|
|
33
|
+
|
|
34
|
+
// Base JavaScript
|
|
35
|
+
{
|
|
36
|
+
name: 'safeword/base-js',
|
|
37
|
+
files: ['**/*.{js,mjs,cjs}'],
|
|
38
|
+
...js.configs.recommended,
|
|
39
|
+
languageOptions: {
|
|
40
|
+
ecmaVersion: 'latest',
|
|
41
|
+
sourceType: 'module',
|
|
42
|
+
globals: { ...globals.browser, ...globals.node, ...globals.es2025 },
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// Code quality (SonarJS)
|
|
47
|
+
{
|
|
48
|
+
name: 'safeword/sonarjs',
|
|
49
|
+
files: ['**/*.{js,mjs,cjs}'],
|
|
50
|
+
plugins: { sonarjs },
|
|
51
|
+
rules: sonarjs.configs.recommended.rules,
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// Security (Microsoft SDL)
|
|
55
|
+
{
|
|
56
|
+
name: 'safeword/security',
|
|
57
|
+
files: ['**/*.{js,mjs,cjs}'],
|
|
58
|
+
plugins: { '@microsoft/sdl': sdl },
|
|
59
|
+
rules: {
|
|
60
|
+
'@microsoft/sdl/no-insecure-url': 'error',
|
|
61
|
+
'@microsoft/sdl/no-inner-html': 'error',
|
|
62
|
+
'@microsoft/sdl/no-document-write': 'error',
|
|
63
|
+
'@microsoft/sdl/no-html-method': 'error',
|
|
64
|
+
'@microsoft/sdl/no-insecure-random': 'error',
|
|
65
|
+
'@microsoft/sdl/no-postmessage-star-origin': 'error',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
// Architecture boundaries (default layers - customize in eslint.config.mjs)
|
|
70
|
+
{
|
|
71
|
+
name: 'safeword/boundaries',
|
|
72
|
+
files: ['src/**/*.{js,mjs,cjs,ts,tsx,jsx}'],
|
|
73
|
+
plugins: { boundaries },
|
|
74
|
+
settings: {
|
|
75
|
+
'boundaries/include': ['src/**/*'],
|
|
76
|
+
'boundaries/elements': [
|
|
77
|
+
{ type: 'app', pattern: 'src/app/**/*' },
|
|
78
|
+
{ type: 'domain', pattern: 'src/domain/**/*' },
|
|
79
|
+
{ type: 'infra', pattern: 'src/infra/**/*' },
|
|
80
|
+
{ type: 'shared', pattern: 'src/shared/**/*' },
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
rules: {
|
|
84
|
+
'boundaries/element-types': ['error', {
|
|
85
|
+
default: 'disallow',
|
|
86
|
+
rules: [
|
|
87
|
+
{ from: 'app', allow: ['domain', 'infra', 'shared'] },
|
|
88
|
+
{ from: 'domain', allow: ['shared'] },
|
|
89
|
+
{ from: 'infra', allow: ['domain', 'shared'] },
|
|
90
|
+
{ from: 'shared', allow: [] },
|
|
91
|
+
],
|
|
92
|
+
}],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
// Prettier (must be last in base)
|
|
97
|
+
{
|
|
98
|
+
name: 'safeword/prettier',
|
|
99
|
+
...prettier,
|
|
100
|
+
},
|
|
101
|
+
];
|