@xylabs/ts-scripts-yarn3 7.4.18 → 7.4.19

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 (187) hide show
  1. package/README.body.md +86 -0
  2. package/README.md +108 -0
  3. package/dist/actions/claude-commands.mjs +1 -1
  4. package/dist/actions/claude-commands.mjs.map +1 -1
  5. package/dist/actions/claude-rules.mjs +1 -1
  6. package/dist/actions/claude-rules.mjs.map +1 -1
  7. package/dist/actions/compile.mjs.map +1 -1
  8. package/dist/actions/cycle.mjs.map +1 -1
  9. package/dist/actions/dead.mjs.map +1 -1
  10. package/dist/actions/deploy-major.mjs.map +1 -1
  11. package/dist/actions/deploy-minor.mjs.map +1 -1
  12. package/dist/actions/deploy-next.mjs.map +1 -1
  13. package/dist/actions/deploy.mjs.map +1 -1
  14. package/dist/actions/fix.mjs.map +1 -1
  15. package/dist/actions/gen-docs.mjs.map +1 -1
  16. package/dist/actions/index.mjs +146 -41
  17. package/dist/actions/index.mjs.map +1 -1
  18. package/dist/actions/knip.mjs.map +1 -1
  19. package/dist/actions/lint.mjs.map +1 -1
  20. package/dist/actions/publint.mjs.map +1 -1
  21. package/dist/actions/publish.mjs.map +1 -1
  22. package/dist/actions/readme-gen.mjs +136 -20
  23. package/dist/actions/readme-gen.mjs.map +1 -1
  24. package/dist/actions/readme-init.mjs +83 -0
  25. package/dist/actions/readme-init.mjs.map +1 -0
  26. package/dist/actions/rebuild.mjs.map +1 -1
  27. package/dist/actions/reinstall.mjs.map +1 -1
  28. package/dist/actions/relint.mjs.map +1 -1
  29. package/dist/actions/retest.mjs +2 -2
  30. package/dist/actions/retest.mjs.map +1 -1
  31. package/dist/actions/sonar.mjs.map +1 -1
  32. package/dist/actions/test.mjs.map +1 -1
  33. package/dist/actions/up.mjs.map +1 -1
  34. package/dist/actions/updo.mjs.map +1 -1
  35. package/dist/actions/upplug.mjs.map +1 -1
  36. package/dist/actions/upyarn.mjs.map +1 -1
  37. package/dist/bin/xy.mjs +817 -576
  38. package/dist/bin/xy.mjs.map +1 -1
  39. package/dist/index.d.ts +42 -13
  40. package/dist/index.mjs +820 -573
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/lib/claudeMdTemplate.mjs +1 -1
  43. package/dist/lib/claudeMdTemplate.mjs.map +1 -1
  44. package/dist/lib/generateReadmeFiles.mjs +118 -21
  45. package/dist/lib/generateReadmeFiles.mjs.map +1 -1
  46. package/dist/lib/index.mjs +120 -23
  47. package/dist/lib/index.mjs.map +1 -1
  48. package/dist/lib/runSteps.mjs.map +1 -1
  49. package/dist/lib/runXy.mjs.map +1 -1
  50. package/dist/xy/build/buildCommand.mjs +161 -0
  51. package/dist/xy/build/buildCommand.mjs.map +1 -0
  52. package/dist/xy/build/compileCommand.mjs +174 -0
  53. package/dist/xy/build/compileCommand.mjs.map +1 -0
  54. package/dist/xy/build/compileOnlyCommand.mjs +175 -0
  55. package/dist/xy/build/compileOnlyCommand.mjs.map +1 -0
  56. package/dist/xy/build/copyAssetsCommand.mjs +84 -0
  57. package/dist/xy/build/copyAssetsCommand.mjs.map +1 -0
  58. package/dist/xy/{xyBuildCommands.mjs → build/index.mjs} +111 -93
  59. package/dist/xy/build/index.mjs.map +1 -0
  60. package/dist/xy/build/rebuildCommand.mjs +114 -0
  61. package/dist/xy/build/rebuildCommand.mjs.map +1 -0
  62. package/dist/xy/build/recompileCommand.mjs +204 -0
  63. package/dist/xy/build/recompileCommand.mjs.map +1 -0
  64. package/dist/xy/common/claude/commandsCommand.mjs +107 -0
  65. package/dist/xy/common/claude/commandsCommand.mjs.map +1 -0
  66. package/dist/xy/common/claude/index.mjs +332 -0
  67. package/dist/xy/common/claude/index.mjs.map +1 -0
  68. package/dist/xy/common/claude/initCommand.mjs +283 -0
  69. package/dist/xy/common/claude/initCommand.mjs.map +1 -0
  70. package/dist/xy/common/claude/rulesCommand.mjs +129 -0
  71. package/dist/xy/common/claude/rulesCommand.mjs.map +1 -0
  72. package/dist/xy/common/claude/settingsCommand.mjs +90 -0
  73. package/dist/xy/common/claude/settingsCommand.mjs.map +1 -0
  74. package/dist/xy/common/cleanDocsCommand.mjs +45 -0
  75. package/dist/xy/common/cleanDocsCommand.mjs.map +1 -0
  76. package/dist/xy/common/deadCommand.mjs +116 -0
  77. package/dist/xy/common/deadCommand.mjs.map +1 -0
  78. package/dist/xy/common/genDocsCommand.mjs +125 -0
  79. package/dist/xy/common/genDocsCommand.mjs.map +1 -0
  80. package/dist/xy/common/gitignoreGenCommand.mjs +98 -0
  81. package/dist/xy/common/gitignoreGenCommand.mjs.map +1 -0
  82. package/dist/xy/common/gitlintCommand.mjs +82 -0
  83. package/dist/xy/common/gitlintCommand.mjs.map +1 -0
  84. package/dist/xy/{xyCommonCommands.mjs → common/index.mjs} +451 -241
  85. package/dist/xy/common/index.mjs.map +1 -0
  86. package/dist/xy/common/licenseCommand.mjs +100 -0
  87. package/dist/xy/common/licenseCommand.mjs.map +1 -0
  88. package/dist/xy/common/npmignoreGenCommand.mjs +98 -0
  89. package/dist/xy/common/npmignoreGenCommand.mjs.map +1 -0
  90. package/dist/xy/common/readme/genCommand.mjs +321 -0
  91. package/dist/xy/common/readme/genCommand.mjs.map +1 -0
  92. package/dist/xy/common/readme/index.mjs +361 -0
  93. package/dist/xy/common/readme/index.mjs.map +1 -0
  94. package/dist/xy/common/readme/initCommand.mjs +103 -0
  95. package/dist/xy/common/readme/initCommand.mjs.map +1 -0
  96. package/dist/xy/common/retestCommand.mjs +111 -0
  97. package/dist/xy/common/retestCommand.mjs.map +1 -0
  98. package/dist/xy/common/testCommand.mjs +108 -0
  99. package/dist/xy/common/testCommand.mjs.map +1 -0
  100. package/dist/xy/common/upplugCommand.mjs +113 -0
  101. package/dist/xy/common/upplugCommand.mjs.map +1 -0
  102. package/dist/xy/common/upyarnCommand.mjs +108 -0
  103. package/dist/xy/common/upyarnCommand.mjs.map +1 -0
  104. package/dist/xy/common/yarn3OnlyCommand.mjs +70 -0
  105. package/dist/xy/common/yarn3OnlyCommand.mjs.map +1 -0
  106. package/dist/xy/deploy/deployCommand.mjs +139 -0
  107. package/dist/xy/deploy/deployCommand.mjs.map +1 -0
  108. package/dist/xy/deploy/deployMajorCommand.mjs +139 -0
  109. package/dist/xy/deploy/deployMajorCommand.mjs.map +1 -0
  110. package/dist/xy/deploy/deployMinorCommand.mjs +139 -0
  111. package/dist/xy/deploy/deployMinorCommand.mjs.map +1 -0
  112. package/dist/xy/deploy/deployNextCommand.mjs +139 -0
  113. package/dist/xy/deploy/deployNextCommand.mjs.map +1 -0
  114. package/dist/xy/{xyDeployCommands.mjs → deploy/index.mjs} +53 -53
  115. package/dist/xy/deploy/index.mjs.map +1 -0
  116. package/dist/xy/deploy/publishCommand.mjs +108 -0
  117. package/dist/xy/deploy/publishCommand.mjs.map +1 -0
  118. package/dist/xy/index.mjs +817 -576
  119. package/dist/xy/index.mjs.map +1 -1
  120. package/dist/xy/install/cleanCommand.mjs +140 -0
  121. package/dist/xy/install/cleanCommand.mjs.map +1 -0
  122. package/dist/xy/install/dupdepsCommand.mjs +191 -0
  123. package/dist/xy/install/dupdepsCommand.mjs.map +1 -0
  124. package/dist/xy/{xyInstallCommands.mjs → install/index.mjs} +71 -68
  125. package/dist/xy/install/index.mjs.map +1 -0
  126. package/dist/xy/install/reinstallCommand.mjs +140 -0
  127. package/dist/xy/install/reinstallCommand.mjs.map +1 -0
  128. package/dist/xy/install/staticsCommand.mjs +191 -0
  129. package/dist/xy/install/staticsCommand.mjs.map +1 -0
  130. package/dist/{actions/clean-jest.mjs → xy/install/upCommand.mjs} +15 -6
  131. package/dist/xy/install/upCommand.mjs.map +1 -0
  132. package/dist/xy/install/updoCommand.mjs +112 -0
  133. package/dist/xy/install/updoCommand.mjs.map +1 -0
  134. package/dist/xy/lint/cycleCommand.mjs +163 -0
  135. package/dist/xy/lint/cycleCommand.mjs.map +1 -0
  136. package/dist/xy/lint/deplintCommand.mjs +814 -0
  137. package/dist/xy/lint/deplintCommand.mjs.map +1 -0
  138. package/dist/xy/lint/fixCommand.mjs +168 -0
  139. package/dist/xy/lint/fixCommand.mjs.map +1 -0
  140. package/dist/xy/{xyLintCommands.mjs → lint/index.mjs} +176 -145
  141. package/dist/xy/lint/index.mjs.map +1 -0
  142. package/dist/xy/lint/knipCommand.mjs +121 -0
  143. package/dist/xy/lint/knipCommand.mjs.map +1 -0
  144. package/dist/xy/lint/lintCommand.mjs +186 -0
  145. package/dist/xy/lint/lintCommand.mjs.map +1 -0
  146. package/dist/xy/lint/publintCommand.mjs +187 -0
  147. package/dist/xy/lint/publintCommand.mjs.map +1 -0
  148. package/dist/xy/lint/relintCommand.mjs +163 -0
  149. package/dist/xy/lint/relintCommand.mjs.map +1 -0
  150. package/dist/xy/lint/sonarCommand.mjs +121 -0
  151. package/dist/xy/lint/sonarCommand.mjs.map +1 -0
  152. package/dist/xy/xy.mjs +815 -574
  153. package/dist/xy/xy.mjs.map +1 -1
  154. package/package.json +2 -2
  155. package/templates/readme/README.body.md +11 -0
  156. package/templates/readme/README.template.md +22 -0
  157. package/dist/actions/clean-jest.mjs.map +0 -1
  158. package/dist/xy/xyBuildCommands.mjs.map +0 -1
  159. package/dist/xy/xyCommonCommands.mjs.map +0 -1
  160. package/dist/xy/xyDeployCommands.mjs.map +0 -1
  161. package/dist/xy/xyInstallCommands.mjs.map +0 -1
  162. package/dist/xy/xyLintCommands.mjs.map +0 -1
  163. /package/templates/{CLAUDE-project.md → claude/CLAUDE-project.md} +0 -0
  164. /package/templates/{commands → claude/commands}/xylabs-build.md +0 -0
  165. /package/templates/{commands → claude/commands}/xylabs-clean.md +0 -0
  166. /package/templates/{commands → claude/commands}/xylabs-compile.md +0 -0
  167. /package/templates/{commands → claude/commands}/xylabs-cycle.md +0 -0
  168. /package/templates/{commands → claude/commands}/xylabs-deplint.md +0 -0
  169. /package/templates/{commands → claude/commands}/xylabs-deploy-major.md +0 -0
  170. /package/templates/{commands → claude/commands}/xylabs-deploy-minor.md +0 -0
  171. /package/templates/{commands → claude/commands}/xylabs-deploy.md +0 -0
  172. /package/templates/{commands → claude/commands}/xylabs-fix.md +0 -0
  173. /package/templates/{commands → claude/commands}/xylabs-knip.md +0 -0
  174. /package/templates/{commands → claude/commands}/xylabs-lint.md +0 -0
  175. /package/templates/{commands → claude/commands}/xylabs-publint.md +0 -0
  176. /package/templates/{commands → claude/commands}/xylabs-rebuild.md +0 -0
  177. /package/templates/{commands → claude/commands}/xylabs-test.md +0 -0
  178. /package/templates/{rules → claude/rules}/xylabs-architecture.md +0 -0
  179. /package/templates/{rules → claude/rules}/xylabs-build.md +0 -0
  180. /package/templates/{rules → claude/rules}/xylabs-dependencies.md +0 -0
  181. /package/templates/{rules → claude/rules}/xylabs-error-handling.md +0 -0
  182. /package/templates/{rules → claude/rules}/xylabs-frameworks.md +0 -0
  183. /package/templates/{rules → claude/rules}/xylabs-git-workflow.md +0 -0
  184. /package/templates/{rules → claude/rules}/xylabs-linting.md +0 -0
  185. /package/templates/{rules → claude/rules}/xylabs-naming.md +0 -0
  186. /package/templates/{rules → claude/rules}/xylabs-style.md +0 -0
  187. /package/templates/{rules → claude/rules}/xylabs-typescript.md +0 -0
