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,343 +0,0 @@
1
- # Design: Safeword CLI
2
-
3
- **Guide**: `@./.safeword/guides/design-doc-guide.md` - Principles, structure guidelines, and avoiding bloat
4
- **Template**: `@./.safeword/templates/design-doc-template.md`
5
-
6
- **Related**: User Stories: `.safeword/planning/user-stories/005-cli-implementation.md` | Test Definitions: `.safeword/planning/test-definitions/005-cli-implementation.md`
7
-
8
- **TDD Note**: This design implements tests from Test Definitions. Reference specific test scenarios (e.g., "Test 3.1: Registers hooks in settings.json").
9
-
10
- ## Architecture
11
-
12
- The CLI is a TypeScript Node.js application structured around command handlers. Each command (setup, check, upgrade, diff, reset) is an independent module that shares utilities for file operations, prompting, and output formatting.
13
-
14
- The core principle is **idempotent operations with explicit state**: the CLI reads project state from `.safeword/version` and `.claude/settings.json`, performs operations, and writes state back. No global state or caching between runs.
15
-
16
- **Diagram**:
17
- ```
18
- ┌─────────────────────────────────────────────────────────┐
19
- │ CLI Entry │
20
- │ (parse args, route to command) │
21
- └─────────────────────────────────────────────────────────┘
22
-
23
- ┌─────────────────┼─────────────────┐
24
- ▼ ▼ ▼
25
- ┌─────────┐ ┌──────────┐ ┌─────────┐
26
- │ setup │ │ check │ │ reset │
27
- │ upgrade │ │ diff │ │ │
28
- └────┬────┘ └────┬─────┘ └────┬────┘
29
- │ │ │
30
- └────────────────┼─────────────────┘
31
-
32
- ┌─────────────────────┐
33
- │ Utilities │
34
- │ ─────────────────── │
35
- │ • FileManager │
36
- │ • HookManager │
37
- │ • Prompter │
38
- │ • ProjectDetector │
39
- │ • OutputFormatter │
40
- └─────────────────────┘
41
- ```
42
-
43
- ## Components
44
-
45
- ### Component 1: CLI Entry (`src/cli.ts`)
46
-
47
- **What**: Parses arguments, routes to command handlers, handles global flags
48
- **Where**: `packages/cli/src/cli.ts`
49
- **Interface**:
50
- ```typescript
51
- // Entry point
52
- async function main(args: string[]): Promise<void>;
53
-
54
- // Parsed options available to all commands
55
- interface GlobalOptions {
56
- version: boolean;
57
- help: boolean;
58
- yes: boolean; // --yes flag
59
- verbose: boolean; // --verbose flag
60
- offline: boolean; // --offline flag
61
- }
62
- ```
63
-
64
- **Dependencies**: Commander.js (arg parsing), all command modules
65
- **Tests**: Test 1.1-1.3 (version, help, bare command)
66
-
67
- ### Component 2: Setup Command (`src/commands/setup.ts`)
68
-
69
- **What**: Orchestrates full project setup - files, hooks, skills, linting, AGENTS.md
70
- **Where**: `packages/cli/src/commands/setup.ts`
71
- **Interface**:
72
- ```typescript
73
- interface SetupOptions {
74
- yes: boolean; // Skip prompts
75
- }
76
-
77
- async function setup(options: SetupOptions): Promise<void>;
78
-
79
- // Throws SetupError on failure (exit 1)
80
- // Returns normally on success (exit 0)
81
- ```
82
-
83
- **Dependencies**: FileManager, HookManager, Prompter, ProjectDetector, LintingSetup
84
- **Tests**: Test 2.1-2.5, 3.1-3.5, 4.4-4.8, 5.1-5.2, 6.1-6.3, 7.1-7.5
85
-
86
- ### Component 2b: Other Commands (check, upgrade, diff, reset)
87
-
88
- | Command | File | What | Dependencies | Tests |
89
- |---------|------|------|--------------|-------|
90
- | check | `commands/check.ts` | Show versions, verify structure, check for updates | FileManager, npm registry fetch | 8.1-8.7 |
91
- | upgrade | `commands/upgrade.ts` | Overwrite .safeword/, update hooks/skills | FileManager, HookManager | 9.1-9.7 |
92
- | diff | `commands/diff.ts` | Compare project vs bundled templates | FileManager | 10.1-10.5 |
93
- | reset | `commands/reset.ts` | Remove .safeword/, hooks, skills, AGENTS.md link | FileManager, HookManager, Prompter | 11.1-11.10 |
94
-
95
- All commands share the same pattern: parse options → check project state → perform operation → output result.
96
-
97
- ### Component 3: FileManager (`src/utils/file-manager.ts`)
98
-
99
- **What**: Handles all file system operations - copy, write, read, delete with atomic operations
100
- **Where**: `packages/cli/src/utils/file-manager.ts`
101
- **Interface**:
102
- ```typescript
103
- interface FileManager {
104
- // Template operations
105
- copyTemplates(dest: string): Promise<string[]>;
106
-
107
- // Version file
108
- readVersion(projectRoot: string): Promise<string | null>;
109
- writeVersion(projectRoot: string, version: string): Promise<void>;
110
-
111
- // AGENTS.md operations
112
- prependAgentsLink(projectRoot: string): Promise<void>;
113
- removeAgentsLink(projectRoot: string): Promise<void>;
114
- hasAgentsLink(projectRoot: string): Promise<boolean>;
115
-
116
- // Diff operations
117
- diffTemplates(projectRoot: string): Promise<DiffResult>;
118
- }
119
-
120
- interface DiffResult {
121
- added: string[];
122
- modified: string[];
123
- unchanged: string[];
124
- removed: string[];
125
- }
126
- ```
127
-
128
- **Dependencies**: Node fs/promises, path
129
- **Tests**: Test 2.1-2.4, 9.1, 10.1-10.4, 11.4, 11.8
130
-
131
- ### Component 4: HookManager (`src/utils/hook-manager.ts`)
132
-
133
- **What**: Manages Claude Code hooks in settings.json and git hooks in .git/hooks/
134
- **Where**: `packages/cli/src/utils/hook-manager.ts`
135
- **Interface**:
136
- ```typescript
137
- interface HookManager {
138
- // Claude hooks
139
- registerClaudeHooks(projectRoot: string): Promise<void>;
140
- removeClaudeHooks(projectRoot: string): Promise<void>;
141
- getClaudeHooks(projectRoot: string): Promise<ClaudeSettings>;
142
-
143
- // Git hooks
144
- installGitHooks(projectRoot: string): Promise<void>;
145
- removeGitHooks(projectRoot: string): Promise<void>;
146
-
147
- // Skills
148
- copySkills(projectRoot: string): Promise<void>;
149
- removeSkills(projectRoot: string): Promise<void>;
150
- }
151
-
152
- // Marker constants for git hooks
153
- const GIT_HOOK_START = '# SAFEWORD_ARCH_CHECK_START';
154
- const GIT_HOOK_END = '# SAFEWORD_ARCH_CHECK_END';
155
- ```
156
-
157
- **Dependencies**: FileManager (for file ops)
158
- **Tests**: Test 3.1-3.5, 7.4-7.5, 11.5-11.7
159
-
160
- ### Component 5: Prompter (`src/utils/prompter.ts`)
161
-
162
- **What**: Handles interactive prompts with TTY detection and --yes override
163
- **Where**: `packages/cli/src/utils/prompter.ts`
164
- **Interface**:
165
- ```typescript
166
- interface Prompter {
167
- // Check if running interactively
168
- isInteractive(): boolean;
169
-
170
- // Prompt with automatic default in non-interactive mode
171
- confirm(message: string, defaultValue: boolean): Promise<boolean>;
172
- }
173
-
174
- // Factory to inject --yes flag
175
- function createPrompter(options: { yes: boolean }): Prompter;
176
- ```
177
-
178
- **Dependencies**: Node readline, process.stdin.isTTY
179
- **Tests**: Test 6.1-6.3, 7.1-7.3, 11.1-11.3
180
-
181
- ### Component 6: ProjectDetector (`src/utils/project-detector.ts`)
182
-
183
- **What**: Detects project type from package.json for linting configuration
184
- **Where**: `packages/cli/src/utils/project-detector.ts`
185
- **Interface**:
186
- ```typescript
187
- interface ProjectType {
188
- typescript: boolean;
189
- react: boolean;
190
- nextjs: boolean;
191
- astro: boolean;
192
- node: boolean;
193
- }
194
-
195
- function detectProjectType(packageJson: PackageJson): ProjectType;
196
- ```
197
-
198
- **Dependencies**: None (pure function)
199
- **Tests**: Test 4.1-4.3
200
-
201
- ### Component 7: LintingSetup (`src/utils/linting-setup.ts`)
202
-
203
- **What**: Installs and configures ESLint + Prettier based on detected project type
204
- **Where**: `packages/cli/src/utils/linting-setup.ts`
205
- **Interface**:
206
- ```typescript
207
- interface LintingSetup {
208
- // Full setup - install deps, create configs, add scripts
209
- configure(projectRoot: string, projectType: ProjectType): Promise<void>;
210
-
211
- // Individual operations
212
- installDependencies(projectRoot: string, projectType: ProjectType): Promise<void>;
213
- createEslintConfig(projectRoot: string, projectType: ProjectType): Promise<void>;
214
- createPrettierConfig(projectRoot: string): Promise<void>;
215
- addPackageScripts(projectRoot: string): Promise<void>;
216
- }
217
-
218
- // Throws LintingError on failure (exit 1 - core failure)
219
- ```
220
-
221
- **Dependencies**: ProjectDetector, child_process (for npm/pnpm install), FileManager
222
- **Tests**: Test 4.4-4.8
223
-
224
- ## Data Model
225
-
226
- ```typescript
227
- // Project state (read from .safeword/version)
228
- interface ProjectState {
229
- configured: boolean;
230
- version: string | null; // null if unconfigured
231
- }
232
-
233
- // Claude settings structure
234
- interface ClaudeSettings {
235
- hooks?: {
236
- SessionStart?: HookConfig[];
237
- PostToolUse?: HookConfig[];
238
- Stop?: HookConfig[];
239
- // ... other hook types
240
- };
241
- }
242
-
243
- interface HookConfig {
244
- matcher?: string;
245
- hooks: Array<{
246
- type: 'command';
247
- command: string;
248
- timeout?: number;
249
- }>;
250
- }
251
- ```
252
-
253
- ## Component Interaction
254
-
255
- **Setup Flow:**
256
- ```
257
- CLI Entry → Setup Command
258
- → FileManager.copyTemplates()
259
- → HookManager.registerClaudeHooks()
260
- → HookManager.copySkills()
261
- → LintingSetup.configure()
262
- → Prompter.confirm() [if no git]
263
- → HookManager.installGitHooks() [if git]
264
- → FileManager.prependAgentsLink()
265
- → FileManager.writeVersion()
266
- ```
267
-
268
- **Reset Flow:**
269
- ```
270
- CLI Entry → Reset Command
271
- → Prompter.confirm()
272
- → FileManager.remove('.safeword/')
273
- → HookManager.removeClaudeHooks()
274
- → HookManager.removeSkills()
275
- → HookManager.removeGitHooks()
276
- → FileManager.removeAgentsLink()
277
- ```
278
-
279
- ## User Flow
280
-
281
- 1. User runs `npx safeword setup` in project directory
282
- 2. CLI checks for existing `.safeword/` → errors if found
283
- 3. CLI detects project type from package.json
284
- 4. CLI copies templates to `.safeword/`
285
- 5. CLI registers hooks in `.claude/settings.json`
286
- 6. CLI installs ESLint + Prettier, creates configs
287
- 7. CLI checks for `.git/` → prompts if missing (skips with --yes)
288
- 8. CLI prepends link to `AGENTS.md`
289
- 9. CLI prints success summary with file counts
290
-
291
- ## Key Decisions
292
-
293
- ### Decision 1: Commander.js for argument parsing
294
-
295
- **What**: Use Commander.js instead of manual argv parsing or alternatives (yargs, meow)
296
- **Why**: Most popular (40k+ GitHub stars), excellent TypeScript support, subcommand pattern matches our design, minimal bundle size impact
297
- **Trade-off**: External dependency vs zero-dep (but arg parsing is complex enough to warrant it)
298
-
299
- ### Decision 2: Marker-based git hooks
300
-
301
- **What**: Use comment markers (`SAFEWORD_ARCH_CHECK_START/END`) for git hook content
302
- **Why**: Allows coexistence with other tools (husky, lint-staged) that also modify pre-commit hooks
303
- **Trade-off**: Slightly more complex removal logic, but essential for ecosystem compatibility
304
-
305
- ### Decision 3: Bundled templates
306
-
307
- **What**: Ship templates as part of npm package, copy on setup (not fetch from GitHub)
308
- **Why**: Works offline, faster setup, version-locked to CLI, no network dependency
309
- **Trade-off**: Larger package size (~500KB), but acceptable for CLI tool
310
-
311
- ### Decision 4: No config file
312
-
313
- **What**: No `.safewordrc` or similar - all behavior via flags
314
- **Why**: Simpler mental model, npx-first means config rarely persists anyway, flags are explicit
315
- **Trade-off**: Can't persist preferences, but `--yes` covers the main use case (CI)
316
-
317
- ## Implementation Notes
318
-
319
- **Constraints**:
320
- - Node 18+ required (use engines field in package.json)
321
- - Must work with npm, pnpm, yarn, bun for linting deps install
322
- - Max 500ms startup time (lazy-load heavy modules)
323
-
324
- **Error Handling**:
325
- - Core failures (can't write files, linting fails) → exit 1 with clear message
326
- - Warnings (no git, offline) → exit 0 with warning in output
327
- - Use custom error classes: `SetupError`, `ConfigError`, `NetworkError`
328
-
329
- **Gotchas**:
330
- - Always check for existing `.safeword/` before any writes in setup
331
- - AGENTS.md link must be exact string match for removal
332
- - Git hooks must preserve existing content outside markers
333
- - settings.json might not exist yet - create if missing
334
-
335
- **Open Questions**:
336
- - [ ] Which npm registry endpoint for version check? (registry.npmjs.org/safeword/latest)
337
- - [ ] Should we support Bun's package manager for linting install?
338
-
339
- ## References
340
-
341
- - [CLI UX Vision](../../.agents/planning/011-cli-ux-vision.md)
342
- - [Ticket #005](../../.agents/tickets/005-cli-implementation.md)
343
- - [Commander.js docs](https://github.com/tj/commander.js)