safeword 0.2.2 → 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.
Files changed (235) hide show
  1. package/.claude/commands/arch-review.md +32 -0
  2. package/.claude/commands/lint.md +6 -0
  3. package/.claude/commands/quality-review.md +13 -0
  4. package/.claude/commands/setup-linting.md +6 -0
  5. package/.claude/hooks/auto-lint.sh +6 -0
  6. package/.claude/hooks/auto-quality-review.sh +170 -0
  7. package/.claude/hooks/check-linting-sync.sh +17 -0
  8. package/.claude/hooks/inject-timestamp.sh +6 -0
  9. package/.claude/hooks/question-protocol.sh +12 -0
  10. package/.claude/hooks/run-linters.sh +8 -0
  11. package/.claude/hooks/run-quality-review.sh +76 -0
  12. package/.claude/hooks/version-check.sh +10 -0
  13. package/.claude/mcp/README.md +96 -0
  14. package/.claude/mcp/arcade.sample.json +9 -0
  15. package/.claude/mcp/context7.sample.json +7 -0
  16. package/.claude/mcp/playwright.sample.json +7 -0
  17. package/.claude/settings.json +62 -0
  18. package/.claude/skills/quality-reviewer/SKILL.md +190 -0
  19. package/.claude/skills/safeword-quality-reviewer/SKILL.md +13 -0
  20. package/.env.arcade.example +4 -0
  21. package/.env.example +11 -0
  22. package/.gitmodules +4 -0
  23. package/.safeword/SAFEWORD.md +33 -0
  24. package/.safeword/eslint/eslint-base.mjs +101 -0
  25. package/.safeword/guides/architecture-guide.md +404 -0
  26. package/.safeword/guides/code-philosophy.md +174 -0
  27. package/.safeword/guides/context-files-guide.md +405 -0
  28. package/.safeword/guides/data-architecture-guide.md +183 -0
  29. package/.safeword/guides/design-doc-guide.md +165 -0
  30. package/.safeword/guides/learning-extraction.md +515 -0
  31. package/.safeword/guides/llm-instruction-design.md +239 -0
  32. package/.safeword/guides/llm-prompting.md +95 -0
  33. package/.safeword/guides/tdd-best-practices.md +570 -0
  34. package/.safeword/guides/test-definitions-guide.md +243 -0
  35. package/.safeword/guides/testing-methodology.md +573 -0
  36. package/.safeword/guides/user-story-guide.md +237 -0
  37. package/.safeword/guides/zombie-process-cleanup.md +214 -0
  38. package/{templates → .safeword}/hooks/agents-md-check.sh +0 -0
  39. package/{templates → .safeword}/hooks/post-tool.sh +0 -0
  40. package/{templates → .safeword}/hooks/pre-commit.sh +0 -0
  41. package/.safeword/planning/002-user-story-quality-evaluation.md +1840 -0
  42. package/.safeword/planning/003-langsmith-eval-setup-prompt.md +363 -0
  43. package/.safeword/planning/004-llm-eval-test-cases.md +3226 -0
  44. package/.safeword/planning/005-architecture-enforcement-system.md +169 -0
  45. package/.safeword/planning/006-reactive-fix-prevention-research.md +135 -0
  46. package/.safeword/planning/011-cli-ux-vision.md +330 -0
  47. package/.safeword/planning/012-project-structure-cleanup.md +154 -0
  48. package/.safeword/planning/README.md +39 -0
  49. package/.safeword/planning/automation-plan-v2.md +1225 -0
  50. package/.safeword/planning/automation-plan-v3.md +1291 -0
  51. package/.safeword/planning/automation-plan.md +3058 -0
  52. package/.safeword/planning/design/005-cli-implementation.md +343 -0
  53. package/.safeword/planning/design/013-cli-self-contained-templates.md +596 -0
  54. package/.safeword/planning/design/013a-eslint-plugin-suite.md +256 -0
  55. package/.safeword/planning/design/013b-implementation-snippets.md +385 -0
  56. package/.safeword/planning/design/013c-config-isolation-strategy.md +242 -0
  57. package/.safeword/planning/design/code-philosophy-improvements.md +60 -0
  58. package/.safeword/planning/mcp-analysis.md +545 -0
  59. package/.safeword/planning/phase2-subagents-vs-skills-analysis.md +451 -0
  60. package/.safeword/planning/settings-improvements.md +970 -0
  61. package/.safeword/planning/test-definitions/005-cli-implementation.md +1301 -0
  62. package/.safeword/planning/test-definitions/cli-self-contained-templates.md +205 -0
  63. package/.safeword/planning/user-stories/001-guides-review-user-stories.md +1381 -0
  64. package/.safeword/planning/user-stories/003-reactive-fix-prevention.md +132 -0
  65. package/.safeword/planning/user-stories/004-technical-constraints.md +86 -0
  66. package/.safeword/planning/user-stories/005-cli-implementation.md +311 -0
  67. package/.safeword/planning/user-stories/cli-self-contained-templates.md +172 -0
  68. package/.safeword/planning/versioned-distribution.md +740 -0
  69. package/.safeword/prompts/arch-review.md +43 -0
  70. package/.safeword/prompts/quality-review.md +11 -0
  71. package/.safeword/scripts/arch-review.sh +235 -0
  72. package/.safeword/scripts/check-linting-sync.sh +58 -0
  73. package/.safeword/scripts/setup-linting.sh +559 -0
  74. package/.safeword/templates/architecture-template.md +136 -0
  75. package/.safeword/templates/ci/architecture-check.yml +79 -0
  76. package/.safeword/templates/design-doc-template.md +127 -0
  77. package/.safeword/templates/test-definitions-feature.md +100 -0
  78. package/.safeword/templates/ticket-template.md +74 -0
  79. package/.safeword/templates/user-stories-template.md +82 -0
  80. package/.safeword/tickets/001-guides-review-user-stories.md +83 -0
  81. package/.safeword/tickets/002-architecture-enforcement.md +211 -0
  82. package/.safeword/tickets/003-reactive-fix-prevention.md +57 -0
  83. package/.safeword/tickets/004-technical-constraints-in-user-stories.md +39 -0
  84. package/.safeword/tickets/005-cli-implementation.md +248 -0
  85. package/.safeword/tickets/006-flesh-out-skills.md +43 -0
  86. package/.safeword/tickets/007-flesh-out-questioning.md +44 -0
  87. package/.safeword/tickets/008-upgrade-questioning.md +58 -0
  88. package/.safeword/tickets/009-naming-conventions.md +41 -0
  89. package/.safeword/tickets/010-safeword-md-cleanup.md +34 -0
  90. package/.safeword/tickets/011-cursor-setup.md +86 -0
  91. package/.safeword/tickets/README.md +73 -0
  92. package/.safeword/version +1 -0
  93. package/AGENTS.md +59 -0
  94. package/CLAUDE.md +12 -0
  95. package/README.md +347 -0
  96. package/docs/001-cli-implementation-plan.md +856 -0
  97. package/docs/elite-dx-implementation-plan.md +1034 -0
  98. package/framework/README.md +131 -0
  99. package/framework/mcp/README.md +96 -0
  100. package/framework/mcp/arcade.sample.json +8 -0
  101. package/framework/mcp/context7.sample.json +6 -0
  102. package/framework/mcp/playwright.sample.json +6 -0
  103. package/framework/scripts/arch-review.sh +235 -0
  104. package/framework/scripts/check-linting-sync.sh +58 -0
  105. package/framework/scripts/load-env.sh +49 -0
  106. package/framework/scripts/setup-claude.sh +223 -0
  107. package/framework/scripts/setup-linting.sh +559 -0
  108. package/framework/scripts/setup-quality.sh +477 -0
  109. package/framework/scripts/setup-safeword.sh +550 -0
  110. package/framework/templates/ci/architecture-check.yml +78 -0
  111. package/learnings/ai-sdk-v5-breaking-changes.md +178 -0
  112. package/learnings/e2e-test-zombie-processes.md +231 -0
  113. package/learnings/milkdown-crepe-editor-property.md +96 -0
  114. package/learnings/prosemirror-fragment-traversal.md +119 -0
  115. package/package.json +19 -43
  116. package/packages/cli/AGENTS.md +1 -0
  117. package/packages/cli/ARCHITECTURE.md +279 -0
  118. package/packages/cli/package.json +51 -0
  119. package/packages/cli/src/cli.ts +63 -0
  120. package/packages/cli/src/commands/check.ts +166 -0
  121. package/packages/cli/src/commands/diff.ts +209 -0
  122. package/packages/cli/src/commands/reset.ts +190 -0
  123. package/packages/cli/src/commands/setup.ts +325 -0
  124. package/packages/cli/src/commands/upgrade.ts +163 -0
  125. package/packages/cli/src/index.ts +3 -0
  126. package/packages/cli/src/templates/config.ts +58 -0
  127. package/packages/cli/src/templates/content.ts +18 -0
  128. package/packages/cli/src/templates/index.ts +12 -0
  129. package/packages/cli/src/utils/agents-md.ts +66 -0
  130. package/packages/cli/src/utils/fs.ts +179 -0
  131. package/packages/cli/src/utils/git.ts +124 -0
  132. package/packages/cli/src/utils/hooks.ts +29 -0
  133. package/packages/cli/src/utils/output.ts +60 -0
  134. package/packages/cli/src/utils/project-detector.test.ts +185 -0
  135. package/packages/cli/src/utils/project-detector.ts +44 -0
  136. package/packages/cli/src/utils/version.ts +28 -0
  137. package/packages/cli/src/version.ts +6 -0
  138. package/packages/cli/templates/SAFEWORD.md +776 -0
  139. package/packages/cli/templates/doc-templates/architecture-template.md +136 -0
  140. package/packages/cli/templates/doc-templates/design-doc-template.md +134 -0
  141. package/packages/cli/templates/doc-templates/test-definitions-feature.md +131 -0
  142. package/packages/cli/templates/doc-templates/ticket-template.md +82 -0
  143. package/packages/cli/templates/doc-templates/user-stories-template.md +92 -0
  144. package/packages/cli/templates/guides/architecture-guide.md +423 -0
  145. package/packages/cli/templates/guides/code-philosophy.md +195 -0
  146. package/packages/cli/templates/guides/context-files-guide.md +457 -0
  147. package/packages/cli/templates/guides/data-architecture-guide.md +200 -0
  148. package/packages/cli/templates/guides/design-doc-guide.md +171 -0
  149. package/packages/cli/templates/guides/learning-extraction.md +552 -0
  150. package/packages/cli/templates/guides/llm-instruction-design.md +248 -0
  151. package/packages/cli/templates/guides/llm-prompting.md +102 -0
  152. package/packages/cli/templates/guides/tdd-best-practices.md +615 -0
  153. package/packages/cli/templates/guides/test-definitions-guide.md +334 -0
  154. package/packages/cli/templates/guides/testing-methodology.md +618 -0
  155. package/packages/cli/templates/guides/user-story-guide.md +256 -0
  156. package/packages/cli/templates/guides/zombie-process-cleanup.md +219 -0
  157. package/packages/cli/templates/hooks/agents-md-check.sh +27 -0
  158. package/packages/cli/templates/hooks/post-tool.sh +4 -0
  159. package/packages/cli/templates/hooks/pre-commit.sh +10 -0
  160. package/packages/cli/templates/prompts/arch-review.md +43 -0
  161. package/packages/cli/templates/prompts/quality-review.md +10 -0
  162. package/packages/cli/templates/skills/safeword-quality-reviewer/SKILL.md +207 -0
  163. package/packages/cli/tests/commands/check.test.ts +129 -0
  164. package/packages/cli/tests/commands/cli.test.ts +89 -0
  165. package/packages/cli/tests/commands/diff.test.ts +115 -0
  166. package/packages/cli/tests/commands/reset.test.ts +310 -0
  167. package/packages/cli/tests/commands/self-healing.test.ts +170 -0
  168. package/packages/cli/tests/commands/setup-blocking.test.ts +71 -0
  169. package/packages/cli/tests/commands/setup-core.test.ts +135 -0
  170. package/packages/cli/tests/commands/setup-git.test.ts +139 -0
  171. package/packages/cli/tests/commands/setup-hooks.test.ts +334 -0
  172. package/packages/cli/tests/commands/setup-linting.test.ts +189 -0
  173. package/packages/cli/tests/commands/setup-noninteractive.test.ts +80 -0
  174. package/packages/cli/tests/commands/setup-templates.test.ts +181 -0
  175. package/packages/cli/tests/commands/upgrade.test.ts +215 -0
  176. package/packages/cli/tests/helpers.ts +243 -0
  177. package/packages/cli/tests/npm-package.test.ts +83 -0
  178. package/packages/cli/tests/technical-constraints.test.ts +96 -0
  179. package/packages/cli/tsconfig.json +25 -0
  180. package/packages/cli/tsup.config.ts +11 -0
  181. package/packages/cli/vitest.config.ts +23 -0
  182. package/promptfoo.yaml +3270 -0
  183. package/dist/check-M73LGONJ.js +0 -129
  184. package/dist/check-M73LGONJ.js.map +0 -1
  185. package/dist/chunk-2XWIUEQK.js +0 -190
  186. package/dist/chunk-2XWIUEQK.js.map +0 -1
  187. package/dist/chunk-GZRQL3SX.js +0 -146
  188. package/dist/chunk-GZRQL3SX.js.map +0 -1
  189. package/dist/chunk-V5G6BGOK.js +0 -26
  190. package/dist/chunk-V5G6BGOK.js.map +0 -1
  191. package/dist/chunk-W66Z3C5H.js +0 -21
  192. package/dist/chunk-W66Z3C5H.js.map +0 -1
  193. package/dist/cli.d.ts +0 -1
  194. package/dist/cli.js +0 -34
  195. package/dist/cli.js.map +0 -1
  196. package/dist/diff-FSFDCBL5.js +0 -166
  197. package/dist/diff-FSFDCBL5.js.map +0 -1
  198. package/dist/index.d.ts +0 -11
  199. package/dist/index.js +0 -7
  200. package/dist/index.js.map +0 -1
  201. package/dist/reset-3ACTIYYE.js +0 -143
  202. package/dist/reset-3ACTIYYE.js.map +0 -1
  203. package/dist/setup-MKVVQTVA.js +0 -266
  204. package/dist/setup-MKVVQTVA.js.map +0 -1
  205. package/dist/upgrade-FQOL6AF5.js +0 -134
  206. package/dist/upgrade-FQOL6AF5.js.map +0 -1
  207. /package/{templates → framework}/SAFEWORD.md +0 -0
  208. /package/{templates → framework}/guides/architecture-guide.md +0 -0
  209. /package/{templates → framework}/guides/code-philosophy.md +0 -0
  210. /package/{templates → framework}/guides/context-files-guide.md +0 -0
  211. /package/{templates → framework}/guides/data-architecture-guide.md +0 -0
  212. /package/{templates → framework}/guides/design-doc-guide.md +0 -0
  213. /package/{templates → framework}/guides/learning-extraction.md +0 -0
  214. /package/{templates → framework}/guides/llm-instruction-design.md +0 -0
  215. /package/{templates → framework}/guides/llm-prompting.md +0 -0
  216. /package/{templates → framework}/guides/tdd-best-practices.md +0 -0
  217. /package/{templates → framework}/guides/test-definitions-guide.md +0 -0
  218. /package/{templates → framework}/guides/testing-methodology.md +0 -0
  219. /package/{templates → framework}/guides/user-story-guide.md +0 -0
  220. /package/{templates → framework}/guides/zombie-process-cleanup.md +0 -0
  221. /package/{templates → framework}/prompts/arch-review.md +0 -0
  222. /package/{templates → framework}/prompts/quality-review.md +0 -0
  223. /package/{templates/skills/safeword-quality-reviewer → framework/skills/quality-reviewer}/SKILL.md +0 -0
  224. /package/{templates/doc-templates → framework/templates}/architecture-template.md +0 -0
  225. /package/{templates/doc-templates → framework/templates}/design-doc-template.md +0 -0
  226. /package/{templates/doc-templates → framework/templates}/test-definitions-feature.md +0 -0
  227. /package/{templates/doc-templates → framework/templates}/ticket-template.md +0 -0
  228. /package/{templates/doc-templates → framework/templates}/user-stories-template.md +0 -0
  229. /package/{templates → packages/cli/templates}/commands/arch-review.md +0 -0
  230. /package/{templates → packages/cli/templates}/commands/lint.md +0 -0
  231. /package/{templates → packages/cli/templates}/commands/quality-review.md +0 -0
  232. /package/{templates → packages/cli/templates}/hooks/inject-timestamp.sh +0 -0
  233. /package/{templates → packages/cli/templates}/lib/common.sh +0 -0
  234. /package/{templates → packages/cli/templates}/lib/jq-fallback.sh +0 -0
  235. /package/{templates → packages/cli/templates}/markdownlint.jsonc +0 -0
