@ulpi/cli 0.1.0

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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/dist/auth-PN7TMQHV-2W4ICG64.js +15 -0
  4. package/dist/chunk-247GVVKK.js +2259 -0
  5. package/dist/chunk-2CLNOKPA.js +793 -0
  6. package/dist/chunk-2HEE5OKX.js +79 -0
  7. package/dist/chunk-2MZER6ND.js +415 -0
  8. package/dist/chunk-3SBPZRB5.js +772 -0
  9. package/dist/chunk-4VNS5WPM.js +42 -0
  10. package/dist/chunk-6JCMYYBT.js +1546 -0
  11. package/dist/chunk-6OCEY7JY.js +422 -0
  12. package/dist/chunk-74WVVWJ4.js +375 -0
  13. package/dist/chunk-7AL4DOEJ.js +131 -0
  14. package/dist/chunk-7LXY5UVC.js +330 -0
  15. package/dist/chunk-DBMUNBNB.js +3048 -0
  16. package/dist/chunk-JWUUVXIV.js +13694 -0
  17. package/dist/chunk-KIKPIH6N.js +4048 -0
  18. package/dist/chunk-KLEASXUR.js +70 -0
  19. package/dist/chunk-MIAQVCFW.js +39 -0
  20. package/dist/chunk-NNUWU6CV.js +1610 -0
  21. package/dist/chunk-PKD4ASEM.js +115 -0
  22. package/dist/chunk-Q4HIY43N.js +4230 -0
  23. package/dist/chunk-QJ5GSMEC.js +146 -0
  24. package/dist/chunk-SIAQVRKG.js +2163 -0
  25. package/dist/chunk-SPOI23SB.js +197 -0
  26. package/dist/chunk-YM2HV4IA.js +505 -0
  27. package/dist/codemap-RRJIDBQ5.js +636 -0
  28. package/dist/config-EGAXXCGL.js +127 -0
  29. package/dist/dist-6G7JC2RA.js +90 -0
  30. package/dist/dist-7LHZ65GC.js +418 -0
  31. package/dist/dist-LZKZFPVX.js +140 -0
  32. package/dist/dist-R5F4MX3I.js +107 -0
  33. package/dist/dist-R5ZJ4LX5.js +56 -0
  34. package/dist/dist-RJGCUS3L.js +87 -0
  35. package/dist/dist-RKOGLK7R.js +151 -0
  36. package/dist/dist-W7K4WPAF.js +597 -0
  37. package/dist/export-import-4A5MWLIA.js +53 -0
  38. package/dist/history-ATTUKOHO.js +934 -0
  39. package/dist/index.js +2120 -0
  40. package/dist/init-AY5C2ZAS.js +393 -0
  41. package/dist/launchd-LF2QMSKZ.js +148 -0
  42. package/dist/log-TVTUXAYD.js +75 -0
  43. package/dist/mcp-installer-NQCGKQ23.js +124 -0
  44. package/dist/memory-J3G24QHS.js +406 -0
  45. package/dist/ollama-3XCUZMZT-FYKHW4TZ.js +7 -0
  46. package/dist/openai-E7G2YAHU-UYY4ZWON.js +8 -0
  47. package/dist/projects-ATHDD3D6.js +271 -0
  48. package/dist/review-ADUPV3PN.js +152 -0
  49. package/dist/rules-E427DKYJ.js +134 -0
  50. package/dist/server-MOYPE4SM-N7SE2AN7.js +18 -0
  51. package/dist/server-X5P6WH2M-7K2RY34N.js +11 -0
  52. package/dist/skills/ulpi-generate-guardian/SKILL.md +511 -0
  53. package/dist/skills/ulpi-generate-guardian/references/framework-rules.md +692 -0
  54. package/dist/skills/ulpi-generate-guardian/references/language-rules.md +596 -0
  55. package/dist/skills-CX73O3IV.js +76 -0
  56. package/dist/status-4DFHDJMN.js +66 -0
  57. package/dist/templates/biome.yml +24 -0
  58. package/dist/templates/conventional-commits.yml +18 -0
  59. package/dist/templates/django.yml +30 -0
  60. package/dist/templates/docker.yml +30 -0
  61. package/dist/templates/eslint.yml +13 -0
  62. package/dist/templates/express.yml +20 -0
  63. package/dist/templates/fastapi.yml +23 -0
  64. package/dist/templates/git-flow.yml +26 -0
  65. package/dist/templates/github-flow.yml +27 -0
  66. package/dist/templates/go.yml +33 -0
  67. package/dist/templates/jest.yml +24 -0
  68. package/dist/templates/laravel.yml +30 -0
  69. package/dist/templates/monorepo.yml +26 -0
  70. package/dist/templates/nestjs.yml +21 -0
  71. package/dist/templates/nextjs.yml +31 -0
  72. package/dist/templates/nodejs.yml +33 -0
  73. package/dist/templates/npm.yml +15 -0
  74. package/dist/templates/php.yml +25 -0
  75. package/dist/templates/pnpm.yml +15 -0
  76. package/dist/templates/prettier.yml +23 -0
  77. package/dist/templates/prisma.yml +21 -0
  78. package/dist/templates/python.yml +33 -0
  79. package/dist/templates/quality-of-life.yml +111 -0
  80. package/dist/templates/ruby.yml +25 -0
  81. package/dist/templates/rust.yml +34 -0
  82. package/dist/templates/typescript.yml +14 -0
  83. package/dist/templates/vitest.yml +24 -0
  84. package/dist/templates/yarn.yml +15 -0
  85. package/dist/templates-U7T6MARD.js +156 -0
  86. package/dist/ui-L7UAWXDY.js +167 -0
  87. package/dist/ui.html +698 -0
  88. package/dist/ulpi-RMMCUAGP-JCJ273T6.js +161 -0
  89. package/dist/uninstall-6SW35IK4.js +25 -0
  90. package/dist/update-M2B4RLGH.js +61 -0
  91. package/dist/version-checker-ANCS3IHR.js +10 -0
  92. package/package.json +92 -0
