squads-cli 0.2.1 → 0.2.2
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.
- package/dist/{autonomy-PSVZVX7A.js → autonomy-GARI6J2J.js} +4 -4
- package/dist/chunk-NP5BDPE6.js +240 -0
- package/dist/chunk-NP5BDPE6.js.map +1 -0
- package/dist/chunk-O632SBON.js +62 -0
- package/dist/chunk-O632SBON.js.map +1 -0
- package/dist/{chunk-QHNUMM4V.js → chunk-QRNR4GIT.js} +3 -2
- package/dist/chunk-QRNR4GIT.js.map +1 -0
- package/dist/chunk-XTHZT53Y.js +364 -0
- package/dist/chunk-XTHZT53Y.js.map +1 -0
- package/dist/cli.js +1026 -88
- package/dist/cli.js.map +1 -1
- package/dist/{context-GWPF4SEY.js → context-PYTO2UQG.js} +7 -7
- package/dist/{context-feed-AJGVAR6H.js → context-feed-TLVZZ24S.js} +15 -15
- package/dist/{cost-XBCDJ7XC.js → cost-OALPURUQ.js} +7 -7
- package/dist/{dashboard-LGT2B2BL.js → dashboard-HQIEHTZC.js} +14 -14
- package/dist/{doctor-XPUIIBHJ.js → doctor-TWHMR23W.js} +4 -4
- package/dist/{exec-OUXM7JBF.js → exec-DYLI4TXY.js} +2 -2
- package/dist/{feedback-KNAOG5QK.js → feedback-5AEACUX6.js} +8 -8
- package/dist/{goal-BVHV5573.js → goal-XUNV3CKV.js} +8 -8
- package/dist/{health-4UXN44PF.js → health-ZF3HSA4W.js} +4 -4
- package/dist/{history-ILH3SWHB.js → history-WP6R5BNG.js} +5 -5
- package/dist/history-WP6R5BNG.js.map +1 -0
- package/dist/{init-XQZ7BOGT.js → init-BQSCG57S.js} +115 -6
- package/dist/init-BQSCG57S.js.map +1 -0
- package/dist/{kpi-RQIU7WGK.js → kpi-VBGDO4GI.js} +6 -6
- package/dist/{learn-OIFUVZAS.js → learn-C4B2PQ5J.js} +8 -8
- package/dist/{login-DXZANWZY.js → login-F6ITE7PR.js} +7 -7
- package/dist/{memory-T3ACCS7E.js → memory-33HYD6AN.js} +11 -11
- package/dist/observability-CL23L7LD.js +20 -0
- package/dist/observability-CL23L7LD.js.map +1 -0
- package/dist/org-cycle-Q74OT4I4.js +130 -0
- package/dist/org-cycle-Q74OT4I4.js.map +1 -0
- package/dist/{progress-DAUZMT3N.js → progress-P2EIZBKP.js} +5 -5
- package/dist/{providers-3P5D2XL5.js → providers-LE744DM6.js} +2 -2
- package/dist/repo-enforcement-JJQMKDAU.js +75 -0
- package/dist/repo-enforcement-JJQMKDAU.js.map +1 -0
- package/dist/{results-UECWGLTB.js → results-6TH33HPN.js} +6 -6
- package/dist/{run-I6KAXU6U.js → run-DOY5SGF3.js} +3713 -3688
- package/dist/run-DOY5SGF3.js.map +1 -0
- package/dist/run-context-GB6GUCKZ.js +26 -0
- package/dist/run-context-GB6GUCKZ.js.map +1 -0
- package/dist/{status-AQNLDZVN.js → status-PFFB2NV6.js} +16 -16
- package/dist/{sync-ZI3MHA4G.js → sync-FR6LQJ4C.js} +12 -12
- package/dist/templates/seed/config/SYSTEM.md +6 -0
- package/dist/templates/seed/idp/catalog/service.yaml.template +25 -0
- package/dist/templates/seed/memory/_squad/goals.md +23 -0
- package/dist/templates/seed/memory/_squad/priorities.md +25 -0
- package/dist/templates/seed/memory/company/company.md +31 -0
- package/dist/templates/seed/skills/squads-cli/SKILL.md +302 -57
- package/dist/templates/seed/skills/squads-cli/references/commands.md +181 -0
- package/dist/templates/seed/squads/company/company-critic.md +12 -4
- package/dist/templates/seed/squads/company/company-eval.md +12 -4
- package/dist/templates/seed/squads/company/event-dispatcher.md +14 -4
- package/dist/templates/seed/squads/company/goal-tracker.md +12 -4
- package/dist/templates/seed/squads/company/manager.md +17 -11
- package/dist/templates/seed/squads/engineering/code-reviewer.md +14 -2
- package/dist/templates/seed/squads/engineering/issue-solver.md +10 -2
- package/dist/templates/seed/squads/engineering/test-writer.md +15 -5
- package/dist/templates/seed/squads/intelligence/intel-critic.md +19 -2
- package/dist/templates/seed/squads/intelligence/intel-eval.md +18 -1
- package/dist/templates/seed/squads/intelligence/intel-lead.md +12 -4
- package/dist/templates/seed/squads/marketing/content-drafter.md +14 -4
- package/dist/templates/seed/squads/marketing/growth-analyst.md +14 -2
- package/dist/templates/seed/squads/marketing/social-poster.md +15 -3
- package/dist/templates/seed/squads/operations/finance-tracker.md +11 -3
- package/dist/templates/seed/squads/operations/goal-tracker.md +14 -2
- package/dist/templates/seed/squads/operations/ops-lead.md +14 -4
- package/dist/templates/seed/squads/product/lead.md +11 -3
- package/dist/templates/seed/squads/product/scanner.md +12 -4
- package/dist/templates/seed/squads/product/worker.md +12 -4
- package/dist/templates/seed/squads/research/analyst.md +12 -4
- package/dist/templates/seed/squads/research/lead.md +11 -5
- package/dist/templates/seed/squads/research/synthesizer.md +12 -4
- package/dist/tier-detect-YX2HPNNR.js +15 -0
- package/dist/tier-detect-YX2HPNNR.js.map +1 -0
- package/package.json +1 -1
- package/templates/seed/config/SYSTEM.md +6 -0
- package/templates/seed/idp/catalog/service.yaml.template +25 -0
- package/templates/seed/memory/_squad/goals.md +23 -0
- package/templates/seed/memory/_squad/priorities.md +25 -0
- package/templates/seed/memory/company/company.md +31 -0
- package/templates/seed/skills/squads-cli/SKILL.md +302 -57
- package/templates/seed/skills/squads-cli/references/commands.md +181 -0
- package/templates/seed/squads/company/company-critic.md +12 -4
- package/templates/seed/squads/company/company-eval.md +12 -4
- package/templates/seed/squads/company/event-dispatcher.md +14 -4
- package/templates/seed/squads/company/goal-tracker.md +12 -4
- package/templates/seed/squads/company/manager.md +17 -11
- package/templates/seed/squads/engineering/code-reviewer.md +14 -2
- package/templates/seed/squads/engineering/issue-solver.md +10 -2
- package/templates/seed/squads/engineering/test-writer.md +15 -5
- package/templates/seed/squads/intelligence/intel-critic.md +19 -2
- package/templates/seed/squads/intelligence/intel-eval.md +18 -1
- package/templates/seed/squads/intelligence/intel-lead.md +12 -4
- package/templates/seed/squads/marketing/content-drafter.md +14 -4
- package/templates/seed/squads/marketing/growth-analyst.md +14 -2
- package/templates/seed/squads/marketing/social-poster.md +15 -3
- package/templates/seed/squads/operations/finance-tracker.md +11 -3
- package/templates/seed/squads/operations/goal-tracker.md +14 -2
- package/templates/seed/squads/operations/ops-lead.md +14 -4
- package/templates/seed/squads/product/lead.md +11 -3
- package/templates/seed/squads/product/scanner.md +12 -4
- package/templates/seed/squads/product/worker.md +12 -4
- package/templates/seed/squads/research/analyst.md +12 -4
- package/templates/seed/squads/research/lead.md +11 -5
- package/templates/seed/squads/research/synthesizer.md +12 -4
- package/dist/chunk-QHNUMM4V.js.map +0 -1
- package/dist/history-ILH3SWHB.js.map +0 -1
- package/dist/init-XQZ7BOGT.js.map +0 -1
- package/dist/run-I6KAXU6U.js.map +0 -1
- /package/dist/{autonomy-PSVZVX7A.js.map → autonomy-GARI6J2J.js.map} +0 -0
- /package/dist/{context-GWPF4SEY.js.map → context-PYTO2UQG.js.map} +0 -0
- /package/dist/{context-feed-AJGVAR6H.js.map → context-feed-TLVZZ24S.js.map} +0 -0
- /package/dist/{cost-XBCDJ7XC.js.map → cost-OALPURUQ.js.map} +0 -0
- /package/dist/{dashboard-LGT2B2BL.js.map → dashboard-HQIEHTZC.js.map} +0 -0
- /package/dist/{doctor-XPUIIBHJ.js.map → doctor-TWHMR23W.js.map} +0 -0
- /package/dist/{exec-OUXM7JBF.js.map → exec-DYLI4TXY.js.map} +0 -0
- /package/dist/{feedback-KNAOG5QK.js.map → feedback-5AEACUX6.js.map} +0 -0
- /package/dist/{goal-BVHV5573.js.map → goal-XUNV3CKV.js.map} +0 -0
- /package/dist/{health-4UXN44PF.js.map → health-ZF3HSA4W.js.map} +0 -0
- /package/dist/{kpi-RQIU7WGK.js.map → kpi-VBGDO4GI.js.map} +0 -0
- /package/dist/{learn-OIFUVZAS.js.map → learn-C4B2PQ5J.js.map} +0 -0
- /package/dist/{login-DXZANWZY.js.map → login-F6ITE7PR.js.map} +0 -0
- /package/dist/{memory-T3ACCS7E.js.map → memory-33HYD6AN.js.map} +0 -0
- /package/dist/{progress-DAUZMT3N.js.map → progress-P2EIZBKP.js.map} +0 -0
- /package/dist/{providers-3P5D2XL5.js.map → providers-LE744DM6.js.map} +0 -0
- /package/dist/{results-UECWGLTB.js.map → results-6TH33HPN.js.map} +0 -0
- /package/dist/{status-AQNLDZVN.js.map → status-PFFB2NV6.js.map} +0 -0
- /package/dist/{sync-ZI3MHA4G.js.map → sync-FR6LQJ4C.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts","../src/lib/setup-checks.ts"],"sourcesContent":["/**\n * squads init - Plant the seed\n *\n * Creates:\n * - Use-case specific squads (Engineering, Marketing, Operations, or all)\n * - CLI skill (teaches agents how to use squads CLI)\n * - Core squads (company + research + intelligence) for all use cases\n * - CLAUDE.md (operating manual for all Claude instances)\n * - BUSINESS_BRIEF.md (from user input)\n * - Memory directories (persistent state)\n * - Claude Code hooks (session tracking)\n */\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport { createInterface } from 'readline';\nimport { checkGitStatus, getRepoName } from '../lib/git.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport { existsSync, readFileSync } from 'fs';\nimport {\n loadTemplate,\n type TemplateVariables,\n} from '../lib/templates.js';\nimport {\n PROVIDERS,\n checkGhCli,\n runAuthChecks,\n displayCheckResults,\n} from '../lib/setup-checks.js';\nimport { writeLine } from '../lib/terminal.js';\n\nexport interface InitOptions {\n provider?: string;\n skipInfra?: boolean;\n force?: boolean;\n yes?: boolean;\n quick?: boolean;\n pack?: string[];\n}\n\ntype Provider = 'claude' | 'gemini' | 'openai' | 'ollama' | 'cursor' | 'aider' | 'none';\n\ntype UseCase = 'engineering' | 'marketing' | 'operations' | 'full-company' | 'custom';\n\n/**\n * Use-case configuration: squads, files, memory dirs, and display info\n */\ninterface UseCaseConfig {\n label: string;\n description: string;\n squads: SquadConfig[];\n}\n\ninterface SquadConfig {\n name: string;\n description: string;\n agentCount: number;\n agentSummary: string;\n dirs: string[];\n files: [string, string][]; // [destPath, templatePath]\n memoryFiles: [string, string][]; // [destPath, templatePath]\n}\n\n/**\n * Define what each use case creates\n */\nfunction getUseCaseConfig(useCase: UseCase): UseCaseConfig {\n const configs: Record<UseCase, UseCaseConfig> = {\n engineering: {\n label: 'Engineering',\n description: 'Ships code',\n squads: [getEngineeringSquad()],\n },\n marketing: {\n label: 'Marketing',\n description: 'Grows audience',\n squads: [getMarketingSquad()],\n },\n operations: {\n label: 'Operations',\n description: 'Runs the business',\n squads: [getOperationsSquad()],\n },\n 'full-company': {\n label: 'Full Company',\n description: 'Enterprise — Engineering + Marketing + Operations',\n squads: [getEngineeringSquad(), getMarketingSquad(), getOperationsSquad()],\n },\n custom: {\n label: 'Custom',\n description: 'Empty scaffold — you build from scratch',\n squads: [],\n },\n };\n\n return configs[useCase];\n}\n\nfunction getProductSquad(): SquadConfig {\n return {\n name: 'product',\n description: 'Roadmap, specs, user feedback synthesis',\n agentCount: 3,\n agentSummary: 'lead, scanner, worker',\n dirs: [\n '.agents/squads/product',\n '.agents/memory/product/lead',\n '.agents/memory/product/scanner',\n '.agents/memory/product/worker',\n ],\n files: [\n ['.agents/squads/product/SQUAD.md', 'squads/product/SQUAD.md'],\n ['.agents/squads/product/lead.md', 'squads/product/lead.md'],\n ['.agents/squads/product/scanner.md', 'squads/product/scanner.md'],\n ['.agents/squads/product/worker.md', 'squads/product/worker.md'],\n ],\n memoryFiles: [\n ['.agents/memory/product/lead/state.md', 'memory/product/lead/state.md'],\n ],\n };\n}\n\nfunction getEngineeringSquad(): SquadConfig {\n return {\n name: 'engineering',\n description: 'Solves GitHub issues, reviews code, writes tests',\n agentCount: 3,\n agentSummary: 'issue-solver, code-reviewer, test-writer',\n dirs: [\n '.agents/squads/engineering',\n '.agents/memory/engineering/issue-solver',\n '.agents/memory/engineering/code-reviewer',\n '.agents/memory/engineering/test-writer',\n ],\n files: [\n ['.agents/squads/engineering/SQUAD.md', 'squads/engineering/SQUAD.md'],\n ['.agents/squads/engineering/issue-solver.md', 'squads/engineering/issue-solver.md'],\n ['.agents/squads/engineering/code-reviewer.md', 'squads/engineering/code-reviewer.md'],\n ['.agents/squads/engineering/test-writer.md', 'squads/engineering/test-writer.md'],\n ],\n memoryFiles: [\n ['.agents/memory/engineering/issue-solver/state.md', 'memory/engineering/issue-solver/state.md'],\n ],\n };\n}\n\nfunction getMarketingSquad(): SquadConfig {\n return {\n name: 'marketing',\n description: 'Creates content, grows audience, tracks growth',\n agentCount: 3,\n agentSummary: 'content-drafter, social-poster, growth-analyst',\n dirs: [\n '.agents/squads/marketing',\n '.agents/memory/marketing/content-drafter',\n '.agents/memory/marketing/social-poster',\n '.agents/memory/marketing/growth-analyst',\n ],\n files: [\n ['.agents/squads/marketing/SQUAD.md', 'squads/marketing/SQUAD.md'],\n ['.agents/squads/marketing/content-drafter.md', 'squads/marketing/content-drafter.md'],\n ['.agents/squads/marketing/social-poster.md', 'squads/marketing/social-poster.md'],\n ['.agents/squads/marketing/growth-analyst.md', 'squads/marketing/growth-analyst.md'],\n ],\n memoryFiles: [\n ['.agents/memory/marketing/content-drafter/state.md', 'memory/marketing/content-drafter/state.md'],\n ],\n };\n}\n\nfunction getOperationsSquad(): SquadConfig {\n return {\n name: 'operations',\n description: 'Runs daily ops, tracks finances and goals',\n agentCount: 3,\n agentSummary: 'ops-lead, finance-tracker, goal-tracker',\n dirs: [\n '.agents/squads/operations',\n '.agents/memory/operations/ops-lead',\n '.agents/memory/operations/finance-tracker',\n '.agents/memory/operations/goal-tracker',\n ],\n files: [\n ['.agents/squads/operations/SQUAD.md', 'squads/operations/SQUAD.md'],\n ['.agents/squads/operations/ops-lead.md', 'squads/operations/ops-lead.md'],\n ['.agents/squads/operations/finance-tracker.md', 'squads/operations/finance-tracker.md'],\n ['.agents/squads/operations/goal-tracker.md', 'squads/operations/goal-tracker.md'],\n ],\n memoryFiles: [\n ['.agents/memory/operations/ops-lead/state.md', 'memory/operations/ops-lead/state.md'],\n ],\n };\n}\n\ninterface ProjectInfo {\n name: string;\n type: 'product' | 'domain';\n stack: string;\n repoName: string;\n buildCommand: string | null;\n testCommand: string | null;\n}\n\n/**\n * Auto-detect project metadata from the filesystem\n */\nfunction detectProjectInfo(cwd: string, gitStatus: { remoteUrl?: string }): ProjectInfo {\n const dirName = path.basename(cwd);\n\n // Name: from git remote (last segment) or directory name\n let name = dirName;\n let repoName = dirName;\n if (gitStatus.remoteUrl) {\n const full = getRepoName(gitStatus.remoteUrl);\n if (full) {\n repoName = full;\n name = full.includes('/') ? full.split('/')[1] : full;\n }\n }\n\n // Stack: detect from project files\n let stack = 'unknown';\n let type: 'product' | 'domain' = 'domain';\n let buildCommand: string | null = null;\n let testCommand: string | null = null;\n\n if (existsSync(path.join(cwd, 'package.json'))) {\n stack = 'node';\n type = 'product';\n buildCommand = 'npm run build';\n testCommand = 'npm test';\n // Check for specific frameworks\n try {\n const pkg = JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps['next']) stack = 'next';\n else if (deps['nuxt']) stack = 'nuxt';\n else if (deps['astro']) stack = 'astro';\n else if (deps['react']) stack = 'react';\n else if (deps['vue']) stack = 'vue';\n } catch { /* ignore */ }\n } else if (existsSync(path.join(cwd, 'go.mod'))) {\n stack = 'go';\n type = 'product';\n buildCommand = 'go build ./...';\n testCommand = 'go test ./...';\n } else if (\n existsSync(path.join(cwd, 'requirements.txt')) ||\n existsSync(path.join(cwd, 'pyproject.toml')) ||\n existsSync(path.join(cwd, 'setup.py'))\n ) {\n stack = 'python';\n type = 'product';\n testCommand = 'pytest';\n } else if (existsSync(path.join(cwd, 'Gemfile'))) {\n stack = 'ruby';\n type = 'product';\n testCommand = 'bundle exec rspec';\n } else if (existsSync(path.join(cwd, 'Cargo.toml'))) {\n stack = 'rust';\n type = 'product';\n buildCommand = 'cargo build';\n testCommand = 'cargo test';\n }\n\n return { name, type, stack, repoName, buildCommand, testCommand };\n}\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nasync function prompt(question: string, defaultValue = ''): Promise<string> {\n if (!isInteractive()) return defaultValue;\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n const suffix = defaultValue ? chalk.dim(` (${defaultValue})`) : '';\n rl.question(` ${question}${suffix} `, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue);\n });\n });\n}\n\nasync function promptProvider(forceProvider?: string): Promise<Provider> {\n if (forceProvider && forceProvider in PROVIDERS) {\n return forceProvider as Provider;\n }\n if (!isInteractive()) return 'claude';\n\n writeLine();\n writeLine(chalk.bold(' Select your AI assistant:'));\n writeLine();\n writeLine(` ${chalk.cyan('1)')} Claude Code ${chalk.dim('(recommended)')}`);\n writeLine(` ${chalk.cyan('2)')} Gemini`);\n writeLine(` ${chalk.cyan('3)')} OpenAI GPT`);\n writeLine(` ${chalk.cyan('4)')} Ollama ${chalk.dim('(local)')}`);\n writeLine(` ${chalk.cyan('5)')} Other/None`);\n writeLine();\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(` ${chalk.dim('Enter choice [1-5]:')} `, (answer) => {\n rl.close();\n const choice = answer.trim() || '1';\n switch (choice) {\n case '1': resolve('claude'); break;\n case '2': resolve('gemini'); break;\n case '3': resolve('openai'); break;\n case '4': resolve('ollama'); break;\n case '5': resolve('none'); break;\n default: resolve('claude'); break;\n }\n });\n });\n}\n\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load a seed template from templates/seed/\n * Falls back to bundled templates in dist/templates/seed/\n */\nfunction loadSeedTemplate(templatePath: string, variables: TemplateVariables = {}): string {\n // Try loading from seed directory\n return loadTemplate(`seed/${templatePath}`, variables);\n}\n\n/**\n * Write a file only if it doesn't already exist (safe for re-runs)\n */\nasync function writeIfNew(filePath: string, content: string): Promise<boolean> {\n if (await fileExists(filePath)) return false;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n return true;\n}\n\n/**\n * Write a file, creating directories as needed\n */\nasync function writeFile(filePath: string, content: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n}\n\n/**\n * Main init command - plant the seed\n */\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n // 1. Welcome\n writeLine();\n writeLine(chalk.bold(' Plant the seed for your AI workforce'));\n writeLine(chalk.dim(' https://agents-squads.com/docs/getting-started'));\n writeLine();\n\n // 2. Select provider\n const selectedProvider = await promptProvider(options.provider);\n const provider = PROVIDERS[selectedProvider];\n\n // 3. Prerequisite checks\n writeLine();\n writeLine(chalk.bold(' Checking prerequisites...'));\n writeLine();\n\n const checks = [\n ...runAuthChecks(selectedProvider),\n checkGhCli(),\n ];\n\n // Check Git\n const gitStatus = checkGitStatus(cwd);\n if (!gitStatus.isGitRepo) {\n checks.push({\n name: 'Git Repository',\n status: 'missing' as const,\n message: 'Git is the coordination layer',\n hint: 'Run: git init',\n fixCommand: 'git init',\n });\n } else {\n checks.push({ name: 'Git Repository', status: 'ok' as const });\n if (gitStatus.hasRemote) {\n const repoName = getRepoName(gitStatus.remoteUrl);\n checks.push({ name: `Remote: ${repoName || gitStatus.remoteUrl}`, status: 'ok' as const });\n }\n }\n\n const { hasErrors } = displayCheckResults(checks);\n\n if (hasErrors && !options.force) {\n writeLine();\n writeLine(chalk.red(' Fix the errors above before continuing.'));\n writeLine(chalk.dim(' Or run with --force to skip checks.'));\n writeLine();\n process.exit(1);\n }\n\n writeLine();\n\n // 4. Detect project info (used for IDP catalog)\n const projectInfo = detectProjectInfo(cwd, gitStatus);\n\n // Ask about the business\n let businessName: string;\n let businessDescription: string;\n let businessFocus: string;\n let businessCompetitors: string;\n let selectedUseCase: UseCase;\n\n if (options.yes || options.quick || !isInteractive()) {\n businessName = path.basename(cwd);\n businessDescription = 'A startup building and integrating AI smart capabilities for autonomous execution.';\n businessFocus = 'Track the big AI players — Anthropic, OpenAI, Google, Amazon, Meta, and xAI: latest model releases, API changes, pricing shifts, and strategic moves that affect builders.';\n businessCompetitors = '';\n selectedUseCase = 'custom'; // Core 4 squads only; use --pack for more\n } else {\n const dirName = path.basename(cwd);\n\n writeLine(chalk.bold(' Tell us about your business:'));\n writeLine(chalk.dim(' (Agents read this to produce useful output — be specific)'));\n writeLine();\n\n businessName = await prompt(\n 'Company or project name?',\n dirName\n );\n\n writeLine(chalk.dim(' e.g., \"We sell handmade coffee mugs online\" or \"B2B SaaS for construction teams\"'));\n businessDescription = await prompt(\n 'What does it do? (one sentence)',\n ''\n );\n // Require a non-empty description — empty = generic output on first run\n if (!businessDescription) {\n writeLine(chalk.dim(` Tip: Without a description, agents produce generic output. You can edit .agents/BUSINESS_BRIEF.md later.`));\n businessDescription = `${businessName} — add your business description to .agents/BUSINESS_BRIEF.md`;\n }\n\n writeLine();\n writeLine(chalk.dim(' e.g., \"Identify our top 3 competitors and what they do better than us\"'));\n businessFocus = await prompt(\n 'What should your agents research first?',\n 'Our market position, top competitors, and biggest growth opportunity'\n );\n\n writeLine();\n writeLine(chalk.dim(' e.g., \"BlueCart, MarketMan\" — leave blank to skip'));\n businessCompetitors = await prompt(\n 'Who are your main competitors? (optional)',\n ''\n );\n\n // 4b. Additional packs\n if (!options.pack) {\n writeLine();\n writeLine(chalk.bold(' Add squad packs? (optional)'));\n writeLine();\n writeLine(` ${chalk.cyan('1)')} Core only ${chalk.dim('— intelligence, research, product, company')} ${chalk.green('(recommended)')}`);\n writeLine(` ${chalk.cyan('2)')} + Engineering ${chalk.dim('— issue-solver, code-reviewer, test-writer')}`);\n writeLine(` ${chalk.cyan('3)')} + All packs ${chalk.dim('— engineering, marketing, operations')}`);\n writeLine();\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const packChoice = await new Promise<string>((resolve) => {\n rl.question(` ${chalk.dim('Enter choice [1-3]:')} `, (answer) => {\n rl.close();\n resolve(answer.trim() || '1');\n });\n });\n\n if (packChoice === '2') {\n options.pack = ['engineering'];\n } else if (packChoice === '3') {\n options.pack = ['all'];\n }\n }\n\n selectedUseCase = 'custom'; // Core 4 squads; packs handled separately\n }\n\n const useCaseConfig = getUseCaseConfig(selectedUseCase);\n\n // 4c. Pack support\n if (options.pack && options.pack.length > 0) {\n const additionalSquads: SquadConfig[] = [];\n for (const pack of options.pack) {\n if (pack === 'engineering') additionalSquads.push(getEngineeringSquad());\n if (pack === 'marketing') additionalSquads.push(getMarketingSquad());\n if (pack === 'operations') additionalSquads.push(getOperationsSquad());\n if (pack === 'all') {\n additionalSquads.push(getEngineeringSquad(), getMarketingSquad(), getOperationsSquad());\n }\n }\n // De-duplicate squads by name\n const existingNames = new Set(useCaseConfig.squads.map(s => s.name));\n for (const squad of additionalSquads) {\n if (!existingNames.has(squad.name)) {\n useCaseConfig.squads.push(squad);\n existingNames.add(squad.name);\n }\n }\n }\n\n // Calculate totals (core squads + use-case squads)\n const coreAgentCount = 14; // company(5) + research(3) + intelligence(3) + product(3)\n const coreSquadCount = 4;\n const useCaseAgentCount = useCaseConfig.squads.reduce((sum, s) => sum + s.agentCount, 0);\n const totalAgentCount = coreAgentCount + useCaseAgentCount;\n const totalSquadCount = coreSquadCount + useCaseConfig.squads.length;\n\n writeLine();\n writeLine(` ${chalk.green('✓')} Business: ${chalk.cyan(businessName)}${businessDescription ? chalk.dim(` — ${businessDescription}`) : ''}`);\n writeLine(` ${chalk.green('✓')} Provider: ${chalk.cyan(provider?.name || selectedProvider)}`);\n writeLine(` ${chalk.green('✓')} Research focus: ${chalk.cyan(businessFocus)}`);\n if (businessCompetitors) {\n writeLine(` ${chalk.green('✓')} Competitors: ${chalk.cyan(businessCompetitors)}`);\n }\n if (options.pack && options.pack.length > 0) {\n writeLine(` ${chalk.green('✓')} Packs: ${chalk.cyan(options.pack.join(', '))}`);\n }\n writeLine();\n\n // 5. Create the seed\n const spinner = ora('Planting the seed...').start();\n\n try {\n // Only show PLACEHOLDER sentinel when user skipped the description in interactive mode\n const isPlaceholder = businessDescription.includes('add your business description');\n const variables: TemplateVariables = {\n BUSINESS_NAME: businessName,\n BUSINESS_DESCRIPTION: businessDescription || `${businessName} — details to be added by the manager agent.`,\n BUSINESS_FOCUS: businessFocus,\n COMPETITORS_SECTION: businessCompetitors\n ? `## Competitors\\n\\n${businessCompetitors}\\n\\n`\n : '',\n PLACEHOLDER_SENTINEL: isPlaceholder\n ? '<!-- STATUS: PLACEHOLDER — Edit this file before running agents. -->\\n<!-- Agents that read \"PLACEHOLDER\" in this comment will ask you to fill it in. -->\\n\\n'\n : '',\n PROVIDER: selectedProvider,\n PROVIDER_NAME: provider?.name || 'Unknown',\n CURRENT_DATE: new Date().toISOString().split('T')[0],\n };\n\n // Core directories (always created)\n const dirs = [\n '.agents/squads/company',\n '.agents/squads/research',\n '.agents/squads/intelligence',\n '.agents/squads/product',\n '.agents/memory/company/manager',\n '.agents/memory/company/event-dispatcher',\n '.agents/memory/company/goal-tracker',\n '.agents/memory/company/company-eval',\n '.agents/memory/company/company-critic',\n '.agents/memory/research/lead',\n '.agents/memory/research/analyst',\n '.agents/memory/research/synthesizer',\n '.agents/memory/intelligence/intel-lead',\n '.agents/memory/intelligence/intel-eval',\n '.agents/memory/intelligence/intel-critic',\n '.agents/memory/product/lead',\n '.agents/skills/squads-cli',\n '.agents/skills/gh',\n '.agents/config',\n ];\n\n // Add use-case specific directories\n for (const squad of useCaseConfig.squads) {\n dirs.push(...squad.dirs);\n }\n\n if (selectedProvider === 'claude') {\n dirs.push('.claude');\n }\n\n for (const dir of dirs) {\n await fs.mkdir(path.join(cwd, dir), { recursive: true });\n }\n\n spinner.text = 'Creating squad definitions...';\n\n // Core squad files (always created)\n const companyFiles: [string, string][] = [\n ['.agents/squads/company/SQUAD.md', 'squads/company/SQUAD.md'],\n ['.agents/squads/company/manager.md', 'squads/company/manager.md'],\n ['.agents/squads/company/event-dispatcher.md', 'squads/company/event-dispatcher.md'],\n ['.agents/squads/company/goal-tracker.md', 'squads/company/goal-tracker.md'],\n ['.agents/squads/company/company-eval.md', 'squads/company/company-eval.md'],\n ['.agents/squads/company/company-critic.md', 'squads/company/company-critic.md'],\n ];\n\n const researchFiles: [string, string][] = [\n ['.agents/squads/research/SQUAD.md', 'squads/research/SQUAD.md'],\n ['.agents/squads/research/lead.md', 'squads/research/lead.md'],\n ['.agents/squads/research/analyst.md', 'squads/research/analyst.md'],\n ['.agents/squads/research/synthesizer.md', 'squads/research/synthesizer.md'],\n ];\n\n const intelligenceFiles: [string, string][] = [\n ['.agents/squads/intelligence/SQUAD.md', 'squads/intelligence/SQUAD.md'],\n ['.agents/squads/intelligence/intel-lead.md', 'squads/intelligence/intel-lead.md'],\n ['.agents/squads/intelligence/intel-eval.md', 'squads/intelligence/intel-eval.md'],\n ['.agents/squads/intelligence/intel-critic.md', 'squads/intelligence/intel-critic.md'],\n ];\n\n const productFiles: [string, string][] = getProductSquad().files;\n\n // Collect all use-case squad files\n const useCaseFiles: [string, string][] = [];\n for (const squad of useCaseConfig.squads) {\n useCaseFiles.push(...squad.files);\n }\n\n // Write all squad files\n for (const [dest, template] of [...companyFiles, ...researchFiles, ...intelligenceFiles, ...productFiles, ...useCaseFiles]) {\n const content = loadSeedTemplate(template, variables);\n await writeFile(path.join(cwd, dest), content);\n }\n\n spinner.text = 'Creating memory and config...';\n\n // Core memory state files\n const coreMemoryFiles: [string, string][] = [\n ['.agents/memory/company/manager/state.md', 'memory/company/manager/state.md'],\n ['.agents/memory/research/lead/state.md', 'memory/research/lead/state.md'],\n ['.agents/memory/intelligence/intel-lead/state.md', 'memory/intelligence/intel-lead/state.md'],\n ['.agents/memory/product/lead/state.md', 'memory/product/lead/state.md'],\n ];\n\n // Use-case memory state files\n const useCaseMemoryFiles: [string, string][] = [];\n for (const squad of useCaseConfig.squads) {\n useCaseMemoryFiles.push(...squad.memoryFiles);\n }\n\n for (const [dest, template] of [...coreMemoryFiles, ...useCaseMemoryFiles]) {\n await writeIfNew(path.join(cwd, dest), loadSeedTemplate(template, variables));\n }\n\n // Squad-level priorities and goals (all squads including use-case squads)\n const reviewDate = new Date();\n reviewDate.setDate(reviewDate.getDate() + 14);\n const allSquads = [\n { name: 'company', label: 'Company', lead: 'manager' },\n { name: 'research', label: 'Research', lead: 'lead' },\n { name: 'intelligence', label: 'Intelligence', lead: 'intel-lead' },\n { name: 'product', label: 'Product', lead: 'lead' },\n ...useCaseConfig.squads.map(s => ({\n name: s.name,\n label: s.name.charAt(0).toUpperCase() + s.name.slice(1),\n lead: s.agentSummary.split(',')[0].trim(),\n })),\n ];\n for (const squad of allSquads) {\n const squadVars: TemplateVariables = {\n ...variables,\n SQUAD_NAME: squad.name,\n SQUAD_LABEL: squad.label,\n SQUAD_LEAD: squad.lead,\n REVIEW_DATE: reviewDate.toISOString().split('T')[0],\n };\n await writeIfNew(\n path.join(cwd, `.agents/memory/${squad.name}/priorities.md`),\n loadSeedTemplate('memory/_squad/priorities.md', squadVars),\n );\n await writeIfNew(\n path.join(cwd, `.agents/memory/${squad.name}/goals.md`),\n loadSeedTemplate('memory/_squad/goals.md', squadVars),\n );\n }\n\n // Skills\n const skillContent = loadSeedTemplate('skills/squads-cli/SKILL.md', variables);\n await writeFile(path.join(cwd, '.agents/skills/squads-cli/SKILL.md'), skillContent);\n\n const skillRefContent = loadSeedTemplate('skills/squads-cli/references/commands.md', variables);\n await writeFile(path.join(cwd, '.agents/skills/squads-cli/references/commands.md'), skillRefContent);\n\n const ghSkillContent = loadSeedTemplate('skills/gh/SKILL.md', variables);\n await writeFile(path.join(cwd, '.agents/skills/gh/SKILL.md'), ghSkillContent);\n\n // Provider config\n const providerConfig = loadSeedTemplate('config/provider.yaml', variables);\n await writeFile(path.join(cwd, '.agents/config/provider.yaml'), providerConfig);\n\n // System protocol (Layer 0 of context cascade)\n const systemMd = loadSeedTemplate('config/SYSTEM.md', variables);\n await writeFile(path.join(cwd, '.agents/config/SYSTEM.md'), systemMd);\n\n // IDP catalog entry (only if .agents/idp/ doesn't already exist)\n const idpCatalogDir = path.join(cwd, '.agents', 'idp', 'catalog');\n if (!existsSync(idpCatalogDir)) {\n const ownerSquad = useCaseConfig.squads[0]?.name || 'engineering';\n const isProduct = projectInfo.type === 'product';\n const idpVariables: TemplateVariables = {\n ...variables,\n SERVICE_NAME: projectInfo.name,\n SERVICE_TYPE: projectInfo.type,\n SERVICE_STACK: projectInfo.stack,\n SERVICE_SCORECARD: isProduct ? 'product' : 'domain',\n REPO_NAME: projectInfo.repoName,\n OWNER_SQUAD: ownerSquad,\n BRANCHES_WORKFLOW: isProduct ? 'pr-to-develop' : 'direct-to-main',\n BRANCHES_DEVELOPMENT: isProduct ? 'develop' : '',\n CI_TEMPLATE: isProduct ? projectInfo.stack : 'null',\n BUILD_COMMAND: projectInfo.buildCommand ?? 'null',\n TEST_COMMAND: projectInfo.testCommand ?? 'null',\n };\n const catalogContent = loadSeedTemplate('idp/catalog/service.yaml.template', idpVariables);\n await writeFile(path.join(idpCatalogDir, `${projectInfo.name}.yaml`), catalogContent);\n }\n\n // Company context (Layer 1 of context cascade)\n const companyMd = loadSeedTemplate('memory/company/company.md', variables);\n await writeIfNew(path.join(cwd, '.agents/memory/company/company.md'), companyMd);\n\n // Directives (Layer 3 of context cascade)\n const directivesMd = loadSeedTemplate('memory/company/directives.md', variables);\n await writeIfNew(path.join(cwd, '.agents/memory/company/directives.md'), directivesMd);\n\n // Business brief\n const businessBrief = loadSeedTemplate('BUSINESS_BRIEF.md.template', variables);\n await writeFile(path.join(cwd, '.agents/BUSINESS_BRIEF.md'), businessBrief);\n\n // AGENTS.md (repo root — vendor-neutral agent instructions)\n const agentsMd = loadTemplate('core/AGENTS.md.template', variables);\n await writeIfNew(path.join(cwd, 'AGENTS.md'), agentsMd);\n\n // README.md (only if it doesn't already exist or is the default single-line stub)\n const readmePath = path.join(cwd, 'README.md');\n let existingReadme = '';\n try {\n existingReadme = await fs.readFile(readmePath, 'utf-8');\n } catch {\n // File doesn't exist\n }\n const isStub = existingReadme.trim() === '' || /^# [^\\n]+\\s*$/.test(existingReadme.trim());\n if (isStub) {\n const readmeContent = loadSeedTemplate('README.md.template', variables);\n await writeFile(readmePath, readmeContent);\n }\n\n spinner.text = 'Setting up operating manual...';\n\n // CLAUDE.md (the operating manual — only if it doesn't exist)\n if (selectedProvider === 'claude') {\n const claudeMd = loadSeedTemplate('CLAUDE.md.template', variables);\n await writeIfNew(path.join(cwd, 'CLAUDE.md'), claudeMd);\n\n // Claude Code hooks\n const hooksContent = loadSeedTemplate('hooks/settings.json.template', variables);\n await writeIfNew(path.join(cwd, '.claude/settings.json'), hooksContent);\n }\n\n spinner.succeed('Seed planted');\n\n // Track initialization\n await track(Events.CLI_INIT, {\n success: true,\n hasGit: gitStatus.isGitRepo,\n hasRemote: gitStatus.hasRemote,\n provider: selectedProvider,\n useCase: selectedUseCase,\n agentCount: totalAgentCount,\n squadCount: totalSquadCount,\n hasBusinessName: businessName !== path.basename(cwd),\n hasBusinessDescription: businessDescription.length > 0,\n });\n\n } catch (error) {\n spinner.fail('Failed to plant the seed');\n const err = error as NodeJS.ErrnoException;\n if (err?.code === 'EACCES' || err?.code === 'EPERM') {\n writeLine(chalk.red(' Permission denied — cannot write to this directory.'));\n writeLine(chalk.dim(' Try running in a directory you own, or check folder permissions.'));\n } else if (err?.code === 'ENOENT') {\n writeLine(chalk.red(` Could not find or create: ${err.path || 'unknown path'}`));\n writeLine(chalk.dim(' Check that the directory exists and you have write access.'));\n } else {\n const msg = error instanceof Error ? error.message : String(error);\n writeLine(chalk.red(` ${msg}`));\n writeLine(chalk.dim(' Run with --verbose for more details, or check squads doctor.'));\n }\n process.exit(1);\n }\n\n // 5b. Auto-commit scaffolding (agents need at least one commit for worktrees)\n try {\n execSync('git add -A && git commit -q -m \"feat: init AI workforce\\n\\nCo-Authored-By: Claude <noreply@anthropic.com>\"', {\n cwd,\n stdio: 'ignore',\n });\n } catch {\n // Commit may fail if nothing to add or git not configured — non-fatal\n }\n\n // 6. Success message\n writeLine();\n writeLine(chalk.green.bold(` ${businessName}'s AI workforce is ready.`));\n writeLine();\n writeLine(chalk.dim(' Created:'));\n\n // Core squads (always present)\n writeLine(chalk.dim(' • research/ 3 agents — Researches your market, competitors, and opportunities'));\n writeLine(chalk.dim(' • company/ 5 agents — Manages goals, events, and strategy'));\n writeLine(chalk.dim(' • intelligence/ 3 agents — Monitors trends and competitive signals'));\n writeLine(chalk.dim(' • product/ 3 agents — Roadmap, specs, user feedback synthesis'));\n\n // Additional pack squads\n for (const squad of useCaseConfig.squads) {\n const namePad = ' '.repeat(Math.max(0, 14 - squad.name.length));\n writeLine(chalk.dim(` • ${squad.name}/${namePad}${squad.agentCount} agents — ${squad.description}`));\n }\n\n writeLine(chalk.dim(' • .agents/skills/ CLI + GitHub workflow skills'));\n writeLine(chalk.dim(' • .agents/memory/ Persistent state'));\n writeLine(chalk.dim(' • .agents/BUSINESS_BRIEF.md'));\n writeLine(chalk.dim(' • AGENTS.md Agent instructions (vendor-neutral)'));\n if (selectedProvider === 'claude') {\n writeLine(chalk.dim(' • CLAUDE.md Operating manual'));\n writeLine(chalk.dim(' • .claude/settings.json Session hooks'));\n }\n writeLine();\n writeLine(chalk.bold(' Getting started:'));\n writeLine();\n writeLine(` ${chalk.cyan('1.')} ${chalk.yellow('$EDITOR .agents/BUSINESS_BRIEF.md')}`);\n writeLine(chalk.dim(' Set your business context — agents use this for every run'));\n writeLine();\n // Dynamic \"first run\" suggestion based on use case\n const firstRunCommand = getFirstRunCommand(selectedUseCase);\n const squadCommand = firstRunCommand.command.replace(/\\/[^/]+$/, '');\n writeLine(` ${chalk.cyan('2.')} ${chalk.yellow(firstRunCommand.command)}`);\n writeLine(chalk.dim(` ${firstRunCommand.description}`));\n writeLine(chalk.dim(` Full squad (4+ agents, longer): ${squadCommand}`));\n writeLine();\n writeLine(` ${chalk.cyan('3.')} ${chalk.yellow(`squads run`)}`);\n writeLine(chalk.dim(' Autopilot — runs all squads on schedule, learns between cycles'));\n writeLine(chalk.dim(` Options: squads run --once (single cycle), squads run -i 15 --budget 50`));\n writeLine();\n writeLine(chalk.dim(' Docs: https://agents-squads.com/docs/getting-started'));\n writeLine();\n }\n\n/**\n * Get the suggested first command based on installed packs\n */\nfunction getFirstRunCommand(useCase: UseCase): { command: string; description: string } {\n switch (useCase) {\n case 'engineering':\n return {\n command: 'squads run engineering/issue-solver',\n description: 'Run a single agent — finds and solves GitHub issues (~2 min)',\n };\n case 'marketing':\n return {\n command: 'squads run marketing/content-drafter',\n description: 'Run a single agent — drafts content for your business (~2 min)',\n };\n case 'operations':\n return {\n command: 'squads run operations/ops-lead',\n description: 'Run a single agent — coordinates daily operations (~2 min)',\n };\n case 'full-company':\n case 'custom':\n default:\n return {\n command: 'squads run research/lead',\n description: 'Run a single agent — researches the topic you set (~2 min)',\n };\n }\n}\n\n","/**\n * Setup checks and validation for squads setup command\n * Provides prerequisite checking with helpful fix guidance\n */\n\nimport { execSync, spawn } from 'child_process';\nimport {\n colors,\n RESET,\n icons,\n writeLine,\n} from './terminal.js';\n\nexport type CheckStatus = 'ok' | 'missing' | 'warning' | 'error';\n\nexport interface CheckResult {\n name: string;\n status: CheckStatus;\n message?: string;\n hint?: string;\n fixCommand?: string;\n}\n\nexport interface ProviderInfo {\n id: string;\n name: string;\n cliCheck?: string;\n envKey?: string;\n installCmd?: string;\n loginCmd?: string;\n requiresSubscription: boolean;\n requiresApiKey: boolean;\n}\n\nexport const PROVIDERS: Record<string, ProviderInfo> = {\n claude: {\n id: 'claude',\n name: 'Claude Code (Anthropic)',\n cliCheck: 'claude',\n installCmd: 'npm install -g @anthropic-ai/claude-code',\n loginCmd: 'claude login',\n requiresSubscription: true,\n requiresApiKey: false,\n },\n gemini: {\n id: 'gemini',\n name: 'Gemini (Google)',\n cliCheck: 'gemini',\n envKey: 'GEMINI_API_KEY',\n installCmd: 'npm install -g @anthropic-ai/claude-code', // Placeholder - gemini CLI\n requiresSubscription: false,\n requiresApiKey: true,\n },\n openai: {\n id: 'openai',\n name: 'GPT (OpenAI)',\n envKey: 'OPENAI_API_KEY',\n requiresSubscription: false,\n requiresApiKey: true,\n },\n ollama: {\n id: 'ollama',\n name: 'Ollama (Local)',\n cliCheck: 'ollama',\n installCmd: 'brew install ollama',\n requiresSubscription: false,\n requiresApiKey: false,\n },\n cursor: {\n id: 'cursor',\n name: 'Cursor IDE',\n requiresSubscription: true,\n requiresApiKey: false,\n },\n aider: {\n id: 'aider',\n name: 'Aider',\n cliCheck: 'aider',\n installCmd: 'pip install aider-chat',\n requiresSubscription: false,\n requiresApiKey: true,\n },\n none: {\n id: 'none',\n name: 'Planning Only (no agent execution)',\n requiresSubscription: false,\n requiresApiKey: false,\n },\n};\n\n/**\n * Check if a command exists in PATH\n */\nexport function commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Docker is running\n */\nexport function isDockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Colima is running (alternative to Docker Desktop on macOS)\n */\nexport function isColimaRunning(): boolean {\n try {\n const result = execSync('colima status', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] });\n return result.includes('Running');\n } catch {\n return false;\n }\n}\n\n/**\n * Check Docker/Colima prerequisites (informational only, never required)\n */\nexport function checkDockerPrereqs(): CheckResult {\n // Docker is never required for the CLI — purely informational\n if (isDockerRunning()) {\n return { name: 'Docker', status: 'ok', message: 'Available (optional)' };\n }\n\n if (commandExists('docker')) {\n if (commandExists('colima') && isColimaRunning()) {\n return { name: 'Docker (Colima)', status: 'ok', message: 'Available (optional)' };\n }\n }\n\n // Not installed or not running — that's fine\n return {\n name: 'Docker',\n status: 'ok',\n message: 'Not detected (optional — not required for CLI usage)',\n };\n}\n\n/**\n * Check GitHub CLI\n */\nexport function checkGhCli(): CheckResult {\n if (!commandExists('gh')) {\n return {\n name: 'GitHub CLI',\n status: 'warning',\n message: 'Recommended for GitHub integration',\n hint: 'Install: https://cli.github.com',\n };\n }\n\n // Check if authenticated\n try {\n execSync('gh auth status', { stdio: 'ignore' });\n return { name: 'GitHub CLI', status: 'ok' };\n } catch {\n return {\n name: 'GitHub CLI',\n status: 'warning',\n message: 'Installed but not authenticated',\n hint: 'Run: gh auth login',\n fixCommand: 'gh auth login',\n };\n }\n}\n\n/**\n * Check GitHub token permissions\n */\nexport function checkGhPermissions(): CheckResult {\n try {\n // Get current scopes\n const result = execSync('gh auth status 2>&1', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Check for required scopes\n const hasRepo = result.includes('repo') || result.includes('Token scopes:') && !result.includes('none');\n const hasWorkflow = result.includes('workflow');\n\n if (!hasRepo) {\n return {\n name: 'GitHub Permissions',\n status: 'warning',\n message: 'Missing repo scope',\n hint: 'Run: gh auth refresh -s repo,workflow',\n fixCommand: 'gh auth refresh -s repo,workflow',\n };\n }\n\n if (!hasWorkflow) {\n return {\n name: 'GitHub Permissions',\n status: 'warning',\n message: 'Missing workflow scope (optional)',\n hint: 'For Actions: gh auth refresh -s repo,workflow',\n };\n }\n\n return { name: 'GitHub Permissions', status: 'ok' };\n } catch {\n return {\n name: 'GitHub Permissions',\n status: 'warning',\n message: 'Could not verify permissions',\n hint: 'Run: gh auth status',\n };\n }\n}\n\n/**\n * Check Claude CLI\n */\nexport function checkClaudeCli(): CheckResult {\n if (!commandExists('claude')) {\n return {\n name: 'Claude CLI',\n status: 'missing',\n message: 'Required to run agents',\n hint: 'Install: npm install -g @anthropic-ai/claude-code',\n fixCommand: 'npm install -g @anthropic-ai/claude-code',\n };\n }\n\n // Check if logged in by running claude --version\n try {\n execSync('claude --version', { stdio: 'ignore' });\n return { name: 'Claude CLI', status: 'ok' };\n } catch {\n return {\n name: 'Claude CLI',\n status: 'warning',\n message: 'Installed but may need login',\n hint: 'Run: claude login',\n fixCommand: 'claude login',\n };\n }\n}\n\n/**\n * Check provider-specific requirements\n */\nexport function checkProviderAuth(providerId: string): CheckResult {\n const provider = PROVIDERS[providerId];\n if (!provider) {\n return { name: 'Provider', status: 'warning', message: `Unknown provider: ${providerId}` };\n }\n\n // No requirements for none/cursor\n if (providerId === 'none' || providerId === 'cursor') {\n return { name: provider.name, status: 'ok' };\n }\n\n // Check CLI if required — missing CLI is a warning (not an error) during init\n // Users can scaffold first and install the provider CLI later\n if (provider.cliCheck) {\n if (!commandExists(provider.cliCheck)) {\n return {\n name: provider.name,\n status: 'warning',\n message: `CLI not installed`,\n hint: provider.installCmd ? `Install: ${provider.installCmd}` : undefined,\n fixCommand: provider.installCmd,\n };\n }\n }\n\n // Check API key if required\n if (provider.envKey && provider.requiresApiKey) {\n if (!process.env[provider.envKey]) {\n return {\n name: provider.name,\n status: 'warning',\n message: `${provider.envKey} not set`,\n hint: `Set environment variable: export ${provider.envKey}=<your-key>`,\n };\n }\n }\n\n return { name: provider.name, status: 'ok' };\n}\n\n/**\n * Run all prerequisite checks\n */\nexport function runPrereqChecks(): CheckResult[] {\n return [\n checkDockerPrereqs(),\n checkGhCli(),\n ];\n}\n\n/**\n * Run all auth checks for a specific provider\n */\nexport function runAuthChecks(providerId: string): CheckResult[] {\n const checks: CheckResult[] = [];\n\n // Provider-specific auth (includes CLI check)\n checks.push(checkProviderAuth(providerId));\n\n // GitHub permissions (for all providers that use GitHub)\n if (providerId !== 'none') {\n checks.push(checkGhPermissions());\n }\n\n return checks;\n}\n\n/**\n * Display check results with formatting\n */\nexport function displayCheckResults(checks: CheckResult[]): {\n hasErrors: boolean;\n hasWarnings: boolean;\n errorChecks: CheckResult[];\n warningChecks: CheckResult[];\n} {\n const errorChecks: CheckResult[] = [];\n const warningChecks: CheckResult[] = [];\n\n for (const check of checks) {\n const icon = getStatusIcon(check.status);\n const statusColor = getStatusColor(check.status);\n\n if (check.status === 'ok') {\n writeLine(` ${icon} ${check.name}`);\n } else {\n const suffix = check.message ? ` ${colors.dim}(${check.message})${RESET}` : '';\n writeLine(` ${icon} ${statusColor}${check.name}${RESET}${suffix}`);\n\n if (check.hint) {\n writeLine(` ${colors.cyan}→ ${check.hint}${RESET}`);\n }\n\n if (check.status === 'error' || check.status === 'missing') {\n errorChecks.push(check);\n } else if (check.status === 'warning') {\n warningChecks.push(check);\n }\n }\n }\n\n return {\n hasErrors: errorChecks.length > 0,\n hasWarnings: warningChecks.length > 0,\n errorChecks,\n warningChecks,\n };\n}\n\nfunction getStatusIcon(status: CheckStatus): string {\n switch (status) {\n case 'ok':\n return `${colors.green}${icons.success}${RESET}`;\n case 'warning':\n return `${colors.yellow}${icons.warning}${RESET}`;\n case 'missing':\n case 'error':\n return `${colors.red}${icons.error}${RESET}`;\n }\n}\n\nfunction getStatusColor(status: CheckStatus): string {\n switch (status) {\n case 'ok':\n return colors.green;\n case 'warning':\n return colors.yellow;\n case 'missing':\n case 'error':\n return colors.red;\n }\n}\n\n/**\n * Attempt to fix a failed check by running its fix command\n */\nexport async function attemptFix(check: CheckResult): Promise<boolean> {\n if (!check.fixCommand) {\n return false;\n }\n\n writeLine();\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Running: ${colors.dim}${check.fixCommand}${RESET}`);\n writeLine();\n\n return new Promise((resolve) => {\n const proc = spawn(check.fixCommand!, [], {\n stdio: 'inherit',\n shell: true,\n });\n\n proc.on('close', (code) => {\n resolve(code === 0);\n });\n\n proc.on('error', () => {\n resolve(false);\n });\n });\n}\n\n/**\n * Wait for a service to be ready with retry\n */\nexport async function waitForService(\n name: string,\n checkFn: () => boolean | Promise<boolean>,\n maxAttempts = 30,\n intervalMs = 1000\n): Promise<boolean> {\n for (let i = 0; i < maxAttempts; i++) {\n const ready = await checkFn();\n if (ready) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n return false;\n}\n"],"mappings":"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","names":["execSync","execSync"]}
|
|
@@ -3,11 +3,6 @@ import {
|
|
|
3
3
|
Events,
|
|
4
4
|
track
|
|
5
5
|
} from "./chunk-QJ7C7CMB.js";
|
|
6
|
-
import {
|
|
7
|
-
findSquadsDir,
|
|
8
|
-
listSquads,
|
|
9
|
-
loadSquad
|
|
10
|
-
} from "./chunk-TYFTF53O.js";
|
|
11
6
|
import {
|
|
12
7
|
RESET,
|
|
13
8
|
bold,
|
|
@@ -16,6 +11,11 @@ import {
|
|
|
16
11
|
icons,
|
|
17
12
|
writeLine
|
|
18
13
|
} from "./chunk-M5FXNY6Y.js";
|
|
14
|
+
import {
|
|
15
|
+
findSquadsDir,
|
|
16
|
+
listSquads,
|
|
17
|
+
loadSquad
|
|
18
|
+
} from "./chunk-TYFTF53O.js";
|
|
19
19
|
import "./chunk-7OCVIDC7.js";
|
|
20
20
|
|
|
21
21
|
// src/lib/kpi.ts
|
|
@@ -410,4 +410,4 @@ export {
|
|
|
410
410
|
kpiShowCommand,
|
|
411
411
|
kpiTrendCommand
|
|
412
412
|
};
|
|
413
|
-
//# sourceMappingURL=kpi-
|
|
413
|
+
//# sourceMappingURL=kpi-VBGDO4GI.js.map
|
|
@@ -3,13 +3,6 @@ import {
|
|
|
3
3
|
Events,
|
|
4
4
|
track
|
|
5
5
|
} from "./chunk-QJ7C7CMB.js";
|
|
6
|
-
import {
|
|
7
|
-
findSquadsDir,
|
|
8
|
-
listSquads
|
|
9
|
-
} from "./chunk-TYFTF53O.js";
|
|
10
|
-
import {
|
|
11
|
-
findMemoryDir
|
|
12
|
-
} from "./chunk-ZTQ7ISUR.js";
|
|
13
6
|
import {
|
|
14
7
|
RESET,
|
|
15
8
|
colors,
|
|
@@ -17,6 +10,13 @@ import {
|
|
|
17
10
|
icons,
|
|
18
11
|
writeLine
|
|
19
12
|
} from "./chunk-M5FXNY6Y.js";
|
|
13
|
+
import {
|
|
14
|
+
findMemoryDir
|
|
15
|
+
} from "./chunk-ZTQ7ISUR.js";
|
|
16
|
+
import {
|
|
17
|
+
findSquadsDir,
|
|
18
|
+
listSquads
|
|
19
|
+
} from "./chunk-TYFTF53O.js";
|
|
20
20
|
import "./chunk-7OCVIDC7.js";
|
|
21
21
|
|
|
22
22
|
// src/commands/learn.ts
|
|
@@ -266,4 +266,4 @@ export {
|
|
|
266
266
|
learnSearchCommand,
|
|
267
267
|
learnShowCommand
|
|
268
268
|
};
|
|
269
|
-
//# sourceMappingURL=learn-
|
|
269
|
+
//# sourceMappingURL=learn-C4B2PQ5J.js.map
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
track
|
|
4
|
+
} from "./chunk-QJ7C7CMB.js";
|
|
5
|
+
import {
|
|
6
|
+
writeLine
|
|
7
|
+
} from "./chunk-M5FXNY6Y.js";
|
|
2
8
|
import {
|
|
3
9
|
clearSession,
|
|
4
10
|
getEmailDomain,
|
|
@@ -7,12 +13,6 @@ import {
|
|
|
7
13
|
saveSession,
|
|
8
14
|
startAuthCallbackServer
|
|
9
15
|
} from "./chunk-Z2UKDBNL.js";
|
|
10
|
-
import {
|
|
11
|
-
track
|
|
12
|
-
} from "./chunk-QJ7C7CMB.js";
|
|
13
|
-
import {
|
|
14
|
-
writeLine
|
|
15
|
-
} from "./chunk-M5FXNY6Y.js";
|
|
16
16
|
import "./chunk-7OCVIDC7.js";
|
|
17
17
|
|
|
18
18
|
// src/commands/login.ts
|
|
@@ -152,4 +152,4 @@ export {
|
|
|
152
152
|
logoutCommand,
|
|
153
153
|
whoamiCommand
|
|
154
154
|
};
|
|
155
|
-
//# sourceMappingURL=login-
|
|
155
|
+
//# sourceMappingURL=login-F6ITE7PR.js.map
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
getEnv
|
|
4
|
-
} from "./chunk-EHQJHRIW.js";
|
|
5
2
|
import {
|
|
6
3
|
Events,
|
|
7
4
|
track
|
|
8
5
|
} from "./chunk-QJ7C7CMB.js";
|
|
9
|
-
import {
|
|
10
|
-
appendToMemory,
|
|
11
|
-
findMemoryDir,
|
|
12
|
-
getSquadState,
|
|
13
|
-
listMemoryEntries,
|
|
14
|
-
searchMemory
|
|
15
|
-
} from "./chunk-ZTQ7ISUR.js";
|
|
16
6
|
import {
|
|
17
7
|
RESET,
|
|
18
8
|
bold,
|
|
@@ -24,6 +14,16 @@ import {
|
|
|
24
14
|
truncate,
|
|
25
15
|
writeLine
|
|
26
16
|
} from "./chunk-M5FXNY6Y.js";
|
|
17
|
+
import {
|
|
18
|
+
appendToMemory,
|
|
19
|
+
findMemoryDir,
|
|
20
|
+
getSquadState,
|
|
21
|
+
listMemoryEntries,
|
|
22
|
+
searchMemory
|
|
23
|
+
} from "./chunk-ZTQ7ISUR.js";
|
|
24
|
+
import {
|
|
25
|
+
getEnv
|
|
26
|
+
} from "./chunk-EHQJHRIW.js";
|
|
27
27
|
import "./chunk-7OCVIDC7.js";
|
|
28
28
|
|
|
29
29
|
// src/lib/services.ts
|
|
@@ -557,4 +557,4 @@ export {
|
|
|
557
557
|
memoryShowCommand,
|
|
558
558
|
memoryUpdateCommand
|
|
559
559
|
};
|
|
560
|
-
//# sourceMappingURL=memory-
|
|
560
|
+
//# sourceMappingURL=memory-33HYD6AN.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
calculateCostSummary,
|
|
4
|
+
captureSessionUsage,
|
|
5
|
+
diffGoals,
|
|
6
|
+
logObservability,
|
|
7
|
+
queryExecutions,
|
|
8
|
+
snapshotGoals
|
|
9
|
+
} from "./chunk-NP5BDPE6.js";
|
|
10
|
+
import "./chunk-TYFTF53O.js";
|
|
11
|
+
import "./chunk-7OCVIDC7.js";
|
|
12
|
+
export {
|
|
13
|
+
calculateCostSummary,
|
|
14
|
+
captureSessionUsage,
|
|
15
|
+
diffGoals,
|
|
16
|
+
logObservability,
|
|
17
|
+
queryExecutions,
|
|
18
|
+
snapshotGoals
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=observability-CL23L7LD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
RESET,
|
|
4
|
+
bold,
|
|
5
|
+
colors,
|
|
6
|
+
writeLine
|
|
7
|
+
} from "./chunk-M5FXNY6Y.js";
|
|
8
|
+
import {
|
|
9
|
+
findMemoryDir
|
|
10
|
+
} from "./chunk-ZTQ7ISUR.js";
|
|
11
|
+
import {
|
|
12
|
+
findSquadsDir,
|
|
13
|
+
loadSquad
|
|
14
|
+
} from "./chunk-TYFTF53O.js";
|
|
15
|
+
import "./chunk-7OCVIDC7.js";
|
|
16
|
+
|
|
17
|
+
// src/lib/org-cycle.ts
|
|
18
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
19
|
+
import { join } from "path";
|
|
20
|
+
function scanOrg() {
|
|
21
|
+
const squadsDir = findSquadsDir();
|
|
22
|
+
const memoryDir = findMemoryDir();
|
|
23
|
+
if (!squadsDir || !memoryDir) return [];
|
|
24
|
+
const results = [];
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
for (const squadName of readdirSync(squadsDir).sort()) {
|
|
27
|
+
const squadPath = join(squadsDir, squadName);
|
|
28
|
+
if (!statSync(squadPath).isDirectory()) continue;
|
|
29
|
+
if (!existsSync(join(squadPath, "SQUAD.md"))) continue;
|
|
30
|
+
const squad = loadSquad(squadName);
|
|
31
|
+
const result = {
|
|
32
|
+
squad: squadName,
|
|
33
|
+
status: "healthy",
|
|
34
|
+
prioritiesAge: 999,
|
|
35
|
+
goalsActive: 0,
|
|
36
|
+
lastExecution: null,
|
|
37
|
+
lead: null,
|
|
38
|
+
repo: squad?.repo || null,
|
|
39
|
+
reason: ""
|
|
40
|
+
};
|
|
41
|
+
for (const file of readdirSync(squadPath)) {
|
|
42
|
+
if (file.endsWith("-lead.md") || file === "coo.md" || file.startsWith("web-lead") || file.startsWith("intel-lead") || file.startsWith("eng-lead")) {
|
|
43
|
+
result.lead = file.replace(".md", "");
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const prioritiesPath = join(memoryDir, squadName, "priorities.md");
|
|
48
|
+
if (existsSync(prioritiesPath)) {
|
|
49
|
+
const content = readFileSync(prioritiesPath, "utf-8");
|
|
50
|
+
if (content.includes("frozen")) {
|
|
51
|
+
result.status = "frozen";
|
|
52
|
+
result.reason = "Squad frozen \u2014 no work until trigger";
|
|
53
|
+
results.push(result);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const updatedMatch = content.match(/updated:\s*"?(\d{4}-\d{2}-\d{2})"?/);
|
|
57
|
+
if (updatedMatch) {
|
|
58
|
+
const updated = new Date(updatedMatch[1]).getTime();
|
|
59
|
+
result.prioritiesAge = Math.round((now - updated) / (24 * 60 * 60 * 1e3));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const goalsPath = join(memoryDir, squadName, "goals.md");
|
|
63
|
+
if (existsSync(goalsPath)) {
|
|
64
|
+
const content = readFileSync(goalsPath, "utf-8");
|
|
65
|
+
const activeMatches = content.match(/status: (in-progress|not-started)/g);
|
|
66
|
+
result.goalsActive = activeMatches?.length || 0;
|
|
67
|
+
}
|
|
68
|
+
if (result.prioritiesAge > 14) {
|
|
69
|
+
result.status = "stale";
|
|
70
|
+
result.reason = `Priorities ${result.prioritiesAge}d old`;
|
|
71
|
+
} else if (result.goalsActive === 0) {
|
|
72
|
+
result.status = "stale";
|
|
73
|
+
result.reason = "No active goals";
|
|
74
|
+
} else {
|
|
75
|
+
result.reason = `${result.goalsActive} active goals, priorities ${result.prioritiesAge}d old`;
|
|
76
|
+
}
|
|
77
|
+
results.push(result);
|
|
78
|
+
}
|
|
79
|
+
return results;
|
|
80
|
+
}
|
|
81
|
+
function planOrgCycle(scan) {
|
|
82
|
+
return scan.filter((s) => s.status !== "frozen").filter((s) => s.lead !== null).sort((a, b) => {
|
|
83
|
+
if (a.status === "stale" && b.status !== "stale") return -1;
|
|
84
|
+
if (b.status === "stale" && a.status !== "stale") return 1;
|
|
85
|
+
return b.goalsActive - a.goalsActive;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function displayOrgScan(scan) {
|
|
89
|
+
writeLine();
|
|
90
|
+
writeLine(` ${bold}Org Scan${RESET} (${scan.length} squads)
|
|
91
|
+
`);
|
|
92
|
+
const frozen = scan.filter((s) => s.status === "frozen");
|
|
93
|
+
const stale = scan.filter((s) => s.status === "stale");
|
|
94
|
+
const healthy = scan.filter((s) => s.status === "healthy");
|
|
95
|
+
if (healthy.length > 0) {
|
|
96
|
+
writeLine(` ${colors.green}Healthy (${healthy.length})${RESET}`);
|
|
97
|
+
for (const s of healthy) {
|
|
98
|
+
writeLine(` ${s.squad.padEnd(22)} ${colors.dim}${s.reason}${RESET}`);
|
|
99
|
+
}
|
|
100
|
+
writeLine();
|
|
101
|
+
}
|
|
102
|
+
if (stale.length > 0) {
|
|
103
|
+
writeLine(` ${colors.yellow}Stale (${stale.length})${RESET}`);
|
|
104
|
+
for (const s of stale) {
|
|
105
|
+
writeLine(` ${s.squad.padEnd(22)} ${colors.yellow}${s.reason}${RESET}`);
|
|
106
|
+
}
|
|
107
|
+
writeLine();
|
|
108
|
+
}
|
|
109
|
+
if (frozen.length > 0) {
|
|
110
|
+
writeLine(` ${colors.dim}Frozen (${frozen.length}): ${frozen.map((s) => s.squad).join(", ")}${RESET}`);
|
|
111
|
+
writeLine();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function displayPlan(plan) {
|
|
115
|
+
writeLine(` ${bold}Execution Plan${RESET} (${plan.length} squads)
|
|
116
|
+
`);
|
|
117
|
+
for (let i = 0; i < plan.length; i++) {
|
|
118
|
+
const s = plan[i];
|
|
119
|
+
const statusIcon = s.status === "stale" ? `${colors.yellow}stale${RESET}` : `${colors.green}ready${RESET}`;
|
|
120
|
+
writeLine(` ${i + 1}. ${bold}${s.squad}${RESET} \u2192 ${s.lead} ${colors.dim}(${statusIcon}, ${s.goalsActive} goals)${RESET}`);
|
|
121
|
+
}
|
|
122
|
+
writeLine();
|
|
123
|
+
}
|
|
124
|
+
export {
|
|
125
|
+
displayOrgScan,
|
|
126
|
+
displayPlan,
|
|
127
|
+
planOrgCycle,
|
|
128
|
+
scanOrg
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=org-cycle-Q74OT4I4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/org-cycle.ts"],"sourcesContent":["/**\n * Org cycle — run the whole organization as a coordinated system.\n *\n * squads run --org [--dry-run]\n *\n * Steps:\n * 1. SCAN: Check all squads — priorities freshness, goal progress, scorecard grades\n * 2. PLAN: Decide what to run — skip frozen, prioritize by staleness + score\n * 3. EXECUTE: Run leads in dependency order (phased)\n * 4. EVALUATE: COO reviews all outputs\n * 5. REPORT: Org-level summary to observability\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join } from 'path';\nimport { findSquadsDir, loadSquad } from './squad-parser.js';\nimport { findMemoryDir } from './memory.js';\nimport { colors, bold, RESET, writeLine } from './terminal.js';\nimport { logObservability, type ObservabilityRecord } from './observability.js';\n\nexport interface OrgScanResult {\n squad: string;\n status: 'active' | 'frozen' | 'stale' | 'healthy';\n prioritiesAge: number; // days since last update\n goalsActive: number;\n lastExecution: string | null;\n lead: string | null;\n repo: string | null;\n reason: string;\n}\n\n/**\n * Scan all squads and return their health status.\n */\nexport function scanOrg(): OrgScanResult[] {\n const squadsDir = findSquadsDir();\n const memoryDir = findMemoryDir();\n if (!squadsDir || !memoryDir) return [];\n\n const results: OrgScanResult[] = [];\n const now = Date.now();\n\n for (const squadName of readdirSync(squadsDir).sort()) {\n const squadPath = join(squadsDir, squadName);\n if (!statSync(squadPath).isDirectory()) continue;\n if (!existsSync(join(squadPath, 'SQUAD.md'))) continue;\n\n const squad = loadSquad(squadName);\n const result: OrgScanResult = {\n squad: squadName,\n status: 'healthy',\n prioritiesAge: 999,\n goalsActive: 0,\n lastExecution: null,\n lead: null,\n repo: squad?.repo || null,\n reason: '',\n };\n\n // Find lead agent\n for (const file of readdirSync(squadPath)) {\n if (file.endsWith('-lead.md') || file === 'coo.md' || file.startsWith('web-lead') || file.startsWith('intel-lead') || file.startsWith('eng-lead')) {\n result.lead = file.replace('.md', '');\n break;\n }\n }\n\n // Check if frozen\n const prioritiesPath = join(memoryDir, squadName, 'priorities.md');\n if (existsSync(prioritiesPath)) {\n const content = readFileSync(prioritiesPath, 'utf-8');\n if (content.includes('frozen')) {\n result.status = 'frozen';\n result.reason = 'Squad frozen — no work until trigger';\n results.push(result);\n continue;\n }\n\n // Check freshness from frontmatter\n const updatedMatch = content.match(/updated:\\s*\"?(\\d{4}-\\d{2}-\\d{2})\"?/);\n if (updatedMatch) {\n const updated = new Date(updatedMatch[1]).getTime();\n result.prioritiesAge = Math.round((now - updated) / (24 * 60 * 60 * 1000));\n }\n }\n\n // Check goals\n const goalsPath = join(memoryDir, squadName, 'goals.md');\n if (existsSync(goalsPath)) {\n const content = readFileSync(goalsPath, 'utf-8');\n const activeMatches = content.match(/status: (in-progress|not-started)/g);\n result.goalsActive = activeMatches?.length || 0;\n }\n\n // Determine status\n if (result.prioritiesAge > 14) {\n result.status = 'stale';\n result.reason = `Priorities ${result.prioritiesAge}d old`;\n } else if (result.goalsActive === 0) {\n result.status = 'stale';\n result.reason = 'No active goals';\n } else {\n result.reason = `${result.goalsActive} active goals, priorities ${result.prioritiesAge}d old`;\n }\n\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Plan which squads to run based on scan results.\n * Returns squads ordered by priority (most needy first).\n */\nexport function planOrgCycle(scan: OrgScanResult[]): OrgScanResult[] {\n return scan\n .filter(s => s.status !== 'frozen') // Skip frozen\n .filter(s => s.lead !== null) // Must have a lead\n .sort((a, b) => {\n // Stale squads first\n if (a.status === 'stale' && b.status !== 'stale') return -1;\n if (b.status === 'stale' && a.status !== 'stale') return 1;\n // Then by goals count (more goals = more work to do)\n return b.goalsActive - a.goalsActive;\n });\n}\n\n/**\n * Display org scan results.\n */\nexport function displayOrgScan(scan: OrgScanResult[]): void {\n writeLine();\n writeLine(` ${bold}Org Scan${RESET} (${scan.length} squads)\\n`);\n\n const frozen = scan.filter(s => s.status === 'frozen');\n const stale = scan.filter(s => s.status === 'stale');\n const healthy = scan.filter(s => s.status === 'healthy');\n\n if (healthy.length > 0) {\n writeLine(` ${colors.green}Healthy (${healthy.length})${RESET}`);\n for (const s of healthy) {\n writeLine(` ${s.squad.padEnd(22)} ${colors.dim}${s.reason}${RESET}`);\n }\n writeLine();\n }\n\n if (stale.length > 0) {\n writeLine(` ${colors.yellow}Stale (${stale.length})${RESET}`);\n for (const s of stale) {\n writeLine(` ${s.squad.padEnd(22)} ${colors.yellow}${s.reason}${RESET}`);\n }\n writeLine();\n }\n\n if (frozen.length > 0) {\n writeLine(` ${colors.dim}Frozen (${frozen.length}): ${frozen.map(s => s.squad).join(', ')}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Display execution plan.\n */\nexport function displayPlan(plan: OrgScanResult[]): void {\n writeLine(` ${bold}Execution Plan${RESET} (${plan.length} squads)\\n`);\n for (let i = 0; i < plan.length; i++) {\n const s = plan[i];\n const statusIcon = s.status === 'stale' ? `${colors.yellow}stale${RESET}` : `${colors.green}ready${RESET}`;\n writeLine(` ${i + 1}. ${bold}${s.squad}${RESET} → ${s.lead} ${colors.dim}(${statusIcon}, ${s.goalsActive} goals)${RESET}`);\n }\n writeLine();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAaA,SAAS,YAAY,cAAc,aAAa,gBAAgB;AAChE,SAAS,YAAY;AAoBd,SAAS,UAA2B;AACzC,QAAM,YAAY,cAAc;AAChC,QAAM,YAAY,cAAc;AAChC,MAAI,CAAC,aAAa,CAAC,UAAW,QAAO,CAAC;AAEtC,QAAM,UAA2B,CAAC;AAClC,QAAM,MAAM,KAAK,IAAI;AAErB,aAAW,aAAa,YAAY,SAAS,EAAE,KAAK,GAAG;AACrD,UAAM,YAAY,KAAK,WAAW,SAAS;AAC3C,QAAI,CAAC,SAAS,SAAS,EAAE,YAAY,EAAG;AACxC,QAAI,CAAC,WAAW,KAAK,WAAW,UAAU,CAAC,EAAG;AAE9C,UAAM,QAAQ,UAAU,SAAS;AACjC,UAAM,SAAwB;AAAA,MAC5B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,aAAa;AAAA,MACb,eAAe;AAAA,MACf,MAAM;AAAA,MACN,MAAM,OAAO,QAAQ;AAAA,MACrB,QAAQ;AAAA,IACV;AAGA,eAAW,QAAQ,YAAY,SAAS,GAAG;AACzC,UAAI,KAAK,SAAS,UAAU,KAAK,SAAS,YAAY,KAAK,WAAW,UAAU,KAAK,KAAK,WAAW,YAAY,KAAK,KAAK,WAAW,UAAU,GAAG;AACjJ,eAAO,OAAO,KAAK,QAAQ,OAAO,EAAE;AACpC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,KAAK,WAAW,WAAW,eAAe;AACjE,QAAI,WAAW,cAAc,GAAG;AAC9B,YAAM,UAAU,aAAa,gBAAgB,OAAO;AACpD,UAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,eAAO,SAAS;AAChB,eAAO,SAAS;AAChB,gBAAQ,KAAK,MAAM;AACnB;AAAA,MACF;AAGA,YAAM,eAAe,QAAQ,MAAM,oCAAoC;AACvE,UAAI,cAAc;AAChB,cAAM,UAAU,IAAI,KAAK,aAAa,CAAC,CAAC,EAAE,QAAQ;AAClD,eAAO,gBAAgB,KAAK,OAAO,MAAM,YAAY,KAAK,KAAK,KAAK,IAAK;AAAA,MAC3E;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,WAAW,WAAW,UAAU;AACvD,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,UAAU,aAAa,WAAW,OAAO;AAC/C,YAAM,gBAAgB,QAAQ,MAAM,oCAAoC;AACxE,aAAO,cAAc,eAAe,UAAU;AAAA,IAChD;AAGA,QAAI,OAAO,gBAAgB,IAAI;AAC7B,aAAO,SAAS;AAChB,aAAO,SAAS,cAAc,OAAO,aAAa;AAAA,IACpD,WAAW,OAAO,gBAAgB,GAAG;AACnC,aAAO,SAAS;AAChB,aAAO,SAAS;AAAA,IAClB,OAAO;AACL,aAAO,SAAS,GAAG,OAAO,WAAW,6BAA6B,OAAO,aAAa;AAAA,IACxF;AAEA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,SAAO;AACT;AAMO,SAAS,aAAa,MAAwC;AACnE,SAAO,KACJ,OAAO,OAAK,EAAE,WAAW,QAAQ,EACjC,OAAO,OAAK,EAAE,SAAS,IAAI,EAC3B,KAAK,CAAC,GAAG,MAAM;AAEd,QAAI,EAAE,WAAW,WAAW,EAAE,WAAW,QAAS,QAAO;AACzD,QAAI,EAAE,WAAW,WAAW,EAAE,WAAW,QAAS,QAAO;AAEzD,WAAO,EAAE,cAAc,EAAE;AAAA,EAC3B,CAAC;AACL;AAKO,SAAS,eAAe,MAA6B;AAC1D,YAAU;AACV,YAAU,KAAK,IAAI,WAAW,KAAK,KAAK,KAAK,MAAM;AAAA,CAAY;AAE/D,QAAM,SAAS,KAAK,OAAO,OAAK,EAAE,WAAW,QAAQ;AACrD,QAAM,QAAQ,KAAK,OAAO,OAAK,EAAE,WAAW,OAAO;AACnD,QAAM,UAAU,KAAK,OAAO,OAAK,EAAE,WAAW,SAAS;AAEvD,MAAI,QAAQ,SAAS,GAAG;AACtB,cAAU,KAAK,OAAO,KAAK,YAAY,QAAQ,MAAM,IAAI,KAAK,EAAE;AAChE,eAAW,KAAK,SAAS;AACvB,gBAAU,OAAO,EAAE,MAAM,OAAO,EAAE,CAAC,IAAI,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE;AAAA,IACxE;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,cAAU,KAAK,OAAO,MAAM,UAAU,MAAM,MAAM,IAAI,KAAK,EAAE;AAC7D,eAAW,KAAK,OAAO;AACrB,gBAAU,OAAO,EAAE,MAAM,OAAO,EAAE,CAAC,IAAI,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE;AAAA,IAC3E;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,cAAU,KAAK,OAAO,GAAG,WAAW,OAAO,MAAM,MAAM,OAAO,IAAI,OAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE;AACpG,cAAU;AAAA,EACZ;AACF;AAKO,SAAS,YAAY,MAA6B;AACvD,YAAU,KAAK,IAAI,iBAAiB,KAAK,KAAK,KAAK,MAAM;AAAA,CAAY;AACrE,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,UAAM,aAAa,EAAE,WAAW,UAAU,GAAG,OAAO,MAAM,QAAQ,KAAK,KAAK,GAAG,OAAO,KAAK,QAAQ,KAAK;AACxG,cAAU,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG,KAAK,WAAM,EAAE,IAAI,IAAI,OAAO,GAAG,IAAI,UAAU,KAAK,EAAE,WAAW,UAAU,KAAK,EAAE;AAAA,EAC5H;AACA,YAAU;AACZ;","names":[]}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./chunk-TYFTF53O.js";
|
|
3
|
-
import {
|
|
4
|
-
findMemoryDir
|
|
5
|
-
} from "./chunk-ZTQ7ISUR.js";
|
|
6
2
|
import {
|
|
7
3
|
RESET,
|
|
8
4
|
bold,
|
|
@@ -14,6 +10,10 @@ import {
|
|
|
14
10
|
truncate,
|
|
15
11
|
writeLine
|
|
16
12
|
} from "./chunk-M5FXNY6Y.js";
|
|
13
|
+
import {
|
|
14
|
+
findMemoryDir
|
|
15
|
+
} from "./chunk-ZTQ7ISUR.js";
|
|
16
|
+
import "./chunk-TYFTF53O.js";
|
|
17
17
|
import "./chunk-7OCVIDC7.js";
|
|
18
18
|
|
|
19
19
|
// src/commands/progress.ts
|
|
@@ -199,4 +199,4 @@ export {
|
|
|
199
199
|
progressCompleteCommand,
|
|
200
200
|
progressStartCommand
|
|
201
201
|
};
|
|
202
|
-
//# sourceMappingURL=progress-
|
|
202
|
+
//# sourceMappingURL=progress-P2EIZBKP.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getAllCLIStatus
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QRNR4GIT.js";
|
|
5
5
|
import {
|
|
6
6
|
Events,
|
|
7
7
|
track
|
|
@@ -62,4 +62,4 @@ async function providersCommand(options = {}) {
|
|
|
62
62
|
export {
|
|
63
63
|
providersCommand
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=providers-
|
|
65
|
+
//# sourceMappingURL=providers-LE744DM6.js.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
RESET,
|
|
4
|
+
colors,
|
|
5
|
+
writeLine
|
|
6
|
+
} from "./chunk-M5FXNY6Y.js";
|
|
7
|
+
import {
|
|
8
|
+
findProjectRoot,
|
|
9
|
+
loadSquad
|
|
10
|
+
} from "./chunk-TYFTF53O.js";
|
|
11
|
+
import "./chunk-7OCVIDC7.js";
|
|
12
|
+
|
|
13
|
+
// src/lib/repo-enforcement.ts
|
|
14
|
+
import { existsSync, readdirSync, statSync } from "fs";
|
|
15
|
+
import { join, dirname } from "path";
|
|
16
|
+
function enforceRepoLayout(squadName, options) {
|
|
17
|
+
const result = { ok: true, warnings: [], errors: [] };
|
|
18
|
+
const projectRoot = findProjectRoot();
|
|
19
|
+
if (!projectRoot) return result;
|
|
20
|
+
const parentDir = dirname(projectRoot);
|
|
21
|
+
try {
|
|
22
|
+
const squad = loadSquad(squadName);
|
|
23
|
+
if (squad?.repo) {
|
|
24
|
+
const repoName = squad.repo.split("/").pop();
|
|
25
|
+
if (repoName) {
|
|
26
|
+
const siblingPath = join(parentDir, repoName);
|
|
27
|
+
if (!existsSync(siblingPath)) {
|
|
28
|
+
result.warnings.push(`Target repo '${squad.repo}' not found locally at ${siblingPath}`);
|
|
29
|
+
} else if (options?.verbose) {
|
|
30
|
+
writeLine(` ${colors.dim}Target repo: ${siblingPath}${RESET}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
} catch {
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const topLevelDirs = readdirSync(projectRoot).filter((f) => {
|
|
38
|
+
if (f.startsWith(".")) return false;
|
|
39
|
+
try {
|
|
40
|
+
return statSync(join(projectRoot, f)).isDirectory();
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
for (const dir of topLevelDirs) {
|
|
46
|
+
const nestedGit = join(projectRoot, dir, ".git");
|
|
47
|
+
if (existsSync(nestedGit)) {
|
|
48
|
+
result.errors.push(`Nested git repo found at ${dir}/ \u2014 this breaks 'git add'. Remove it or move to a sibling directory.`);
|
|
49
|
+
result.ok = false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
}
|
|
54
|
+
const idpGit = join(projectRoot, ".agents", "idp", ".git");
|
|
55
|
+
if (existsSync(idpGit)) {
|
|
56
|
+
result.errors.push(`Nested git repo in .agents/idp/ \u2014 remove it. IDP instance data should be part of hq, not a separate clone.`);
|
|
57
|
+
result.ok = false;
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
function checkAndReport(squadName, options) {
|
|
62
|
+
const result = enforceRepoLayout(squadName, options);
|
|
63
|
+
for (const warning of result.warnings) {
|
|
64
|
+
writeLine(` ${colors.yellow}warn${RESET}: ${warning}`);
|
|
65
|
+
}
|
|
66
|
+
for (const error of result.errors) {
|
|
67
|
+
writeLine(` ${colors.red}error${RESET}: ${error}`);
|
|
68
|
+
}
|
|
69
|
+
return result.ok;
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
checkAndReport,
|
|
73
|
+
enforceRepoLayout
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=repo-enforcement-JJQMKDAU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/repo-enforcement.ts"],"sourcesContent":["/**\n * Repo enforcement — validates workspace layout before agent execution.\n *\n * Checks:\n * 1. SQUAD.md repo: field points to an existing sibling repo\n * 2. No nested .git directories inside hq (prevents clone-inside-hq)\n * 3. Agent definitions exist in hq only (not in domain repos)\n *\n * Called by agent-runner before spawning Claude Code.\n * Warns on mismatches, blocks on critical (nested .git).\n */\n\nimport { existsSync, readdirSync, statSync } from 'fs';\nimport { join, dirname, resolve } from 'path';\nimport { findProjectRoot, loadSquad } from './squad-parser.js';\nimport { colors, RESET, writeLine } from './terminal.js';\n\nexport interface EnforcementResult {\n ok: boolean;\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Validate workspace layout for a squad before execution.\n */\nexport function enforceRepoLayout(squadName: string, options?: { verbose?: boolean }): EnforcementResult {\n const result: EnforcementResult = { ok: true, warnings: [], errors: [] };\n const projectRoot = findProjectRoot();\n if (!projectRoot) return result; // Can't validate without project root\n\n const parentDir = dirname(projectRoot);\n\n // 1. Check SQUAD.md repo: field points to existing sibling\n try {\n const squad = loadSquad(squadName);\n if (squad?.repo) {\n const repoName = squad.repo.split('/').pop();\n if (repoName) {\n const siblingPath = join(parentDir, repoName);\n if (!existsSync(siblingPath)) {\n result.warnings.push(`Target repo '${squad.repo}' not found locally at ${siblingPath}`);\n } else if (options?.verbose) {\n writeLine(` ${colors.dim}Target repo: ${siblingPath}${RESET}`);\n }\n }\n }\n } catch {\n // Squad not found — not our problem here\n }\n\n // 2. Check for nested .git directories inside project root\n // Only check top-level dirs (not .agents/memory/* which are fine)\n try {\n const topLevelDirs = readdirSync(projectRoot).filter(f => {\n if (f.startsWith('.')) return false; // Skip hidden dirs\n try { return statSync(join(projectRoot, f)).isDirectory(); } catch { return false; }\n });\n\n for (const dir of topLevelDirs) {\n const nestedGit = join(projectRoot, dir, '.git');\n if (existsSync(nestedGit)) {\n result.errors.push(`Nested git repo found at ${dir}/ — this breaks 'git add'. Remove it or move to a sibling directory.`);\n result.ok = false;\n }\n }\n } catch {\n // Can't read directory — skip\n }\n\n // 3. Check .agents/idp/ doesn't have a .git (the bug we hit)\n const idpGit = join(projectRoot, '.agents', 'idp', '.git');\n if (existsSync(idpGit)) {\n result.errors.push(`Nested git repo in .agents/idp/ — remove it. IDP instance data should be part of hq, not a separate clone.`);\n result.ok = false;\n }\n\n return result;\n}\n\n/**\n * Run enforcement and display results. Returns false if blocked.\n */\nexport function checkAndReport(squadName: string, options?: { verbose?: boolean }): boolean {\n const result = enforceRepoLayout(squadName, options);\n\n for (const warning of result.warnings) {\n writeLine(` ${colors.yellow}warn${RESET}: ${warning}`);\n }\n\n for (const error of result.errors) {\n writeLine(` ${colors.red}error${RESET}: ${error}`);\n }\n\n return result.ok;\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAS,YAAY,aAAa,gBAAgB;AAClD,SAAS,MAAM,eAAwB;AAahC,SAAS,kBAAkB,WAAmB,SAAoD;AACvG,QAAM,SAA4B,EAAE,IAAI,MAAM,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE;AACvE,QAAM,cAAc,gBAAgB;AACpC,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,YAAY,QAAQ,WAAW;AAGrC,MAAI;AACF,UAAM,QAAQ,UAAU,SAAS;AACjC,QAAI,OAAO,MAAM;AACf,YAAM,WAAW,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI;AAC3C,UAAI,UAAU;AACZ,cAAM,cAAc,KAAK,WAAW,QAAQ;AAC5C,YAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,iBAAO,SAAS,KAAK,gBAAgB,MAAM,IAAI,0BAA0B,WAAW,EAAE;AAAA,QACxF,WAAW,SAAS,SAAS;AAC3B,oBAAU,KAAK,OAAO,GAAG,gBAAgB,WAAW,GAAG,KAAK,EAAE;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAIA,MAAI;AACF,UAAM,eAAe,YAAY,WAAW,EAAE,OAAO,OAAK;AACxD,UAAI,EAAE,WAAW,GAAG,EAAG,QAAO;AAC9B,UAAI;AAAE,eAAO,SAAS,KAAK,aAAa,CAAC,CAAC,EAAE,YAAY;AAAA,MAAG,QAAQ;AAAE,eAAO;AAAA,MAAO;AAAA,IACrF,CAAC;AAED,eAAW,OAAO,cAAc;AAC9B,YAAM,YAAY,KAAK,aAAa,KAAK,MAAM;AAC/C,UAAI,WAAW,SAAS,GAAG;AACzB,eAAO,OAAO,KAAK,4BAA4B,GAAG,2EAAsE;AACxH,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,SAAS,KAAK,aAAa,WAAW,OAAO,MAAM;AACzD,MAAI,WAAW,MAAM,GAAG;AACtB,WAAO,OAAO,KAAK,iHAA4G;AAC/H,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AACT;AAKO,SAAS,eAAe,WAAmB,SAA0C;AAC1F,QAAM,SAAS,kBAAkB,WAAW,OAAO;AAEnD,aAAW,WAAW,OAAO,UAAU;AACrC,cAAU,KAAK,OAAO,MAAM,OAAO,KAAK,KAAK,OAAO,EAAE;AAAA,EACxD;AAEA,aAAW,SAAS,OAAO,QAAQ;AACjC,cAAU,KAAK,OAAO,GAAG,QAAQ,KAAK,KAAK,KAAK,EAAE;AAAA,EACpD;AAEA,SAAO,OAAO;AAChB;","names":[]}
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
findSquadsDir,
|
|
4
|
-
listSquads,
|
|
5
|
-
loadSquad
|
|
6
|
-
} from "./chunk-TYFTF53O.js";
|
|
7
2
|
import {
|
|
8
3
|
RESET,
|
|
9
4
|
bold,
|
|
@@ -15,6 +10,11 @@ import {
|
|
|
15
10
|
truncate,
|
|
16
11
|
writeLine
|
|
17
12
|
} from "./chunk-M5FXNY6Y.js";
|
|
13
|
+
import {
|
|
14
|
+
findSquadsDir,
|
|
15
|
+
listSquads,
|
|
16
|
+
loadSquad
|
|
17
|
+
} from "./chunk-TYFTF53O.js";
|
|
18
18
|
import "./chunk-7OCVIDC7.js";
|
|
19
19
|
|
|
20
20
|
// src/commands/results.ts
|
|
@@ -221,4 +221,4 @@ async function resultsCommand(options = {}) {
|
|
|
221
221
|
export {
|
|
222
222
|
resultsCommand
|
|
223
223
|
};
|
|
224
|
-
//# sourceMappingURL=results-
|
|
224
|
+
//# sourceMappingURL=results-6TH33HPN.js.map
|