@@ -0,0 +1,131 @@
1
+ # SAFEWORD Framework Setup Guide
2
+
3
+ A single place to install and understand the SAFEWORD framework in your project.
4
+
5
+ ## What you get
6
+
7
+ - `.safeword/SAFEWORD.md` and guides for workflows, TDD, and best practices
8
+ - `.safeword/templates/` for user stories, test definitions, and design docs
9
+ - `.safeword/planning/` and `.safeword/tickets/` structure
10
+ - `.claude/` hooks and settings for:
11
+ - Auto-linting (PostToolUse)
12
+ - Quality review (Stop hook)
13
+ - Session start version message
14
+
15
+ All scripts are idempotent and safe to re-run.
16
+
17
+ ## Requirements
18
+
19
+ - bash
20
+ - jq (required for hook settings merging)
21
+ - macOS: `brew install jq`
22
+ - Ubuntu/Debian: `sudo apt-get install jq`
23
+ - Node.js + npm (only for auto-linting setup)
24
+
25
+ ## Recommended setup (2 commands)
26
+
27
+ ```bash
28
+ cd /path/to/your/project
29
+
30
+ # 1) Install SAFEWORD structure and docs (planning, guides, templates)
31
+ bash ./framework/scripts/setup-safeword.sh
32
+
33
+ # 2) Install hooks (auto-linting + quality review)
34
+ bash ./framework/scripts/setup-claude.sh
35
+ ```
36
+
37
+ Options for step 2:
38
+
39
+ - Skip linting (quality review only): `bash ./framework/scripts/setup-claude.sh --skip-linting`
40
+ - Skip quality review: `bash ./framework/scripts/setup-claude.sh --skip-quality`
41
+
42
+ ## What each script does
43
+
44
+ ### setup-safeword.sh (Project structure + docs)
45
+
46
+ - Copies `framework/SAFEWORD.md` to `.safeword/SAFEWORD.md`
47
+ - Copies `framework/guides/` and `framework/templates/` into `.safeword/`
48
+ - Creates `.safeword/planning/` and `.safeword/tickets/` (with archives)
49
+ - Creates or updates `AGENTS.md` with an always-read trigger for `@./.safeword/SAFEWORD.md`
50
+ - Ensures `.gitignore` includes `.safeword` planning folders and Claude local files
51
+ - Creates `.claude/settings.json` if missing
52
+
53
+ Note: Hook binaries are created by the scripts below. Running `setup-claude.sh` installs them.
54
+
55
+ ### setup-claude.sh (Hooks orchestrator)
56
+
57
+ - Auto-detects project type (react, astro, electron, typescript, minimal) unless `--linting-mode` is provided
58
+ - Runs linting setup unless `--skip-linting`
59
+ - Runs quality review setup unless `--skip-quality`
60
+ - Seeds `.claude/skills/` and `.claude/mcp/` from `framework/skills` and `framework/mcp` if present
61
+ - Adds a sample Arcade MCP config and environment example if missing
62
+ - Ensures `CLAUDE.md` references `.safeword/SAFEWORD.md`
63
+
64
+ ### setup-linting.sh (Auto-linting)
65
+
66
+ - **Auto-detects** project type from package.json and tsconfig.json
67
+ - **Two-file architecture** for safe updates:
68
+ - `.safeword/eslint/eslint-base.mjs` - Auto-generated every run
69
+ - `eslint.config.mjs` - User-owned, never overwritten (customize freely)
70
+ - All projects include:
71
+ - `eslint-plugin-boundaries` (architectural boundary enforcement)
72
+ - `eslint-plugin-sonarjs` (code smell detection)
73
+ - `@microsoft/eslint-plugin-sdl` (security rules)
74
+ - Creates:
75
+ - `.claude/hooks/run-linters.sh` (shared logic)
76
+ - `.claude/hooks/auto-lint.sh` (PostToolUse wrapper)
77
+ - `.claude/commands/lint.md`
78
+ - `.prettierrc` and `.prettierignore`
79
+
80
+ The base config is regenerated every run, so after adding/removing frameworks:
81
+
82
+ ```bash
83
+ bash setup-linting.sh # Re-detects and updates
84
+ ```
85
+
86
+ Options: `--no-typescript`, `--no-react`, `--no-astro` - Override auto-detection
87
+
88
+ ### setup-quality.sh (Quality review)
89
+
90
+ - Creates:
91
+ - `.claude/hooks/auto-quality-review.sh` (Stop hook that inspects transcript)
92
+ - `.claude/hooks/run-quality-review.sh` (prompt)
93
+ - `.claude/commands/quality-review.md`
94
+ - `.claude/settings.json` merged with Stop + SessionStart hooks
95
+
96
+ Behavior:
97
+
98
+ - Triggers only when changes are proposed/made (JSON blob present)
99
+ - Skips when the assistant asked a question (waits for your answer)
100
+ - Works in monorepos by searching upward for `SAFEWORD.md` or `CLAUDE.md`
101
+ - Configurable via `.auto-quality-review.config`
102
+
103
+ ## Outputs checklist
104
+
105
+ After recommended setup:
106
+
107
+ - `.safeword/SAFEWORD.md` and `.safeword/guides/`
108
+ - `.claude/hooks/auto-lint.sh`, `run-linters.sh`, `auto-quality-review.sh`, `run-quality-review.sh`, `version-check.sh`
109
+ - `.claude/commands/lint.md`, `quality-review.md`
110
+ - `.claude/settings.json` with:
111
+ - `PostToolUse` → `auto-lint.sh`
112
+ - `Stop` → `auto-quality-review.sh`
113
+ - `SessionStart` → `version-check.sh`
114
+
115
+ ## Updating
116
+
117
+ Re-run the same scripts. Generated files include version headers like:
118
+
119
+ ```bash
120
+ # Generated by setup-linting.sh v1.0.0
121
+ # To upgrade: Re-run this script in this project
122
+ ```
123
+
124
+ ## Troubleshooting
125
+
126
+ - jq missing: Install jq (see Requirements). Scripts will error clearly when required.
127
+ - Node missing: Install Node.js + npm to use auto-linting.
128
+ - Hooks not triggering:
129
+ - Check `.claude/settings.json`
130
+ - Ensure `SAFEWORD.md` or `CLAUDE.md` exists in project or parent
131
+ - See `.safeword/SAFEWORD.md` (methodology) and this guide (setup/troubleshooting)
@@ -0,0 +1,96 @@
1
+ # MCP Server Configurations
2
+
3
+ Sample configurations for Model Context Protocol (MCP) servers.
4
+
5
+ ## Available Servers
6
+
7
+ | Server | Package | API Key | Purpose |
8
+ | -------------- | ----------------------- | --------------- | ------------------------------ |
9
+ | **Context7** | `@upstash/context7-mcp` | Required (free) | Library docs lookups |
10
+ | **Playwright** | `@playwright/mcp` | None | Browser automation (Microsoft) |
11
+ | **Arcade** | Arcade MCP Gateway | Required | Tool gateway |
12
+
13
+ ## API Keys
14
+
15
+ | Server | Get Key |
16
+ | -------- | -------------------------------------------------------------------- |
17
+ | Context7 | [context7.com/dashboard](https://context7.com/dashboard) (free tier) |
18
+ | Arcade | [arcade.dev](https://arcade.dev) |
19
+
20
+ ## Setup
21
+
22
+ ### 1. Set Environment Variables
23
+
24
+ Add to `~/.zshrc` (or `~/.bashrc`):
25
+
26
+ ```bash
27
+ export CONTEXT7_API_KEY="your-key-here"
28
+ export ARCADE_API_KEY="your-key-here"
29
+ ```
30
+
31
+ Then reload: `source ~/.zshrc`
32
+
33
+ ### 2. Add MCP Config
34
+
35
+ **Claude Desktop** — Add to `~/.claude/claude_desktop_config.json`:
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "context7": {
41
+ "command": "npx",
42
+ "args": ["-y", "@upstash/context7-mcp@latest"]
43
+ },
44
+ "playwright": {
45
+ "command": "npx",
46
+ "args": ["@playwright/mcp@latest"]
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ **Cursor** — Add to `.cursor/mcp.json`:
53
+
54
+ ```json
55
+ {
56
+ "mcpServers": {
57
+ "context7": {
58
+ "command": "npx",
59
+ "args": ["-y", "@upstash/context7-mcp@latest"]
60
+ },
61
+ "playwright": {
62
+ "command": "npx",
63
+ "args": ["@playwright/mcp@latest"]
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ MCP servers inherit environment variables from your shell automatically.
70
+
71
+ ## Playwright Options
72
+
73
+ | Arg | Description |
74
+ | ------------------------------------- | ----------------------- |
75
+ | `--browser chromium\|firefox\|webkit` | Browser type |
76
+ | `--headless` | Run headless |
77
+ | `--user-data-dir <path>` | Persist browser profile |
78
+
79
+ Example:
80
+
81
+ ```json
82
+ {
83
+ "command": "npx",
84
+ "args": ["@playwright/mcp@latest", "--browser", "chromium", "--headless"]
85
+ }
86
+ ```
87
+
88
+ ## Context7 Usage
89
+
90
+ Once configured, use in prompts:
91
+
92
+ ```
93
+ use context7 to look up the latest React 19 useOptimistic hook documentation
94
+ ```
95
+
96
+ Context7 fetches current docs directly from source repositories.
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "arcade",
3
+ "transport": "http",
4
+ "url": "https://mcp.arcade.dev",
5
+ "headers": {
6
+ "Authorization": "Bearer YOUR_ARCADE_API_KEY"
7
+ }
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "context7",
3
+ "transport": "stdio",
4
+ "command": "npx",
5
+ "args": ["-y", "@upstash/context7-mcp@latest"]
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "playwright",
3
+ "transport": "stdio",
4
+ "command": "npx",
5
+ "args": ["@playwright/mcp@latest"]
6
+ }
@@ -0,0 +1,235 @@
1
+ #!/bin/bash
2
+ ################################################################################
3
+ # Architecture Review Script
4
+ #
5
+ # Sends changed files to Claude Haiku API for semantic architecture review.
6
+ # Returns JSON verdict: clean | minor | refactor_needed
7
+ #
8
+ # Usage:
9
+ # arch-review.sh file1.ts file2.ts # Review specific files
10
+ # arch-review.sh --staged # Review git staged files
11
+ #
12
+ # Environment variables:
13
+ # ANTHROPIC_API_KEY - Required. Your Anthropic API key.
14
+ # ARCH_REVIEW_MODEL - Optional. Model to use (default: claude-3-haiku-20240307)
15
+ #
16
+ # Exit codes:
17
+ # 0 - Clean or minor issues (commit allowed)
18
+ # 1 - Refactor needed (commit blocked)
19
+ # 2 - Error (missing API key, network issue, etc.)
20
+ ################################################################################
21
+
22
+ set -e
23
+
24
+ VERSION="v1.0.0"
25
+
26
+ # Configuration
27
+ MODEL="${ARCH_REVIEW_MODEL:-claude-3-haiku-20240307}"
28
+ MAX_TOKENS=1024
29
+
30
+ # Colors for output
31
+ RED='\033[0;31m'
32
+ YELLOW='\033[1;33m'
33
+ GREEN='\033[0;32m'
34
+ NC='\033[0m' # No Color
35
+
36
+ # Check for required tools
37
+ if ! command -v curl &> /dev/null; then
38
+ echo "ERROR: curl is required but not installed." >&2
39
+ exit 2
40
+ fi
41
+
42
+ if ! command -v jq &> /dev/null; then
43
+ echo "ERROR: jq is required but not installed." >&2
44
+ exit 2
45
+ fi
46
+
47
+ # Check for API key
48
+ if [ -z "$ANTHROPIC_API_KEY" ]; then
49
+ echo "ERROR: ANTHROPIC_API_KEY environment variable is not set." >&2
50
+ echo "Set it with: export ANTHROPIC_API_KEY='your-api-key'" >&2
51
+ exit 2
52
+ fi
53
+
54
+ # Parse arguments
55
+ FILES=()
56
+ STAGED_MODE=false
57
+
58
+ for arg in "$@"; do
59
+ case "$arg" in
60
+ --staged)
61
+ STAGED_MODE=true
62
+ ;;
63
+ --help|-h)
64
+ echo "Architecture Review Script $VERSION"
65
+ echo ""
66
+ echo "Usage:"
67
+ echo " arch-review.sh file1.ts file2.ts # Review specific files"
68
+ echo " arch-review.sh --staged # Review git staged files"
69
+ echo ""
70
+ echo "Environment variables:"
71
+ echo " ANTHROPIC_API_KEY - Required. Your Anthropic API key."
72
+ echo " ARCH_REVIEW_MODEL - Optional. Model (default: claude-3-haiku-20240307)"
73
+ exit 0
74
+ ;;
75
+ *)
76
+ FILES+=("$arg")
77
+ ;;
78
+ esac
79
+ done
80
+
81
+ # Get staged files if --staged mode
82
+ if [ "$STAGED_MODE" = true ]; then
83
+ # Get staged files (only .js, .ts, .tsx, .jsx)
84
+ while IFS= read -r file; do
85
+ if [[ "$file" =~ \.(js|ts|tsx|jsx)$ ]]; then
86
+ FILES+=("$file")
87
+ fi
88
+ done < <(git diff --cached --name-only --diff-filter=ACM 2>/dev/null || true)
89
+ fi
90
+
91
+ # Check if we have files to review
92
+ if [ ${#FILES[@]} -eq 0 ]; then
93
+ echo "No files to review."
94
+ exit 0
95
+ fi
96
+
97
+ echo "Reviewing ${#FILES[@]} file(s) for architectural issues..."
98
+
99
+ # Find ARCHITECTURE.md (search upward from current directory)
100
+ ARCH_FILE=""
101
+ SEARCH_DIR="$PWD"
102
+ while [ "$SEARCH_DIR" != "/" ]; do
103
+ if [ -f "$SEARCH_DIR/ARCHITECTURE.md" ]; then
104
+ ARCH_FILE="$SEARCH_DIR/ARCHITECTURE.md"
105
+ break
106
+ fi
107
+ SEARCH_DIR=$(dirname "$SEARCH_DIR")
108
+ done
109
+
110
+ # Build context for the prompt
111
+ CONTEXT=""
112
+
113
+ # Add ARCHITECTURE.md if found
114
+ if [ -n "$ARCH_FILE" ]; then
115
+ ARCH_CONTENT=$(cat "$ARCH_FILE" | head -c 8000) # Limit to ~8KB
116
+ CONTEXT+="## ARCHITECTURE.md\n\n$ARCH_CONTENT\n\n"
117
+ fi
118
+
119
+ # Add file contents
120
+ CONTEXT+="## Changed Files\n\n"
121
+ for file in "${FILES[@]}"; do
122
+ if [ -f "$file" ]; then
123
+ FILE_CONTENT=$(cat "$file" | head -c 4000) # Limit each file to ~4KB
124
+ CONTEXT+="### $file\n\n\`\`\`\n$FILE_CONTENT\n\`\`\`\n\n"
125
+ fi
126
+ done
127
+
128
+ # Read the arch-review prompt
129
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
130
+ PROMPT_FILE="$SCRIPT_DIR/../prompts/arch-review.md"
131
+
132
+ # Fall back to .safeword location if framework location doesn't exist
133
+ if [ ! -f "$PROMPT_FILE" ]; then
134
+ # Try .safeword/prompts/ location (when installed in project)
135
+ PROJECT_ROOT="$PWD"
136
+ while [ "$PROJECT_ROOT" != "/" ]; do
137
+ if [ -f "$PROJECT_ROOT/.safeword/prompts/arch-review.md" ]; then
138
+ PROMPT_FILE="$PROJECT_ROOT/.safeword/prompts/arch-review.md"
139
+ break
140
+ fi
141
+ PROJECT_ROOT=$(dirname "$PROJECT_ROOT")
142
+ done
143
+ fi
144
+
145
+ if [ ! -f "$PROMPT_FILE" ]; then
146
+ echo "ERROR: arch-review.md prompt not found." >&2
147
+ exit 2
148
+ fi
149
+
150
+ PROMPT=$(cat "$PROMPT_FILE")
151
+
152
+ # Combine prompt with context
153
+ FULL_PROMPT="$PROMPT\n\n---\n\n$CONTEXT"
154
+
155
+ # Escape for JSON
156
+ FULL_PROMPT_ESCAPED=$(echo -e "$FULL_PROMPT" | jq -Rs .)
157
+
158
+ # Make API request
159
+ RESPONSE=$(curl -s -X POST "https://api.anthropic.com/v1/messages" \
160
+ -H "Content-Type: application/json" \
161
+ -H "x-api-key: $ANTHROPIC_API_KEY" \
162
+ -H "anthropic-version: 2023-06-01" \
163
+ -d "{
164
+ \"model\": \"$MODEL\",
165
+ \"max_tokens\": $MAX_TOKENS,
166
+ \"messages\": [
167
+ {
168
+ \"role\": \"user\",
169
+ \"content\": $FULL_PROMPT_ESCAPED
170
+ }
171
+ ]
172
+ }" 2>&1)
173
+
174
+ # Check for API errors
175
+ if echo "$RESPONSE" | jq -e '.error' > /dev/null 2>&1; then
176
+ ERROR_MSG=$(echo "$RESPONSE" | jq -r '.error.message // "Unknown error"')
177
+ echo "ERROR: API request failed: $ERROR_MSG" >&2
178
+ exit 2
179
+ fi
180
+
181
+ # Extract the text response
182
+ TEXT_RESPONSE=$(echo "$RESPONSE" | jq -r '.content[0].text // empty')
183
+
184
+ if [ -z "$TEXT_RESPONSE" ]; then
185
+ echo "ERROR: Empty response from API" >&2
186
+ exit 2
187
+ fi
188
+
189
+ # Try to extract JSON from the response
190
+ JSON_RESULT=$(echo "$TEXT_RESPONSE" | grep -oP '\{[^{}]*"verdict"[^{}]*\}' | head -1 || true)
191
+
192
+ # If no simple JSON found, try to extract from code block
193
+ if [ -z "$JSON_RESULT" ]; then
194
+ JSON_RESULT=$(echo "$TEXT_RESPONSE" | sed -n '/```json/,/```/p' | grep -v '```' | tr -d '\n' || true)
195
+ fi
196
+
197
+ # Parse verdict
198
+ VERDICT="clean"
199
+ if [ -n "$JSON_RESULT" ]; then
200
+ VERDICT=$(echo "$JSON_RESULT" | jq -r '.verdict // "clean"' 2>/dev/null || echo "clean")
201
+ fi
202
+
203
+ # Output results
204
+ echo ""
205
+ echo "=== Architecture Review Results ==="
206
+ echo ""
207
+
208
+ # Show full response for debugging/context
209
+ echo "$TEXT_RESPONSE"
210
+ echo ""
211
+
212
+ # Show verdict with color
213
+ case "$VERDICT" in
214
+ clean)
215
+ echo -e "${GREEN}✓ Verdict: CLEAN${NC}"
216
+ echo "No architectural issues found."
217
+ exit 0
218
+ ;;
219
+ minor)
220
+ echo -e "${YELLOW}⚠ Verdict: MINOR${NC}"
221
+ echo "Minor issues noted. Commit allowed."
222
+ exit 0
223
+ ;;
224
+ refactor_needed)
225
+ echo -e "${RED}✗ Verdict: REFACTOR NEEDED${NC}"
226
+ echo "Significant architectural issues found. Please address before committing."
227
+ exit 1
228
+ ;;
229
+ *)
230
+ echo -e "${YELLOW}? Verdict: UNKNOWN (${VERDICT})${NC}"
231
+ echo "Could not parse verdict. Allowing commit."
232
+ exit 0
233
+ ;;
234
+ esac
235
+
@@ -0,0 +1,58 @@
1
+ #!/bin/bash
2
+ ################################################################################
3
+ # ESLint Config Sync Check (SessionStart hook)
4
+ #
5
+ # Checks if .safeword/eslint/eslint-base.mjs matches the frameworks in package.json.
6
+ # Alerts user if out of sync (e.g., React added but not in ESLint config).
7
+ #
8
+ # Usage: Called automatically at Claude Code session start
9
+ ################################################################################
10
+
11
+ # Quick exit if no eslint config
12
+ [ ! -f ".safeword/eslint/eslint-base.mjs" ] && exit 0
13
+ [ ! -f "package.json" ] && exit 0
14
+
15
+ # Read dependencies
16
+ if command -v jq &> /dev/null; then
17
+ DEPS=$(jq -r '(.dependencies // {}), (.devDependencies // {}) | keys[]' package.json 2>/dev/null || echo "")
18
+ else
19
+ DEPS=$(grep -E '"[^"]+"\s*:' package.json | cut -d'"' -f2)
20
+ fi
21
+
22
+ # Detect what's installed
23
+ HAS_TS=false
24
+ HAS_REACT=false
25
+ HAS_ASTRO=false
26
+
27
+ { [ -f "tsconfig.json" ] || echo "$DEPS" | grep -qx "typescript"; } && HAS_TS=true
28
+ echo "$DEPS" | grep -qx "react" && HAS_REACT=true
29
+ echo "$DEPS" | grep -qx "astro" && HAS_ASTRO=true
30
+
31
+ # Check what's in the config
32
+ CONFIG_HAS_TS=false
33
+ CONFIG_HAS_REACT=false
34
+ CONFIG_HAS_ASTRO=false
35
+
36
+ grep -q "typescript-eslint" .safeword/eslint/eslint-base.mjs 2>/dev/null && CONFIG_HAS_TS=true
37
+ grep -q "@eslint-react" .safeword/eslint/eslint-base.mjs 2>/dev/null && CONFIG_HAS_REACT=true
38
+ grep -q "eslint-plugin-astro" .safeword/eslint/eslint-base.mjs 2>/dev/null && CONFIG_HAS_ASTRO=true
39
+
40
+ # Build mismatch message
41
+ MISMATCHES=""
42
+
43
+ [ "$HAS_TS" = true ] && [ "$CONFIG_HAS_TS" = false ] && MISMATCHES+="TypeScript added. "
44
+ [ "$HAS_TS" = false ] && [ "$CONFIG_HAS_TS" = true ] && MISMATCHES+="TypeScript removed. "
45
+ [ "$HAS_REACT" = true ] && [ "$CONFIG_HAS_REACT" = false ] && MISMATCHES+="React added. "
46
+ [ "$HAS_REACT" = false ] && [ "$CONFIG_HAS_REACT" = true ] && MISMATCHES+="React removed. "
47
+ [ "$HAS_ASTRO" = true ] && [ "$CONFIG_HAS_ASTRO" = false ] && MISMATCHES+="Astro added. "
48
+ [ "$HAS_ASTRO" = false ] && [ "$CONFIG_HAS_ASTRO" = true ] && MISMATCHES+="Astro removed. "
49
+
50
+ # Alert if mismatched
51
+ if [ -n "$MISMATCHES" ]; then
52
+ echo "⚠️ ESLint config out of sync: $MISMATCHES"
53
+ echo " Run: bash .safeword/scripts/setup-linting.sh"
54
+ echo ""
55
+ fi
56
+
57
+ exit 0
58
+
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env bash
2
+ # Load environment variables from .env file
3
+ # Source this in other scripts: source "$(dirname "$0")/load-env.sh"
4
+ #
5
+ # Priority: Shell env > .env.local > .env
6
+ # Does NOT override existing shell variables
7
+
8
+ set -euo pipefail
9
+
10
+ # Find project root (look for .git or package.json)
11
+ find_project_root() {
12
+ local dir="$PWD"
13
+ while [[ "$dir" != "/" ]]; do
14
+ if [[ -f "$dir/package.json" ]] || [[ -d "$dir/.git" ]]; then
15
+ echo "$dir"
16
+ return 0
17
+ fi
18
+ dir="$(dirname "$dir")"
19
+ done
20
+ echo "$PWD"
21
+ }
22
+
23
+ PROJECT_ROOT="${PROJECT_ROOT:-$(find_project_root)}"
24
+
25
+ # Load .env file (does not override existing vars)
26
+ load_env_file() {
27
+ local env_file="$1"
28
+ if [[ -f "$env_file" ]]; then
29
+ while IFS='=' read -r key value; do
30
+ # Skip comments and empty lines
31
+ [[ "$key" =~ ^#.*$ ]] && continue
32
+ [[ -z "$key" ]] && continue
33
+
34
+ # Trim whitespace
35
+ key="${key// /}"
36
+ value="${value%"${value##*[![:space:]]}"}"
37
+
38
+ # Only set if not already in environment
39
+ if [[ -z "${!key:-}" ]]; then
40
+ export "$key=$value"
41
+ fi
42
+ done < "$env_file"
43
+ fi
44
+ }
45
+
46
+ # Load in priority order (first wins due to skip-if-exists logic)
47
+ load_env_file "$PROJECT_ROOT/.env.local"
48
+ load_env_file "$PROJECT_ROOT/.env"
49
+