@xylabs/ts-scripts-yarn3 7.4.24 → 7.4.25

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.
@@ -1 +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 {\n readdirSync, readFileSync, statSync,\n} 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 = 'xy-'\nexport const LEGACY_COMMANDS_PREFIX = 'xylabs-'\nexport const XYLABS_SKILLS_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\n// Returns { 'xylabs-foo': { 'SKILL.md': '...', 'other.ts': '...' } }\nexport const claudeSkillTemplates = (): Record<string, Record<string, string>> => {\n const skillsDir = PATH.resolve(templatesDir, 'skills')\n const dirs = readdirSync(skillsDir).filter(\n f => f.startsWith(XYLABS_SKILLS_PREFIX) && statSync(PATH.resolve(skillsDir, f)).isDirectory(),\n )\n const result: Record<string, Record<string, string>> = {}\n for (const dir of dirs) {\n const dirPath = PATH.resolve(skillsDir, dir)\n const files = readdirSync(dirPath, { recursive: true, encoding: 'utf8' }) as string[]\n result[dir] = {}\n for (const file of files) {\n if (statSync(PATH.resolve(dirPath, file)).isFile()) {\n result[dir][file] = readFileSync(PATH.resolve(dirPath, file), 'utf8')\n }\n }\n }\n return result\n}\n\nexport const claudeMdProjectTemplate = (): string =>\n readFileSync(PATH.resolve(templatesDir, 'CLAUDE-project.md'), 'utf8')\n\nexport const claudeMdLocalTemplate = (): string =>\n readFileSync(PATH.resolve(templatesDir, 'CLAUDE-local.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 claudeCommandTemplates, LEGACY_COMMANDS_PREFIX, XYLABS_COMMANDS_PREFIX,\n} 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 removeLegacyCommands = (commandsDir: string): number => {\n const legacyFiles = readdirSync(commandsDir).filter(f => f.startsWith(LEGACY_COMMANDS_PREFIX) && f.endsWith('.md'))\n for (const file of legacyFiles) {\n unlinkSync(PATH.resolve(commandsDir, file))\n }\n return legacyFiles.length\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 legacy = removeLegacyCommands(commandsDir)\n const {\n created, templateNames, updated,\n } = syncCommandFiles(commandsDir)\n const removed = removeStaleCommands(commandsDir, templateNames)\n logCommandsResult(created, updated, removed + legacy)\n\n return 0\n}\n","import { spawnSync } from 'node:child_process'\nimport {\n existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport {\n claudeMdLocalTemplate, 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('Regenerating CLAUDE.md'))\n }\n console.log(chalk.green('Generating CLAUDE.md via claude /init...'))\n const result = spawnSync('claude', ['-p', '/init', '--allowedTools', 'Read', 'Write', 'Glob', 'Grep'], {\n cwd,\n shell: true,\n stdio: 'inherit',\n })\n if (result.status !== 0) {\n console.error(chalk.red('claude /init failed — is Claude Code installed?'))\n return 1\n }\n } else {\n console.log(chalk.gray('CLAUDE.md already exists (skipped, use --force to regenerate)'))\n }\n return 0\n}\n\nconst ensureLocalClaudeMd = (cwd: string) => {\n const localPath = PATH.resolve(cwd, 'CLAUDE.local.md')\n\n if (existsSync(localPath)) {\n console.log(chalk.gray('CLAUDE.local.md already exists (skipped)'))\n } else {\n writeFileSync(localPath, claudeMdLocalTemplate(), 'utf8')\n console.log(chalk.green('Generated CLAUDE.local.md'))\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 const claudeMdResult = ensureProjectClaudeMd(cwd, force)\n ensureLocalClaudeMd(cwd)\n\n return claudeMdResult ?? 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"]}
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 {\n readdirSync, readFileSync, statSync,\n} 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 = 'xy-'\nexport const LEGACY_COMMANDS_PREFIX = 'xylabs-'\nexport const XYLABS_SKILLS_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\n// Returns { 'xylabs-foo': { 'SKILL.md': '...', 'other.ts': '...' } }\nexport const claudeSkillTemplates = (): Record<string, Record<string, string>> => {\n const skillsDir = PATH.resolve(templatesDir, 'skills')\n const dirs = readdirSync(skillsDir).filter(\n f => f.startsWith(XYLABS_SKILLS_PREFIX) && statSync(PATH.resolve(skillsDir, f)).isDirectory(),\n )\n const result: Record<string, Record<string, string>> = {}\n for (const dir of dirs) {\n const dirPath = PATH.resolve(skillsDir, dir)\n const files = readdirSync(dirPath, { recursive: true, encoding: 'utf8' }) as string[]\n result[dir] = {}\n for (const file of files) {\n if (statSync(PATH.resolve(dirPath, file)).isFile()) {\n result[dir][file] = readFileSync(PATH.resolve(dirPath, file), 'utf8')\n }\n }\n }\n return result\n}\n\nexport const claudeMdProjectTemplate = (): string =>\n readFileSync(PATH.resolve(templatesDir, 'CLAUDE-project.md'), 'utf8')\n\nexport const claudeMdLocalTemplate = (): string =>\n readFileSync(PATH.resolve(templatesDir, 'CLAUDE-local.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 claudeCommandTemplates, LEGACY_COMMANDS_PREFIX, XYLABS_COMMANDS_PREFIX,\n} 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 removeLegacyCommands = (commandsDir: string): number => {\n const legacyFiles = readdirSync(commandsDir).filter(f => f.startsWith(LEGACY_COMMANDS_PREFIX) && f.endsWith('.md'))\n for (const file of legacyFiles) {\n unlinkSync(PATH.resolve(commandsDir, file))\n }\n return legacyFiles.length\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 legacy = removeLegacyCommands(commandsDir)\n const {\n created, templateNames, updated,\n } = syncCommandFiles(commandsDir)\n const removed = removeStaleCommands(commandsDir, templateNames)\n logCommandsResult(created, updated, removed + legacy)\n\n return 0\n}\n","import { spawnSync } from 'node:child_process'\nimport {\n existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport {\n claudeMdLocalTemplate, 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('Regenerating CLAUDE.md'))\n }\n console.log(chalk.green('Generating CLAUDE.md via claude /init...'))\n const result = spawnSync('claude', ['-p', '/init', '--allowedTools', 'Read', 'Write', 'Glob', 'Grep'], {\n cwd,\n shell: true,\n stdio: 'inherit',\n })\n if (result.status !== 0) {\n console.error(chalk.red('claude /init failed — is Claude Code installed?'))\n return 1\n }\n } else {\n console.log(chalk.gray('CLAUDE.md already exists (skipped, use --force to regenerate)'))\n }\n return 0\n}\n\nconst ensureLocalClaudeMd = (cwd: string) => {\n const localPath = PATH.resolve(cwd, 'CLAUDE.local.md')\n\n if (existsSync(localPath)) {\n console.log(chalk.gray('CLAUDE.local.md already exists (skipped)'))\n } else {\n writeFileSync(localPath, claudeMdLocalTemplate(), 'utf8')\n console.log(chalk.green('Generated CLAUDE.local.md'))\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 const claudeMdResult = ensureProjectClaudeMd(cwd, force)\n ensureLocalClaudeMd(cwd)\n\n return claudeMdResult ?? 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(grep *)',\n 'Bash(find *)',\n 'Bash(npm view *)',\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"]}
@@ -31,6 +31,9 @@ var DEFAULT_SETTINGS = {
31
31
  "Bash(echo *)",
32
32
  "Bash(pwd)",
33
33
  "Bash(which *)",
34
+ "Bash(grep *)",
35
+ "Bash(find *)",
36
+ "Bash(npm view *)",
34
37
  "Bash(gh *)",
35
38
  "Read",
36
39
  "Edit",
@@ -1 +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":[]}
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(grep *)',\n 'Bash(find *)',\n 'Bash(npm view *)',\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,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;;;ACzEO,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":[]}
@@ -767,6 +767,9 @@ var DEFAULT_SETTINGS = {
767
767
  "Bash(echo *)",
768
768
  "Bash(pwd)",
769
769
  "Bash(which *)",
770
+ "Bash(grep *)",
771
+ "Bash(find *)",
772
+ "Bash(npm view *)",
770
773
  "Bash(gh *)",
771
774
  "Read",
772
775
  "Edit",