@@ -0,0 +1,596 @@
1
+ # Language-Specific Rules
2
+
3
+ ## Node.js / TypeScript
4
+
5
+ ```yaml
6
+ permissions:
7
+ auto-approve-npm:
8
+ trigger: PermissionRequest
9
+ matcher: Bash
10
+ command_pattern: "npm"
11
+ decision: allow
12
+
13
+ auto-approve-pnpm:
14
+ trigger: PermissionRequest
15
+ matcher: Bash
16
+ command_pattern: "pnpm"
17
+ decision: allow
18
+
19
+ auto-approve-yarn:
20
+ trigger: PermissionRequest
21
+ matcher: Bash
22
+ command_pattern: "yarn"
23
+ decision: allow
24
+
25
+ auto-approve-bun:
26
+ trigger: PermissionRequest
27
+ matcher: Bash
28
+ command_pattern: "bun"
29
+ decision: allow
30
+
31
+ auto-approve-node:
32
+ trigger: PermissionRequest
33
+ matcher: Bash
34
+ command_pattern: "node"
35
+ decision: allow
36
+
37
+ auto-approve-npx:
38
+ trigger: PermissionRequest
39
+ matcher: Bash
40
+ command_pattern: "npx"
41
+ decision: allow
42
+
43
+ # Lock file protection (use whichever lock file is detected)
44
+ block-lock-file:
45
+ trigger: PreToolUse
46
+ matcher: "Write|Edit"
47
+ file_pattern: "pnpm-lock.yaml" # or yarn.lock, package-lock.json, bun.lockb
48
+ decision: deny
49
+ message: "Do not edit lock files manually. Use `{package_manager} install` to manage dependencies."
50
+ locked: true
51
+
52
+ # Build artifact protection
53
+ block-dist:
54
+ trigger: PreToolUse
55
+ matcher: "Write|Edit"
56
+ file_pattern: "dist/**"
57
+ decision: deny
58
+ message: "Do not edit build output. Run the build command to regenerate."
59
+ locked: true
60
+
61
+ block-build-output:
62
+ trigger: PreToolUse
63
+ matcher: "Write|Edit"
64
+ file_pattern: "build/**"
65
+ decision: deny
66
+ message: "Do not edit build output. Run the build command to regenerate."
67
+ locked: true
68
+
69
+ block-node-modules:
70
+ trigger: PreToolUse
71
+ matcher: "Write|Edit"
72
+ file_pattern: "node_modules/**"
73
+ decision: deny
74
+ message: "Do not edit node_modules directly. Use the package manager."
75
+ locked: true
76
+
77
+ block-turbo-cache:
78
+ trigger: PreToolUse
79
+ matcher: "Write|Edit"
80
+ file_pattern: ".turbo/**"
81
+ decision: deny
82
+ message: "Do not edit .turbo cache. Run turbo to regenerate."
83
+ locked: true
84
+
85
+ postconditions:
86
+ # Dependency sync after manifest change
87
+ install-after-package-json:
88
+ trigger: PostToolUse
89
+ matcher: "Write|Edit"
90
+ file_pattern: "package.json"
91
+ run: "{package_manager} install"
92
+ timeout: 60000
93
+ block_on_failure: false
94
+ ```
95
+
96
+ ## Python
97
+
98
+ ```yaml
99
+ permissions:
100
+ auto-approve-pip:
101
+ trigger: PermissionRequest
102
+ matcher: Bash
103
+ command_pattern: "pip"
104
+ decision: allow
105
+
106
+ auto-approve-python:
107
+ trigger: PermissionRequest
108
+ matcher: Bash
109
+ command_pattern: "python"
110
+ decision: allow
111
+
112
+ auto-approve-poetry:
113
+ trigger: PermissionRequest
114
+ matcher: Bash
115
+ command_pattern: "poetry"
116
+ decision: allow
117
+
118
+ auto-approve-uv:
119
+ trigger: PermissionRequest
120
+ matcher: Bash
121
+ command_pattern: "uv"
122
+ decision: allow
123
+
124
+ auto-approve-pytest:
125
+ trigger: PermissionRequest
126
+ matcher: Bash
127
+ command_pattern: "pytest"
128
+ decision: allow
129
+
130
+ auto-approve-ruff:
131
+ trigger: PermissionRequest
132
+ matcher: Bash
133
+ command_pattern: "ruff"
134
+ decision: allow
135
+
136
+ # Lock file protection (use whichever is detected)
137
+ block-poetry-lock:
138
+ trigger: PreToolUse
139
+ matcher: "Write|Edit"
140
+ file_pattern: "poetry.lock" # or uv.lock
141
+ decision: deny
142
+ message: "Do not edit lock files manually. Use `poetry install` or `uv sync` to manage dependencies."
143
+ locked: true
144
+
145
+ # Build artifact protection
146
+ block-pycache:
147
+ trigger: PreToolUse
148
+ matcher: "Write|Edit"
149
+ file_pattern: "**/__pycache__/**"
150
+ decision: deny
151
+ message: "Do not edit __pycache__. These are auto-generated bytecode files."
152
+ locked: true
153
+
154
+ block-egg-info:
155
+ trigger: PreToolUse
156
+ matcher: "Write|Edit"
157
+ file_pattern: "**/*.egg-info/**"
158
+ decision: deny
159
+ message: "Do not edit .egg-info directories. Run setup.py to regenerate."
160
+ locked: true
161
+
162
+ block-mypy-cache:
163
+ trigger: PreToolUse
164
+ matcher: "Write|Edit"
165
+ file_pattern: ".mypy_cache/**"
166
+ decision: deny
167
+ message: "Do not edit .mypy_cache. Run mypy to regenerate."
168
+ locked: true
169
+
170
+ postconditions:
171
+ # Dependency sync (use detected package manager)
172
+ install-after-pyproject:
173
+ trigger: PostToolUse
174
+ matcher: "Write|Edit"
175
+ file_pattern: "pyproject.toml"
176
+ run: "poetry install" # or "uv sync" if uv detected
177
+ timeout: 60000
178
+ block_on_failure: false
179
+
180
+ install-after-requirements:
181
+ trigger: PostToolUse
182
+ matcher: "Write|Edit"
183
+ file_pattern: "requirements*.txt"
184
+ run: "pip install -r {file_path}"
185
+ timeout: 60000
186
+ block_on_failure: false
187
+
188
+ # Lint on save (use detected linter: ruff, flake8, pylint)
189
+ lint-on-save:
190
+ trigger: PostToolUse
191
+ matcher: "Write|Edit"
192
+ file_pattern: "**/*.py"
193
+ run: "ruff check {file_path}" # or flake8/pylint
194
+ timeout: 15000
195
+ block_on_failure: false
196
+
197
+ # Format check on save (use detected formatter: ruff format, black)
198
+ format-check-on-save:
199
+ trigger: PostToolUse
200
+ matcher: "Write|Edit"
201
+ file_pattern: "**/*.py"
202
+ run: "ruff format --check {file_path}" # or "black --check {file_path}"
203
+ timeout: 10000
204
+ block_on_failure: false
205
+ ```
206
+
207
+ ## Go
208
+
209
+ ```yaml
210
+ permissions:
211
+ auto-approve-go:
212
+ trigger: PermissionRequest
213
+ matcher: Bash
214
+ command_pattern: "go"
215
+ decision: allow
216
+
217
+ # Build artifact protection
218
+ block-go-bin:
219
+ trigger: PreToolUse
220
+ matcher: "Write|Edit"
221
+ file_pattern: "bin/**"
222
+ decision: deny
223
+ message: "Do not edit compiled binaries. Run `go build` to regenerate."
224
+ locked: true
225
+
226
+ postconditions:
227
+ # Dependency sync
228
+ go-mod-tidy:
229
+ trigger: PostToolUse
230
+ matcher: "Write|Edit"
231
+ file_pattern: "go.mod"
232
+ run: "go mod tidy"
233
+ timeout: 30000
234
+ block_on_failure: false
235
+
236
+ # Build check on save
237
+ go-build-check:
238
+ trigger: PostToolUse
239
+ matcher: "Write|Edit"
240
+ file_pattern: "**/*.go"
241
+ run: "go build ./..."
242
+ timeout: 30000
243
+ block_on_failure: true
244
+
245
+ go-vet:
246
+ trigger: PostToolUse
247
+ matcher: "Write|Edit"
248
+ file_pattern: "**/*.go"
249
+ run: "go vet ./..."
250
+ timeout: 20000
251
+ block_on_failure: false
252
+ ```
253
+
254
+ ## Rust
255
+
256
+ ```yaml
257
+ permissions:
258
+ auto-approve-cargo:
259
+ trigger: PermissionRequest
260
+ matcher: Bash
261
+ command_pattern: "cargo"
262
+ decision: allow
263
+
264
+ # Lock file protection
265
+ block-cargo-lock:
266
+ trigger: PreToolUse
267
+ matcher: "Write|Edit"
268
+ file_pattern: "Cargo.lock"
269
+ decision: deny
270
+ message: "Do not edit Cargo.lock manually. Use `cargo update` to manage dependencies."
271
+ locked: true
272
+
273
+ # Build artifact protection
274
+ block-target:
275
+ trigger: PreToolUse
276
+ matcher: "Write|Edit"
277
+ file_pattern: "target/**"
278
+ decision: deny
279
+ message: "Do not edit target/. Run `cargo build` to regenerate."
280
+ locked: true
281
+
282
+ postconditions:
283
+ # Dependency check after manifest change
284
+ cargo-check-after-toml:
285
+ trigger: PostToolUse
286
+ matcher: "Write|Edit"
287
+ file_pattern: "Cargo.toml"
288
+ run: "cargo check"
289
+ timeout: 60000
290
+ block_on_failure: false
291
+
292
+ # Build check on save
293
+ cargo-check:
294
+ trigger: PostToolUse
295
+ matcher: "Write|Edit"
296
+ file_pattern: "**/*.rs"
297
+ run: "cargo check"
298
+ timeout: 60000
299
+ block_on_failure: true
300
+
301
+ # Lint on save
302
+ cargo-clippy:
303
+ trigger: PostToolUse
304
+ matcher: "Write|Edit"
305
+ file_pattern: "**/*.rs"
306
+ run: "cargo clippy -- -D warnings"
307
+ timeout: 60000
308
+ block_on_failure: false
309
+ ```
310
+
311
+ ## PHP
312
+
313
+ ```yaml
314
+ permissions:
315
+ auto-approve-composer:
316
+ trigger: PermissionRequest
317
+ matcher: Bash
318
+ command_pattern: "composer"
319
+ decision: allow
320
+
321
+ auto-approve-php:
322
+ trigger: PermissionRequest
323
+ matcher: Bash
324
+ command_pattern: "php"
325
+ decision: allow
326
+
327
+ # Lock file protection
328
+ block-composer-lock:
329
+ trigger: PreToolUse
330
+ matcher: "Write|Edit"
331
+ file_pattern: "composer.lock"
332
+ decision: deny
333
+ message: "Do not edit composer.lock manually. Use `composer install` or `composer update` to manage dependencies."
334
+ locked: true
335
+
336
+ # Build artifact protection
337
+ block-vendor:
338
+ trigger: PreToolUse
339
+ matcher: "Write|Edit"
340
+ file_pattern: "vendor/**"
341
+ decision: deny
342
+ message: "Do not edit vendor/ directly. Use composer to manage dependencies."
343
+ locked: true
344
+
345
+ postconditions:
346
+ # Dependency sync after manifest change
347
+ composer-install:
348
+ trigger: PostToolUse
349
+ matcher: "Write|Edit"
350
+ file_pattern: "composer.json"
351
+ run: "composer install"
352
+ timeout: 60000
353
+ block_on_failure: false
354
+ ```
355
+
356
+ ## Ruby
357
+
358
+ ```yaml
359
+ permissions:
360
+ auto-approve-bundle:
361
+ trigger: PermissionRequest
362
+ matcher: Bash
363
+ command_pattern: "bundle"
364
+ decision: allow
365
+
366
+ auto-approve-ruby:
367
+ trigger: PermissionRequest
368
+ matcher: Bash
369
+ command_pattern: "ruby"
370
+ decision: allow
371
+
372
+ auto-approve-rake:
373
+ trigger: PermissionRequest
374
+ matcher: Bash
375
+ command_pattern: "rake"
376
+ decision: allow
377
+
378
+ # Lock file protection
379
+ block-gemfile-lock:
380
+ trigger: PreToolUse
381
+ matcher: "Write|Edit"
382
+ file_pattern: "Gemfile.lock"
383
+ decision: deny
384
+ message: "Do not edit Gemfile.lock manually. Use `bundle install` to manage dependencies."
385
+ locked: true
386
+
387
+ postconditions:
388
+ # Dependency sync after manifest change
389
+ bundle-install:
390
+ trigger: PostToolUse
391
+ matcher: "Write|Edit"
392
+ file_pattern: "Gemfile"
393
+ run: "bundle install"
394
+ timeout: 60000
395
+ block_on_failure: false
396
+ ```
397
+
398
+ ## Java
399
+
400
+ ```yaml
401
+ permissions:
402
+ auto-approve-mvn:
403
+ trigger: PermissionRequest
404
+ matcher: Bash
405
+ command_pattern: "mvn"
406
+ decision: allow
407
+
408
+ auto-approve-gradle:
409
+ trigger: PermissionRequest
410
+ matcher: Bash
411
+ command_pattern: "gradle"
412
+ decision: allow
413
+
414
+ auto-approve-gradlew:
415
+ trigger: PermissionRequest
416
+ matcher: Bash
417
+ command_pattern: "./gradlew"
418
+ decision: allow
419
+
420
+ # Build artifact protection (Maven)
421
+ block-maven-target:
422
+ trigger: PreToolUse
423
+ matcher: "Write|Edit"
424
+ file_pattern: "target/**"
425
+ decision: deny
426
+ message: "Do not edit target/. Run `mvn compile` to regenerate."
427
+ locked: true
428
+
429
+ # Build artifact protection (Gradle)
430
+ block-gradle-build:
431
+ trigger: PreToolUse
432
+ matcher: "Write|Edit"
433
+ file_pattern: "build/**"
434
+ decision: deny
435
+ message: "Do not edit build/. Run `gradle build` to regenerate."
436
+ locked: true
437
+
438
+ postconditions:
439
+ # Dependency resolution after pom change (Maven)
440
+ mvn-resolve-deps:
441
+ trigger: PostToolUse
442
+ matcher: "Write|Edit"
443
+ file_pattern: "pom.xml"
444
+ run: "mvn dependency:resolve -q"
445
+ timeout: 120000
446
+ block_on_failure: false
447
+
448
+ # Dependency resolution after build.gradle change (Gradle)
449
+ gradle-resolve-deps:
450
+ trigger: PostToolUse
451
+ matcher: "Write|Edit"
452
+ file_pattern: "build.gradle*"
453
+ run: "./gradlew dependencies --quiet"
454
+ timeout: 120000
455
+ block_on_failure: false
456
+ ```
457
+
458
+ ## C# / .NET
459
+
460
+ ```yaml
461
+ permissions:
462
+ auto-approve-dotnet:
463
+ trigger: PermissionRequest
464
+ matcher: Bash
465
+ command_pattern: "dotnet"
466
+ decision: allow
467
+
468
+ # Build artifact protection
469
+ block-bin:
470
+ trigger: PreToolUse
471
+ matcher: "Write|Edit"
472
+ file_pattern: "bin/**"
473
+ decision: deny
474
+ message: "Do not edit bin/. Run `dotnet build` to regenerate."
475
+ locked: true
476
+
477
+ block-obj:
478
+ trigger: PreToolUse
479
+ matcher: "Write|Edit"
480
+ file_pattern: "obj/**"
481
+ decision: deny
482
+ message: "Do not edit obj/. Run `dotnet build` to regenerate."
483
+ locked: true
484
+
485
+ postconditions:
486
+ # Build check on save
487
+ dotnet-build:
488
+ trigger: PostToolUse
489
+ matcher: "Write|Edit"
490
+ file_pattern: "**/*.cs"
491
+ run: "dotnet build"
492
+ timeout: 60000
493
+ block_on_failure: true
494
+
495
+ # Dependency sync after csproj change
496
+ dotnet-restore:
497
+ trigger: PostToolUse
498
+ matcher: "Write|Edit"
499
+ file_pattern: "**/*.csproj"
500
+ run: "dotnet restore"
501
+ timeout: 60000
502
+ block_on_failure: false
503
+ ```
504
+
505
+ ## Elixir
506
+
507
+ ```yaml
508
+ permissions:
509
+ auto-approve-mix:
510
+ trigger: PermissionRequest
511
+ matcher: Bash
512
+ command_pattern: "mix"
513
+ decision: allow
514
+
515
+ auto-approve-iex:
516
+ trigger: PermissionRequest
517
+ matcher: Bash
518
+ command_pattern: "iex"
519
+ decision: allow
520
+
521
+ # Lock file protection
522
+ block-mix-lock:
523
+ trigger: PreToolUse
524
+ matcher: "Write|Edit"
525
+ file_pattern: "mix.lock"
526
+ decision: deny
527
+ message: "Do not edit mix.lock manually. Use `mix deps.get` to manage dependencies."
528
+ locked: true
529
+
530
+ # Build artifact protection
531
+ block-elixir-build:
532
+ trigger: PreToolUse
533
+ matcher: "Write|Edit"
534
+ file_pattern: "_build/**"
535
+ decision: deny
536
+ message: "Do not edit _build/. Run `mix compile` to regenerate."
537
+ locked: true
538
+
539
+ postconditions:
540
+ # Dependency sync after manifest change
541
+ mix-deps-get:
542
+ trigger: PostToolUse
543
+ matcher: "Write|Edit"
544
+ file_pattern: "mix.exs"
545
+ run: "mix deps.get"
546
+ timeout: 60000
547
+ block_on_failure: false
548
+
549
+ # Build check on save
550
+ mix-compile:
551
+ trigger: PostToolUse
552
+ matcher: "Write|Edit"
553
+ file_pattern: "**/*.ex"
554
+ run: "mix compile --warnings-as-errors"
555
+ timeout: 30000
556
+ block_on_failure: true
557
+ ```
558
+
559
+ ## Docker (Add if Dockerfile present)
560
+
561
+ ```yaml
562
+ permissions:
563
+ auto-approve-docker:
564
+ trigger: PermissionRequest
565
+ matcher: Bash
566
+ command_pattern: "docker"
567
+ decision: allow
568
+
569
+ auto-approve-docker-compose:
570
+ trigger: PermissionRequest
571
+ matcher: Bash
572
+ command_pattern: "docker compose"
573
+ decision: allow
574
+
575
+ block-system-prune:
576
+ trigger: PreToolUse
577
+ matcher: Bash
578
+ command_pattern: "docker system prune"
579
+ decision: deny
580
+ message: "docker system prune removes all unused data."
581
+
582
+ preconditions:
583
+ warn-dockerfile:
584
+ trigger: PreToolUse
585
+ matcher: "Write|Edit"
586
+ file_pattern: "Dockerfile"
587
+ message: "Dockerfile changes affect container builds and deployment. Rebuild and test locally."
588
+ priority: 60
589
+
590
+ warn-compose:
591
+ trigger: PreToolUse
592
+ matcher: "Write|Edit"
593
+ file_pattern: "docker-compose.yml" # or compose.yml
594
+ message: "Docker Compose changes affect service orchestration. Test with `docker compose up` after editing."
595
+ priority: 60
596
+ ```
@@ -0,0 +1,76 @@
1
+ import {
2
+ loadSkillSync
3
+ } from "./chunk-6OCEY7JY.js";
4
+ import "./chunk-7LXY5UVC.js";
5
+ import "./chunk-4VNS5WPM.js";
6
+
7
+ // src/commands/skills.ts
8
+ import * as fs from "fs";
9
+ import * as path from "path";
10
+ import chalk from "chalk";
11
+ async function runSkills(args, _projectDir) {
12
+ const subcommand = args[0];
13
+ switch (subcommand) {
14
+ case "list":
15
+ return listSkills();
16
+ case "get":
17
+ return getSkill(args[1]);
18
+ default:
19
+ console.log(`
20
+ Usage: ulpi skills <subcommand>
21
+
22
+ Subcommands:
23
+ list List available skills
24
+ get Show skill content
25
+ `.trim());
26
+ }
27
+ }
28
+ function listSkills() {
29
+ console.log(chalk.bold("\nBundled Skills:\n"));
30
+ const skillPaths = [
31
+ path.join(process.cwd(), ".ulpi", "skills")
32
+ ];
33
+ try {
34
+ let dir = path.dirname(new URL(import.meta.url).pathname);
35
+ for (let i = 0; i < 10; i++) {
36
+ const candidate = path.join(dir, "node_modules", "@ulpi", "templates-engine", "skills");
37
+ if (fs.existsSync(candidate)) {
38
+ skillPaths.push(candidate);
39
+ break;
40
+ }
41
+ dir = path.dirname(dir);
42
+ }
43
+ } catch {
44
+ }
45
+ let found = false;
46
+ for (const skillDir of skillPaths) {
47
+ if (!fs.existsSync(skillDir)) continue;
48
+ const files = fs.readdirSync(skillDir).filter((f) => f.endsWith(".md"));
49
+ for (const file of files) {
50
+ const name = file.replace(/\.md$/, "");
51
+ const content = fs.readFileSync(path.join(skillDir, file), "utf-8");
52
+ const firstLine = content.split("\n")[0]?.replace(/^#+\s*/, "") ?? name;
53
+ console.log(` ${chalk.cyan(name.padEnd(30))} ${firstLine}`);
54
+ found = true;
55
+ }
56
+ }
57
+ if (!found) {
58
+ console.log(chalk.dim(" No skills found."));
59
+ }
60
+ console.log("");
61
+ }
62
+ function getSkill(name) {
63
+ if (!name) {
64
+ console.log(chalk.red("Usage: ulpi skills get <name>"));
65
+ return;
66
+ }
67
+ const content = loadSkillSync(name, process.cwd());
68
+ if (content) {
69
+ console.log(content);
70
+ } else {
71
+ console.log(chalk.red(`Skill "${name}" not found`));
72
+ }
73
+ }
74
+ export {
75
+ runSkills
76
+ };