safeword 0.2.4 → 0.2.6

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/dist/check-3NGQ4NR5.js +129 -0
  2. package/dist/check-3NGQ4NR5.js.map +1 -0
  3. package/dist/chunk-2XWIUEQK.js +190 -0
  4. package/dist/chunk-2XWIUEQK.js.map +1 -0
  5. package/dist/chunk-GZRQL3SX.js +146 -0
  6. package/dist/chunk-GZRQL3SX.js.map +1 -0
  7. package/dist/chunk-ORQHKDT2.js +10 -0
  8. package/dist/chunk-ORQHKDT2.js.map +1 -0
  9. package/dist/chunk-W66Z3C5H.js +21 -0
  10. package/dist/chunk-W66Z3C5H.js.map +1 -0
  11. package/dist/cli.d.ts +1 -0
  12. package/dist/cli.js +34 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/diff-Y6QTAW4O.js +166 -0
  15. package/dist/diff-Y6QTAW4O.js.map +1 -0
  16. package/dist/index.d.ts +11 -0
  17. package/dist/index.js +7 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/reset-3ACTIYYE.js +143 -0
  20. package/dist/reset-3ACTIYYE.js.map +1 -0
  21. package/dist/setup-AIL5RL45.js +276 -0
  22. package/dist/setup-AIL5RL45.js.map +1 -0
  23. package/dist/upgrade-6AR3DHUV.js +134 -0
  24. package/dist/upgrade-6AR3DHUV.js.map +1 -0
  25. package/package.json +44 -19
  26. package/{.safeword → templates}/hooks/agents-md-check.sh +0 -0
  27. package/{.safeword → templates}/hooks/post-tool.sh +0 -0
  28. package/{.safeword → templates}/hooks/pre-commit.sh +0 -0
  29. package/.claude/commands/arch-review.md +0 -32
  30. package/.claude/commands/lint.md +0 -6
  31. package/.claude/commands/quality-review.md +0 -13
  32. package/.claude/commands/setup-linting.md +0 -6
  33. package/.claude/hooks/auto-lint.sh +0 -6
  34. package/.claude/hooks/auto-quality-review.sh +0 -170
  35. package/.claude/hooks/check-linting-sync.sh +0 -17
  36. package/.claude/hooks/inject-timestamp.sh +0 -6
  37. package/.claude/hooks/question-protocol.sh +0 -12
  38. package/.claude/hooks/run-linters.sh +0 -8
  39. package/.claude/hooks/run-quality-review.sh +0 -76
  40. package/.claude/hooks/version-check.sh +0 -10
  41. package/.claude/mcp/README.md +0 -96
  42. package/.claude/mcp/arcade.sample.json +0 -9
  43. package/.claude/mcp/context7.sample.json +0 -7
  44. package/.claude/mcp/playwright.sample.json +0 -7
  45. package/.claude/settings.json +0 -62
  46. package/.claude/skills/quality-reviewer/SKILL.md +0 -190
  47. package/.claude/skills/safeword-quality-reviewer/SKILL.md +0 -13
  48. package/.env.arcade.example +0 -4
  49. package/.env.example +0 -11
  50. package/.gitmodules +0 -4
  51. package/.safeword/SAFEWORD.md +0 -33
  52. package/.safeword/eslint/eslint-base.mjs +0 -101
  53. package/.safeword/guides/architecture-guide.md +0 -404
  54. package/.safeword/guides/code-philosophy.md +0 -174
  55. package/.safeword/guides/context-files-guide.md +0 -405
  56. package/.safeword/guides/data-architecture-guide.md +0 -183
  57. package/.safeword/guides/design-doc-guide.md +0 -165
  58. package/.safeword/guides/learning-extraction.md +0 -515
  59. package/.safeword/guides/llm-instruction-design.md +0 -239
  60. package/.safeword/guides/llm-prompting.md +0 -95
  61. package/.safeword/guides/tdd-best-practices.md +0 -570
  62. package/.safeword/guides/test-definitions-guide.md +0 -243
  63. package/.safeword/guides/testing-methodology.md +0 -573
  64. package/.safeword/guides/user-story-guide.md +0 -237
  65. package/.safeword/guides/zombie-process-cleanup.md +0 -214
  66. package/.safeword/planning/002-user-story-quality-evaluation.md +0 -1840
  67. package/.safeword/planning/003-langsmith-eval-setup-prompt.md +0 -363
  68. package/.safeword/planning/004-llm-eval-test-cases.md +0 -3226
  69. package/.safeword/planning/005-architecture-enforcement-system.md +0 -169
  70. package/.safeword/planning/006-reactive-fix-prevention-research.md +0 -135
  71. package/.safeword/planning/011-cli-ux-vision.md +0 -330
  72. package/.safeword/planning/012-project-structure-cleanup.md +0 -154
  73. package/.safeword/planning/README.md +0 -39
  74. package/.safeword/planning/automation-plan-v2.md +0 -1225
  75. package/.safeword/planning/automation-plan-v3.md +0 -1291
  76. package/.safeword/planning/automation-plan.md +0 -3058
  77. package/.safeword/planning/design/005-cli-implementation.md +0 -343
  78. package/.safeword/planning/design/013-cli-self-contained-templates.md +0 -596
  79. package/.safeword/planning/design/013a-eslint-plugin-suite.md +0 -256
  80. package/.safeword/planning/design/013b-implementation-snippets.md +0 -385
  81. package/.safeword/planning/design/013c-config-isolation-strategy.md +0 -242
  82. package/.safeword/planning/design/code-philosophy-improvements.md +0 -60
  83. package/.safeword/planning/mcp-analysis.md +0 -545
  84. package/.safeword/planning/phase2-subagents-vs-skills-analysis.md +0 -451
  85. package/.safeword/planning/settings-improvements.md +0 -970
  86. package/.safeword/planning/test-definitions/005-cli-implementation.md +0 -1301
  87. package/.safeword/planning/test-definitions/cli-self-contained-templates.md +0 -205
  88. package/.safeword/planning/user-stories/001-guides-review-user-stories.md +0 -1381
  89. package/.safeword/planning/user-stories/003-reactive-fix-prevention.md +0 -132
  90. package/.safeword/planning/user-stories/004-technical-constraints.md +0 -86
  91. package/.safeword/planning/user-stories/005-cli-implementation.md +0 -311
  92. package/.safeword/planning/user-stories/cli-self-contained-templates.md +0 -172
  93. package/.safeword/planning/versioned-distribution.md +0 -740
  94. package/.safeword/prompts/arch-review.md +0 -43
  95. package/.safeword/prompts/quality-review.md +0 -11
  96. package/.safeword/scripts/arch-review.sh +0 -235
  97. package/.safeword/scripts/check-linting-sync.sh +0 -58
  98. package/.safeword/scripts/setup-linting.sh +0 -559
  99. package/.safeword/templates/architecture-template.md +0 -136
  100. package/.safeword/templates/ci/architecture-check.yml +0 -79
  101. package/.safeword/templates/design-doc-template.md +0 -127
  102. package/.safeword/templates/test-definitions-feature.md +0 -100
  103. package/.safeword/templates/ticket-template.md +0 -74
  104. package/.safeword/templates/user-stories-template.md +0 -82
  105. package/.safeword/tickets/001-guides-review-user-stories.md +0 -83
  106. package/.safeword/tickets/002-architecture-enforcement.md +0 -211
  107. package/.safeword/tickets/003-reactive-fix-prevention.md +0 -57
  108. package/.safeword/tickets/004-technical-constraints-in-user-stories.md +0 -39
  109. package/.safeword/tickets/005-cli-implementation.md +0 -248
  110. package/.safeword/tickets/006-flesh-out-skills.md +0 -43
  111. package/.safeword/tickets/007-flesh-out-questioning.md +0 -44
  112. package/.safeword/tickets/008-upgrade-questioning.md +0 -58
  113. package/.safeword/tickets/009-naming-conventions.md +0 -41
  114. package/.safeword/tickets/010-safeword-md-cleanup.md +0 -34
  115. package/.safeword/tickets/011-cursor-setup.md +0 -86
  116. package/.safeword/tickets/README.md +0 -73
  117. package/.safeword/version +0 -1
  118. package/AGENTS.md +0 -59
  119. package/CLAUDE.md +0 -12
  120. package/README.md +0 -347
  121. package/docs/001-cli-implementation-plan.md +0 -856
  122. package/docs/elite-dx-implementation-plan.md +0 -1034
  123. package/framework/README.md +0 -131
  124. package/framework/mcp/README.md +0 -96
  125. package/framework/mcp/arcade.sample.json +0 -8
  126. package/framework/mcp/context7.sample.json +0 -6
  127. package/framework/mcp/playwright.sample.json +0 -6
  128. package/framework/scripts/arch-review.sh +0 -235
  129. package/framework/scripts/check-linting-sync.sh +0 -58
  130. package/framework/scripts/load-env.sh +0 -49
  131. package/framework/scripts/setup-claude.sh +0 -223
  132. package/framework/scripts/setup-linting.sh +0 -559
  133. package/framework/scripts/setup-quality.sh +0 -477
  134. package/framework/scripts/setup-safeword.sh +0 -550
  135. package/framework/templates/ci/architecture-check.yml +0 -78
  136. package/learnings/ai-sdk-v5-breaking-changes.md +0 -178
  137. package/learnings/e2e-test-zombie-processes.md +0 -231
  138. package/learnings/milkdown-crepe-editor-property.md +0 -96
  139. package/learnings/prosemirror-fragment-traversal.md +0 -119
  140. package/packages/cli/AGENTS.md +0 -1
  141. package/packages/cli/ARCHITECTURE.md +0 -279
  142. package/packages/cli/package.json +0 -51
  143. package/packages/cli/src/cli.ts +0 -63
  144. package/packages/cli/src/commands/check.ts +0 -166
  145. package/packages/cli/src/commands/diff.ts +0 -209
  146. package/packages/cli/src/commands/reset.ts +0 -190
  147. package/packages/cli/src/commands/setup.ts +0 -325
  148. package/packages/cli/src/commands/upgrade.ts +0 -163
  149. package/packages/cli/src/index.ts +0 -3
  150. package/packages/cli/src/templates/config.ts +0 -58
  151. package/packages/cli/src/templates/content.ts +0 -18
  152. package/packages/cli/src/templates/index.ts +0 -12
  153. package/packages/cli/src/utils/agents-md.ts +0 -66
  154. package/packages/cli/src/utils/fs.ts +0 -179
  155. package/packages/cli/src/utils/git.ts +0 -124
  156. package/packages/cli/src/utils/hooks.ts +0 -29
  157. package/packages/cli/src/utils/output.ts +0 -60
  158. package/packages/cli/src/utils/project-detector.test.ts +0 -185
  159. package/packages/cli/src/utils/project-detector.ts +0 -44
  160. package/packages/cli/src/utils/version.ts +0 -28
  161. package/packages/cli/src/version.ts +0 -6
  162. package/packages/cli/templates/SAFEWORD.md +0 -776
  163. package/packages/cli/templates/doc-templates/architecture-template.md +0 -136
  164. package/packages/cli/templates/doc-templates/design-doc-template.md +0 -134
  165. package/packages/cli/templates/doc-templates/test-definitions-feature.md +0 -131
  166. package/packages/cli/templates/doc-templates/ticket-template.md +0 -82
  167. package/packages/cli/templates/doc-templates/user-stories-template.md +0 -92
  168. package/packages/cli/templates/guides/architecture-guide.md +0 -423
  169. package/packages/cli/templates/guides/code-philosophy.md +0 -195
  170. package/packages/cli/templates/guides/context-files-guide.md +0 -457
  171. package/packages/cli/templates/guides/data-architecture-guide.md +0 -200
  172. package/packages/cli/templates/guides/design-doc-guide.md +0 -171
  173. package/packages/cli/templates/guides/learning-extraction.md +0 -552
  174. package/packages/cli/templates/guides/llm-instruction-design.md +0 -248
  175. package/packages/cli/templates/guides/llm-prompting.md +0 -102
  176. package/packages/cli/templates/guides/tdd-best-practices.md +0 -615
  177. package/packages/cli/templates/guides/test-definitions-guide.md +0 -334
  178. package/packages/cli/templates/guides/testing-methodology.md +0 -618
  179. package/packages/cli/templates/guides/user-story-guide.md +0 -256
  180. package/packages/cli/templates/guides/zombie-process-cleanup.md +0 -219
  181. package/packages/cli/templates/hooks/agents-md-check.sh +0 -27
  182. package/packages/cli/templates/hooks/post-tool.sh +0 -4
  183. package/packages/cli/templates/hooks/pre-commit.sh +0 -10
  184. package/packages/cli/templates/prompts/arch-review.md +0 -43
  185. package/packages/cli/templates/prompts/quality-review.md +0 -10
  186. package/packages/cli/templates/skills/safeword-quality-reviewer/SKILL.md +0 -207
  187. package/packages/cli/tests/commands/check.test.ts +0 -129
  188. package/packages/cli/tests/commands/cli.test.ts +0 -89
  189. package/packages/cli/tests/commands/diff.test.ts +0 -115
  190. package/packages/cli/tests/commands/reset.test.ts +0 -310
  191. package/packages/cli/tests/commands/self-healing.test.ts +0 -170
  192. package/packages/cli/tests/commands/setup-blocking.test.ts +0 -71
  193. package/packages/cli/tests/commands/setup-core.test.ts +0 -135
  194. package/packages/cli/tests/commands/setup-git.test.ts +0 -139
  195. package/packages/cli/tests/commands/setup-hooks.test.ts +0 -334
  196. package/packages/cli/tests/commands/setup-linting.test.ts +0 -189
  197. package/packages/cli/tests/commands/setup-noninteractive.test.ts +0 -80
  198. package/packages/cli/tests/commands/setup-templates.test.ts +0 -181
  199. package/packages/cli/tests/commands/upgrade.test.ts +0 -215
  200. package/packages/cli/tests/helpers.ts +0 -243
  201. package/packages/cli/tests/npm-package.test.ts +0 -83
  202. package/packages/cli/tests/technical-constraints.test.ts +0 -96
  203. package/packages/cli/tsconfig.json +0 -25
  204. package/packages/cli/tsup.config.ts +0 -11
  205. package/packages/cli/vitest.config.ts +0 -23
  206. package/promptfoo.yaml +0 -3270
  207. /package/{framework → templates}/SAFEWORD.md +0 -0
  208. /package/{packages/cli/templates → templates}/commands/arch-review.md +0 -0
  209. /package/{packages/cli/templates → templates}/commands/lint.md +0 -0
  210. /package/{packages/cli/templates → templates}/commands/quality-review.md +0 -0
  211. /package/{framework/templates → templates/doc-templates}/architecture-template.md +0 -0
  212. /package/{framework/templates → templates/doc-templates}/design-doc-template.md +0 -0
  213. /package/{framework/templates → templates/doc-templates}/test-definitions-feature.md +0 -0
  214. /package/{framework/templates → templates/doc-templates}/ticket-template.md +0 -0
  215. /package/{framework/templates → templates/doc-templates}/user-stories-template.md +0 -0
  216. /package/{framework → templates}/guides/architecture-guide.md +0 -0
  217. /package/{framework → templates}/guides/code-philosophy.md +0 -0
  218. /package/{framework → templates}/guides/context-files-guide.md +0 -0
  219. /package/{framework → templates}/guides/data-architecture-guide.md +0 -0
  220. /package/{framework → templates}/guides/design-doc-guide.md +0 -0
  221. /package/{framework → templates}/guides/learning-extraction.md +0 -0
  222. /package/{framework → templates}/guides/llm-instruction-design.md +0 -0
  223. /package/{framework → templates}/guides/llm-prompting.md +0 -0
  224. /package/{framework → templates}/guides/tdd-best-practices.md +0 -0
  225. /package/{framework → templates}/guides/test-definitions-guide.md +0 -0
  226. /package/{framework → templates}/guides/testing-methodology.md +0 -0
  227. /package/{framework → templates}/guides/user-story-guide.md +0 -0
  228. /package/{framework → templates}/guides/zombie-process-cleanup.md +0 -0
  229. /package/{packages/cli/templates → templates}/hooks/inject-timestamp.sh +0 -0
  230. /package/{packages/cli/templates → templates}/lib/common.sh +0 -0
  231. /package/{packages/cli/templates → templates}/lib/jq-fallback.sh +0 -0
  232. /package/{packages/cli/templates → templates}/markdownlint.jsonc +0 -0
  233. /package/{framework → templates}/prompts/arch-review.md +0 -0
  234. /package/{framework → templates}/prompts/quality-review.md +0 -0
  235. /package/{framework/skills/quality-reviewer → templates/skills/safeword-quality-reviewer}/SKILL.md +0 -0
