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,43 @@
1
+ # Architecture Review Prompt
2
+
3
+ Review the following code changes for architectural issues.
4
+
5
+ ## Check for:
6
+
7
+ 1. **Misplaced logic** - Business rules in wrong layer?
8
+ 2. **God module** - Too many responsibilities (>10 dependents or >500 lines)?
9
+ 3. **Leaky abstraction** - Implementation details exposed to callers?
10
+ 4. **Tight coupling** - Changes would cascade unnecessarily?
11
+ 5. **Boundary violation** - Import from disallowed layer?
12
+
13
+ ## Context
14
+
15
+ Read the project's ARCHITECTURE.md for:
16
+ - Defined layers and their responsibilities
17
+ - Allowed dependencies between layers
18
+ - Project-specific patterns and conventions
19
+
20
+ ## Response Format
21
+
22
+ Return JSON:
23
+
24
+ ```json
25
+ {
26
+ "issues": [
27
+ {
28
+ "type": "misplaced_logic | god_module | leaky_abstraction | tight_coupling | boundary_violation",
29
+ "location": "file:line or module name",
30
+ "description": "What's wrong",
31
+ "fix": "How to fix it"
32
+ }
33
+ ],
34
+ "verdict": "clean | minor | refactor_needed"
35
+ }
36
+ ```
37
+
38
+ ### Verdict definitions:
39
+
40
+ - **clean**: No issues found
41
+ - **minor**: Small issues that should be noted but don't block commit
42
+ - **refactor_needed**: Significant issues that should be addressed before commit
43
+
@@ -0,0 +1,11 @@
1
+ # Quality Review Prompt
2
+
3
+ Double check and critique your work just in case.
4
+
5
+ - Is it correct?
6
+ - Is it elegant?
7
+ - Does it adhere to the latest documentation and best practices for the relevant stack items, UX principles, domain requirements, and testing practices?
8
+ - Ask me any non-obvious questions you can't research yourself in the codebase or online.
9
+ - Think hard.
10
+ - Avoid bloat.
11
+
@@ -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
+