@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,146 @@
1
+ import {
2
+ CLI_BIN_NAME,
3
+ getBinaryPath
4
+ } from "./chunk-7LXY5UVC.js";
5
+
6
+ // src/hooks-installer.ts
7
+ import * as fs from "fs";
8
+ import * as path from "path";
9
+ import * as os from "os";
10
+ function installHooks(projectDir) {
11
+ const settingsDir = path.join(projectDir, ".claude");
12
+ const settingsPath = path.join(settingsDir, "settings.local.json");
13
+ let settings = {};
14
+ if (fs.existsSync(settingsPath)) {
15
+ try {
16
+ settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
17
+ } catch {
18
+ }
19
+ }
20
+ const binary = getBinaryPath();
21
+ const hookEvents = {
22
+ PreToolUse: "pre-tool",
23
+ PostToolUse: "post-tool",
24
+ PermissionRequest: "permission",
25
+ Notification: "notification",
26
+ Stop: "stop",
27
+ SessionStart: "session-start",
28
+ SessionEnd: "session-end"
29
+ };
30
+ settings.hooks = settings.hooks ?? {};
31
+ for (const [event, handler] of Object.entries(hookEvents)) {
32
+ const hookCommand = `${binary} ${handler}`;
33
+ const existing = settings.hooks[event] ?? [];
34
+ const alreadyInstalled = existing.some(
35
+ (h) => h.hooks.some((cmd) => {
36
+ const cmdStr = typeof cmd === "string" ? cmd : cmd.command;
37
+ return cmdStr.includes(CLI_BIN_NAME);
38
+ })
39
+ );
40
+ if (!alreadyInstalled) {
41
+ existing.push({
42
+ matcher: "",
43
+ hooks: [{ type: "command", command: hookCommand }]
44
+ });
45
+ settings.hooks[event] = existing;
46
+ }
47
+ }
48
+ fs.mkdirSync(settingsDir, { recursive: true });
49
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
50
+ }
51
+ function findSkillSource() {
52
+ if (process.argv[1]) {
53
+ const entryDir = path.dirname(path.resolve(process.argv[1]));
54
+ const bundled = path.join(entryDir, "skills", "ulpi-generate-guardian");
55
+ if (fs.existsSync(bundled)) return bundled;
56
+ }
57
+ if (process.argv[1]) {
58
+ let dir = path.dirname(path.resolve(process.argv[1]));
59
+ for (let i = 0; i < 5; i++) {
60
+ dir = path.dirname(dir);
61
+ const candidate = path.join(dir, ".claude", "skills", "ulpi-generate-guardian");
62
+ if (fs.existsSync(candidate)) return candidate;
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+ function installGlobalSkill() {
68
+ const homeDir = os.homedir();
69
+ const globalSkillsDir = path.join(homeDir, ".claude", "skills", "ulpi-generate-guardian");
70
+ if (fs.existsSync(globalSkillsDir)) {
71
+ return { installed: false, message: "Skill already installed globally" };
72
+ }
73
+ const skillSource = findSkillSource();
74
+ if (!skillSource) {
75
+ return { installed: false, message: "Skill source not found" };
76
+ }
77
+ try {
78
+ fs.mkdirSync(path.dirname(globalSkillsDir), { recursive: true });
79
+ copyDirRecursive(skillSource, globalSkillsDir);
80
+ return { installed: true, message: `Installed /ulpi-generate-guardian skill globally to ${globalSkillsDir}` };
81
+ } catch (err) {
82
+ return { installed: false, message: `Failed to install skill: ${err instanceof Error ? err.message : String(err)}` };
83
+ }
84
+ }
85
+ function installLocalSkill(projectDir) {
86
+ const localSkillsDir = path.join(projectDir, ".claude", "skills", "ulpi-generate-guardian");
87
+ if (fs.existsSync(localSkillsDir)) {
88
+ return { installed: false, message: "Skill already installed locally" };
89
+ }
90
+ const skillSource = findSkillSource();
91
+ if (!skillSource) {
92
+ return { installed: false, message: "Skill source not found" };
93
+ }
94
+ try {
95
+ fs.mkdirSync(path.dirname(localSkillsDir), { recursive: true });
96
+ copyDirRecursive(skillSource, localSkillsDir);
97
+ return { installed: true, message: `Installed /ulpi-generate-guardian skill locally` };
98
+ } catch (err) {
99
+ return { installed: false, message: `Failed to install skill: ${err instanceof Error ? err.message : String(err)}` };
100
+ }
101
+ }
102
+ function copyDirRecursive(src, dest) {
103
+ fs.mkdirSync(dest, { recursive: true });
104
+ const entries = fs.readdirSync(src, { withFileTypes: true });
105
+ for (const entry of entries) {
106
+ const srcPath = path.join(src, entry.name);
107
+ const destPath = path.join(dest, entry.name);
108
+ if (entry.isDirectory()) {
109
+ copyDirRecursive(srcPath, destPath);
110
+ } else {
111
+ fs.copyFileSync(srcPath, destPath);
112
+ }
113
+ }
114
+ }
115
+ function uninstallHooks(projectDir) {
116
+ const settingsPath = path.join(projectDir, ".claude", "settings.local.json");
117
+ if (!fs.existsSync(settingsPath)) return;
118
+ try {
119
+ const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
120
+ if (settings.hooks) {
121
+ for (const [event, entries] of Object.entries(settings.hooks)) {
122
+ settings.hooks[event] = entries.filter(
123
+ (h) => !h.hooks.some((cmd) => {
124
+ const cmdStr = typeof cmd === "string" ? cmd : cmd.command;
125
+ return cmdStr.includes(CLI_BIN_NAME);
126
+ })
127
+ );
128
+ if (settings.hooks[event].length === 0) {
129
+ delete settings.hooks[event];
130
+ }
131
+ }
132
+ if (Object.keys(settings.hooks).length === 0) {
133
+ delete settings.hooks;
134
+ }
135
+ }
136
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
137
+ } catch {
138
+ }
139
+ }
140
+
141
+ export {
142
+ installHooks,
143
+ installGlobalSkill,
144
+ installLocalSkill,
145
+ uninstallHooks
146
+ };