@torus-engineering/tas-kit 1.9.0 → 1.11.1

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 (68) hide show
  1. package/.claude/commands/ado-create.md +17 -17
  2. package/.claude/commands/ado-delete.md +11 -11
  3. package/.claude/commands/ado-get.md +12 -12
  4. package/.claude/commands/ado-status.md +12 -12
  5. package/.claude/commands/ado-update.md +15 -15
  6. package/.claude/commands/tas-adr.md +33 -33
  7. package/.claude/commands/tas-apitest-plan.md +173 -173
  8. package/.claude/commands/tas-apitest.md +143 -143
  9. package/.claude/commands/tas-brainstorm.md +14 -14
  10. package/.claude/commands/tas-bug.md +113 -113
  11. package/.claude/commands/tas-design.md +37 -37
  12. package/.claude/commands/tas-dev.md +128 -128
  13. package/.claude/commands/tas-e2e-mobile.md +155 -155
  14. package/.claude/commands/tas-e2e-web.md +163 -163
  15. package/.claude/commands/tas-e2e.md +102 -102
  16. package/.claude/commands/tas-epic.md +35 -35
  17. package/.claude/commands/tas-feature.md +47 -47
  18. package/.claude/commands/tas-fix.md +51 -51
  19. package/.claude/commands/tas-functest-mobile.md +144 -144
  20. package/.claude/commands/tas-functest-web.md +192 -192
  21. package/.claude/commands/tas-functest.md +76 -76
  22. package/.claude/commands/tas-init.md +14 -14
  23. package/.claude/commands/tas-plan.md +198 -200
  24. package/.claude/commands/tas-prd.md +37 -37
  25. package/.claude/commands/tas-review.md +111 -111
  26. package/.claude/commands/tas-sad.md +43 -43
  27. package/.claude/commands/tas-security.md +87 -81
  28. package/.claude/commands/tas-spec.md +20 -20
  29. package/.claude/commands/tas-status.md +13 -13
  30. package/.claude/commands/tas-story.md +91 -91
  31. package/.claude/commands/tas-verify.md +51 -51
  32. package/.claude/rules/common/post-review-agent.md +49 -49
  33. package/.claude/rules/common/project-status.md +14 -14
  34. package/.claude/rules/common/stack-detection.md +6 -6
  35. package/.claude/rules/common/token-logging.md +27 -27
  36. package/.claude/rules/csharp/api-testing.md +171 -171
  37. package/.claude/skills/ado-integration/SKILL.md +36 -36
  38. package/.claude/skills/tas-conventions/SKILL.md +32 -32
  39. package/.claude/skills/tas-implementation-complete/SKILL.md +100 -99
  40. package/.claude/skills/tas-tdd/SKILL.md +123 -123
  41. package/.claude/skills/token-logger/SKILL.md +19 -19
  42. package/.tas/README.md +266 -1520
  43. package/.tas/checklists/code-review.md +13 -13
  44. package/.tas/checklists/security.md +3 -3
  45. package/.tas/checklists/story-done.md +11 -11
  46. package/.tas/hooks/README.md +138 -0
  47. package/.tas/hooks/pre-commit +26 -0
  48. package/.tas/hooks/security-scan.js +599 -0
  49. package/.tas/project-status-example.yaml +3 -3
  50. package/.tas/tas-example.yaml +25 -8
  51. package/.tas/templates/ADR.md +16 -16
  52. package/.tas/templates/API-Test-Spec.md +3 -3
  53. package/.tas/templates/Bug.md +12 -12
  54. package/.tas/templates/Design-Spec.md +8 -8
  55. package/.tas/templates/E2E-Execution-Report.md +1 -1
  56. package/.tas/templates/Epic.md +1 -1
  57. package/.tas/templates/Feature.md +10 -10
  58. package/.tas/templates/Func-Test-Spec.md +3 -3
  59. package/.tas/templates/SAD.md +106 -106
  60. package/.tas/templates/Security-Report.md +3 -3
  61. package/.tas/templates/Story.md +9 -9
  62. package/.tas/tools/tas-ado-readme.md +169 -169
  63. package/.tas/tools/tas-ado.py +1 -1
  64. package/CLAUDE-Example.md +37 -58
  65. package/README.md +294 -42
  66. package/bin/cli.js +24 -7
  67. package/lib/install.js +161 -47
  68. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,182 @@