@@ -1,550 +0,0 @@
1
- #!/bin/bash
2
- # setup-safeword.sh
3
- # Sets up standardized agent project structure with SAFEWORD framework
4
- # Copies skills, guides, templates, and prompts to target project
5
-
6
- set -e
7
-
8
- PROJECT_ROOT=$(pwd)
9
- SAFEWORD_DIR="$PROJECT_ROOT/.safeword"
10
- # Locate framework files relative to this script
11
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
-
13
- echo "Setting up agent project structure..."
14
-
15
- # Copy framework skills to project .claude/skills/
16
- FRAMEWORK_SKILLS_DIR="$SCRIPT_DIR/../skills"
17
- PROJECT_SKILLS_DIR="$PROJECT_ROOT/.claude/skills"
18
-
19
- if [ -d "$FRAMEWORK_SKILLS_DIR" ]; then
20
- echo "Copying skills to .claude/skills/..."
21
- mkdir -p "$PROJECT_SKILLS_DIR"
22
- for skill in "$FRAMEWORK_SKILLS_DIR"/*; do
23
- if [ -d "$skill" ]; then
24
- skill_name=$(basename "$skill")
25
- target="$PROJECT_SKILLS_DIR/$skill_name"
26
-
27
- # Copy skill folder (overwrite if exists)
28
- rm -rf "$target" 2>/dev/null || true
29
- cp -r "$skill" "$target"
30
- echo " ✓ Copied $skill_name"
31
- fi
32
- done
33
- fi
34
-
35
- # Create directory structure with archive folders
36
- mkdir -p "$SAFEWORD_DIR"/planning/{user-stories/{,archive},test-definitions/{,archive},design/{,archive},issues/{,archive}}
37
- mkdir -p "$SAFEWORD_DIR"/tickets/{,completed,archived}
38
-
39
- # Create Claude Code directory structure
40
- mkdir -p "$PROJECT_ROOT/.claude"
41
-
42
- # Copy framework SAFEWORD.md into project .safeword/ (global patterns)
43
- mkdir -p "$SAFEWORD_DIR"
44
- if [ -f "$SCRIPT_DIR/../SAFEWORD.md" ]; then
45
- cp "$SCRIPT_DIR/../SAFEWORD.md" "$SAFEWORD_DIR/SAFEWORD.md"
46
- echo " ✓ Copied framework SAFEWORD.md to .safeword/SAFEWORD.md"
47
- else
48
- echo " ⚠ Warning: framework SAFEWORD.md not found at $SCRIPT_DIR/../SAFEWORD.md (skipping)"
49
- fi
50
-
51
- # Copy guides and templates into .safeword/ for standalone operation
52
- if [ -d "$SCRIPT_DIR/../guides" ]; then
53
- cp -R "$SCRIPT_DIR/../guides" "$SAFEWORD_DIR/" 2>/dev/null || true
54
- echo " ✓ Copied guides to .safeword/guides/"
55
- else
56
- echo " ⚠ Warning: framework guides not found at $SCRIPT_DIR/../guides (skipping)"
57
- fi
58
- if [ -d "$SCRIPT_DIR/../templates" ]; then
59
- cp -R "$SCRIPT_DIR/../templates" "$SAFEWORD_DIR/" 2>/dev/null || true
60
- echo " ✓ Copied templates to .safeword/templates/"
61
- else
62
- echo " ⚠ Warning: framework templates not found at $SCRIPT_DIR/../templates (skipping)"
63
- fi
64
-
65
- # Copy prompts into .safeword/prompts/ for LLM review hooks
66
- if [ -d "$SCRIPT_DIR/../prompts" ]; then
67
- cp -R "$SCRIPT_DIR/../prompts" "$SAFEWORD_DIR/" 2>/dev/null || true
68
- echo " ✓ Copied prompts to .safeword/prompts/"
69
- else
70
- echo " ⚠ Warning: framework prompts not found at $SCRIPT_DIR/../prompts (skipping)"
71
- fi
72
-
73
- # Copy scripts to .safeword/scripts/
74
- mkdir -p "$SAFEWORD_DIR/scripts"
75
-
76
- if [ -f "$SCRIPT_DIR/arch-review.sh" ]; then
77
- cp "$SCRIPT_DIR/arch-review.sh" "$SAFEWORD_DIR/scripts/" 2>/dev/null || true
78
- chmod +x "$SAFEWORD_DIR/scripts/arch-review.sh"
79
- echo " ✓ Copied arch-review.sh to .safeword/scripts/"
80
- else
81
- echo " ⚠ Warning: arch-review.sh not found (skipping)"
82
- fi
83
-
84
- if [ -f "$SCRIPT_DIR/check-linting-sync.sh" ]; then
85
- cp "$SCRIPT_DIR/check-linting-sync.sh" "$SAFEWORD_DIR/scripts/" 2>/dev/null || true
86
- chmod +x "$SAFEWORD_DIR/scripts/check-linting-sync.sh"
87
- echo " ✓ Copied check-linting-sync.sh to .safeword/scripts/"
88
- else
89
- echo " ⚠ Warning: check-linting-sync.sh not found (skipping)"
90
- fi
91
-
92
- if [ -f "$SCRIPT_DIR/setup-linting.sh" ]; then
93
- cp "$SCRIPT_DIR/setup-linting.sh" "$SAFEWORD_DIR/scripts/" 2>/dev/null || true
94
- chmod +x "$SAFEWORD_DIR/scripts/setup-linting.sh"
95
- echo " ✓ Copied setup-linting.sh to .safeword/scripts/"
96
- else
97
- echo " ⚠ Warning: setup-linting.sh not found (skipping)"
98
- fi
99
-
100
- # Create .claude/hooks directory and add timestamp injection hook
101
- mkdir -p "$PROJECT_ROOT/.claude/hooks"
102
- cat > "$PROJECT_ROOT/.claude/hooks/inject-timestamp.sh" << 'EOF'
103
- #!/bin/bash
104
- # Inject Timestamp - Notification Hook
105
- # Outputs current Unix timestamp at session start for Claude's context awareness
106
- # Helps with accurate ticket timestamps and time-based reasoning
107
-
108
- echo "Current time: $(date +%s) ($(date -u +%Y-%m-%dT%H:%M:%SZ))"
109
- EOF
110
- chmod +x "$PROJECT_ROOT/.claude/hooks/inject-timestamp.sh"
111
- echo " ✓ Created inject-timestamp.sh hook"
112
-
113
- # Create SAFEWORD.md at project root if missing
114
- if [ ! -f "$PROJECT_ROOT/SAFEWORD.md" ]; then
115
- echo "Creating SAFEWORD.md with project template..."
116
- cat > "$PROJECT_ROOT/SAFEWORD.md" << 'EOF'
117
- # [Project Name] - SAFEWORD Configuration
118
-
119
- Use the guides under `@./.safeword/guides/` for core patterns, workflows, and conventions.
120
-
121
- ---
122
-
123
- ## Project Overview
124
-
125
- [Brief description. Current status.]
126
-
127
- ## Tech Stack
128
-
129
- - [List your technologies here]
130
-
131
- ## Architecture Decisions
132
-
133
- ### [Tech Choice]
134
- **Decision:** [What we chose]
135
- **Why:** [Specific reasoning]
136
- **Trade-off:** [What we gave up]
137
- **Gotcha:** [Common mistake to avoid]
138
-
139
- ## Common Gotchas
140
-
141
- 1. **[Thing]:** [Why it breaks and how to fix]
142
-
143
- ## File Organization
144
-
145
- **Dir** (`path/`) - Purpose
146
- EOF
147
- fi
148
-
149
- # Create .claude/settings.json with hook references
150
- if [ ! -f "$PROJECT_ROOT/.claude/settings.json" ]; then
151
- echo "Creating .claude/settings.json with hook references..."
152
- cat > "$PROJECT_ROOT/.claude/settings.json" << 'EOF'
153
- {
154
- "$schema": "https://json.schemastore.org/claude-code-settings.json",
155
- "hooks": {
156
- "Notification": [
157
- {
158
- "hooks": [
159
- {
160
- "type": "command",
161
- "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/inject-timestamp.sh"
162
- }
163
- ]
164
- }
165
- ]
166
- }
167
- }
168
- EOF
169
- else
170
- echo "Note: .claude/settings.json already exists, skipping..."
171
- # Check if Notification hook needs to be added
172
- if command -v jq &> /dev/null; then
173
- if ! jq -e '.hooks.Notification[]?.hooks[]? | select(.command | contains("inject-timestamp"))' "$PROJECT_ROOT/.claude/settings.json" > /dev/null 2>&1; then
174
- jq '.hooks.Notification = (.hooks.Notification // []) + [{"hooks": [{"type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/inject-timestamp.sh"}]}]' \
175
- "$PROJECT_ROOT/.claude/settings.json" > "$PROJECT_ROOT/.claude/settings.json.tmp"
176
- mv "$PROJECT_ROOT/.claude/settings.json.tmp" "$PROJECT_ROOT/.claude/settings.json"
177
- echo " ✓ Added Notification hook for timestamp injection"
178
- fi
179
- fi
180
- fi
181
-
182
- # Create git pre-commit hook for architecture enforcement
183
- if [ -d "$PROJECT_ROOT/.git" ]; then
184
- mkdir -p "$PROJECT_ROOT/.git/hooks"
185
-
186
- # Check if pre-commit hook already exists
187
- if [ -f "$PROJECT_ROOT/.git/hooks/pre-commit" ]; then
188
- # Check if our section is already there (has our marker)
189
- if grep -q "SAFEWORD_ARCH_CHECK_START" "$PROJECT_ROOT/.git/hooks/pre-commit" 2>/dev/null; then
190
- echo " ✓ Architecture checks already in pre-commit hook (skipped)"
191
- else
192
- # Append our checks to existing hook
193
- echo " Appending architecture checks to existing pre-commit hook..."
194
- cat >> "$PROJECT_ROOT/.git/hooks/pre-commit" << 'EOF'
195
-
196
- # === SAFEWORD_ARCH_CHECK_START ===
197
- # Architecture Enforcement (appended by setup-safeword.sh)
198
- # Get staged JS/TS files
199
- STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|tsx|jsx)$' || true)
200
-
201
- if [ -n "$STAGED_FILES" ]; then
202
- echo "Running architecture checks..."
203
-
204
- # ESLint (if configured)
205
- if command -v npx &> /dev/null && { [ -f "eslint.config.mjs" ] || [ -f ".eslintrc.json" ] || [ -f ".eslintrc.js" ]; }; then
206
- echo "$STAGED_FILES" | xargs npx eslint --max-warnings 0 || exit 1
207
- fi
208
-
209
- # Architecture review (if configured and API key set)
210
- if [ -f ".safeword/scripts/arch-review.sh" ] && [ -n "$ANTHROPIC_API_KEY" ]; then
211
- bash .safeword/scripts/arch-review.sh --staged || {
212
- if [ $? -eq 1 ]; then exit 1; fi # Only fail on refactor_needed
213
- }
214
- fi
215
- fi
216
- # === SAFEWORD_ARCH_CHECK_END ===
217
- EOF
218
- echo " ✓ Appended architecture checks to existing pre-commit hook"
219
- fi
220
- else
221
- # Create new pre-commit hook
222
- cat > "$PROJECT_ROOT/.git/hooks/pre-commit" << 'EOF'
223
- #!/bin/bash
224
- # === SAFEWORD_ARCH_CHECK_START ===
225
- ################################################################################
226
- # Pre-commit Hook: Architecture Enforcement
227
- #
228
- # Runs:
229
- # 1. ESLint on staged files (fast, free, deterministic)
230
- # 2. arch-review.sh on staged files (semantic LLM review, requires ANTHROPIC_API_KEY)
231
- #
232
- # Exit codes:
233
- # 0 - All checks pass, commit allowed
234
- # 1 - Issues found, commit blocked
235
- ################################################################################
236
-
237
- # Get staged JS/TS files
238
- STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|tsx|jsx)$' || true)
239
-
240
- if [ -z "$STAGED_FILES" ]; then
241
- # No JS/TS files staged, skip checks
242
- exit 0
243
- fi
244
-
245
- echo "Running architecture checks on staged files..."
246
- echo ""
247
-
248
- # Step 1: ESLint (fast, deterministic)
249
- echo "=== ESLint Check ==="
250
- if command -v npx &> /dev/null && { [ -f "eslint.config.mjs" ] || [ -f ".eslintrc.json" ] || [ -f ".eslintrc.js" ]; }; then
251
- # Run ESLint on staged files
252
- echo "$STAGED_FILES" | xargs npx eslint --max-warnings 0
253
- ESLINT_EXIT=$?
254
-
255
- if [ $ESLINT_EXIT -ne 0 ]; then
256
- echo ""
257
- echo "✗ ESLint found errors. Please fix them before committing."
258
- exit 1
259
- fi
260
- echo "✓ ESLint passed"
261
- else
262
- echo "⚠ ESLint not configured, skipping"
263
- fi
264
- echo ""
265
-
266
- # Step 2: Architecture Review (semantic, requires API key)
267
- echo "=== Architecture Review ==="
268
- ARCH_REVIEW_SCRIPT=""
269
-
270
- # Find arch-review.sh (check multiple locations)
271
- if [ -f ".safeword/scripts/arch-review.sh" ]; then
272
- ARCH_REVIEW_SCRIPT=".safeword/scripts/arch-review.sh"
273
- elif [ -f ".claude/hooks/arch-review.sh" ]; then
274
- ARCH_REVIEW_SCRIPT=".claude/hooks/arch-review.sh"
275
- fi
276
-
277
- if [ -n "$ARCH_REVIEW_SCRIPT" ] && [ -n "$ANTHROPIC_API_KEY" ]; then
278
- bash "$ARCH_REVIEW_SCRIPT" --staged
279
- ARCH_EXIT=$?
280
-
281
- if [ $ARCH_EXIT -eq 1 ]; then
282
- echo ""
283
- echo "✗ Architecture review found issues that need refactoring."
284
- echo " Fix them before committing, or use 'git commit --no-verify' to bypass."
285
- exit 1
286
- elif [ $ARCH_EXIT -eq 2 ]; then
287
- echo "⚠ Architecture review encountered an error (continuing anyway)"
288
- else
289
- echo "✓ Architecture review passed"
290
- fi
291
- elif [ -z "$ANTHROPIC_API_KEY" ]; then
292
- echo "⚠ ANTHROPIC_API_KEY not set, skipping LLM architecture review"
293
- echo " Set it to enable: export ANTHROPIC_API_KEY='your-key'"
294
- else
295
- echo "⚠ arch-review.sh not found, skipping LLM architecture review"
296
- fi
297
-
298
- echo ""
299
- echo "✓ All pre-commit checks passed"
300
- exit 0
301
- # === SAFEWORD_ARCH_CHECK_END ===
302
- EOF
303
-
304
- chmod +x "$PROJECT_ROOT/.git/hooks/pre-commit"
305
- echo " ✓ Created git pre-commit hook for architecture enforcement"
306
- fi
307
- else
308
- echo " ⚠ Not a git repository, skipping pre-commit hook"
309
- fi
310
-
311
- # Ensure learnings directory exists
312
- mkdir -p "$SAFEWORD_DIR/learnings" "$SAFEWORD_DIR/learnings/archive"
313
- echo " ✓ Ensured .safeword/learnings/ and archive/ exist"
314
-
315
- # If AGENTS.md exists, ensure it includes the SAFEWORD trigger at the top
316
- if [ -f "$PROJECT_ROOT/AGENTS.md" ]; then
317
- if grep -q "@./.safeword/SAFEWORD.md" "$PROJECT_ROOT/AGENTS.md"; then
318
- echo " ✓ AGENTS.md already has SAFEWORD.md reference (skipped)"
319
- else
320
- temp_file=$(mktemp)
321
- cat > "$temp_file" << 'EOF'
322
- **⚠️ ALWAYS READ FIRST: @./.safeword/SAFEWORD.md**
323
-
324
- The SAFEWORD.md file contains core development patterns, workflows, and conventions.
325
- Read it BEFORE working on any task in this project.
326
-
327
- ---
328
-
329
- EOF
330
- cat "$PROJECT_ROOT/AGENTS.md" >> "$temp_file"
331
- mv "$temp_file" "$PROJECT_ROOT/AGENTS.md"
332
- echo " ✓ Added SAFEWORD.md reference to existing AGENTS.md"
333
- fi
334
- else
335
- # Create AGENTS.md with SAFEWORD trigger
336
- cat > "$PROJECT_ROOT/AGENTS.md" << 'EOF'
337
- # Project Name - Developer Context
338
-
339
- **⚠️ ALWAYS READ FIRST: @./.safeword/SAFEWORD.md**
340
-
341
- The SAFEWORD.md file contains core development patterns, workflows, and conventions.
342
- Read it BEFORE working on any task in this project.
343
-
344
- ---
345
-
346
- ## Project-Specific Context
347
-
348
- ### Tech Stack
349
- - Add your technologies here
350
-
351
- ### Architecture
352
- - Add architecture notes here
353
-
354
- ### Gotchas
355
- - Add project-specific gotchas here
356
-
357
- ### Conventions
358
- - Add coding conventions here
359
- EOF
360
- echo " ✓ Created AGENTS.md with SAFEWORD.md reference"
361
- fi
362
-
363
- # Create README for planning
364
- cat > "$SAFEWORD_DIR/planning/README.md" << 'EOF'
365
- # Planning
366
-
367
- ## Structure
368
-
369
- - `user-stories/` - User stories for features (As a X / Given-When-Then)
370
- - `user-stories/archive/` - Completed/obsolete user stories
371
- - `test-definitions/` - Test scenarios and acceptance criteria
372
- - `test-definitions/archive/` - Completed/obsolete test definitions
373
- - `design/` - Design docs for complex features (>3 components, new data model, architectural decisions)
374
- - `design/archive/` - Completed/obsolete design docs
375
- - `issues/` - Issue tracking and requirements
376
- - `issues/archive/` - Completed/obsolete issues
377
-
378
- ## Naming Convention
379
-
380
- **Planning docs share the same prefix as their ticket:**
381
-
382
- Example for ticket `001-user-authentication.md`:
383
- - `user-stories/001-user-authentication.md`
384
- - `test-definitions/001-user-authentication.md`
385
- - `design/001-user-authentication.md`
386
-
387
- This makes it easy to find all related docs: `ls **/001-user-authentication.md`
388
-
389
- ## Archiving
390
-
391
- When planning docs are completed and no longer actively referenced:
392
- - Move to corresponding `archive/` subfolder
393
- - Preserves history while preventing bloat in active folders
394
-
395
- ## Workflow
396
-
397
- 1. **User stories** → Define what we're building
398
- 2. **Test definitions** → Define how we'll verify it works
399
- 3. **Design docs** (optional for complex features) → Plan implementation
400
- 4. **Implementation (TDD)** → RED → GREEN → REFACTOR
401
- 5. **Archive** → Move completed docs to archive/
402
-
403
- See `@./.safeword/SAFEWORD.md` for full workflow.
404
- EOF
405
-
406
- # Create README for tickets
407
- cat > "$SAFEWORD_DIR/tickets/README.md" << 'EOF'
408
- # Tickets
409
-
410
- Higher-level feature/epic tracking. Each ticket references planning docs.
411
-
412
- ## Structure
413
-
414
- - `./` - Active tickets (in progress or todo)
415
- - `completed/` - Verified completed tickets (user confirmed)
416
- - `archived/` - Blocked or cancelled tickets
417
-
418
- ## Naming Convention
419
-
420
- **Tickets:** `{id}-{feature-slug}.md`
421
- - Example: `001-user-authentication.md`, `002-payment-flow.md`
422
-
423
- **Planning docs share same prefix:**
424
- - User stories: `./.safeword/planning/user-stories/001-user-authentication.md`
425
- - Test definitions: `./.safeword/planning/test-definitions/001-user-authentication.md`
426
- - Design doc: `./.safeword/planning/design/001-user-authentication.md`
427
-
428
- This makes it easy to find all related docs by prefix.
429
-
430
- ## Format
431
-
432
- ```markdown
433
- ---
434
- id: 001
435
- status: todo|in_progress|done|blocked
436
- created: 2025-01-19T14:30:00Z
437
- priority: low|medium|high
438
- planning_refs:
439
- - ./.safeword/planning/user-stories/001-user-authentication.md
440
- - ./.safeword/planning/test-definitions/001-user-authentication.md
441
- - ./.safeword/planning/design/001-user-authentication.md (if complex)
442
- ---
443
-
444
- # User Authentication System
445
-
446
- ## Description
447
- {High-level feature description}
448
-
449
- ## Scope
450
- {What's included in this ticket}
451
-
452
- ## Acceptance Criteria
453
- - [ ] All user stories completed
454
- - [ ] All tests passing
455
- - [ ] Documentation updated
456
-
457
- ## Work Log
458
- {Progress notes, decisions, blockers}
459
- ```
460
-
461
- ## Completion Process
462
-
463
- **CRITICAL:** Never mark ticket as done or archive without user confirmation.
464
-
465
- 1. Update status to `done` when work complete
466
- 2. **Ask user to confirm** all acceptance criteria met
467
- 3. User verifies:
468
- - All tests passing
469
- - Feature works as expected
470
- - No regressions introduced
471
- 4. After confirmation: Move to `completed/`
472
- 5. Blocked/cancelled tickets: Move to `archived/`
473
-
474
- ## Relationship
475
-
476
- - **Ticket** = Higher-level feature/epic
477
- - **Planning docs** = Detailed specs (user stories, test definitions, design)
478
- - **TodoWrite** = Task-level tracking in current session
479
-
480
- See `@./.safeword/SAFEWORD.md` → Ticket System for details.
481
- EOF
482
-
483
- # Create .gitignore if it doesn't exist
484
- if [ ! -f "$PROJECT_ROOT/.gitignore" ]; then
485
- echo "Creating .gitignore..."
486
- cat > "$PROJECT_ROOT/.gitignore" << 'EOF'
487
- # Claude Code - Personal settings
488
- .claude/settings.local.json
489
- .claude/todos/
490
- .claude/shell-snapshots/
491
-
492
- # SAFEWORD planning (local state)
493
- .safeword/planning/
494
- .safeword/tickets/
495
-
496
- # Node
497
- node_modules/
498
- dist/
499
- *.log
500
- .env
501
- .env.local
502
-
503
- # OS
504
- .DS_Store
505
- EOF
506
- else
507
- # Add .safeword planning folders to existing gitignore if not present
508
- if ! grep -q "^\.safeword/planning/$" "$PROJECT_ROOT/.gitignore"; then
509
- echo "" >> "$PROJECT_ROOT/.gitignore"
510
- echo "# SAFEWORD planning (local state)" >> "$PROJECT_ROOT/.gitignore"
511
- echo ".safeword/planning/" >> "$PROJECT_ROOT/.gitignore"
512
- echo ".safeword/tickets/" >> "$PROJECT_ROOT/.gitignore"
513
- echo "Added .safeword planning folders to .gitignore"
514
- fi
515
-
516
- # Add Claude Code ignores if not present
517
- if ! grep -q "^\.claude/settings\.local\.json$" "$PROJECT_ROOT/.gitignore"; then
518
- echo "" >> "$PROJECT_ROOT/.gitignore"
519
- echo "# Claude Code - Personal settings" >> "$PROJECT_ROOT/.gitignore"
520
- echo ".claude/settings.local.json" >> "$PROJECT_ROOT/.gitignore"
521
- echo ".claude/todos/" >> "$PROJECT_ROOT/.gitignore"
522
- echo ".claude/shell-snapshots/" >> "$PROJECT_ROOT/.gitignore"
523
- echo "Added Claude Code ignores to .gitignore"
524
- fi
525
- fi
526
-
527
- echo ""
528
- echo "✓ Project setup complete!"
529
- echo ""
530
- echo "Structure created:"
531
- echo " /SAFEWORD.md - Project configuration (references guides)"
532
- echo " /.safeword/planning/user-stories/ - Active user stories"
533
- echo " /.safeword/planning/user-stories/archive/ - Completed user stories"
534
- echo " /.safeword/planning/test-definitions/ - Active test definitions"
535
- echo " /.safeword/planning/test-definitions/archive/ - Completed test definitions"
536
- echo " /.safeword/planning/design/ - Active design docs"
537
- echo " /.safeword/planning/design/archive/ - Completed design docs"
538
- echo " /.safeword/planning/issues/ - Active issues"
539
- echo " /.safeword/planning/issues/archive/ - Completed issues"
540
- echo " /.safeword/tickets/ - Active tickets"
541
- echo " /.safeword/tickets/completed/ - Verified completed tickets"
542
- echo " /.safeword/tickets/archived/ - Blocked/cancelled tickets"
543
- echo " .gitignore - Updated to exclude planning folders"
544
- echo ""
545
- echo "Next steps:"
546
- echo "1. Review and customize SAFEWORD.md (add project-specific context)"
547
- echo "2. Create tickets in .safeword/tickets/ for major features"
548
- echo "3. Create planning docs in .safeword/planning/"
549
- echo "4. (Optional) Run setup-quality.sh for auto quality review hooks"
550
- echo "5. (Optional) Run setup-claude.sh for additional Claude Code configuration"
@@ -1,78 +0,0 @@
1
- # Architecture Check CI Workflow
2
- #
3
- # Runs on pull requests to enforce architectural boundaries.
4
- #
5
- # Steps:
6
- # 1. Type check (tsc --noEmit)
7
- # 2. ESLint (includes eslint-plugin-boundaries)
8
- # 3. LLM architecture review (optional, non-blocking)
9
- #
10
- # Usage:
11
- # 1. Copy to .github/workflows/architecture-check.yml
12
- # 2. Set ANTHROPIC_API_KEY secret (optional, for LLM review)
13
- # 3. Adjust paths and triggers as needed
14
-
15
- name: Architecture Check
16
-
17
- on:
18
- pull_request:
19
- branches: [main, develop]
20
- paths:
21
- - 'src/**'
22
- - 'package.json'
23
- - 'tsconfig.json'
24
- - 'eslint.config.mjs'
25
-
26
- jobs:
27
- architecture-check:
28
- runs-on: ubuntu-latest
29
-
30
- steps:
31
- - name: Checkout
32
- uses: actions/checkout@v4
33
-
34
- - name: Setup Node.js
35
- uses: actions/setup-node@v4
36
- with:
37
- node-version: '20'
38
- cache: 'npm'
39
-
40
- - name: Install dependencies
41
- run: npm ci
42
-
43
- # Step 1: Type check
44
- - name: TypeScript Check
45
- run: npx tsc --noEmit
46
- continue-on-error: false
47
-
48
- # Step 2: ESLint (includes boundary rules)
49
- - name: ESLint
50
- run: npm run lint
51
- continue-on-error: false
52
-
53
- # Step 3: LLM Architecture Review (optional)
54
- # Only runs if ANTHROPIC_API_KEY is set
55
- # Non-blocking by default (continue-on-error: true)
56
- - name: Architecture Review (LLM)
57
- if: ${{ secrets.ANTHROPIC_API_KEY != '' }}
58
- env:
59
- ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
60
- run: |
61
- # Get changed files in this PR
62
- CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -E '\.(js|ts|tsx|jsx)$' || true)
63
-
64
- if [ -n "$CHANGED_FILES" ]; then
65
- echo "Reviewing changed files:"
66
- echo "$CHANGED_FILES"
67
- echo ""
68
-
69
- # Run architecture review if script exists
70
- if [ -f ".safeword/scripts/arch-review.sh" ]; then
71
- echo "$CHANGED_FILES" | xargs bash .safeword/scripts/arch-review.sh || true
72
- else
73
- echo "arch-review.sh not found, skipping LLM review"
74
- fi
75
- else
76
- echo "No JS/TS files changed"
77
- fi
78
- continue-on-error: true # Non-blocking (advisory only)