@@ -0,0 +1,283 @@
1
+ // src/lib/claudeMdTemplate.ts
2
+ import { readdirSync, readFileSync } from "fs";
3
+ import { createRequire } from "module";
4
+ import PATH from "path";
5
+ var require2 = createRequire(import.meta.url);
6
+ var packageRoot = PATH.dirname(require2.resolve("@xylabs/ts-scripts-yarn3/package.json"));
7
+ var templatesDir = PATH.resolve(packageRoot, "templates", "claude");
8
+ var XYLABS_RULES_PREFIX = "xylabs-";
9
+ var XYLABS_COMMANDS_PREFIX = "xylabs-";
10
+ var claudeMdRuleTemplates = () => {
11
+ const rulesDir = PATH.resolve(templatesDir, "rules");
12
+ const files = readdirSync(rulesDir).filter((f) => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith(".md"));
13
+ const result = {};
14
+ for (const file of files) {
15
+ result[file] = readFileSync(PATH.resolve(rulesDir, file), "utf8");
16
+ }
17
+ return result;
18
+ };
19
+ var claudeCommandTemplates = () => {
20
+ const commandsDir = PATH.resolve(templatesDir, "commands");
21
+ const files = readdirSync(commandsDir).filter((f) => f.startsWith(XYLABS_COMMANDS_PREFIX) && f.endsWith(".md"));
22
+ const result = {};
23
+ for (const file of files) {
24
+ result[file] = readFileSync(PATH.resolve(commandsDir, file), "utf8");
25
+ }
26
+ return result;
27
+ };
28
+ var claudeMdProjectTemplate = () => readFileSync(PATH.resolve(templatesDir, "CLAUDE-project.md"), "utf8");
29
+
30
+ // src/lib/yarn/yarnInitCwd.ts
31
+ var INIT_CWD = () => {
32
+ if (!process.env.INIT_CWD) console.error("Missing INIT_CWD");
33
+ return process.env.INIT_CWD;
34
+ };
35
+
36
+ // src/actions/claude-commands.ts
37
+ import {
38
+ existsSync,
39
+ mkdirSync,
40
+ readdirSync as readdirSync2,
41
+ readFileSync as readFileSync2,
42
+ unlinkSync,
43
+ writeFileSync
44
+ } from "fs";
45
+ import PATH2 from "path";
46
+ import chalk from "chalk";
47
+ var syncCommandFiles = (commandsDir) => {
48
+ const templates = claudeCommandTemplates();
49
+ const templateNames = new Set(Object.keys(templates));
50
+ let updated = 0;
51
+ let created = 0;
52
+ for (const [filename, content] of Object.entries(templates)) {
53
+ const targetPath = PATH2.resolve(commandsDir, filename);
54
+ const existing = existsSync(targetPath) ? readFileSync2(targetPath, "utf8") : void 0;
55
+ if (existing === content) continue;
56
+ writeFileSync(targetPath, content, "utf8");
57
+ if (existing) {
58
+ updated++;
59
+ } else {
60
+ created++;
61
+ }
62
+ }
63
+ return {
64
+ created,
65
+ templateNames,
66
+ updated
67
+ };
68
+ };
69
+ var removeStaleCommands = (commandsDir, templateNames) => {
70
+ const existingCommands = readdirSync2(commandsDir).filter((f) => f.startsWith(XYLABS_COMMANDS_PREFIX) && f.endsWith(".md"));
71
+ let removed = 0;
72
+ for (const file of existingCommands) {
73
+ if (!templateNames.has(file)) {
74
+ unlinkSync(PATH2.resolve(commandsDir, file));
75
+ removed++;
76
+ }
77
+ }
78
+ return removed;
79
+ };
80
+ var logCommandsResult = (created, updated, removed) => {
81
+ if (created || updated || removed) {
82
+ const parts = [
83
+ created ? `${created} created` : "",
84
+ updated ? `${updated} updated` : "",
85
+ removed ? `${removed} removed` : ""
86
+ ].filter(Boolean);
87
+ console.log(chalk.green(`.claude/commands/${XYLABS_COMMANDS_PREFIX}*.md: ${parts.join(", ")}`));
88
+ } else {
89
+ console.log(chalk.gray(`.claude/commands/${XYLABS_COMMANDS_PREFIX}*.md: already up to date`));
90
+ }
91
+ };
92
+ var claudeCommands = () => {
93
+ const cwd = INIT_CWD() ?? process.cwd();
94
+ const commandsDir = PATH2.resolve(cwd, ".claude", "commands");
95
+ mkdirSync(commandsDir, { recursive: true });
96
+ const {
97
+ created,
98
+ templateNames,
99
+ updated
100
+ } = syncCommandFiles(commandsDir);
101
+ const removed = removeStaleCommands(commandsDir, templateNames);
102
+ logCommandsResult(created, updated, removed);
103
+ return 0;
104
+ };
105
+
106
+ // src/actions/claude-rules.ts
107
+ import {
108
+ existsSync as existsSync2,
109
+ mkdirSync as mkdirSync2,
110
+ readdirSync as readdirSync3,
111
+ readFileSync as readFileSync3,
112
+ unlinkSync as unlinkSync2,
113
+ writeFileSync as writeFileSync2
114
+ } from "fs";
115
+ import PATH3 from "path";
116
+ import chalk2 from "chalk";
117
+ var syncRuleFiles = (rulesDir) => {
118
+ const templates = claudeMdRuleTemplates();
119
+ const templateNames = new Set(Object.keys(templates));
120
+ let updated = 0;
121
+ let created = 0;
122
+ for (const [filename, content] of Object.entries(templates)) {
123
+ const targetPath = PATH3.resolve(rulesDir, filename);
124
+ const existing = existsSync2(targetPath) ? readFileSync3(targetPath, "utf8") : void 0;
125
+ if (existing === content) continue;
126
+ writeFileSync2(targetPath, content, "utf8");
127
+ if (existing) {
128
+ updated++;
129
+ } else {
130
+ created++;
131
+ }
132
+ }
133
+ return {
134
+ created,
135
+ templateNames,
136
+ updated
137
+ };
138
+ };
139
+ var removeStaleRules = (rulesDir, templateNames) => {
140
+ const existingRules = readdirSync3(rulesDir).filter((f) => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith(".md"));
141
+ let removed = 0;
142
+ for (const file of existingRules) {
143
+ if (!templateNames.has(file)) {
144
+ unlinkSync2(PATH3.resolve(rulesDir, file));
145
+ removed++;
146
+ }
147
+ }
148
+ return removed;
149
+ };
150
+ var logRulesResult = (created, updated, removed) => {
151
+ if (created || updated || removed) {
152
+ const parts = [
153
+ created ? `${created} created` : "",
154
+ updated ? `${updated} updated` : "",
155
+ removed ? `${removed} removed` : ""
156
+ ].filter(Boolean);
157
+ console.log(chalk2.green(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: ${parts.join(", ")}`));
158
+ } else {
159
+ console.log(chalk2.gray(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: already up to date`));
160
+ }
161
+ };
162
+ var ensureProjectClaudeMd = (cwd, force) => {
163
+ const projectPath = PATH3.resolve(cwd, "CLAUDE.md");
164
+ if (!existsSync2(projectPath) || force) {
165
+ if (force && existsSync2(projectPath)) {
166
+ console.log(chalk2.yellow("Overwriting existing CLAUDE.md"));
167
+ }
168
+ writeFileSync2(projectPath, claudeMdProjectTemplate(), "utf8");
169
+ console.log(chalk2.green("Generated CLAUDE.md"));
170
+ } else {
171
+ console.log(chalk2.gray("CLAUDE.md already exists (skipped)"));
172
+ }
173
+ };
174
+ var claudeRules = ({ force } = {}) => {
175
+ const cwd = INIT_CWD() ?? process.cwd();
176
+ const rulesDir = PATH3.resolve(cwd, ".claude", "rules");
177
+ mkdirSync2(rulesDir, { recursive: true });
178
+ const {
179
+ created,
180
+ templateNames,
181
+ updated
182
+ } = syncRuleFiles(rulesDir);
183
+ const removed = removeStaleRules(rulesDir, templateNames);
184
+ logRulesResult(created, updated, removed);
185
+ ensureProjectClaudeMd(cwd, force);
186
+ return 0;
187
+ };
188
+
189
+ // src/actions/claude-settings.ts
190
+ import {
191
+ existsSync as existsSync3,
192
+ mkdirSync as mkdirSync3,
193
+ writeFileSync as writeFileSync3
194
+ } from "fs";
195
+ import PATH4 from "path";
196
+ import { createInterface } from "readline";
197
+ import chalk3 from "chalk";
198
+ var DEFAULT_SETTINGS = {
199
+ permissions: {
200
+ allow: [
201
+ "Bash(git *)",
202
+ "Bash(yarn *)",
203
+ "Bash(npx *)",
204
+ "Bash(node *)",
205
+ "Bash(ls *)",
206
+ "Bash(mkdir *)",
207
+ "Bash(cp *)",
208
+ "Bash(mv *)",
209
+ "Bash(rm *)",
210
+ "Bash(cat *)",
211
+ "Bash(head *)",
212
+ "Bash(tail *)",
213
+ "Bash(echo *)",
214
+ "Bash(pwd)",
215
+ "Bash(which *)",
216
+ "Bash(gh *)",
217
+ "Read",
218
+ "Edit",
219
+ "Write",
220
+ "Glob",
221
+ "Grep",
222
+ "Skill"
223
+ ],
224
+ deny: [
225
+ "Bash(git push --force*)",
226
+ "Bash(git reset --hard*)",
227
+ "Bash(rm -rf /*)"
228
+ ]
229
+ }
230
+ };
231
+ function askConfirmation(question) {
232
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
233
+ return new Promise((resolve) => {
234
+ rl.question(question, (answer) => {
235
+ rl.close();
236
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
237
+ });
238
+ });
239
+ }
240
+ async function claudeSettings() {
241
+ const cwd = INIT_CWD() ?? process.cwd();
242
+ const claudeDir = PATH4.resolve(cwd, ".claude");
243
+ const settingsPath = PATH4.resolve(claudeDir, "settings.local.json");
244
+ mkdirSync3(claudeDir, { recursive: true });
245
+ if (existsSync3(settingsPath)) {
246
+ const confirmed = await askConfirmation(
247
+ chalk3.yellow(`${settingsPath} already exists. Replace it? (y/N) `)
248
+ );
249
+ if (!confirmed) {
250
+ console.log(chalk3.gray("Skipped \u2014 existing settings.local.json preserved"));
251
+ return 0;
252
+ }
253
+ }
254
+ writeFileSync3(settingsPath, `${JSON.stringify(DEFAULT_SETTINGS, null, 2)}
255
+ `, "utf8");
256
+ console.log(chalk3.green("Generated .claude/settings.local.json"));
257
+ return 0;
258
+ }
259
+
260
+ // src/xy/common/claude/initCommand.ts
261
+ var initCommand = {
262
+ builder: (yargs) => {
263
+ return yargs.option("force", {
264
+ alias: "f",
265
+ default: false,
266
+ description: "Overwrite existing CLAUDE.md",
267
+ type: "boolean"
268
+ });
269
+ },
270
+ command: "init",
271
+ describe: "Initialize all Claude configuration (commands, rules, settings)",
272
+ handler: async (argv) => {
273
+ if (argv.verbose) console.log("Claude Init");
274
+ const commandsResult = claudeCommands();
275
+ const rulesResult = claudeRules({ force: argv.force });
276
+ const settingsResult = await claudeSettings();
277
+ process.exitCode = commandsResult || rulesResult || settingsResult;
278
+ }
279
+ };
280
+ export {
281
+ initCommand
282
+ };
283
+ //# sourceMappingURL=initCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/lib/claudeMdTemplate.ts","../../../../src/lib/yarn/yarnInitCwd.ts","../../../../src/actions/claude-commands.ts","../../../../src/actions/claude-rules.ts","../../../../src/actions/claude-settings.ts","../../../../src/xy/common/claude/initCommand.ts"],"sourcesContent":["import { readdirSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport PATH from 'node:path'\n\nconst require = createRequire(import.meta.url)\nconst packageRoot = PATH.dirname(require.resolve('@xylabs/ts-scripts-yarn3/package.json'))\nconst templatesDir = PATH.resolve(packageRoot, 'templates', 'claude')\n\nexport const XYLABS_RULES_PREFIX = 'xylabs-'\nexport const XYLABS_COMMANDS_PREFIX = 'xylabs-'\n\nexport const claudeMdRuleTemplates = (): Record<string, string> => {\n const rulesDir = PATH.resolve(templatesDir, 'rules')\n const files = readdirSync(rulesDir).filter(f => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith('.md'))\n const result: Record<string, string> = {}\n for (const file of files) {\n result[file] = readFileSync(PATH.resolve(rulesDir, file), 'utf8')\n }\n return result\n}\n\nexport const claudeCommandTemplates = (): Record<string, string> => {\n const commandsDir = PATH.resolve(templatesDir, 'commands')\n const files = readdirSync(commandsDir).filter(f => f.startsWith(XYLABS_COMMANDS_PREFIX) && f.endsWith('.md'))\n const result: Record<string, string> = {}\n for (const file of files) {\n result[file] = readFileSync(PATH.resolve(commandsDir, file), 'utf8')\n }\n return result\n}\n\nexport const claudeMdProjectTemplate = (): string =>\n readFileSync(PATH.resolve(templatesDir, 'CLAUDE-project.md'), 'utf8')\n","export const INIT_CWD = () => {\n if (!process.env.INIT_CWD) console.error('Missing INIT_CWD')\n return process.env.INIT_CWD\n}\n","import {\n existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport { claudeCommandTemplates, XYLABS_COMMANDS_PREFIX } from '../lib/index.ts'\nimport { INIT_CWD } from '../lib/yarn/index.ts'\n\nconst syncCommandFiles = (commandsDir: string) => {\n const templates = claudeCommandTemplates()\n const templateNames = new Set(Object.keys(templates))\n let updated = 0\n let created = 0\n\n for (const [filename, content] of Object.entries(templates)) {\n const targetPath = PATH.resolve(commandsDir, filename)\n const existing = existsSync(targetPath) ? readFileSync(targetPath, 'utf8') : undefined\n if (existing === content) continue\n writeFileSync(targetPath, content, 'utf8')\n if (existing) {\n updated++\n } else {\n created++\n }\n }\n\n return {\n created, templateNames, updated,\n }\n}\n\nconst removeStaleCommands = (commandsDir: string, templateNames: Set<string>) => {\n const existingCommands = readdirSync(commandsDir).filter(f => f.startsWith(XYLABS_COMMANDS_PREFIX) && f.endsWith('.md'))\n let removed = 0\n\n for (const file of existingCommands) {\n if (!templateNames.has(file)) {\n unlinkSync(PATH.resolve(commandsDir, file))\n removed++\n }\n }\n\n return removed\n}\n\nconst logCommandsResult = (created: number, updated: number, removed: number) => {\n if (created || updated || removed) {\n const parts = [\n created ? `${created} created` : '',\n updated ? `${updated} updated` : '',\n removed ? `${removed} removed` : '',\n ].filter(Boolean)\n console.log(chalk.green(`.claude/commands/${XYLABS_COMMANDS_PREFIX}*.md: ${parts.join(', ')}`))\n } else {\n console.log(chalk.gray(`.claude/commands/${XYLABS_COMMANDS_PREFIX}*.md: already up to date`))\n }\n}\n\nexport const claudeCommands = (): number => {\n const cwd = INIT_CWD() ?? process.cwd()\n const commandsDir = PATH.resolve(cwd, '.claude', 'commands')\n\n mkdirSync(commandsDir, { recursive: true })\n\n const {\n created, templateNames, updated,\n } = syncCommandFiles(commandsDir)\n const removed = removeStaleCommands(commandsDir, templateNames)\n logCommandsResult(created, updated, removed)\n\n return 0\n}\n","import {\n existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport {\n claudeMdProjectTemplate, claudeMdRuleTemplates, XYLABS_RULES_PREFIX,\n} from '../lib/index.ts'\nimport { INIT_CWD } from '../lib/yarn/index.ts'\n\nconst syncRuleFiles = (rulesDir: string) => {\n const templates = claudeMdRuleTemplates()\n const templateNames = new Set(Object.keys(templates))\n let updated = 0\n let created = 0\n\n for (const [filename, content] of Object.entries(templates)) {\n const targetPath = PATH.resolve(rulesDir, filename)\n const existing = existsSync(targetPath) ? readFileSync(targetPath, 'utf8') : undefined\n if (existing === content) continue\n writeFileSync(targetPath, content, 'utf8')\n if (existing) {\n updated++\n } else {\n created++\n }\n }\n\n return {\n created, templateNames, updated,\n }\n}\n\nconst removeStaleRules = (rulesDir: string, templateNames: Set<string>) => {\n const existingRules = readdirSync(rulesDir).filter(f => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith('.md'))\n let removed = 0\n\n for (const file of existingRules) {\n if (!templateNames.has(file)) {\n unlinkSync(PATH.resolve(rulesDir, file))\n removed++\n }\n }\n\n return removed\n}\n\nconst logRulesResult = (created: number, updated: number, removed: number) => {\n if (created || updated || removed) {\n const parts = [\n created ? `${created} created` : '',\n updated ? `${updated} updated` : '',\n removed ? `${removed} removed` : '',\n ].filter(Boolean)\n console.log(chalk.green(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: ${parts.join(', ')}`))\n } else {\n console.log(chalk.gray(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: already up to date`))\n }\n}\n\nconst ensureProjectClaudeMd = (cwd: string, force?: boolean) => {\n const projectPath = PATH.resolve(cwd, 'CLAUDE.md')\n\n if (!existsSync(projectPath) || force) {\n if (force && existsSync(projectPath)) {\n console.log(chalk.yellow('Overwriting existing CLAUDE.md'))\n }\n writeFileSync(projectPath, claudeMdProjectTemplate(), 'utf8')\n console.log(chalk.green('Generated CLAUDE.md'))\n } else {\n console.log(chalk.gray('CLAUDE.md already exists (skipped)'))\n }\n}\n\nexport const claudeRules = ({ force }: { force?: boolean } = {}): number => {\n const cwd = INIT_CWD() ?? process.cwd()\n const rulesDir = PATH.resolve(cwd, '.claude', 'rules')\n\n mkdirSync(rulesDir, { recursive: true })\n\n const {\n created, templateNames, updated,\n } = syncRuleFiles(rulesDir)\n const removed = removeStaleRules(rulesDir, templateNames)\n logRulesResult(created, updated, removed)\n ensureProjectClaudeMd(cwd, force)\n\n return 0\n}\n","import {\n existsSync, mkdirSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\nimport { createInterface } from 'node:readline'\n\nimport chalk from 'chalk'\n\nimport { INIT_CWD } from '../lib/yarn/index.ts'\n\nconst DEFAULT_SETTINGS = {\n permissions: {\n allow: [\n 'Bash(git *)',\n 'Bash(yarn *)',\n 'Bash(npx *)',\n 'Bash(node *)',\n 'Bash(ls *)',\n 'Bash(mkdir *)',\n 'Bash(cp *)',\n 'Bash(mv *)',\n 'Bash(rm *)',\n 'Bash(cat *)',\n 'Bash(head *)',\n 'Bash(tail *)',\n 'Bash(echo *)',\n 'Bash(pwd)',\n 'Bash(which *)',\n 'Bash(gh *)',\n 'Read',\n 'Edit',\n 'Write',\n 'Glob',\n 'Grep',\n 'Skill',\n ],\n deny: [\n 'Bash(git push --force*)',\n 'Bash(git reset --hard*)',\n 'Bash(rm -rf /*)',\n ],\n },\n}\n\nfunction askConfirmation(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes')\n })\n })\n}\n\nexport async function claudeSettings(): Promise<number> {\n const cwd = INIT_CWD() ?? process.cwd()\n const claudeDir = PATH.resolve(cwd, '.claude')\n const settingsPath = PATH.resolve(claudeDir, 'settings.local.json')\n\n mkdirSync(claudeDir, { recursive: true })\n\n if (existsSync(settingsPath)) {\n const confirmed = await askConfirmation(\n chalk.yellow(`${settingsPath} already exists. Replace it? (y/N) `),\n )\n if (!confirmed) {\n console.log(chalk.gray('Skipped — existing settings.local.json preserved'))\n return 0\n }\n }\n\n writeFileSync(settingsPath, `${JSON.stringify(DEFAULT_SETTINGS, null, 2)}\\n`, 'utf8')\n console.log(chalk.green('Generated .claude/settings.local.json'))\n return 0\n}\n","import type { CommandModule } from 'yargs'\n\nimport {\n claudeCommands, claudeRules, claudeSettings,\n} from '../../../actions/index.ts'\n\nexport const initCommand: CommandModule = {\n builder: (yargs) => {\n return yargs\n .option('force', {\n alias: 'f',\n default: false,\n description: 'Overwrite existing CLAUDE.md',\n type: 'boolean',\n })\n },\n command: 'init',\n describe: 'Initialize all Claude configuration (commands, rules, settings)',\n handler: async (argv) => {\n if (argv.verbose) console.log('Claude Init')\n const commandsResult = claudeCommands()\n const rulesResult = claudeRules({ force: argv.force as boolean | undefined })\n const settingsResult = await claudeSettings()\n process.exitCode = commandsResult || rulesResult || settingsResult\n },\n}\n"],"mappings":"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","names":["require","readdirSync","readFileSync","PATH","PATH","readFileSync","readdirSync","existsSync","mkdirSync","readdirSync","readFileSync","unlinkSync","writeFileSync","PATH","chalk","PATH","existsSync","readFileSync","writeFileSync","readdirSync","unlinkSync","chalk","mkdirSync","existsSync","mkdirSync","writeFileSync","PATH","chalk","PATH","mkdirSync","existsSync","chalk","writeFileSync"]}
@@ -0,0 +1,129 @@
1
+ // src/lib/claudeMdTemplate.ts
2
+ import { readdirSync, readFileSync } from "fs";
3
+ import { createRequire } from "module";
4
+ import PATH from "path";
5
+ var require2 = createRequire(import.meta.url);
6
+ var packageRoot = PATH.dirname(require2.resolve("@xylabs/ts-scripts-yarn3/package.json"));
7
+ var templatesDir = PATH.resolve(packageRoot, "templates", "claude");
8
+ var XYLABS_RULES_PREFIX = "xylabs-";
9
+ var claudeMdRuleTemplates = () => {
10
+ const rulesDir = PATH.resolve(templatesDir, "rules");
11
+ const files = readdirSync(rulesDir).filter((f) => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith(".md"));
12
+ const result = {};
13
+ for (const file of files) {
14
+ result[file] = readFileSync(PATH.resolve(rulesDir, file), "utf8");
15
+ }
16
+ return result;
17
+ };
18
+ var claudeMdProjectTemplate = () => readFileSync(PATH.resolve(templatesDir, "CLAUDE-project.md"), "utf8");
19
+
20
+ // src/lib/yarn/yarnInitCwd.ts
21
+ var INIT_CWD = () => {
22
+ if (!process.env.INIT_CWD) console.error("Missing INIT_CWD");
23
+ return process.env.INIT_CWD;
24
+ };
25
+
26
+ // src/actions/claude-rules.ts
27
+ import {
28
+ existsSync,
29
+ mkdirSync,
30
+ readdirSync as readdirSync2,
31
+ readFileSync as readFileSync2,
32
+ unlinkSync,
33
+ writeFileSync
34
+ } from "fs";
35
+ import PATH2 from "path";
36
+ import chalk from "chalk";
37
+ var syncRuleFiles = (rulesDir) => {
38
+ const templates = claudeMdRuleTemplates();
39
+ const templateNames = new Set(Object.keys(templates));
40
+ let updated = 0;
41
+ let created = 0;
42
+ for (const [filename, content] of Object.entries(templates)) {
43
+ const targetPath = PATH2.resolve(rulesDir, filename);
44
+ const existing = existsSync(targetPath) ? readFileSync2(targetPath, "utf8") : void 0;
45
+ if (existing === content) continue;
46
+ writeFileSync(targetPath, content, "utf8");
47
+ if (existing) {
48
+ updated++;
49
+ } else {
50
+ created++;
51
+ }
52
+ }
53
+ return {
54
+ created,
55
+ templateNames,
56
+ updated
57
+ };
58
+ };
59
+ var removeStaleRules = (rulesDir, templateNames) => {
60
+ const existingRules = readdirSync2(rulesDir).filter((f) => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith(".md"));
61
+ let removed = 0;
62
+ for (const file of existingRules) {
63
+ if (!templateNames.has(file)) {
64
+ unlinkSync(PATH2.resolve(rulesDir, file));
65
+ removed++;
66
+ }
67
+ }
68
+ return removed;
69
+ };
70
+ var logRulesResult = (created, updated, removed) => {
71
+ if (created || updated || removed) {
72
+ const parts = [
73
+ created ? `${created} created` : "",
74
+ updated ? `${updated} updated` : "",
75
+ removed ? `${removed} removed` : ""
76
+ ].filter(Boolean);
77
+ console.log(chalk.green(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: ${parts.join(", ")}`));
78
+ } else {
79
+ console.log(chalk.gray(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: already up to date`));
80
+ }
81
+ };
82
+ var ensureProjectClaudeMd = (cwd, force) => {
83
+ const projectPath = PATH2.resolve(cwd, "CLAUDE.md");
84
+ if (!existsSync(projectPath) || force) {
85
+ if (force && existsSync(projectPath)) {
86
+ console.log(chalk.yellow("Overwriting existing CLAUDE.md"));
87
+ }
88
+ writeFileSync(projectPath, claudeMdProjectTemplate(), "utf8");
89
+ console.log(chalk.green("Generated CLAUDE.md"));
90
+ } else {
91
+ console.log(chalk.gray("CLAUDE.md already exists (skipped)"));
92
+ }
93
+ };
94
+ var claudeRules = ({ force } = {}) => {
95
+ const cwd = INIT_CWD() ?? process.cwd();
96
+ const rulesDir = PATH2.resolve(cwd, ".claude", "rules");
97
+ mkdirSync(rulesDir, { recursive: true });
98
+ const {
99
+ created,
100
+ templateNames,
101
+ updated
102
+ } = syncRuleFiles(rulesDir);
103
+ const removed = removeStaleRules(rulesDir, templateNames);
104
+ logRulesResult(created, updated, removed);
105
+ ensureProjectClaudeMd(cwd, force);
106
+ return 0;
107
+ };
108
+
109
+ // src/xy/common/claude/rulesCommand.ts
110
+ var rulesCommand = {
111
+ builder: (yargs) => {
112
+ return yargs.option("force", {
113
+ alias: "f",
114
+ default: false,
115
+ description: "Overwrite existing CLAUDE.md",
116
+ type: "boolean"
117
+ });
118
+ },
119
+ command: "rules",
120
+ describe: "Sync XY Labs standard Claude rules to .claude/rules/",
121
+ handler: (argv) => {
122
+ if (argv.verbose) console.log("Claude Rules");
123
+ process.exitCode = claudeRules({ force: argv.force });
124
+ }
125
+ };
126
+ export {
127
+ rulesCommand
128
+ };
129
+ //# sourceMappingURL=rulesCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/lib/claudeMdTemplate.ts","../../../../src/lib/yarn/yarnInitCwd.ts","../../../../src/actions/claude-rules.ts","../../../../src/xy/common/claude/rulesCommand.ts"],"sourcesContent":["import { readdirSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport PATH from 'node:path'\n\nconst require = createRequire(import.meta.url)\nconst packageRoot = PATH.dirname(require.resolve('@xylabs/ts-scripts-yarn3/package.json'))\nconst templatesDir = PATH.resolve(packageRoot, 'templates', 'claude')\n\nexport const XYLABS_RULES_PREFIX = 'xylabs-'\nexport const XYLABS_COMMANDS_PREFIX = 'xylabs-'\n\nexport const claudeMdRuleTemplates = (): Record<string, string> => {\n const rulesDir = PATH.resolve(templatesDir, 'rules')\n const files = readdirSync(rulesDir).filter(f => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith('.md'))\n const result: Record<string, string> = {}\n for (const file of files) {\n result[file] = readFileSync(PATH.resolve(rulesDir, file), 'utf8')\n }\n return result\n}\n\nexport const claudeCommandTemplates = (): Record<string, string> => {\n const commandsDir = PATH.resolve(templatesDir, 'commands')\n const files = readdirSync(commandsDir).filter(f => f.startsWith(XYLABS_COMMANDS_PREFIX) && f.endsWith('.md'))\n const result: Record<string, string> = {}\n for (const file of files) {\n result[file] = readFileSync(PATH.resolve(commandsDir, file), 'utf8')\n }\n return result\n}\n\nexport const claudeMdProjectTemplate = (): string =>\n readFileSync(PATH.resolve(templatesDir, 'CLAUDE-project.md'), 'utf8')\n","export const INIT_CWD = () => {\n if (!process.env.INIT_CWD) console.error('Missing INIT_CWD')\n return process.env.INIT_CWD\n}\n","import {\n existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport {\n claudeMdProjectTemplate, claudeMdRuleTemplates, XYLABS_RULES_PREFIX,\n} from '../lib/index.ts'\nimport { INIT_CWD } from '../lib/yarn/index.ts'\n\nconst syncRuleFiles = (rulesDir: string) => {\n const templates = claudeMdRuleTemplates()\n const templateNames = new Set(Object.keys(templates))\n let updated = 0\n let created = 0\n\n for (const [filename, content] of Object.entries(templates)) {\n const targetPath = PATH.resolve(rulesDir, filename)\n const existing = existsSync(targetPath) ? readFileSync(targetPath, 'utf8') : undefined\n if (existing === content) continue\n writeFileSync(targetPath, content, 'utf8')\n if (existing) {\n updated++\n } else {\n created++\n }\n }\n\n return {\n created, templateNames, updated,\n }\n}\n\nconst removeStaleRules = (rulesDir: string, templateNames: Set<string>) => {\n const existingRules = readdirSync(rulesDir).filter(f => f.startsWith(XYLABS_RULES_PREFIX) && f.endsWith('.md'))\n let removed = 0\n\n for (const file of existingRules) {\n if (!templateNames.has(file)) {\n unlinkSync(PATH.resolve(rulesDir, file))\n removed++\n }\n }\n\n return removed\n}\n\nconst logRulesResult = (created: number, updated: number, removed: number) => {\n if (created || updated || removed) {\n const parts = [\n created ? `${created} created` : '',\n updated ? `${updated} updated` : '',\n removed ? `${removed} removed` : '',\n ].filter(Boolean)\n console.log(chalk.green(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: ${parts.join(', ')}`))\n } else {\n console.log(chalk.gray(`.claude/rules/${XYLABS_RULES_PREFIX}*.md: already up to date`))\n }\n}\n\nconst ensureProjectClaudeMd = (cwd: string, force?: boolean) => {\n const projectPath = PATH.resolve(cwd, 'CLAUDE.md')\n\n if (!existsSync(projectPath) || force) {\n if (force && existsSync(projectPath)) {\n console.log(chalk.yellow('Overwriting existing CLAUDE.md'))\n }\n writeFileSync(projectPath, claudeMdProjectTemplate(), 'utf8')\n console.log(chalk.green('Generated CLAUDE.md'))\n } else {\n console.log(chalk.gray('CLAUDE.md already exists (skipped)'))\n }\n}\n\nexport const claudeRules = ({ force }: { force?: boolean } = {}): number => {\n const cwd = INIT_CWD() ?? process.cwd()\n const rulesDir = PATH.resolve(cwd, '.claude', 'rules')\n\n mkdirSync(rulesDir, { recursive: true })\n\n const {\n created, templateNames, updated,\n } = syncRuleFiles(rulesDir)\n const removed = removeStaleRules(rulesDir, templateNames)\n logRulesResult(created, updated, removed)\n ensureProjectClaudeMd(cwd, force)\n\n return 0\n}\n","import type { CommandModule } from 'yargs'\n\nimport { claudeRules } from '../../../actions/index.ts'\n\nexport const rulesCommand: CommandModule = {\n builder: (yargs) => {\n return yargs\n .option('force', {\n alias: 'f',\n default: false,\n description: 'Overwrite existing CLAUDE.md',\n type: 'boolean',\n })\n },\n command: 'rules',\n describe: 'Sync XY Labs standard Claude rules to .claude/rules/',\n handler: (argv) => {\n if (argv.verbose) console.log('Claude Rules')\n process.exitCode = claudeRules({ force: argv.force as boolean | undefined })\n },\n}\n"],"mappings":"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","names":["require","readdirSync","readFileSync","PATH","PATH","readFileSync","readdirSync"]}
@@ -0,0 +1,90 @@
1
+ // src/lib/yarn/yarnInitCwd.ts
2
+ var INIT_CWD = () => {
3
+ if (!process.env.INIT_CWD) console.error("Missing INIT_CWD");
4
+ return process.env.INIT_CWD;
5
+ };
6
+
7
+ // src/actions/claude-settings.ts
8
+ import {
9
+ existsSync,
10
+ mkdirSync,
11
+ writeFileSync
12
+ } from "fs";
13
+ import PATH from "path";
14
+ import { createInterface } from "readline";
15
+ import chalk from "chalk";
16
+ var DEFAULT_SETTINGS = {
17
+ permissions: {
18
+ allow: [
19
+ "Bash(git *)",
20
+ "Bash(yarn *)",
21
+ "Bash(npx *)",
22
+ "Bash(node *)",
23
+ "Bash(ls *)",
24
+ "Bash(mkdir *)",
25
+ "Bash(cp *)",
26
+ "Bash(mv *)",
27
+ "Bash(rm *)",
28
+ "Bash(cat *)",
29
+ "Bash(head *)",
30
+ "Bash(tail *)",
31
+ "Bash(echo *)",
32
+ "Bash(pwd)",
33
+ "Bash(which *)",
34
+ "Bash(gh *)",
35
+ "Read",
36
+ "Edit",
37
+ "Write",
38
+ "Glob",
39
+ "Grep",
40
+ "Skill"
41
+ ],
42
+ deny: [
43
+ "Bash(git push --force*)",
44
+ "Bash(git reset --hard*)",
45
+ "Bash(rm -rf /*)"
46
+ ]
47
+ }
48
+ };
49
+ function askConfirmation(question) {
50
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
51
+ return new Promise((resolve) => {
52
+ rl.question(question, (answer) => {
53
+ rl.close();
54
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
55
+ });
56
+ });
57
+ }
58
+ async function claudeSettings() {
59
+ const cwd = INIT_CWD() ?? process.cwd();
60
+ const claudeDir = PATH.resolve(cwd, ".claude");
61
+ const settingsPath = PATH.resolve(claudeDir, "settings.local.json");
62
+ mkdirSync(claudeDir, { recursive: true });
63
+ if (existsSync(settingsPath)) {
64
+ const confirmed = await askConfirmation(
65
+ chalk.yellow(`${settingsPath} already exists. Replace it? (y/N) `)
66
+ );
67
+ if (!confirmed) {
68
+ console.log(chalk.gray("Skipped \u2014 existing settings.local.json preserved"));
69
+ return 0;
70
+ }
71
+ }
72
+ writeFileSync(settingsPath, `${JSON.stringify(DEFAULT_SETTINGS, null, 2)}
73
+ `, "utf8");
74
+ console.log(chalk.green("Generated .claude/settings.local.json"));
75
+ return 0;
76
+ }
77
+
78
+ // src/xy/common/claude/settingsCommand.ts
79
+ var settingsCommand = {
80
+ command: "settings",
81
+ describe: "Initialize .claude/settings.local.json with XY Labs defaults",
82
+ handler: async (argv) => {
83
+ if (argv.verbose) console.log("Claude Settings");
84
+ process.exitCode = await claudeSettings();
85
+ }
86
+ };
87
+ export {
88
+ settingsCommand
89
+ };
90
+ //# sourceMappingURL=settingsCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/lib/yarn/yarnInitCwd.ts","../../../../src/actions/claude-settings.ts","../../../../src/xy/common/claude/settingsCommand.ts"],"sourcesContent":["export const INIT_CWD = () => {\n if (!process.env.INIT_CWD) console.error('Missing INIT_CWD')\n return process.env.INIT_CWD\n}\n","import {\n existsSync, mkdirSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\nimport { createInterface } from 'node:readline'\n\nimport chalk from 'chalk'\n\nimport { INIT_CWD } from '../lib/yarn/index.ts'\n\nconst DEFAULT_SETTINGS = {\n permissions: {\n allow: [\n 'Bash(git *)',\n 'Bash(yarn *)',\n 'Bash(npx *)',\n 'Bash(node *)',\n 'Bash(ls *)',\n 'Bash(mkdir *)',\n 'Bash(cp *)',\n 'Bash(mv *)',\n 'Bash(rm *)',\n 'Bash(cat *)',\n 'Bash(head *)',\n 'Bash(tail *)',\n 'Bash(echo *)',\n 'Bash(pwd)',\n 'Bash(which *)',\n 'Bash(gh *)',\n 'Read',\n 'Edit',\n 'Write',\n 'Glob',\n 'Grep',\n 'Skill',\n ],\n deny: [\n 'Bash(git push --force*)',\n 'Bash(git reset --hard*)',\n 'Bash(rm -rf /*)',\n ],\n },\n}\n\nfunction askConfirmation(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes')\n })\n })\n}\n\nexport async function claudeSettings(): Promise<number> {\n const cwd = INIT_CWD() ?? process.cwd()\n const claudeDir = PATH.resolve(cwd, '.claude')\n const settingsPath = PATH.resolve(claudeDir, 'settings.local.json')\n\n mkdirSync(claudeDir, { recursive: true })\n\n if (existsSync(settingsPath)) {\n const confirmed = await askConfirmation(\n chalk.yellow(`${settingsPath} already exists. Replace it? (y/N) `),\n )\n if (!confirmed) {\n console.log(chalk.gray('Skipped — existing settings.local.json preserved'))\n return 0\n }\n }\n\n writeFileSync(settingsPath, `${JSON.stringify(DEFAULT_SETTINGS, null, 2)}\\n`, 'utf8')\n console.log(chalk.green('Generated .claude/settings.local.json'))\n return 0\n}\n","import type { CommandModule } from 'yargs'\n\nimport { claudeSettings } from '../../../actions/index.ts'\n\nexport const settingsCommand: CommandModule = {\n command: 'settings',\n describe: 'Initialize .claude/settings.local.json with XY Labs defaults',\n handler: async (argv) => {\n if (argv.verbose) console.log('Claude Settings')\n process.exitCode = await claudeSettings()\n },\n}\n"],"mappings":";AAAO,IAAM,WAAW,MAAM;AAC5B,MAAI,CAAC,QAAQ,IAAI,SAAU,SAAQ,MAAM,kBAAkB;AAC3D,SAAO,QAAQ,IAAI;AACrB;;;ACHA;AAAA,EACE;AAAA,EAAY;AAAA,EAAW;AAAA,OAClB;AACP,OAAO,UAAU;AACjB,SAAS,uBAAuB;AAEhC,OAAO,WAAW;AAIlB,IAAM,mBAAmB;AAAA,EACvB,aAAa;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,UAAoC;AAC3D,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,SAAG,MAAM;AACT,cAAQ,OAAO,YAAY,MAAM,OAAO,OAAO,YAAY,MAAM,KAAK;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,iBAAkC;AACtD,QAAM,MAAM,SAAS,KAAK,QAAQ,IAAI;AACtC,QAAM,YAAY,KAAK,QAAQ,KAAK,SAAS;AAC7C,QAAM,eAAe,KAAK,QAAQ,WAAW,qBAAqB;AAElE,YAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAExC,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAM,YAAY,MAAM;AAAA,MACtB,MAAM,OAAO,GAAG,YAAY,qCAAqC;AAAA,IACnE;AACA,QAAI,CAAC,WAAW;AACd,cAAQ,IAAI,MAAM,KAAK,uDAAkD,CAAC;AAC1E,aAAO;AAAA,IACT;AAAA,EACF;AAEA,gBAAc,cAAc,GAAG,KAAK,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACpF,UAAQ,IAAI,MAAM,MAAM,uCAAuC,CAAC;AAChE,SAAO;AACT;;;ACtEO,IAAM,kBAAiC;AAAA,EAC5C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,OAAO,SAAS;AACvB,QAAI,KAAK,QAAS,SAAQ,IAAI,iBAAiB;AAC/C,YAAQ,WAAW,MAAM,eAAe;AAAA,EAC1C;AACF;","names":[]}
@@ -0,0 +1,45 @@
1
+ // src/lib/deleteGlob.ts
2
+ import fs from "fs";
3
+ import { glob } from "glob";
4
+ var deleteGlob = (globPath) => {
5
+ const files = glob.sync(globPath);
6
+ for (const file of files) {
7
+ fs.rmSync(file, { recursive: true, force: true });
8
+ }
9
+ };
10
+
11
+ // src/lib/yarn/workspace/yarnWorkspaces.ts
12
+ import { spawnSync } from "child_process";
13
+ var yarnWorkspaces = () => {
14
+ const result = spawnSync("yarn", ["workspaces", "list", "--json", "--recursive"], { encoding: "utf8", shell: true });
15
+ if (result.error) {
16
+ throw result.error;
17
+ }
18
+ return result.stdout.toString().split("\n").slice(0, -1).map((item) => {
19
+ return JSON.parse(item);
20
+ });
21
+ };
22
+
23
+ // src/actions/clean-docs.ts
24
+ import path from "path";
25
+ import chalk from "chalk";
26
+ var cleanDocs = () => {
27
+ const pkgName = process.env.npm_package_name;
28
+ console.log(chalk.green(`Cleaning Docs [${pkgName}]`));
29
+ for (const { location } of yarnWorkspaces()) deleteGlob(path.join(location, "docs"));
30
+ return 0;
31
+ };
32
+
33
+ // src/xy/common/cleanDocsCommand.ts
34
+ var cleanDocsCommand = {
35
+ command: "clean-docs",
36
+ describe: "CleanDocs - Clean TypeDocs",
37
+ handler: (argv) => {
38
+ if (argv.verbose) console.log("Cleaning TypeDocs: all");
39
+ process.exitCode = cleanDocs();
40
+ }
41
+ };
42
+ export {
43
+ cleanDocsCommand
44
+ };
45
+ //# sourceMappingURL=cleanDocsCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/deleteGlob.ts","../../../src/lib/yarn/workspace/yarnWorkspaces.ts","../../../src/actions/clean-docs.ts","../../../src/xy/common/cleanDocsCommand.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { glob } from 'glob'\n\nexport const deleteGlob = (globPath: string) => {\n // Find all files matching the glob pattern\n const files = glob.sync(globPath)\n\n // Remove each file or directory\n for (const file of files) {\n fs.rmSync(file, { recursive: true, force: true })\n }\n}\n","import { spawnSync } from 'node:child_process'\n\nimport type { Workspace } from './Workspace.ts'\n\nexport const yarnWorkspaces = (): Workspace[] => {\n const result = spawnSync('yarn', ['workspaces', 'list', '--json', '--recursive'], { encoding: 'utf8', shell: true })\n if (result.error) {\n throw result.error\n }\n return (\n result.stdout\n .toString()\n // NOTE: This probably doesn't work on Windows\n // TODO: Replace /r/n with /n first\n .split('\\n')\n .slice(0, -1)\n .map((item) => {\n return JSON.parse(item)\n })\n )\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\n\nimport { deleteGlob, yarnWorkspaces } from '../lib/index.ts'\n\nexport const cleanDocs = () => {\n const pkgName = process.env.npm_package_name\n console.log(chalk.green(`Cleaning Docs [${pkgName}]`))\n for (const { location } of yarnWorkspaces()) deleteGlob(path.join(location, 'docs'))\n return 0\n}\n","import type { CommandModule } from 'yargs'\n\nimport { cleanDocs } from '../../actions/index.ts'\n\nexport const cleanDocsCommand: CommandModule = {\n command: 'clean-docs',\n describe: 'CleanDocs - Clean TypeDocs',\n handler: (argv) => {\n if (argv.verbose) console.log('Cleaning TypeDocs: all')\n process.exitCode = cleanDocs()\n },\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AAEf,SAAS,YAAY;AAEd,IAAM,aAAa,CAAC,aAAqB;AAE9C,QAAM,QAAQ,KAAK,KAAK,QAAQ;AAGhC,aAAW,QAAQ,OAAO;AACxB,OAAG,OAAO,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAClD;AACF;;;ACZA,SAAS,iBAAiB;AAInB,IAAM,iBAAiB,MAAmB;AAC/C,QAAM,SAAS,UAAU,QAAQ,CAAC,cAAc,QAAQ,UAAU,aAAa,GAAG,EAAE,UAAU,QAAQ,OAAO,KAAK,CAAC;AACnH,MAAI,OAAO,OAAO;AAChB,UAAM,OAAO;AAAA,EACf;AACA,SACE,OAAO,OACJ,SAAS,EAGT,MAAM,IAAI,EACV,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,SAAS;AACb,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,CAAC;AAEP;;;ACpBA,OAAO,UAAU;AAEjB,OAAO,WAAW;AAIX,IAAM,YAAY,MAAM;AAC7B,QAAM,UAAU,QAAQ,IAAI;AAC5B,UAAQ,IAAI,MAAM,MAAM,kBAAkB,OAAO,GAAG,CAAC;AACrD,aAAW,EAAE,SAAS,KAAK,eAAe,EAAG,YAAW,KAAK,KAAK,UAAU,MAAM,CAAC;AACnF,SAAO;AACT;;;ACPO,IAAM,mBAAkC;AAAA,EAC7C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,CAAC,SAAS;AACjB,QAAI,KAAK,QAAS,SAAQ,IAAI,wBAAwB;AACtD,YAAQ,WAAW,UAAU;AAAA,EAC/B;AACF;","names":[]}