1
1
  # TAS Kit
2
2
 
3
- **Torus Agentic SDLC Kit** — Claude Code commands, skills and templates for modern AI-assisted SDLC.
3
+ **Torus Agentic SDLC Kit** — AI-assisted SDLC toolkit, designed following Spec-Driven Development philosophy and Context-Aware Architecture.
4
+
5
+ ---
6
+
7
+ ## Purpose
8
+
9
+ TAS Kit helps software development teams:
10
+ - **Standardize SDLC process** with clear artifacts (PRD, SAD, ADR, Epic, Feature, Story)
11
+ - **Optimize token usage** through Context Layer — invest in design phase, save in code phase
12
+ - **Support multiple workflows**: from solo developer to full team with PE/SE/DSE roles
13
+ - **Automate** with Hybrid and Autonomous agents operating 24/7
14
+
15
+ ---
16
+
17
+ ## Design Philosophy
18
+
19
+ ### Spec-Driven Development
20
+ All code starts from spec. Story.md is "context digest" that has absorbed all information from PRD, SAD, ADR, Feature. Each implementation session only needs to read CLAUDE.md + Story.md — no need to reload all artifacts.
21
+
22
+ ### Human-Led, AI-Powered
23
+ - **Human-led**: Architecture decisions, design approval, code review
24
+ - **AI-assisted**: Draft creation, implementation per spec, test execution, bug detection
25
+
26
+ ### Dual Mode Operation
27
+ - **Hybrid Mode**: Developer and AI work together in session
28
+ - **Autonomous Mode**: AI automatically develops 24/7, reports results when done
29
+
30
+ ### Lightweight & Context-Aware
31
+ - Each skill < 3KB, total kit < 50KB
32
+ - Context Layer: invest tokens in design phase to save many times in code phase
33
+ - When coding: MUST start new session (don't reuse old session that loaded PRD/SAD to avoid Window Context bloat)
34
+
35
+ ### Role-Based & Template-Driven
36
+ - 3 actual roles at Torus: PE (Product Engineer), SE (Software Engineer), DSE (DevOps Engineer)
37
+ - Separate templates for PRD, SAD, ADR, Epic, Feature, Story per Torus standards
38
+ - Flow configurable via `tas.yaml` file
39
+
40
+ ### Azure DevOps Compatible
41
+ - Markdown output compatible with Azure DevOps Wiki
42
+ - Mermaid diagrams don't use `()` characters (avoid conflict with ADO syntax)
43
+
44
+ ---
45
+
46
+ ## SDLC Workflow
47
+
48
+ :::mermaid
49
+ graph TD
50
+ subgraph Phase1["Phase 1: Discovery"]
51
+ PRD["/tas-prd"]
52
+ SAD["/tas-sad"]
53
+ ADR["/tas-adr"]
54
+ DESIGN["/tas-design"]
55
+ PRD -->|Product Engineer| PRD_ARTIFACT["PRD.md"]
56
+ PRD_ARTIFACT -->|Software Engineer| SAD
57
+ PRD_ARTIFACT -->|Software Engineer| ADR
58
+ SAD --> SAD_ARTIFACT["SAD.md"]
59
+ ADR --> ADR_ARTIFACT["ADR-XXX.md"]
60
+ PRD_ARTIFACT -->|Product Engineer| DESIGN
61
+ DESIGN --> DESIGN_ARTIFACT["design-spec.md"]
62
+ end
63
+
64
+ subgraph Phase2["Phase 2: Planning"]
65
+ EPIC["/tas-epic"]
66
+ FEATURE["/tas-feature"]
67
+ STORY["/tas-story"]
68
+ PRD_ARTIFACT -->|Product Engineer| EPIC
69
+ EPIC --> EPIC_ARTIFACT["Epic-XXX/"]
70
+ EPIC_ARTIFACT -->|Product Engineer| FEATURE
71
+ FEATURE --> FEATURE_ARTIFACT["Feature-XXX/"]
72
+ SAD_ARTIFACT --> FEATURE
73
+ DESIGN_ARTIFACT --> FEATURE
74
+ FEATURE_ARTIFACT -->|Product Engineer| STORY
75
+ STORY --> STORY_ARTIFACT["Story-XXX.md"]
76
+ end
77
+
78
+ subgraph Phase3["Phase 3: Implementation"]
79
+ PLAN["/tas-plan"]
80
+ DEV["/tas-dev"]
81
+ FIX["/tas-fix"]
82
+ APItest["/tas-apitest"]
83
+ E2E["/tas-e2e"]
84
+ FUNCTEST_WEB["/tas-functest-web"]
85
+ FUNCTEST_MOBILE["/tas-functest-mobile"]
86
+ E2E_WEB["/tas-e2e-web"]
87
+ E2E_MOBILE["/tas-e2e-mobile"]
88
+ BUG["/tas-bug"]
89
+ REVIEW["/tas-review"]
90
+ FUNctest["/tas-functest"]
91
+ STORY_ARTIFACT -->|Software Engineer| PLAN
92
+ PLAN --> STORY_ARTIFACT
93
+ STORY_ARTIFACT -->|AI Agent| DEV
94
+ DEV --> CODE["Source Code"]
95
+ CODE -->|Bug found| FIX
96
+ FIX --> CODE
97
+ CODE -->|Software Engineer| REVIEW
98
+ REVIEW --> REVIEW_ARTIFACT["Code Review Report"]
99
+ STORY_ARTIFACT -->|Software Engineer| APItest
100
+ APItest --> APITEST_ARTIFACT["API Testing Script"]
101
+ FUNCTEST_ARTIFACT -->|Product Engineer| E2E
102
+ E2E --> E2E_ARTIFACT["E2E Test Scenarios"]
103
+ FUNCTEST_ARTIFACT -->|Software Engineer| FUNCTEST_WEB
104
+ FUNCTEST_WEB --> FUNCTEST_WEB_ARTIFACT["Functional Test Web Script"]
105
+ FUNCTEST_ARTIFACT -->|Software Engineer| FUNCTEST_MOBILE
106
+ FUNCTEST_MOBILE --> FUNCTEST_MOBILE_ARTIFACT["Functional Test Mobile Script"]
107
+ FUNCTEST_ARTIFACT -->|Product Engineer| E2E_WEB
108
+ E2E_WEB --> E2E_WEB_ARTIFACT["E2E Web Test Script"]
109
+ FUNCTEST_ARTIFACT -->|Product Engineer| E2E_MOBILE
110
+ E2E_MOBILE --> E2E_MOBILE_ARTIFACT["E2E Mobile Test Script"]
111
+ CODE -->|Bug found| BUG
112
+ BUG --> BUG_ARTIFACT["Bug Report"]
113
+ FEATURE_ARTIFACT -->|Product Engineer| FUNctest
114
+ FUNctest --> FUNCTEST_ARTIFACT["Functional-Testing-Spec-FeatureXXX.md"]
115
+ end
116
+
117
+ subgraph Phase4["Phase 4: Quality & Deploy"]
118
+ SECURITY["/tas-security"]
119
+ PIPELINE["Pipeline / CLI"]
120
+ CODE -->|DevOps Engineer| SECURITY
121
+ SECURITY --> SECURITY_ARTIFACT["Security Report"]
122
+ APITEST_ARTIFACT -->|Product Engineer| PIPELINE
123
+ FUNCTEST_WEB_ARTIFACT --> PIPELINE
124
+ FUNCTEST_MOBILE_ARTIFACT --> PIPELINE
125
+ E2E_WEB_ARTIFACT --> PIPELINE
126
+ E2E_MOBILE_ARTIFACT --> PIPELINE
127
+ PIPELINE --> TEST_REPORT["Test Report"]
128
+ SECURITY_ARTIFACT -->|DevOps Engineer| DEPLOY["Production"]
129
+ TEST_REPORT --> DEPLOY
130
+ end
131
+
132
+ STATUS["/tas-status"] -.->|Track| PRD_ARTIFACT
133
+ STATUS -.->|Track| SAD_ARTIFACT
134
+ STATUS -.->|Track| STORY_ARTIFACT
135
+ STATUS -.->|Track| DEPLOY
136
+
137
+ style PRD_ARTIFACT fill:#e1f5ff
138
+ style SAD_ARTIFACT fill:#fff4e1
139
+ style DESIGN_ARTIFACT fill:#f3e5f5
140
+ style STORY_ARTIFACT fill:#e8f5e9
141
+ style CODE fill:#f3e5f5
142
+ style TEST_REPORT fill:#c8e6c9
143
+ style DEPLOY fill:#c8e6c9
144
+ :::
145
+
146
+ ### Phase Summary
147
+
148
+ | Phase | Role | Commands | Artifacts |
149
+ |-------|------|----------|-----------|
150
+ | **Phase 1: Discovery** | PE, SE | `/tas-prd`, `/tas-sad`, `/tas-adr`, `/tas-design` | PRD.md, SAD.md, ADR-XXX.md, design-spec.md |
151
+ | **Phase 2: Planning** | SE | `/tas-epic`, `/tas-feature`, `/tas-story`, `/tas-functest` | Epic-XXX/, Feature-XXX/, Story-XXX.md, Functional-Testing-Spec-FeatureXXX.md |
152
+ | **Phase 3: Implementation** | PE, SE, AI | `/tas-plan`, `/tas-dev`, `/tas-fix`, `/tas-apitest`, `/tas-e2e`, `/tas-functest-web`, `/tas-functest-mobile`, `/tas-e2e-web`, `/tas-e2e-mobile`, `/tas-bug`, `/tas-review` | Plan.md, Source Code, API Testing Script, E2E Test Scenarios, Functional Test Scripts, Bug Report, Code Review Report |
153
+ | **Phase 4: Quality & Deploy** | PE, DSE | `/tas-security`, Pipeline/CLI | Security Report, Test Report, Production |
154
+
155
+ ### Phase Details
156
+
157
+ #### Phase 1: Discovery
158
+ - **PE**: Create PRD with `/tas-prd`, create design-spec with `/tas-design`
159
+ - **SE**: Create SAD with `/tas-sad`, create ADR with `/tas-adr`
160
+
161
+ #### Phase 2: Planning
162
+ - **PE**: Breakdown Epic with `/tas-epic`, Feature with `/tas-feature`, Story with `/tas-story`
163
+
164
+ #### Phase 3: Implementation
165
+ - **SE**: Create Plan with `/tas-plan`, Implement with `/tas-dev`, Fix bug with `/tas-fix`
166
+ - **SE**: Review code with `/tas-review`
167
+ - **PE**: Create Functional Testing Spec with `/tas-functest`
168
+ - **SE**: Create API Testing Script with `/tas-apitest`
169
+ - **PE**: Create E2E Test Scenarios with `/tas-e2e`
170
+ - **SE**: Create Functional Test Scripts with `/tas-functest-web`, `/tas-functest-mobile`
171
+ - **PE**: Create E2E Test Scripts with `/tas-e2e-web`, `/tas-e2e-mobile`
172
+ - **PE**: Create Bug Report with `/tas-bug`
173
+
174
+ #### Phase 4: Quality & Deploy
175
+ - **DSE**: Security Review with `/tas-security`
176
+ - **PE**: Run Pipeline/CLI to execute Automation Tests
177
+ - **DSE**: Deploy to Production
178
+
179
+ ---
4
180
 
5
181
  ## Quick Start
6
182
 
@@ -8,13 +184,94 @@
8
184
  npx @torus-engineering/tas-kit install
9
185
  ```
10
186
 
11
- ## Options
187
+ ### Options
12
188
 
13
189
  ```bash
14
190
  npx @torus-engineering/tas-kit install --directory /path/to/my-project
15
191
  npx @torus-engineering/tas-kit install --yes # skip confirmation prompts
16
192
  ```
17
193
 
194
+ ---
195
+
196
+ ## Important Setup
197
+
198
+ ### CLAUDE.md
199
+
200
+ Most important configuration file — Claude reads this file first in every session.
201
+
202
+ **Structure:**
203
+ ```markdown
204
+ # Project Name
205
+
206
+ ## Tech Stack
207
+ - Backend: .NET / Node.js / Python
208
+ - Frontend: React / Next.js
209
+ - Database: PostgreSQL / MySQL
210
+ - Infrastructure: AWS / Azure
211
+
212
+ ## Conventions
213
+ - Coding standards
214
+ - Architecture patterns
215
+ - Testing requirements
216
+ ```
217
+
218
+ ### tas.yaml
219
+
220
+ Controls TAS Kit flow per project.
221
+
222
+ **Structure:**
223
+ ```yaml
224
+ project:
225
+ name: "My Project"
226
+ team: "Team Name"
227
+
228
+ azure_devops:
229
+ enabled: true
230
+ organization: "org"
231
+ project: "project"
232
+
233
+ flow:
234
+ mode: "greenfield" # or "brownfield"
235
+ use_tdd: true
236
+ auto_review: true
237
+ ```
238
+
239
+ ### project-status.yaml
240
+
241
+ Project status index — automatically updated after each artifact change.
242
+
243
+ **Structure:**
244
+ ```yaml
245
+ last_updated: 2025-01-15
246
+
247
+ artifacts:
248
+ prd:
249
+ file: docs/prd.md
250
+ status: Approved
251
+ version: "1.0"
252
+
253
+ epics:
254
+ Epic-001:
255
+ status: Active
256
+ features:
257
+ Feature-001:
258
+ stories:
259
+ Story-001:
260
+ status: In Progress
261
+ ```
262
+
263
+ ### .env
264
+
265
+ Environment variables for Azure DevOps integration.
266
+
267
+ ```bash
268
+ AZURE_DEVOPS_PAT=your_pat_here
269
+ AZURE_DEVOPS_ORG=your_org
270
+ AZURE_DEVOPS_PROJECT=your_project
271
+ ```
272
+
273
+ ---
274
+
18
275
  ## What gets installed
19
276
 
20
277
  ```
@@ -31,52 +288,47 @@ tas.yaml Flow configuration template (edit this for your project)
31
288
  .env.example Environment variable template
32
289
  ```
33
290
 
34
- ## After install
35
-
36
- 1. Edit `CLAUDE.md` — add your project's tech stack and conventions
37
- 2. Edit `tas.yaml` — set project name, team and ADO config
38
- 3. Create `.env` — add `AZURE_DEVOPS_PAT` (see `.env.example`)
39
- 4. Open Claude Code — run `/tas-init` to initialize your project
40
-
41
- ## Commands
42
-
43
- | Command | Description |
44
- |---------|-------------|
45
- | `/tas-init` | Initialize TAS for a new project |
46
- | `/tas-status` | Show current project state |
47
- | `/tas-prd` | Create/update Product Requirements Document |
48
- | `/tas-sad` | Create/update Solution Architecture Document |
49
- | `/tas-epic` | Create/update Epic |
50
- | `/tas-feature` | Create/update Feature |
51
- | `/tas-story` | Create/update Story |
52
- | `/tas-spec` | Lightweight spec (solo / prototype) |
53
- | `/tas-plan` | Plan technical implementation |
54
- | `/tas-dev` | Implement a story (agentic) |
55
- | `/tas-fix` | Quick fix without full story flow |
56
- | `/tas-review` | Code review with checklist |
57
- | `/tas-brainstorm` | Brainstorm solutions |
58
- | `/tas-bug` | Create bug report |
59
- | `/tas-security` | Security review |
60
- | `/tas-verify` | Verify feature on staging |
61
- | `/ado-*` | Azure DevOps integration |
291
+ ---
62
292
 
63
- ## Requirements
293
+ ## Commands Reference
64
294
 
65
- - Node.js 18+
66
- - [Claude Code](https://claude.ai/code)
295
+ | Command | Description | Role |
296
+ |---------|-------------|------|
297
+ | `/tas-init` | Initialize TAS for new project | All |
298
+ | `/tas-status` | Display current project status | All |
299
+ | `/tas-prd` | Create/update Product Requirements Document | PE |
300
+ | `/tas-sad` | Create/update Solution Architecture Document | SE |
301
+ | `/tas-adr` | Create Architecture Decision Record | SE |
302
+ | `/tas-design` | Create Design Specification | SE |
303
+ | `/tas-epic` | Create/update Epic | SE |
304
+ | `/tas-feature` | Create/update Feature | SE |
305
+ | `/tas-story` | Create/update Story | SE |
306
+ | `/tas-functest` | Create Functional Testing Specification | SE |
307
+ | `/tas-spec` | Lightweight spec (solo / prototype) | SE |
308
+ | `/tas-plan` | Create technical implementation plan | SE |
309
+ | `/tas-dev` | Implement story (agentic) | AI |
310
+ | `/tas-fix` | Quick fix without full story flow | SE |
311
+ | `/tas-apitest` | Create API Testing Script automatically | SE |
312
+ | `/tas-e2e` | Create E2E Test Scenarios | PE |
313
+ | `/tas-functest-web` | Create Functional Test Script for Web | SE |
314
+ | `/tas-functest-mobile` | Create Functional Test Script for Mobile | SE |
315
+ | `/tas-e2e-web` | Create E2E Test Script for Web | PE |
316
+ | `/tas-e2e-mobile` | Create E2E Test Script for Mobile | PE |
317
+ | `/tas-bug` | Create Bug Report | PE |
318
+ | `/tas-review` | Code Review with checklist | SE |
319
+ | `/tas-brainstorm` | Brainstorm solutions | All |
320
+ | `/tas-security` | Security Review | DSE |
321
+ | `/ado-*` | Azure DevOps integration | All |
67
322
 
68
- ## Publishing to npm
323
+ ---
69
324
 
70
- ```bash
71
- # Bump version (patch / minor / major)
72
- npm version patch
325
+ ## Requirements
73
326
 
74
- # Publish to npm registry
75
- npm publish --access=public --auth-type=web
76
- ```
327
+ - Node.js 18+
328
+ - [Claude Code](https://claude.ai/code)
77
329
 
78
- `--auth-type=web` mở trình duyệt để xác thực nếu chưa login. Chạy `npm whoami` để kiểm tra đang đăng nhập với account nào trước khi publish.
330
+ ---
79
331
 
80
332
  ## Documentation
81
333
 
82
- See `.tas/README.md` after install for full kit documentation.
334
+ See `.tas/README.md` after install for detailed documentation.
package/bin/cli.js CHANGED
@@ -17,15 +17,20 @@ Commands:
17
17
  (preserves CLAUDE.md, tas.yaml, .env.example)
18
18
 
19
19
  Options:
20
- --directory <path> Target directory (default: current working directory)
21
- --yes, -y Skip confirmation prompts
22
- --help, -h Show this help message
20
+ --directory <path> Target directory (default: current working directory)
21
+ --yes, -y Skip confirmation prompts (uses native hook by default)
22
+ --security-hook <mode> Pre-commit hook mode: husky | native | none
23
+ Default: interactive prompt on install,
24
+ no-op on update unless specified.
25
+ --help, -h Show this help message
23
26
 
24
27
  Examples:
25
28
  npx @torus-engineering/tas-kit install
26
29
  npx @torus-engineering/tas-kit install --directory /path/to/my-project
30
+ npx @torus-engineering/tas-kit install --yes --security-hook=husky
31
+ npx @torus-engineering/tas-kit install --security-hook=none
27
32
  npx @torus-engineering/tas-kit update
28
- npx @torus-engineering/tas-kit update --yes
33
+ npx @torus-engineering/tas-kit update --yes --security-hook=native
29
34
  `.trim());
30
35
  }
31
36
 
@@ -40,15 +45,27 @@ if (command !== 'install' && command !== 'update') {
40
45
  process.exit(1);
41
46
  }
42
47
 
43
- const opts = { directory: process.cwd(), yes: false };
48
+ const opts = { directory: process.cwd(), yes: false, securityHook: null };
49
+
44
50
  for (let i = 1; i < args.length; i++) {
45
- if ((args[i] === '--directory' || args[i] === '-d') && args[i + 1]) {
51
+ const a = args[i];
52
+ if ((a === '--directory' || a === '-d') && args[i + 1]) {
46
53
  opts.directory = args[++i];
47
- } else if (args[i] === '--yes' || args[i] === '-y') {
54
+ } else if (a === '--yes' || a === '-y') {
48
55
  opts.yes = true;
56
+ } else if (a.startsWith('--security-hook=')) {
57
+ opts.securityHook = a.slice('--security-hook='.length).toLowerCase();
58
+ } else if (a === '--security-hook' && args[i + 1]) {
59
+ opts.securityHook = args[++i].toLowerCase();
49
60
  }
50
61
  }
51
62
 
63
+ if (opts.securityHook && !['husky', 'native', 'none'].includes(opts.securityHook)) {
64
+ console.error(`Invalid --security-hook value: "${opts.securityHook}"`);
65
+ console.error(`Expected one of: husky, native, none`);
66
+ process.exit(1);
67
+ }
68
+
52
69
  const runner = command === 'update' ? update : install;
53
70
  runner(opts).catch((err) => {
54
71
  console.error(`\n${command === 'update' ? 'Update' : 'Install'} failed:`, err.message);