@appsforgood/next-supabase-kit 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +2 -1
  3. package/UPGRADE.md +23 -0
  4. package/USER_GUIDE.html +14 -7
  5. package/USER_GUIDE.md +6 -5
  6. package/agents/app-engineer/agent.md +2 -0
  7. package/dist/index.js +319 -242
  8. package/dist/index.js.map +1 -1
  9. package/examples/next-supabase-installed/.agent-kit/manifest.json +25 -25
  10. package/examples/next-supabase-installed/.antigravity/runtime-skills/deslop/SKILL.md +7 -1
  11. package/examples/next-supabase-installed/.antigravity/runtime-skills/frontend-design/SKILL.md +3 -1
  12. package/examples/next-supabase-installed/.antigravity/runtime-skills/nextjs-app-router/SKILL.md +29 -9
  13. package/examples/next-supabase-installed/.antigravity/runtime-skills/owasp-security-review/SKILL.md +31 -9
  14. package/examples/next-supabase-installed/.antigravity/runtime-skills/planning/SKILL.md +11 -5
  15. package/examples/next-supabase-installed/.antigravity/runtime-skills/postgres-migrations/SKILL.md +25 -7
  16. package/examples/next-supabase-installed/.antigravity/runtime-skills/supabase-auth-rls/SKILL.md +41 -9
  17. package/examples/next-supabase-installed/.antigravity/runtime-skills/testing-qa/SKILL.md +5 -3
  18. package/examples/next-supabase-installed/.claude/agents/app-engineer.md +2 -0
  19. package/examples/next-supabase-installed/.codex/agents/app-engineer.toml +2 -0
  20. package/examples/next-supabase-installed/.cursor/agents/app-engineer.md +2 -0
  21. package/examples/next-supabase-installed/.cursor/skills/deslop/SKILL.md +7 -1
  22. package/examples/next-supabase-installed/.cursor/skills/frontend-design/SKILL.md +3 -1
  23. package/examples/next-supabase-installed/.cursor/skills/nextjs-app-router/SKILL.md +29 -9
  24. package/examples/next-supabase-installed/.cursor/skills/owasp-security-review/SKILL.md +31 -9
  25. package/examples/next-supabase-installed/.cursor/skills/planning/SKILL.md +11 -5
  26. package/examples/next-supabase-installed/.cursor/skills/postgres-migrations/SKILL.md +25 -7
  27. package/examples/next-supabase-installed/.cursor/skills/supabase-auth-rls/SKILL.md +41 -9
  28. package/examples/next-supabase-installed/.cursor/skills/testing-qa/SKILL.md +5 -3
  29. package/examples/next-supabase-installed/USER_GUIDE.html +14 -7
  30. package/examples/next-supabase-installed/USER_GUIDE.md +6 -5
  31. package/examples/next-supabase-installed/skills/deslop/SKILL.md +7 -1
  32. package/examples/next-supabase-installed/skills/frontend-design/SKILL.md +3 -1
  33. package/examples/next-supabase-installed/skills/nextjs-app-router/SKILL.md +29 -9
  34. package/examples/next-supabase-installed/skills/owasp-security-review/SKILL.md +31 -9
  35. package/examples/next-supabase-installed/skills/planning/SKILL.md +11 -5
  36. package/examples/next-supabase-installed/skills/postgres-migrations/SKILL.md +25 -7
  37. package/examples/next-supabase-installed/skills/supabase-auth-rls/SKILL.md +41 -9
  38. package/examples/next-supabase-installed/skills/testing-qa/SKILL.md +5 -3
  39. package/package.json +1 -1
  40. package/research/agent-skill-gap-report.md +4 -0
  41. package/skills/deslop/SKILL.md +7 -1
  42. package/skills/frontend-design/SKILL.md +3 -1
  43. package/skills/nextjs-app-router/SKILL.md +29 -9
  44. package/skills/owasp-security-review/SKILL.md +31 -9
  45. package/skills/planning/SKILL.md +11 -5
  46. package/skills/postgres-migrations/SKILL.md +25 -7
  47. package/skills/supabase-auth-rls/SKILL.md +41 -9
  48. package/skills/testing-qa/SKILL.md +5 -3
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/catalog.ts","../src/utils/package-root.ts","../src/install/copy-asset.ts","../src/utils/fs.ts","../src/install/roster-adapters.ts","../src/install/add-agent.ts","../src/install/add-skill.ts","../src/install/adapter-validate.ts","../src/install/doctor.ts","../src/install/install.ts","../src/config/defaults.ts","../src/install/ide-activate.ts","../src/install/managed-assets.ts","../src/install/update.ts","../src/install/file-update-plan.ts","../src/cli/output.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { addAgent, listAgents } from \"../install/add-agent.js\";\nimport { addSkill, listSkills } from \"../install/add-skill.js\";\nimport { validateAdapter, validatePackage, type AdapterValidationTarget } from \"../install/adapter-validate.js\";\nimport { createDoctorReport } from \"../install/doctor.js\";\nimport { initProject } from \"../install/install.js\";\nimport { updateProject } from \"../install/update.js\";\nimport { PACKAGE_VERSION } from \"../config/defaults.js\";\nimport { detail, fail, heading, levelLabel, line, printJson } from \"./output.js\";\n\nconst program = new Command();\n\nprogram.name(\"agent-kit\").description(\"Install agents, skills, and a user guide. QA must review screenshots, not code alone.\").version(PACKAGE_VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Install AGENTS.md, USER_GUIDE.md, USER_GUIDE.html, and native IDE agents/skills.\")\n .option(\"--stack <stack>\", \"Stack profile\", \"next-supabase\")\n .option(\"--activate <targets...>\", \"IDE surfaces: cursor, claude, codex, copilot, antigravity, all\")\n .option(\"--legacy-docs\", \"Also copy leftover living-doc templates\")\n .option(\"--force\", \"Overwrite customized files\")\n .option(\"--json\", \"Machine-readable output\")\n .option(\"--dry-run\", \"Show what would be written\")\n .action((options: { stack: \"next-supabase\"; activate?: string[]; legacyDocs?: boolean; force?: boolean; json?: boolean; dryRun?: boolean }) => {\n if (options.dryRun) {\n if (options.json) {\n printJson({ dryRun: true, wouldWrite: [\"AGENTS.md\", \"USER_GUIDE.md\", \"USER_GUIDE.html\", \".cursor/agents/\", \".cursor/skills/\"] });\n return;\n }\n heading(\"init dry-run\");\n line(\"Would write AGENTS.md, USER_GUIDE.md, USER_GUIDE.html, and native IDE agent/skill files.\");\n return;\n }\n\n const result = initProject({\n cwd: process.cwd(),\n stack: options.stack,\n ...(options.activate ? { activate: options.activate } : {}),\n ...(options.legacyDocs ? { legacyDocs: true } : {}),\n force: Boolean(options.force)\n });\n if (options.json) {\n printJson(result);\n return;\n }\n heading(\"Installed agents and skills\");\n line(`copied: ${result.copied.length}`);\n line(`unchanged: ${result.unchanged.length}`);\n line(`conflicts: ${result.conflicts.length}`);\n detail(\"Open USER_GUIDE.html next.\");\n });\n\nprogram\n .command(\"update\")\n .description(\"Refresh pristine installed files. Local edits win or become conflicts.\")\n .option(\"--force\", \"Overwrite customized files\")\n .option(\"--dry-run\", \"Preview only\")\n .option(\"--json\", \"Machine-readable output\")\n .action((options: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n const result = updateProject({ cwd: process.cwd(), force: Boolean(options.force), dryRun: Boolean(options.dryRun) });\n if (options.json) {\n printJson(result);\n return;\n }\n heading(options.dryRun ? \"update preview\" : \"update\");\n line(\n `created ${result.summary.created}, updated ${result.summary.updated}, kept-local ${result.summary[\"kept-local\"]}, conflicts ${result.summary.conflict}`\n );\n if (result.leftoverDocs.length > 0) {\n detail(`Left in place (not deleted): ${result.leftoverDocs.join(\", \")}. Run doctor for the 0.4 layout.`);\n }\n });\n\nconst add = program.command(\"add\").description(\"Add an optional agent or skill.\");\n\nadd\n .command(\"skill <name>\")\n .description(\"Install one skill into .cursor/skills\")\n .option(\"--force\", \"Overwrite\")\n .option(\"--dry-run\", \"Preview\")\n .option(\"--json\", \"Machine-readable output\")\n .action((name: string, options: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n const result = addSkill(process.cwd(), name, { force: Boolean(options.force), dryRun: Boolean(options.dryRun) });\n if (options.json) {\n printJson(result);\n return;\n }\n line(`${result.action} ${result.target}`);\n if (result.action === \"created\" && !options.dryRun) detail(`Available skills: ${listSkills().join(\", \")}`);\n });\n\nadd\n .command(\"agent <name>\")\n .description(\"Install one agent into .cursor/agents and .claude/agents\")\n .option(\"--force\", \"Overwrite\")\n .option(\"--dry-run\", \"Preview\")\n .option(\"--json\", \"Machine-readable output\")\n .action((name: string, options: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n const result = addAgent(process.cwd(), name, { force: Boolean(options.force), dryRun: Boolean(options.dryRun) });\n if (options.json) {\n printJson(result);\n return;\n }\n line(`${result.action} ${result.target}`);\n if (!options.dryRun) detail(`Available agents: ${listAgents().join(\", \")}`);\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check agents, skills, the screenshot QA rule, and leftover 0.3 council files.\")\n .option(\"--json\", \"Machine-readable output\")\n .action((options: { json?: boolean }) => {\n const report = createDoctorReport(process.cwd());\n if (options.json) {\n printJson(report);\n if (!report.ok) process.exitCode = 1;\n return;\n }\n heading(\"doctor\");\n for (const finding of report.findings) {\n line(`${levelLabel(finding.level)} ${finding.area} ${finding.message}`);\n }\n if (!report.ok) {\n fail(\"doctor found failures\");\n process.exitCode = 1;\n }\n });\n\nconst adapter = program.command(\"adapter\").description(\"Validate IDE adapter files.\");\nadapter\n .command(\"validate [target]\")\n .description(\"Validate cursor, claude, codex, copilot, antigravity, or all\")\n .option(\"--json\", \"Machine-readable output\")\n .action((rawTarget: string | undefined, options: { json?: boolean }) => {\n const target = rawTarget ?? \"all\";\n const allowed = [\"cursor\", \"claude\", \"codex\", \"copilot\", \"antigravity\", \"all\"];\n if (!allowed.includes(target)) {\n throw new Error(`Unknown adapter target \"${target}\".`);\n }\n const report = validateAdapter(process.cwd(), target as AdapterValidationTarget);\n if (options.json) {\n printJson(report);\n } else {\n heading(`adapter validate ${report.target}`);\n for (const finding of report.findings) {\n line(`${levelLabel(finding.level)} ${finding.area} ${finding.message}`);\n }\n }\n if (report.summary.fail > 0) process.exitCode = 1;\n });\n\nconst packageCommand = program.command(\"package\").description(\"Validate this source package.\");\npackageCommand\n .command(\"validate\")\n .option(\"--json\", \"Machine-readable output\")\n .action((options: { json?: boolean }) => {\n const report = validatePackage();\n if (options.json) printJson(report);\n else {\n heading(\"package validate\");\n for (const finding of report.findings) line(`${levelLabel(finding.level)} ${finding.area} ${finding.message}`);\n }\n if (report.summary.fail > 0) process.exitCode = 1;\n });\n\nprogram.configureOutput({\n outputError: (str, write) => {\n const message = str.replace(/^error: /i, \"\").trim();\n write(`error: ${message}\\n`);\n }\n});\n\nasync function main(): Promise<void> {\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`error: ${message}`);\n process.exitCode = 1;\n }\n}\n\nvoid main();\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { findPackageRoot } from \"./utils/package-root.js\";\n\nexport interface Catalog {\n schemaVersion: number;\n defaultAgents: string[];\n optionalAgents: string[];\n defaultSkills: string[];\n optionalSkills: string[];\n screenshotFailClosed: string;\n}\n\nlet cached: Catalog | null = null;\n\nexport function loadCatalog(packageRoot = findPackageRoot()): Catalog {\n if (cached && packageRoot === findPackageRoot()) return cached;\n const parsed = JSON.parse(readFileSync(join(packageRoot, \"catalog.json\"), \"utf8\")) as Catalog;\n cached = parsed;\n return parsed;\n}\n\nexport function resetCatalogCache(): void {\n cached = null;\n}\n\nexport function agentSourcePath(packageRoot: string, id: string): string {\n const main = join(packageRoot, \"agents\", id, \"agent.md\");\n if (existsSync(main)) return main;\n const optional = join(packageRoot, \"agents\", \"optional\", id, \"agent.md\");\n if (existsSync(optional)) return optional;\n throw new Error(`Unknown agent \"${id}\".`);\n}\n\nexport function skillSourcePath(packageRoot: string, id: string): string {\n const main = join(packageRoot, \"skills\", id, \"SKILL.md\");\n if (existsSync(main)) return main;\n const optional = join(packageRoot, \"skills\", \"optional\", id, \"SKILL.md\");\n if (existsSync(optional)) return optional;\n throw new Error(`Unknown skill \"${id}\".`);\n}\n\nexport function listKnownAgents(packageRoot = findPackageRoot()): string[] {\n const catalog = loadCatalog(packageRoot);\n return [...catalog.defaultAgents, ...catalog.optionalAgents];\n}\n\nexport function listKnownSkills(packageRoot = findPackageRoot()): string[] {\n const catalog = loadCatalog(packageRoot);\n return [...catalog.defaultSkills, ...catalog.optionalSkills];\n}\n\nexport function isOptionalAgent(id: string, packageRoot = findPackageRoot()): boolean {\n return loadCatalog(packageRoot).optionalAgents.includes(id);\n}\n\nexport function isOptionalSkill(id: string, packageRoot = findPackageRoot()): boolean {\n return loadCatalog(packageRoot).optionalSkills.includes(id);\n}\n\nexport function parseFrontmatter(markdown: string): { name?: string; description?: string; tools?: string[]; requiredTools?: string[]; body: string } {\n const match = markdown.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return { body: markdown };\n const raw = match[1] ?? \"\";\n const body = match[2] ?? \"\";\n const name = raw.match(/^name:\\s*(.+)$/m)?.[1]?.trim();\n const description = raw.match(/^description:\\s*(.+)$/m)?.[1]?.trim();\n const tools = parseYamlList(raw, \"tools\");\n const requiredTools = parseYamlList(raw, \"requiredTools\");\n return {\n ...(name ? { name } : {}),\n ...(description ? { description } : {}),\n ...(tools ? { tools } : {}),\n ...(requiredTools ? { requiredTools } : {}),\n body\n };\n}\n\nfunction parseYamlList(frontmatter: string, key: string): string[] | undefined {\n const line = frontmatter.match(new RegExp(`^${key}:\\\\s*\\\\[(.*)\\\\]\\\\s*$`, \"m\"));\n if (!line?.[1]) return undefined;\n return line[1]\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function findPackageRoot(start = dirname(fileURLToPath(import.meta.url))): string {\n let current = resolve(start);\n\n for (let i = 0; i < 8; i += 1) {\n if (existsSync(join(current, \"package.json\"))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n throw new Error(\"Unable to locate package root from runtime path.\");\n}\n","import { join } from \"node:path\";\nimport { copyTextWithConflict, writeConflictProposal, writeText, type CopyResult } from \"../utils/fs.js\";\nimport { existsSync, readFileSync } from \"node:fs\";\n\nexport interface CopyCollector {\n copied: string[];\n unchanged: string[];\n conflicts: string[];\n overwritten: string[];\n}\n\nexport function emptyCollector(): CopyCollector {\n return { copied: [], unchanged: [], conflicts: [], overwritten: [] };\n}\n\nexport function recordCopy(collector: CopyCollector, result: CopyResult): void {\n if (result.action === \"created\") collector.copied.push(result.target);\n if (result.action === \"unchanged\") collector.unchanged.push(result.target);\n if (result.action === \"overwritten\") collector.overwritten.push(result.target);\n if (result.action === \"conflict\") {\n collector.conflicts.push(result.conflictPath ? `${result.target} -> ${result.conflictPath}` : result.target);\n }\n}\n\nexport function copyFromPackage(cwd: string, packageRoot: string, source: string, target: string, force: boolean, collector: CopyCollector): void {\n recordCopy(\n collector,\n copyTextWithConflict(join(packageRoot, source), cwd, target, {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n}\n\nexport function writeGenerated(cwd: string, relativePath: string, content: string, force: boolean, collector: CopyCollector): void {\n const targetPath = join(cwd, relativePath);\n if (!force && existsSync(targetPath)) {\n const existing = readFileSync(targetPath, \"utf8\");\n if (existing === content) {\n collector.unchanged.push(relativePath);\n return;\n }\n const proposal = writeConflictProposal(cwd, relativePath, content, {\n currentContent: existing,\n reason: \"Generated content changed while the local target is customized.\"\n });\n collector.conflicts.push(`${relativePath} -> ${proposal.conflictPath}`);\n return;\n }\n writeText(targetPath, content);\n collector.copied.push(relativePath);\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"node:path\";\n\nexport function ensureDir(path: string): void {\n mkdirSync(path, { recursive: true });\n}\n\nexport function readTextIfExists(path: string): string | null {\n if (!existsSync(path)) return null;\n return readFileSync(path, \"utf8\");\n}\n\nexport function writeText(path: string, content: string): void {\n ensureDir(dirname(path));\n const temporaryPath = join(dirname(path), `.${basename(path)}.${process.pid}.${randomUUID()}.tmp`);\n try {\n writeFileSync(temporaryPath, content);\n renameSync(temporaryPath, path);\n } finally {\n rmSync(temporaryPath, { force: true });\n }\n}\n\nexport function sha256(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nexport function resolveInside(root: string, requestedPath: string): string {\n const resolvedRoot = resolve(root);\n const resolvedPath = resolve(resolvedRoot, requestedPath);\n const rel = relative(resolvedRoot, resolvedPath);\n\n if (rel === \"..\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(`Unsafe path outside root: ${requestedPath}`);\n }\n\n return resolvedPath;\n}\n\nexport function listFilesRecursive(root: string): string[] {\n if (!existsSync(root)) return [];\n\n const out: string[] = [];\n const visit = (dir: string) => {\n for (const entry of readdirSync(dir)) {\n const fullPath = join(dir, entry);\n let stats;\n try {\n stats = lstatSync(fullPath);\n } catch {\n continue;\n }\n\n if (stats.isSymbolicLink()) continue;\n\n if (stats.isDirectory()) {\n if (entry === \"node_modules\" || entry === \".git\") continue;\n visit(fullPath);\n } else {\n out.push(relative(root, fullPath));\n }\n }\n };\n\n visit(root);\n return out.sort();\n}\n\nexport interface CopyResult {\n action: \"created\" | \"unchanged\" | \"conflict\" | \"overwritten\";\n target: string;\n conflictPath?: string;\n}\n\nexport interface ConflictProposalResult {\n conflictPath: string;\n metadataPath: string;\n}\n\nexport function writeConflictProposal(\n targetRoot: string,\n targetRelativePath: string,\n proposedContent: string,\n options: { currentContent?: string | undefined; reason?: string; sourceVersion?: string } = {}\n): ConflictProposalResult {\n const proposalHash = sha256(proposedContent);\n const safeTarget = targetRelativePath.replace(/[^a-zA-Z0-9_.-]/g, \"__\");\n const baseName = `${safeTarget}.${proposalHash.slice(0, 12)}`;\n const conflictRoot = join(targetRoot, \".agent-kit\", \"conflicts\");\n const proposalPath = join(conflictRoot, `${baseName}.proposed`);\n const metadataPath = join(conflictRoot, `${baseName}.json`);\n const normalizedTarget = targetRelativePath.replace(/\\\\/g, \"/\");\n writeText(proposalPath, proposedContent);\n writeText(\n metadataPath,\n `${JSON.stringify(\n {\n schemaVersion: 1,\n target: normalizedTarget,\n proposedSha256: proposalHash,\n ...(options.currentContent !== undefined ? { currentSha256: sha256(options.currentContent) } : {}),\n ...(options.reason ? { reason: options.reason } : {}),\n ...(options.sourceVersion ? { sourceVersion: options.sourceVersion } : {})\n },\n null,\n 2\n )}\\n`\n );\n return {\n conflictPath: relative(targetRoot, proposalPath).replace(/\\\\/g, \"/\"),\n metadataPath: relative(targetRoot, metadataPath).replace(/\\\\/g, \"/\")\n };\n}\n\nexport function copyTextWithConflict(\n sourcePath: string,\n targetRoot: string,\n targetRelativePath: string,\n options: { force?: boolean; conflictRoot?: string } = {}\n): CopyResult {\n const targetPath = resolveInside(targetRoot, targetRelativePath);\n const sourceContent = readFileSync(sourcePath, \"utf8\");\n const existingContent = readTextIfExists(targetPath);\n\n if (existingContent === null) {\n writeText(targetPath, sourceContent);\n return { action: \"created\", target: targetRelativePath };\n }\n\n if (sha256(existingContent) === sha256(sourceContent)) {\n return { action: \"unchanged\", target: targetRelativePath };\n }\n\n if (options.force) {\n writeText(targetPath, sourceContent);\n return { action: \"overwritten\", target: targetRelativePath };\n }\n\n const defaultConflictRoot = join(targetRoot, \".agent-kit\", \"conflicts\");\n if (options.conflictRoot && resolve(options.conflictRoot) !== resolve(defaultConflictRoot)) {\n throw new Error(\"Custom conflict roots are no longer supported; proposals must stay under .agent-kit/conflicts.\");\n }\n const proposal = writeConflictProposal(targetRoot, targetRelativePath, sourceContent, {\n currentContent: existingContent,\n reason: \"Local content differs from the proposed package content.\"\n });\n\n return {\n action: \"conflict\",\n target: targetRelativePath,\n conflictPath: proposal.conflictPath\n };\n}\n\nexport function copyDirectory(sourceRoot: string, targetRoot: string): void {\n ensureDir(dirname(targetRoot));\n cpSync(sourceRoot, targetRoot, {\n recursive: true,\n force: true,\n filter: (source) => !basename(source).startsWith(\".DS_Store\")\n });\n}\n","import { readFileSync } from \"node:fs\";\nimport { agentSourcePath, loadCatalog, parseFrontmatter, skillSourcePath } from \"../catalog.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { writeGenerated, type CopyCollector } from \"./copy-asset.js\";\n\nfunction escapeTomlString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function generateCursorAgents(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultAgents) {\n const content = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/agents/${id}.md`, content, force, collector);\n }\n}\n\nexport function generateCursorSkills(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultSkills) {\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/skills/${id}/SKILL.md`, content, force, collector);\n }\n}\n\nexport function generatePortableSkills(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultSkills) {\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `skills/${id}/SKILL.md`, content, force, collector);\n }\n}\n\nexport function generateClaudeAgents(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultAgents) {\n const content = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.claude/agents/${id}.md`, content, force, collector);\n }\n}\n\nexport function generateCodexAgents(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultAgents) {\n const markdown = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n const meta = parseFrontmatter(markdown);\n const description = meta.description ?? id;\n const toml = `name = \"${id}\"\ndescription = \"${escapeTomlString(description)}\"\nmodel_reasoning_effort = \"medium\"\n\ndeveloper_instructions = \"\"\"\n${markdown.replace(/\"\"\"/g, '\\\\\"\\\\\"\\\\\"')}\n\"\"\"\n`;\n writeGenerated(cwd, `.codex/agents/${id}.toml`, toml, force, collector);\n }\n}\n\nexport function generateCopilotInstructions(cwd: string, force: boolean, collector: CopyCollector): void {\n const catalog = loadCatalog();\n const content = `# Copilot instructions\n\nThis repo uses a small agent and skill pack. Read \\`AGENTS.md\\` and \\`USER_GUIDE.md\\`.\n\nWhen the user names a role, act as that agent:\n\n${catalog.defaultAgents.map((id) => `- ${id}`).join(\"\\n\")}\n\n${catalog.screenshotFailClosed}\n\nDo not review user-visible work from code alone. Use the browser-qa skill: open the app, capture desktop and mobile screenshots, read the images, then give accept / accept-with-nits / reject.\n\nIf you cannot open a browser, use Playwright:\n\n\\`\\`\\`bash\nnpx playwright screenshot --viewport-size=1280,720 \"$URL\" qa-evidence/<slug>/desktop.png\nnpx playwright screenshot --viewport-size=390,844 \"$URL\" qa-evidence/<slug>/mobile.png\n\\`\\`\\`\n`;\n writeGenerated(cwd, \".github/copilot-instructions.md\", content, force, collector);\n}\n\nexport function generateAntigravityCommands(cwd: string, force: boolean, collector: CopyCollector): void {\n const commands: Array<{ name: string; description: string; prompt: string }> = [\n {\n name: \"plan\",\n description: \"Plan the change and name the owning agent.\",\n prompt:\n \"Act as the planner agent. Plan this change. Name the owning agent, extra reviewers, and which screenshots QA must capture. Do not write code. Read AGENTS.md and USER_GUIDE.md.\"\n },\n {\n name: \"browser-qa\",\n description: \"Live browser QA with desktop and mobile screenshots.\",\n prompt:\n \"Act as the QA agent. Use the browser-qa skill. Do not review code alone. Open the app, capture desktop and mobile screenshots, read the images, then give accept / accept-with-nits / reject.\"\n },\n {\n name: \"security\",\n description: \"Auth, RLS, secrets, and OWASP review.\",\n prompt: \"Act as the security agent. Review auth, RLS, IDOR, and secrets. Exercise login or denied states in the browser when they are user-visible.\"\n },\n {\n name: \"frontend\",\n description: \"UI review from screenshots first.\",\n prompt: \"Act as the design agent. Review the running UI from screenshots first. Desktop and mobile. Reject generic AI-looking layout.\"\n },\n {\n name: \"copy\",\n description: \"Review rendered conversion copy.\",\n prompt: \"Act as the copy agent. Review the rendered words in screenshots, not just strings in source. Run product-copy first, then deslop last. Always.\"\n },\n {\n name: \"test\",\n description: \"Run tests, then browser-qa for UI.\",\n prompt: \"Act as the QA agent. Run applicable tests, then use browser-qa for any user-visible change.\"\n },\n {\n name: \"ship\",\n description: \"Release go / no-go.\",\n prompt: \"Use the ship skill. Confirm env, migrations, rollback, and browser-qa evidence for user-visible changes.\"\n }\n ];\n\n writeGenerated(\n cwd,\n \".antigravity/agent-kit/plugin.json\",\n `${JSON.stringify({ name: \"agents-and-skills\", commands: commands.map((item) => item.name) }, null, 2)}\\n`,\n force,\n collector\n );\n\n for (const command of commands) {\n const toml = `name = \"${command.name}\"\ndescription = \"${command.description}\"\n\nprompt = \"\"\"\n${command.prompt}\n\"\"\"\n`;\n writeGenerated(cwd, `.antigravity/agent-kit/commands/${command.name}.toml`, toml, force, collector);\n }\n\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultSkills) {\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.antigravity/runtime-skills/${id}/SKILL.md`, content, force, collector);\n }\n}\n\nexport function copyOptionalAgent(cwd: string, id: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const content = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/agents/${id}.md`, content, force, collector);\n writeGenerated(cwd, `.claude/agents/${id}.md`, content, force, collector);\n}\n\nexport function copyOptionalSkill(cwd: string, id: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/skills/${id}/SKILL.md`, content, force, collector);\n}\n","import { listKnownAgents } from \"../catalog.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { emptyCollector } from \"./copy-asset.js\";\nimport { copyOptionalAgent } from \"./roster-adapters.js\";\n\nexport function listAgents(): string[] {\n return listKnownAgents();\n}\n\nexport interface AddAgentResult {\n action: \"created\" | \"unchanged\" | \"conflict\" | \"overwritten\";\n target: string;\n dryRun: boolean;\n}\n\nexport function addAgent(cwd: string, agentName: string, options: { force?: boolean; dryRun?: boolean } = {}): AddAgentResult {\n const packageRoot = findPackageRoot();\n const id = agentName.replace(/\\.md$/, \"\");\n if (!/^[a-z0-9-]+$/.test(id)) {\n throw new Error(\"Agent names may contain only lowercase letters, numbers, and hyphens.\");\n }\n\n const available = listKnownAgents(packageRoot);\n if (!available.includes(id)) {\n throw new Error(`Unknown agent \"${agentName}\". Available agents: ${available.join(\", \")}`);\n }\n\n const target = `.cursor/agents/${id}.md`;\n if (options.dryRun) {\n return { action: \"created\", target, dryRun: true };\n }\n\n const collector = emptyCollector();\n copyOptionalAgent(cwd, id, Boolean(options.force), collector);\n const action = collector.copied.includes(target)\n ? \"created\"\n : collector.unchanged.includes(target)\n ? \"unchanged\"\n : collector.overwritten.includes(target)\n ? \"overwritten\"\n : \"conflict\";\n return { action, target, dryRun: false };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isOptionalSkill, listKnownSkills, skillSourcePath } from \"../catalog.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { emptyCollector } from \"./copy-asset.js\";\nimport { copyOptionalSkill } from \"./roster-adapters.js\";\n\nexport function listSkills(): string[] {\n return listKnownSkills();\n}\n\nexport interface AddSkillResult {\n action: \"created\" | \"unchanged\" | \"conflict\" | \"overwritten\";\n target: string;\n dryRun: boolean;\n}\n\nexport function addSkill(cwd: string, skillName: string, options: { force?: boolean; dryRun?: boolean } = {}): AddSkillResult {\n const packageRoot = findPackageRoot();\n const id = skillName.replace(/\\.md$/, \"\").replace(/\\/SKILL$/, \"\");\n if (!/^[a-z0-9-]+$/.test(id)) {\n throw new Error(\"Skill names may contain only lowercase letters, numbers, and hyphens.\");\n }\n\n const available = listKnownSkills(packageRoot);\n if (!available.includes(id)) {\n throw new Error(`Unknown skill \"${skillName}\". Available skills: ${available.join(\", \")}`);\n }\n\n const sourcePath = skillSourcePath(packageRoot, id);\n const target = `.cursor/skills/${id}/SKILL.md`;\n\n if (options.dryRun) {\n const existing = existsSync(`${cwd}/${target}`) ? readFileSync(`${cwd}/${target}`, \"utf8\") : null;\n const sourceContent = readFileSync(sourcePath, \"utf8\");\n let action: AddSkillResult[\"action\"] = \"created\";\n if (existing === sourceContent) action = \"unchanged\";\n else if (existing) action = options.force ? \"overwritten\" : \"conflict\";\n return { action, target, dryRun: true };\n }\n\n const collector = emptyCollector();\n copyOptionalSkill(cwd, id, Boolean(options.force), collector);\n const action = collector.copied.includes(target)\n ? \"created\"\n : collector.unchanged.includes(target)\n ? \"unchanged\"\n : collector.overwritten.includes(target)\n ? \"overwritten\"\n : \"conflict\";\n return { action, target, dryRun: false };\n}\n\nexport function assertAddableSkill(id: string): void {\n if (!isOptionalSkill(id) && !listKnownSkills().includes(id)) {\n throw new Error(`Unknown skill \"${id}\".`);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadCatalog } from \"../catalog.js\";\nimport type { IdeTarget } from \"./ide-activate.js\";\n\nexport type ValidationLevel = \"pass\" | \"warn\" | \"fail\";\nexport type AdapterValidationTarget = IdeTarget | \"all\";\n\nexport interface ValidationFinding {\n level: ValidationLevel;\n area: string;\n message: string;\n remediation?: string;\n}\n\nexport interface ValidationReport {\n target: string;\n summary: Record<ValidationLevel, number>;\n findings: ValidationFinding[];\n}\n\nfunction summary(findings: ValidationFinding[]): Record<ValidationLevel, number> {\n return {\n pass: findings.filter((finding) => finding.level === \"pass\").length,\n warn: findings.filter((finding) => finding.level === \"warn\").length,\n fail: findings.filter((finding) => finding.level === \"fail\").length\n };\n}\n\nfunction report(target: string, findings: ValidationFinding[]): ValidationReport {\n return { target, summary: summary(findings), findings };\n}\n\nfunction has(cwd: string, relative: string): boolean {\n return existsSync(join(cwd, relative));\n}\n\nfunction text(cwd: string, relative: string): string {\n return readFileSync(join(cwd, relative), \"utf8\");\n}\n\nfunction validateCursor(cwd: string): ValidationFinding[] {\n const catalog = loadCatalog();\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \".cursor/rules/cursor-agent-kit.mdc\")) {\n findings.push({\n level: \"fail\",\n area: \"cursor\",\n message: \"Missing .cursor/rules/cursor-agent-kit.mdc\",\n remediation: \"Run agent-kit init --activate cursor\"\n });\n } else {\n findings.push({ level: \"pass\", area: \"cursor\", message: \"Cursor rule is present.\" });\n }\n for (const id of catalog.defaultAgents) {\n const path = `.cursor/agents/${id}.md`;\n if (!has(cwd, path)) {\n findings.push({ level: \"fail\", area: \"cursor\", message: `Missing ${path}` });\n } else if (\n id === \"qa\" &&\n !text(cwd, path).includes(\"Do not review user-visible work from code alone\") &&\n !text(cwd, path).includes(\"Do not review code alone\")\n ) {\n findings.push({ level: \"fail\", area: \"cursor\", message: \"Cursor QA agent dropped the screenshot fail-closed rule.\" });\n } else {\n findings.push({ level: \"pass\", area: \"cursor\", message: `${path} is present.` });\n }\n }\n if (!has(cwd, \".cursor/skills/browser-qa/SKILL.md\")) {\n findings.push({ level: \"fail\", area: \"cursor\", message: \"Missing .cursor/skills/browser-qa/SKILL.md\" });\n }\n return findings;\n}\n\nfunction validateClaude(cwd: string): ValidationFinding[] {\n const catalog = loadCatalog();\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \"CLAUDE.md\")) {\n findings.push({ level: \"fail\", area: \"claude\", message: \"Missing CLAUDE.md\", remediation: \"Run agent-kit init --activate claude\" });\n }\n for (const id of catalog.defaultAgents) {\n const path = `.claude/agents/${id}.md`;\n findings.push(\n has(cwd, path) ? { level: \"pass\", area: \"claude\", message: `${path} is present.` } : { level: \"fail\", area: \"claude\", message: `Missing ${path}` }\n );\n if (\n id === \"qa\" &&\n has(cwd, path) &&\n !text(cwd, path).includes(\"Do not review code alone\") &&\n !text(cwd, path).includes(\"Do not review user-visible work from code alone\")\n ) {\n findings.push({ level: \"fail\", area: \"claude\", message: \"Claude QA agent dropped the screenshot fail-closed rule.\" });\n }\n }\n return findings;\n}\n\nfunction validateCodex(cwd: string): ValidationFinding[] {\n const catalog = loadCatalog();\n const findings: ValidationFinding[] = [];\n for (const id of catalog.defaultAgents) {\n const path = `.codex/agents/${id}.toml`;\n findings.push(\n has(cwd, path)\n ? { level: \"pass\", area: \"codex\", message: `${path} is present.` }\n : { level: \"fail\", area: \"codex\", message: `Missing ${path}`, remediation: \"Run agent-kit init --activate codex\" }\n );\n if (id === \"qa\" && has(cwd, path) && !text(cwd, path).includes(\"Do not review\")) {\n findings.push({ level: \"fail\", area: \"codex\", message: \"Codex QA agent dropped the screenshot fail-closed rule.\" });\n }\n }\n return findings;\n}\n\nfunction validateCopilot(cwd: string): ValidationFinding[] {\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \".github/copilot-instructions.md\")) {\n findings.push({ level: \"fail\", area: \"copilot\", message: \"Missing .github/copilot-instructions.md\" });\n } else if (!text(cwd, \".github/copilot-instructions.md\").includes(\"Do not review user-visible work from code alone\")) {\n findings.push({ level: \"fail\", area: \"copilot\", message: \"Copilot instructions dropped the screenshot rule.\" });\n } else {\n findings.push({ level: \"pass\", area: \"copilot\", message: \"Copilot instructions include the screenshot rule.\" });\n }\n return findings;\n}\n\nfunction validateAntigravity(cwd: string): ValidationFinding[] {\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \".antigravity/agent-kit/plugin.json\")) {\n findings.push({ level: \"fail\", area: \"antigravity\", message: \"Missing Antigravity plugin.json\" });\n } else {\n findings.push({ level: \"pass\", area: \"antigravity\", message: \"Antigravity plugin is present.\" });\n }\n if (!has(cwd, \".antigravity/agent-kit/commands/browser-qa.toml\")) {\n findings.push({ level: \"fail\", area: \"antigravity\", message: \"Missing /browser-qa command.\" });\n } else if (!text(cwd, \".antigravity/agent-kit/commands/browser-qa.toml\").includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"antigravity\", message: \"/browser-qa dropped the screenshot rule.\" });\n } else {\n findings.push({ level: \"pass\", area: \"antigravity\", message: \"/browser-qa includes the screenshot rule.\" });\n }\n return findings;\n}\n\nexport function validateAdapter(cwd: string, target: AdapterValidationTarget): ValidationReport {\n if (target === \"cursor\") return report(\"cursor\", validateCursor(cwd));\n if (target === \"claude\") return report(\"claude\", validateClaude(cwd));\n if (target === \"codex\") return report(\"codex\", validateCodex(cwd));\n if (target === \"copilot\") return report(\"copilot\", validateCopilot(cwd));\n if (target === \"antigravity\") return report(\"antigravity\", validateAntigravity(cwd));\n\n return report(\"all\", [...validateCursor(cwd), ...validateClaude(cwd), ...validateCodex(cwd), ...validateCopilot(cwd), ...validateAntigravity(cwd)]);\n}\n\nexport function validatePackage(): ValidationReport {\n const cwd = process.cwd();\n const findings: ValidationFinding[] = [];\n if (!existsSync(join(cwd, \"catalog.json\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"catalog.json is missing.\" });\n } else {\n findings.push({ level: \"pass\", area: \"package\", message: \"catalog.json is present.\" });\n }\n if (!existsSync(join(cwd, \"USER_GUIDE.md\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.md is missing.\" });\n } else if (!readFileSync(join(cwd, \"USER_GUIDE.md\"), \"utf8\").includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.md dropped the screenshot fail-closed sentence.\" });\n } else {\n findings.push({ level: \"pass\", area: \"package\", message: \"USER_GUIDE.md includes the screenshot rule.\" });\n }\n if (!existsSync(join(cwd, \"USER_GUIDE.html\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.html is missing.\" });\n } else if (!readFileSync(join(cwd, \"USER_GUIDE.html\"), \"utf8\").includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.html dropped the screenshot fail-closed sentence.\" });\n } else {\n findings.push({ level: \"pass\", area: \"package\", message: \"USER_GUIDE.html includes the screenshot rule.\" });\n }\n if (!existsSync(join(cwd, \"skills/browser-qa/SKILL.md\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"skills/browser-qa/SKILL.md is missing.\" });\n }\n return report(\"package\", findings);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadCatalog, parseFrontmatter } from \"../catalog.js\";\n\nexport type DoctorLevel = \"pass\" | \"warn\" | \"fail\";\n\nexport interface DoctorFinding {\n level: DoctorLevel;\n area: string;\n message: string;\n}\n\nexport interface DoctorReport {\n summary: Record<DoctorLevel, number>;\n findings: DoctorFinding[];\n ok: boolean;\n}\n\n/** Unique 0.3 council-OS files. Product SECURITY.md / DESIGN.md are not listed. */\nexport const LEGACY_LEFTOVER_PATHS = [\n \"AGENT_ROSTER.md\",\n \"COUNCIL.md\",\n \"SKILLS.md\",\n \"QUALITY_GATES.md\",\n \"ASSISTANT_ADAPTERS.md\",\n \".agent-kit/agent-roster.json\",\n \".agent-kit/orchestrator.json\"\n] as const;\n\nfunction summarize(findings: DoctorFinding[]): Record<DoctorLevel, number> {\n return {\n pass: findings.filter((item) => item.level === \"pass\").length,\n warn: findings.filter((item) => item.level === \"warn\").length,\n fail: findings.filter((item) => item.level === \"fail\").length\n };\n}\n\nfunction read(cwd: string, relative: string): string | null {\n const path = join(cwd, relative);\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\n}\n\nexport function listLegacyLeftovers(cwd: string): string[] {\n return LEGACY_LEFTOVER_PATHS.filter((relative) => existsSync(join(cwd, relative)));\n}\n\nexport function createDoctorReport(cwd: string): DoctorReport {\n const catalog = loadCatalog();\n const findings: DoctorFinding[] = [];\n\n const agentsDoc = read(cwd, \"AGENTS.md\");\n findings.push(\n agentsDoc\n ? { level: \"pass\", area: \"docs\", message: \"AGENTS.md is installed.\" }\n : { level: \"fail\", area: \"docs\", message: \"AGENTS.md is missing. Run agent-kit init.\" }\n );\n\n const guide = read(cwd, \"USER_GUIDE.md\");\n if (!guide) {\n findings.push({ level: \"fail\", area: \"docs\", message: \"USER_GUIDE.md is missing. Run agent-kit init.\" });\n } else if (!guide.includes(catalog.screenshotFailClosed) && !guide.includes(\"Do not review code alone\")) {\n findings.push({\n level: \"fail\",\n area: \"docs\",\n message: \"USER_GUIDE.md dropped the screenshot fail-closed rule.\"\n });\n } else {\n findings.push({ level: \"pass\", area: \"docs\", message: \"USER_GUIDE.md includes the screenshot fail-closed rule.\" });\n }\n\n const htmlGuide = read(cwd, \"USER_GUIDE.html\");\n if (!htmlGuide) {\n findings.push({ level: \"fail\", area: \"docs\", message: \"USER_GUIDE.html is missing. Run agent-kit init.\" });\n } else if (!htmlGuide.includes(\"Do not review code alone\") || !htmlGuide.includes('data-view=\"user-guide\"')) {\n findings.push({\n level: \"fail\",\n area: \"docs\",\n message: \"USER_GUIDE.html dropped the screenshot fail-closed rule or assignment-desk layout.\"\n });\n } else {\n findings.push({ level: \"pass\", area: \"docs\", message: \"USER_GUIDE.html is the visual field guide.\" });\n }\n\n const qaSkill = read(cwd, \".cursor/skills/browser-qa/SKILL.md\") ?? read(cwd, \"skills/browser-qa/SKILL.md\");\n if (!qaSkill) {\n findings.push({ level: \"fail\", area: \"skills\", message: \"browser-qa skill is missing.\" });\n } else if (!qaSkill.includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"skills\", message: \"browser-qa no longer forbids code-only review.\" });\n } else {\n findings.push({ level: \"pass\", area: \"skills\", message: \"browser-qa forbids code-only UI review.\" });\n }\n\n for (const id of catalog.defaultAgents) {\n const content = read(cwd, `.cursor/agents/${id}.md`) ?? read(cwd, `agents/${id}/agent.md`);\n if (!content) {\n findings.push({ level: \"warn\", area: \"agents\", message: `${id} agent is not installed in .cursor/agents/.` });\n continue;\n }\n const meta = parseFrontmatter(content);\n if (!meta.tools || meta.tools.length === 0) {\n findings.push({ level: \"fail\", area: \"agents\", message: `${id} is missing a tools list.` });\n } else {\n findings.push({ level: \"pass\", area: \"agents\", message: `${id} declares tools.` });\n }\n }\n\n const leftovers = listLegacyLeftovers(cwd);\n if (leftovers.length > 0) {\n const preview = leftovers.slice(0, 6).join(\", \");\n const extra = leftovers.length > 6 ? `, +${leftovers.length - 6} more` : \"\";\n findings.push({\n level: \"warn\",\n area: \"legacy\",\n message: `0.3 leftover files are still here: ${preview}${extra}. 0.4 uses AGENTS.md + USER_GUIDE. update never deletes these.`\n });\n } else {\n findings.push({\n level: \"pass\",\n area: \"legacy\",\n message: \"No 0.3 council leftover files detected.\"\n });\n }\n\n return {\n findings,\n summary: summarize(findings),\n ok: findings.every((item) => item.level !== \"fail\")\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadCatalog } from \"../catalog.js\";\nimport {\n AGENTS_DOC_SOURCE,\n CURSOR_RULE_FILE,\n PACKAGE_NAME,\n PACKAGE_VERSION,\n ROOT_DOCS,\n USER_GUIDE_HTML_SOURCE,\n USER_GUIDE_SOURCE\n} from \"../config/defaults.js\";\nimport type { InstallManifest, StackProfile } from \"../config/types.js\";\nimport { copyTextWithConflict, ensureDir, sha256, writeText } from \"../utils/fs.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { emptyCollector, recordCopy, type CopyCollector } from \"./copy-asset.js\";\nimport { activateIdeTargets, parseActivateTargets, type ActivateIdeResult, type IdeTarget } from \"./ide-activate.js\";\nimport { listManagedAssets } from \"./managed-assets.js\";\nimport { generatePortableSkills } from \"./roster-adapters.js\";\n\nexport interface InitOptions {\n cwd: string;\n stack?: StackProfile;\n force?: boolean;\n activate?: string[];\n legacyDocs?: boolean;\n}\n\nexport interface InitResult extends CopyCollector {\n manifestPath: string;\n activation?: ActivateIdeResult;\n contextPath?: string;\n}\n\nexport function initProject(options: InitOptions): InitResult {\n const cwd = options.cwd;\n const stack = options.stack ?? \"next-supabase\";\n const packageRoot = findPackageRoot();\n const force = Boolean(options.force);\n\n ensureDir(join(cwd, \".agent-kit\", \"conflicts\"));\n\n const result: InitResult = {\n ...emptyCollector(),\n manifestPath: \".agent-kit/manifest.json\"\n };\n\n const templateHashes: Record<string, string> = {};\n const agentsDoc = readFileSync(join(packageRoot, AGENTS_DOC_SOURCE), \"utf8\");\n const userGuide = readFileSync(join(packageRoot, USER_GUIDE_SOURCE), \"utf8\");\n const userGuideHtml = readFileSync(join(packageRoot, USER_GUIDE_HTML_SOURCE), \"utf8\");\n templateHashes[\"AGENTS.md\"] = sha256(agentsDoc);\n templateHashes[\"USER_GUIDE.md\"] = sha256(userGuide);\n templateHashes[\"USER_GUIDE.html\"] = sha256(userGuideHtml);\n\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, AGENTS_DOC_SOURCE), cwd, \"AGENTS.md\", {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, USER_GUIDE_SOURCE), cwd, \"USER_GUIDE.md\", {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, USER_GUIDE_HTML_SOURCE), cwd, \"USER_GUIDE.html\", {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n\n if (options.legacyDocs) {\n const legacyRoot = join(packageRoot, \"templates\", stack);\n const legacyDocs = [\"SPEC.md\", \"DECISIONS.md\", \"DESIGN.md\", \"SECURITY.md\", \"TESTING.md\", \"QUALITY_GATES.md\"];\n for (const doc of legacyDocs) {\n const source = join(legacyRoot, doc);\n if (!existsSync(source)) continue;\n recordCopy(\n result,\n copyTextWithConflict(source, cwd, doc, {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n }\n }\n\n const activateTargets = parseActivateTargets(options.activate);\n const targets: IdeTarget[] = activateTargets.length > 0 ? activateTargets : [\"cursor\"];\n result.activation = activateIdeTargets({ cwd, targets, force });\n generatePortableSkills(cwd, force, result.activation);\n result.copied.push(...result.activation.copied.filter((path) => !result.copied.includes(path)));\n result.unchanged.push(...result.activation.unchanged.filter((path) => !result.unchanged.includes(path)));\n result.conflicts.push(...result.activation.conflicts.filter((path) => !result.conflicts.includes(path)));\n result.overwritten.push(...result.activation.overwritten.filter((path) => !result.overwritten.includes(path)));\n\n const assets = listManagedAssets(packageRoot, { activated: targets });\n const assetHashes: Record<string, string> = {};\n for (const asset of assets) {\n if (existsSync(asset.sourcePath)) assetHashes[asset.target] = sha256(readFileSync(asset.sourcePath, \"utf8\"));\n }\n // Generated files: hash what we just wrote\n for (const relative of [...result.copied, ...result.unchanged, ...result.overwritten]) {\n const path = join(cwd, relative);\n if (existsSync(path) && !assetHashes[relative]) {\n assetHashes[relative] = sha256(readFileSync(path, \"utf8\"));\n }\n }\n\n const catalog = loadCatalog(packageRoot);\n const manifest: InstallManifest = {\n schemaVersion: 3,\n packageName: PACKAGE_NAME,\n packageVersion: PACKAGE_VERSION,\n stack,\n installedAt: new Date().toISOString(),\n docs: [...ROOT_DOCS],\n activated: targets,\n templateHashes,\n assetHashes\n };\n\n writeText(join(cwd, \".agent-kit\", \"manifest.json\"), `${JSON.stringify(manifest, null, 2)}\\n`);\n writeText(\n join(cwd, \".agent-kit\", \"config.json\"),\n `${JSON.stringify({ stack, catalog: { defaultAgents: catalog.defaultAgents, defaultSkills: catalog.defaultSkills } }, null, 2)}\\n`\n );\n\n // Always keep the Cursor rule available even when only other IDEs were requested\n if (!targets.includes(\"cursor\")) {\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, CURSOR_RULE_FILE.source), cwd, CURSOR_RULE_FILE.target, {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n }\n\n return result;\n}\n\nexport function readManifest(cwd: string): InstallManifest | null {\n const manifestPath = join(cwd, \".agent-kit\", \"manifest.json\");\n if (!existsSync(manifestPath)) return null;\n return JSON.parse(readFileSync(manifestPath, \"utf8\")) as InstallManifest;\n}\n\nexport function readGithubActionsMode(_cwd: string): \"off\" | \"advisory\" {\n return \"off\";\n}\n\nexport { type IdeTarget };\n","import type { AgentKitConfig } from \"./types.js\";\n\nexport const PACKAGE_NAME = \"@appsforgood/next-supabase-kit\";\nexport const PACKAGE_VERSION = \"0.4.1\";\n\nexport const DEFAULT_CONFIG: AgentKitConfig = {\n stack: \"next-supabase\",\n projectType: \"saas\",\n docsMode: \"advisory\",\n githubActions: {\n mode: \"off\"\n },\n agentCouncil: {\n required: false,\n rosterPath: \"\",\n defaultWorkflow: \"planning\",\n coreChangeWorkflow: \"core-change\"\n },\n modelRouting: {\n required: false,\n routingPath: \"\",\n reviewCadence: \"when-needed\"\n },\n designProviders: [\"stitch\", \"claude\", \"figma\", \"human\"],\n research: {\n maxRepos: 40,\n githubTokenEnv: \"GITHUB_TOKEN\",\n workdir: \"research/workdir\"\n }\n};\n\nexport const ROOT_DOCS = [\"AGENTS.md\", \"USER_GUIDE.md\", \"USER_GUIDE.html\"] as const;\n\nexport const CURSOR_RULE_FILE = {\n source: \"assistant-adapters/cursor-agent-kit.mdc\",\n target: \".cursor/rules/cursor-agent-kit.mdc\"\n} as const;\n\nexport const CLAUDE_TEMPLATE = \"templates/next-supabase/CLAUDE.md\";\nexport const USER_GUIDE_SOURCE = \"USER_GUIDE.md\";\nexport const USER_GUIDE_HTML_SOURCE = \"USER_GUIDE.html\";\nexport const AGENTS_DOC_SOURCE = \"templates/next-supabase/AGENTS.md\";\n\nexport const COPILOT_INSTRUCTION_TARGET = \".github/copilot-instructions.md\";\nexport const CODEX_CONFIG_TARGET = \".codex/config.toml\";\n\nexport const ANTIGRAVITY_PLUGIN_TARGET = \".antigravity/agent-kit/plugin.json\";\nexport const ANTIGRAVITY_COMMANDS = [\"plan\", \"browser-qa\", \"security\", \"frontend\", \"copy\", \"test\", \"ship\"] as const;\n\n/** Legacy constants kept so leftover studio/audit modules still typecheck. */\nexport const LIBRARY_FOLDERS = [] as const;\nexport const DEFAULT_AGENT_ROSTER_SOURCE = \"rosters/next-supabase-default-council.json\";\nexport const DEFAULT_AGENT_ROSTER_TARGET = \".agent-kit/agent-roster.json\";\nexport const DEFAULT_MODEL_ROUTING_SOURCE = \"model-routing/default-model-routing.json\";\nexport const DEFAULT_MODEL_ROUTING_TARGET = \".agent-kit/model-routing.json\";\nexport const DEFAULT_ORCHESTRATOR_SOURCE = \"templates/next-supabase/.agent-kit/orchestrator.json\";\nexport const DEFAULT_ORCHESTRATOR_TARGET = \".agent-kit/orchestrator.json\";\nexport const DEFAULT_RUNTIME_IGNORE_SOURCE = \"templates/next-supabase/.agent-kit/runtime/gitignore.template\";\nexport const DEFAULT_RUNTIME_IGNORE_TARGET = \".agent-kit/runtime/.gitignore\";\nexport const CURSOR_ADAPTER_FILES = [CURSOR_RULE_FILE] as const;\nexport const CURSOR_SCOPED_ADAPTER_FILES = [] as const;\nexport const COPILOT_INSTRUCTION_FILES = [{ source: \"assistant-adapters/github-copilot-instructions.md\", target: COPILOT_INSTRUCTION_TARGET }] as const;\nexport const CODEX_CONFIG_SOURCE = \"assistant-adapters/model-selection/codex-config.example.toml\";\nexport const ANTIGRAVITY_PLUGIN_FILES = [{ source: \"antigravity/plugin.json\", target: ANTIGRAVITY_PLUGIN_TARGET }] as const;\nexport const ANTIGRAVITY_COMMANDS_SOURCE_DIR = \"antigravity/commands\";\nexport const ANTIGRAVITY_COMMANDS_TARGET_DIR = \".antigravity/agent-kit/commands\";\nexport const RUNTIME_SKILLS_SOURCE_DIR = \"runtime-skills\";\nexport const ANTIGRAVITY_RUNTIME_SKILLS_TARGET_DIR = \".antigravity/runtime-skills\";\nexport const CI_TEMPLATE_FILES = [\n {\n source: \"templates/next-supabase/.github/workflows/agent-kit-audit.yml\",\n target: \".github/workflows/agent-kit-audit.yml\"\n }\n] as const;\n","import { CLAUDE_TEMPLATE, CURSOR_RULE_FILE } from \"../config/defaults.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { copyFromPackage, emptyCollector, type CopyCollector } from \"./copy-asset.js\";\nimport {\n generateAntigravityCommands,\n generateClaudeAgents,\n generateCodexAgents,\n generateCopilotInstructions,\n generateCursorAgents,\n generateCursorSkills\n} from \"./roster-adapters.js\";\n\nexport type IdeTarget = \"cursor\" | \"claude\" | \"codex\" | \"copilot\" | \"antigravity\";\n\nexport interface ActivateIdeOptions {\n cwd: string;\n targets: Array<IdeTarget | \"all\">;\n force?: boolean;\n}\n\nexport interface ActivateIdeResult extends CopyCollector {\n activated: IdeTarget[];\n}\n\nconst ALLOWED = new Set<IdeTarget>([\"cursor\", \"claude\", \"codex\", \"copilot\", \"antigravity\"]);\n\nexport class InvalidActivateTargetError extends Error {\n constructor(public readonly invalid: string[]) {\n super(`Unknown --activate target(s): ${invalid.join(\", \")}. Allowed: cursor, claude, codex, copilot, antigravity, all.`);\n this.name = \"InvalidActivateTargetError\";\n }\n}\n\nexport function parseActivateTargets(raw: string[] | undefined): IdeTarget[] {\n if (!raw || raw.length === 0) return [];\n return normalizeTargets(raw.flatMap((value) => value.split(\",\")));\n}\n\nfunction normalizeTargets(targets: string[]): IdeTarget[] {\n const normalized = new Set<IdeTarget>();\n const invalid: string[] = [];\n for (const target of targets) {\n const value = target.trim().toLowerCase();\n if (!value) continue;\n if (value === \"all\") {\n for (const item of ALLOWED) normalized.add(item);\n continue;\n }\n if (ALLOWED.has(value as IdeTarget)) {\n normalized.add(value as IdeTarget);\n } else {\n invalid.push(target.trim());\n }\n }\n if (invalid.length > 0) throw new InvalidActivateTargetError(invalid);\n return [...normalized];\n}\n\nexport function activateIdeTargets(options: ActivateIdeOptions): ActivateIdeResult {\n const cwd = options.cwd;\n const packageRoot = findPackageRoot();\n const targets = normalizeTargets(options.targets);\n const force = Boolean(options.force);\n const collector = emptyCollector();\n const result: ActivateIdeResult = { activated: targets, ...collector };\n\n if (targets.length === 0) return result;\n\n if (targets.includes(\"cursor\")) {\n copyFromPackage(cwd, packageRoot, CURSOR_RULE_FILE.source, CURSOR_RULE_FILE.target, force, result);\n generateCursorAgents(cwd, force, result);\n generateCursorSkills(cwd, force, result);\n }\n if (targets.includes(\"claude\")) {\n copyFromPackage(cwd, packageRoot, CLAUDE_TEMPLATE, \"CLAUDE.md\", force, result);\n generateClaudeAgents(cwd, force, result);\n }\n if (targets.includes(\"codex\")) {\n generateCodexAgents(cwd, force, result);\n }\n if (targets.includes(\"copilot\")) {\n generateCopilotInstructions(cwd, force, result);\n }\n if (targets.includes(\"antigravity\")) {\n generateAntigravityCommands(cwd, force, result);\n }\n\n return result;\n}\n\nexport function ideSurfaceToActivateTarget(ideSurface: string): IdeTarget | null {\n const value = ideSurface.trim().toLowerCase();\n if (value === \"cursor\" || value === \"claude\" || value === \"codex\" || value === \"copilot\" || value === \"antigravity\") {\n return value;\n }\n return null;\n}\n","import { join } from \"node:path\";\nimport { AGENTS_DOC_SOURCE, CURSOR_RULE_FILE, USER_GUIDE_HTML_SOURCE, USER_GUIDE_SOURCE } from \"../config/defaults.js\";\nimport type { IdeTarget } from \"./ide-activate.js\";\n\nexport type ManagedAssetCategory = \"root-doc\" | \"adapter\" | \"generated\";\n\nexport interface ManagedAsset {\n target: string;\n sourcePath: string;\n category: ManagedAssetCategory;\n libraryFolder?: string;\n}\n\nexport function listManagedAssets(packageRoot: string, options: { activated?: IdeTarget[] } = {}): ManagedAsset[] {\n const assets: ManagedAsset[] = [\n { target: \"AGENTS.md\", sourcePath: join(packageRoot, AGENTS_DOC_SOURCE), category: \"root-doc\" },\n { target: \"USER_GUIDE.md\", sourcePath: join(packageRoot, USER_GUIDE_SOURCE), category: \"root-doc\" },\n { target: \"USER_GUIDE.html\", sourcePath: join(packageRoot, USER_GUIDE_HTML_SOURCE), category: \"root-doc\" },\n { target: CURSOR_RULE_FILE.target, sourcePath: join(packageRoot, CURSOR_RULE_FILE.source), category: \"adapter\" }\n ];\n\n const activated = new Set(options.activated ?? [\"cursor\"]);\n if (activated.has(\"claude\")) {\n assets.push({\n target: \"CLAUDE.md\",\n sourcePath: join(packageRoot, \"templates/next-supabase/CLAUDE.md\"),\n category: \"adapter\"\n });\n }\n\n return assets;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { PACKAGE_VERSION } from \"../config/defaults.js\";\nimport type { InstallManifest } from \"../config/types.js\";\nimport { resolveInside, sha256, writeConflictProposal, writeText } from \"../utils/fs.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { planFileUpdate, type PlannedUpdateAction } from \"./file-update-plan.js\";\nimport { initProject, readManifest } from \"./install.js\";\nimport { activateIdeTargets } from \"./ide-activate.js\";\nimport { listManagedAssets } from \"./managed-assets.js\";\nimport { generatePortableSkills } from \"./roster-adapters.js\";\nimport { listLegacyLeftovers } from \"./doctor.js\";\nimport type { CopyCollector } from \"./copy-asset.js\";\nimport type { IdeTarget } from \"./ide-activate.js\";\n\nexport type UpdateAction = PlannedUpdateAction;\n\nexport interface UpdateFileResult {\n target: string;\n action: UpdateAction;\n conflictPath?: string;\n reason: string;\n}\n\nexport interface UpdateResult {\n dryRun: boolean;\n files: UpdateFileResult[];\n libraryFoldersRefreshed: string[];\n manifestPath: string;\n summary: Record<UpdateAction, number>;\n leftoverDocs: string[];\n}\n\nexport interface UpdateOptions {\n cwd: string;\n force?: boolean;\n dryRun?: boolean;\n}\n\nfunction summarize(files: UpdateFileResult[]): Record<UpdateAction, number> {\n return {\n created: files.filter((file) => file.action === \"created\").length,\n unchanged: files.filter((file) => file.action === \"unchanged\").length,\n updated: files.filter((file) => file.action === \"updated\").length,\n \"kept-local\": files.filter((file) => file.action === \"kept-local\").length,\n conflict: files.filter((file) => file.action === \"conflict\").length,\n overwritten: files.filter((file) => file.action === \"overwritten\").length\n };\n}\n\nfunction activationToUpdateFiles(collector: CopyCollector): UpdateFileResult[] {\n const files: UpdateFileResult[] = [];\n for (const target of collector.copied) {\n files.push({ target, action: \"created\", reason: \"Refreshed generated IDE or skill file.\" });\n }\n for (const target of collector.unchanged) {\n files.push({ target, action: \"unchanged\", reason: \"Generated file already matched the package asset.\" });\n }\n for (const target of collector.overwritten) {\n files.push({ target, action: \"overwritten\", reason: \"Overwritten generated IDE or skill file.\" });\n }\n for (const entry of collector.conflicts) {\n const [target, conflictPath] = entry.split(\" -> \");\n files.push({\n target: target ?? entry,\n action: \"conflict\",\n reason: \"Generated file changed while the local target is customized.\",\n ...(conflictPath ? { conflictPath } : {})\n });\n }\n return files;\n}\n\nexport function updateProject(options: UpdateOptions): UpdateResult {\n const cwd = options.cwd;\n const force = Boolean(options.force);\n const dryRun = Boolean(options.dryRun);\n const manifest = readManifest(cwd);\n\n if (!manifest) {\n if (dryRun) {\n throw new Error(\"No .agent-kit/manifest.json found. Run agent-kit init first (or run update without --dry-run to install).\");\n }\n const initResult = initProject({ cwd, force });\n const files: UpdateFileResult[] = [\n ...initResult.copied.map((target): UpdateFileResult => ({ target, action: \"created\", reason: \"Installed by init fallback.\" })),\n ...initResult.unchanged.map((target): UpdateFileResult => ({ target, action: \"unchanged\", reason: \"Already matched the package asset.\" })),\n ...initResult.overwritten.map((target): UpdateFileResult => ({ target, action: \"overwritten\", reason: \"Overwritten by init --force fallback.\" })),\n ...initResult.conflicts.map((entry): UpdateFileResult => {\n const [target, conflictPath] = entry.split(\" -> \");\n return {\n target: target ?? entry,\n action: \"conflict\",\n reason: \"Local file differed from the package asset during init fallback.\",\n ...(conflictPath ? { conflictPath } : {})\n };\n })\n ];\n return {\n dryRun,\n files,\n libraryFoldersRefreshed: [],\n manifestPath: \".agent-kit/manifest.json\",\n summary: summarize(files),\n leftoverDocs: listLegacyLeftovers(cwd)\n };\n }\n\n const packageRoot = findPackageRoot();\n const activated = (manifest.activated ?? [\"cursor\"]) as IdeTarget[];\n const assets = listManagedAssets(packageRoot, { activated });\n const files: UpdateFileResult[] = [];\n\n for (const asset of assets) {\n if (!existsSync(asset.sourcePath)) continue;\n const plan = planFileUpdate({\n target: asset.target,\n sourcePath: asset.sourcePath,\n targetPath: resolveInside(cwd, asset.target),\n installedHash: manifest.assetHashes?.[asset.target] ?? manifest.templateHashes?.[asset.target],\n force\n });\n\n let conflictPath: string | undefined;\n if (!dryRun) {\n if (plan.action === \"created\" || plan.action === \"updated\" || plan.action === \"overwritten\") {\n writeText(resolveInside(cwd, asset.target), plan.sourceContent);\n }\n if (plan.action === \"conflict\") {\n const proposal = writeConflictProposal(cwd, asset.target, plan.sourceContent, {\n currentContent: plan.localContent ?? \"\",\n reason: \"Template changed and the local file was customized.\"\n });\n conflictPath = proposal.conflictPath;\n }\n }\n\n files.push({\n target: asset.target,\n action: plan.action,\n reason: plan.reason,\n ...(conflictPath ? { conflictPath } : {})\n });\n }\n\n if (!dryRun) {\n const activation = activateIdeTargets({ cwd, targets: activated, force });\n generatePortableSkills(cwd, force, activation);\n files.push(...activationToUpdateFiles(activation));\n\n const nextHashes = { ...manifest.assetHashes };\n for (const asset of assets) {\n if (existsSync(asset.sourcePath)) nextHashes[asset.target] = sha256(readFileSync(asset.sourcePath, \"utf8\"));\n }\n for (const relative of [...activation.copied, ...activation.unchanged, ...activation.overwritten]) {\n const path = join(cwd, relative);\n if (existsSync(path)) nextHashes[relative] = sha256(readFileSync(path, \"utf8\"));\n }\n const next: InstallManifest = {\n ...manifest,\n packageVersion: PACKAGE_VERSION,\n schemaVersion: 3,\n updatedAt: new Date().toISOString(),\n docs: [\"AGENTS.md\", \"USER_GUIDE.md\", \"USER_GUIDE.html\"],\n assetHashes: nextHashes\n };\n writeText(join(cwd, \".agent-kit\", \"manifest.json\"), `${JSON.stringify(next, null, 2)}\\n`);\n } else {\n files.push({\n target: \".cursor/agents/\",\n action: \"updated\",\n reason: \"Would refresh activated IDE agents, skills, and portable skills/ copies.\"\n });\n }\n\n return {\n dryRun,\n files,\n libraryFoldersRefreshed: [],\n manifestPath: \".agent-kit/manifest.json\",\n summary: summarize(files),\n leftoverDocs: listLegacyLeftovers(cwd)\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { sha256 } from \"../utils/fs.js\";\n\nexport type PlannedUpdateAction = \"created\" | \"updated\" | \"unchanged\" | \"kept-local\" | \"conflict\" | \"overwritten\";\n\nexport interface FileUpdatePlan {\n target: string;\n action: PlannedUpdateAction;\n reason: string;\n sourceContent: string;\n sourceHash: string;\n localContent?: string;\n}\n\nexport interface FileUpdatePlanInput {\n target: string;\n sourcePath: string;\n targetPath: string;\n installedHash: string | undefined;\n force: boolean;\n}\n\nexport function planFileUpdate(input: FileUpdatePlanInput): FileUpdatePlan {\n const sourceContent = readFileSync(input.sourcePath, \"utf8\");\n const sourceHash = sha256(sourceContent);\n\n if (!existsSync(input.targetPath)) {\n return { target: input.target, action: \"created\", reason: \"File is missing locally.\", sourceContent, sourceHash };\n }\n\n const localContent = readFileSync(input.targetPath, \"utf8\");\n const localHash = sha256(localContent);\n if (localHash === sourceHash) {\n return {\n target: input.target,\n action: \"unchanged\",\n reason: \"File already matches the current package asset.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n if (input.installedHash && localHash === input.installedHash) {\n return {\n target: input.target,\n action: \"updated\",\n reason: \"File was unmodified since install; applied the newer package asset.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n if (input.force) {\n return {\n target: input.target,\n action: \"overwritten\",\n reason: \"Local changes will be overwritten because --force was used.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n if (input.installedHash && input.installedHash === sourceHash) {\n return {\n target: input.target,\n action: \"kept-local\",\n reason: \"File is locally customized and the package asset has not changed.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n return {\n target: input.target,\n action: \"conflict\",\n reason: \"File is locally customized and the package asset changed; review the proposed content.\",\n sourceContent,\n sourceHash,\n localContent\n };\n}\n","import pc from \"picocolors\";\n\nconst colorEnabled = process.env.NO_COLOR === undefined && process.stdout.isTTY === true;\n\nfunction paint(painter: (text: string) => string, text: string): string {\n return colorEnabled ? painter(text) : text;\n}\n\nexport const style = {\n heading: (text: string) => paint(pc.cyan, text),\n pass: (text: string) => paint(pc.green, text),\n warn: (text: string) => paint(pc.yellow, text),\n fail: (text: string) => paint(pc.red, text),\n dim: (text: string) => paint(pc.dim, text),\n bold: (text: string) => paint(pc.bold, text)\n};\n\nexport function levelLabel(level: \"pass\" | \"warn\" | \"fail\"): string {\n const label = level.toUpperCase().padEnd(4);\n if (level === \"pass\") return style.pass(label);\n if (level === \"warn\") return style.warn(label);\n return style.fail(label);\n}\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nexport function heading(text: string): void {\n console.log(style.heading(text));\n}\n\nexport function line(text = \"\"): void {\n console.log(text);\n}\n\nexport function detail(text: string): void {\n console.log(style.dim(` ${text}`));\n}\n\nexport function listItem(text: string): void {\n console.log(`- ${text}`);\n}\n\n/** Print a labeled list of file paths, skipping empty groups. */\nexport function fileGroup(label: string, files: string[]): void {\n if (files.length === 0) return;\n console.log(`${style.bold(label)} (${files.length})`);\n for (const file of files) console.log(` ${file}`);\n}\n\nexport function fail(message: string): void {\n console.error(style.fail(`error: ${message}`));\n}\n"],"mappings":"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","names":["existsSync","join","join","main","join","existsSync","line","join","existsSync","readFileSync","dirname","join","resolve","join","readFileSync","resolve","existsSync","readFileSync","join","readFileSync","readFileSync","existsSync","readFileSync","existsSync","readFileSync","action","existsSync","readFileSync","join","relative","existsSync","join","readFileSync","existsSync","readFileSync","join","relative","join","existsSync","readFileSync","existsSync","readFileSync","join","join","join","join","readFileSync","existsSync","relative","existsSync","readFileSync","join","existsSync","readFileSync","readFileSync","existsSync","summarize","files","existsSync","readFileSync","relative","join","text","report"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/catalog.ts","../src/utils/package-root.ts","../src/install/copy-asset.ts","../src/utils/fs.ts","../src/install/roster-adapters.ts","../src/install/add-agent.ts","../src/install/add-skill.ts","../src/install/adapter-validate.ts","../src/config/defaults.ts","../src/install/ide-activate.ts","../src/install/install.ts","../src/install/managed-assets.ts","../src/install/doctor.ts","../src/install/guide.ts","../src/install/update.ts","../src/install/file-update-plan.ts","../src/cli/output.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { addAgent, listAgents } from \"../install/add-agent.js\";\nimport { addSkill, listSkills } from \"../install/add-skill.js\";\nimport { validateAdapter, validatePackage, type AdapterValidationTarget } from \"../install/adapter-validate.js\";\nimport { createDoctorReport } from \"../install/doctor.js\";\nimport { resolveUserGuideHtml } from \"../install/guide.js\";\nimport { initProject } from \"../install/install.js\";\nimport { updateProject } from \"../install/update.js\";\nimport { PACKAGE_VERSION } from \"../config/defaults.js\";\nimport { detail, fail, heading, levelLabel, line, printJson } from \"./output.js\";\n\nconst program = new Command();\n\nprogram.name(\"agent-kit\").description(\"Install agents, skills, and a user guide. QA must review screenshots, not code alone.\").version(PACKAGE_VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Install AGENTS.md, USER_GUIDE.md, USER_GUIDE.html, and native IDE agents/skills.\")\n .option(\"--stack <stack>\", \"Stack profile\", \"next-supabase\")\n .option(\"--activate <targets...>\", \"IDE surfaces: cursor, claude, codex, copilot, antigravity, all\")\n .option(\"--legacy-docs\", \"Also copy leftover living-doc templates\")\n .option(\"--force\", \"Overwrite customized files\")\n .option(\"--json\", \"Machine-readable output\")\n .option(\"--dry-run\", \"Show what would be written\")\n .action((options: { stack: \"next-supabase\"; activate?: string[]; legacyDocs?: boolean; force?: boolean; json?: boolean; dryRun?: boolean }) => {\n if (options.dryRun) {\n if (options.json) {\n printJson({ dryRun: true, wouldWrite: [\"AGENTS.md\", \"USER_GUIDE.md\", \"USER_GUIDE.html\", \".cursor/agents/\", \".cursor/skills/\"] });\n return;\n }\n heading(\"init dry-run\");\n line(\"Would write AGENTS.md, USER_GUIDE.md, USER_GUIDE.html, and native IDE agent/skill files.\");\n return;\n }\n\n const result = initProject({\n cwd: process.cwd(),\n stack: options.stack,\n ...(options.activate ? { activate: options.activate } : {}),\n ...(options.legacyDocs ? { legacyDocs: true } : {}),\n force: Boolean(options.force)\n });\n if (options.json) {\n printJson(result);\n return;\n }\n heading(\"Installed agents and skills\");\n line(`copied: ${result.copied.length}`);\n line(`unchanged: ${result.unchanged.length}`);\n line(`conflicts: ${result.conflicts.length}`);\n detail(\"Open USER_GUIDE.html next.\");\n });\n\nprogram\n .command(\"update\")\n .description(\"Refresh pristine installed files. Local edits win or become conflicts.\")\n .option(\"--force\", \"Overwrite customized files\")\n .option(\"--dry-run\", \"Preview only\")\n .option(\"--json\", \"Machine-readable output\")\n .action((options: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n const result = updateProject({ cwd: process.cwd(), force: Boolean(options.force), dryRun: Boolean(options.dryRun) });\n if (options.json) {\n printJson(result);\n return;\n }\n heading(options.dryRun ? \"update preview\" : \"update\");\n line(\n `created ${result.summary.created}, updated ${result.summary.updated}, kept-local ${result.summary[\"kept-local\"]}, conflicts ${result.summary.conflict}`\n );\n if (result.leftoverDocs.length > 0) {\n detail(`Left in place (not deleted): ${result.leftoverDocs.join(\", \")}. Run doctor for the 0.4 layout.`);\n }\n });\n\nconst add = program.command(\"add\").description(\"Add an optional agent or skill.\");\n\nadd\n .command(\"skill <name>\")\n .description(\"Install one skill into .cursor/skills\")\n .option(\"--force\", \"Overwrite\")\n .option(\"--dry-run\", \"Preview\")\n .option(\"--json\", \"Machine-readable output\")\n .action((name: string, options: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n const result = addSkill(process.cwd(), name, { force: Boolean(options.force), dryRun: Boolean(options.dryRun) });\n if (options.json) {\n printJson(result);\n return;\n }\n line(`${result.action} ${result.target}`);\n if (result.action === \"created\" && !options.dryRun) detail(`Available skills: ${listSkills().join(\", \")}`);\n });\n\nadd\n .command(\"agent <name>\")\n .description(\"Install one agent into .cursor/agents and .claude/agents\")\n .option(\"--force\", \"Overwrite\")\n .option(\"--dry-run\", \"Preview\")\n .option(\"--json\", \"Machine-readable output\")\n .action((name: string, options: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n const result = addAgent(process.cwd(), name, { force: Boolean(options.force), dryRun: Boolean(options.dryRun) });\n if (options.json) {\n printJson(result);\n return;\n }\n line(`${result.action} ${result.target}`);\n if (!options.dryRun) detail(`Available agents: ${listAgents().join(\", \")}`);\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check agents, required tools, the screenshot QA rule, and leftover 0.3 council files.\")\n .option(\"--json\", \"Machine-readable output\")\n .action((options: { json?: boolean }) => {\n const report = createDoctorReport(process.cwd());\n if (options.json) {\n printJson(report);\n if (!report.ok) process.exitCode = 1;\n return;\n }\n heading(\"doctor\");\n for (const finding of report.findings) {\n line(`${levelLabel(finding.level)} ${finding.area} ${finding.message}`);\n }\n if (!report.ok) {\n fail(\"doctor found failures\");\n process.exitCode = 1;\n } else {\n detail(\"Open USER_GUIDE.html in a browser. GitHub shows source, not the layout. Run agent-kit guide for the path.\");\n }\n });\n\nprogram\n .command(\"guide\")\n .description(\"Print the path to USER_GUIDE.html. Open it in a browser; GitHub shows source.\")\n .option(\"--json\", \"Machine-readable output\")\n .action((options: { json?: boolean }) => {\n const location = resolveUserGuideHtml(process.cwd());\n if (options.json) {\n printJson(location);\n return;\n }\n heading(\"user guide\");\n line(location.path);\n detail(\"Open that file in a browser. GitHub shows HTML as source, not the layout.\");\n });\n\nconst adapter = program.command(\"adapter\").description(\"Validate IDE adapter files.\");\nadapter\n .command(\"validate [target]\")\n .description(\"Validate activated IDEs, or one of cursor, claude, codex, copilot, antigravity\")\n .option(\"--json\", \"Machine-readable output\")\n .action((rawTarget: string | undefined, options: { json?: boolean }) => {\n const target = rawTarget ?? \"all\";\n const allowed = [\"cursor\", \"claude\", \"codex\", \"copilot\", \"antigravity\", \"all\"];\n if (!allowed.includes(target)) {\n throw new Error(`Unknown adapter target \"${target}\".`);\n }\n const report = validateAdapter(process.cwd(), target as AdapterValidationTarget);\n if (options.json) {\n printJson(report);\n } else {\n heading(`adapter validate ${report.target}`);\n for (const finding of report.findings) {\n line(`${levelLabel(finding.level)} ${finding.area} ${finding.message}`);\n }\n }\n if (report.summary.fail > 0) process.exitCode = 1;\n });\n\nconst packageCommand = program.command(\"package\").description(\"Validate this source package.\");\npackageCommand\n .command(\"validate\")\n .option(\"--json\", \"Machine-readable output\")\n .action((options: { json?: boolean }) => {\n const report = validatePackage();\n if (options.json) printJson(report);\n else {\n heading(\"package validate\");\n for (const finding of report.findings) line(`${levelLabel(finding.level)} ${finding.area} ${finding.message}`);\n }\n if (report.summary.fail > 0) process.exitCode = 1;\n });\n\nprogram.configureOutput({\n outputError: (str, write) => {\n const message = str.replace(/^error: /i, \"\").trim();\n write(`error: ${message}\\n`);\n }\n});\n\nasync function main(): Promise<void> {\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`error: ${message}`);\n process.exitCode = 1;\n }\n}\n\nvoid main();\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { findPackageRoot } from \"./utils/package-root.js\";\n\nexport interface Catalog {\n schemaVersion: number;\n defaultAgents: string[];\n optionalAgents: string[];\n defaultSkills: string[];\n optionalSkills: string[];\n screenshotFailClosed: string;\n}\n\nconst catalogByRoot = new Map<string, Catalog>();\n\nexport function loadCatalog(packageRoot = findPackageRoot()): Catalog {\n const existing = catalogByRoot.get(packageRoot);\n if (existing) return existing;\n const parsed = JSON.parse(readFileSync(join(packageRoot, \"catalog.json\"), \"utf8\")) as Catalog;\n catalogByRoot.set(packageRoot, parsed);\n return parsed;\n}\n\nexport function resetCatalogCache(): void {\n catalogByRoot.clear();\n}\n\nexport function agentSourcePath(packageRoot: string, id: string): string {\n const main = join(packageRoot, \"agents\", id, \"agent.md\");\n if (existsSync(main)) return main;\n const optional = join(packageRoot, \"agents\", \"optional\", id, \"agent.md\");\n if (existsSync(optional)) return optional;\n throw new Error(`Unknown agent \"${id}\".`);\n}\n\nexport function skillSourcePath(packageRoot: string, id: string): string {\n const main = join(packageRoot, \"skills\", id, \"SKILL.md\");\n if (existsSync(main)) return main;\n const optional = join(packageRoot, \"skills\", \"optional\", id, \"SKILL.md\");\n if (existsSync(optional)) return optional;\n throw new Error(`Unknown skill \"${id}\".`);\n}\n\nexport function listKnownAgents(packageRoot = findPackageRoot()): string[] {\n const catalog = loadCatalog(packageRoot);\n return [...catalog.defaultAgents, ...catalog.optionalAgents];\n}\n\nexport function listKnownSkills(packageRoot = findPackageRoot()): string[] {\n const catalog = loadCatalog(packageRoot);\n return [...catalog.defaultSkills, ...catalog.optionalSkills];\n}\n\nexport function isOptionalAgent(id: string, packageRoot = findPackageRoot()): boolean {\n return loadCatalog(packageRoot).optionalAgents.includes(id);\n}\n\nexport function isOptionalSkill(id: string, packageRoot = findPackageRoot()): boolean {\n return loadCatalog(packageRoot).optionalSkills.includes(id);\n}\n\nexport function parseFrontmatter(markdown: string): { name?: string; description?: string; tools?: string[]; requiredTools?: string[]; body: string } {\n const match = markdown.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return { body: markdown };\n const raw = match[1] ?? \"\";\n const body = match[2] ?? \"\";\n const name = raw.match(/^name:\\s*(.+)$/m)?.[1]?.trim();\n const description = raw.match(/^description:\\s*(.+)$/m)?.[1]?.trim();\n const tools = parseYamlList(raw, \"tools\");\n const requiredTools = parseYamlList(raw, \"requiredTools\");\n return {\n ...(name ? { name } : {}),\n ...(description ? { description } : {}),\n ...(tools ? { tools } : {}),\n ...(requiredTools ? { requiredTools } : {}),\n body\n };\n}\n\nfunction parseYamlList(frontmatter: string, key: string): string[] | undefined {\n const line = frontmatter.match(new RegExp(`^${key}:\\\\s*\\\\[(.*)\\\\]\\\\s*$`, \"m\"));\n if (!line?.[1]) return undefined;\n return line[1]\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function findPackageRoot(start = dirname(fileURLToPath(import.meta.url))): string {\n let current = resolve(start);\n\n for (let i = 0; i < 8; i += 1) {\n if (existsSync(join(current, \"package.json\"))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n throw new Error(\"Unable to locate package root from runtime path.\");\n}\n","import { join } from \"node:path\";\nimport { copyTextWithConflict, writeConflictProposal, writeText, type CopyResult } from \"../utils/fs.js\";\nimport { existsSync, readFileSync } from \"node:fs\";\n\nexport interface CopyCollector {\n copied: string[];\n unchanged: string[];\n conflicts: string[];\n overwritten: string[];\n}\n\nexport function emptyCollector(): CopyCollector {\n return { copied: [], unchanged: [], conflicts: [], overwritten: [] };\n}\n\nexport function recordCopy(collector: CopyCollector, result: CopyResult): void {\n if (result.action === \"created\") collector.copied.push(result.target);\n if (result.action === \"unchanged\") collector.unchanged.push(result.target);\n if (result.action === \"overwritten\") collector.overwritten.push(result.target);\n if (result.action === \"conflict\") {\n collector.conflicts.push(result.conflictPath ? `${result.target} -> ${result.conflictPath}` : result.target);\n }\n}\n\nexport function copyFromPackage(cwd: string, packageRoot: string, source: string, target: string, force: boolean, collector: CopyCollector): void {\n recordCopy(\n collector,\n copyTextWithConflict(join(packageRoot, source), cwd, target, {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n}\n\nexport function writeGenerated(cwd: string, relativePath: string, content: string, force: boolean, collector: CopyCollector): void {\n const targetPath = join(cwd, relativePath);\n if (!force && existsSync(targetPath)) {\n const existing = readFileSync(targetPath, \"utf8\");\n if (existing === content) {\n collector.unchanged.push(relativePath);\n return;\n }\n const proposal = writeConflictProposal(cwd, relativePath, content, {\n currentContent: existing,\n reason: \"Generated content changed while the local target is customized.\"\n });\n collector.conflicts.push(`${relativePath} -> ${proposal.conflictPath}`);\n return;\n }\n writeText(targetPath, content);\n collector.copied.push(relativePath);\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"node:path\";\n\nexport function ensureDir(path: string): void {\n mkdirSync(path, { recursive: true });\n}\n\nexport function readTextIfExists(path: string): string | null {\n if (!existsSync(path)) return null;\n return readFileSync(path, \"utf8\");\n}\n\nexport function writeText(path: string, content: string): void {\n ensureDir(dirname(path));\n const temporaryPath = join(dirname(path), `.${basename(path)}.${process.pid}.${randomUUID()}.tmp`);\n try {\n writeFileSync(temporaryPath, content);\n renameSync(temporaryPath, path);\n } finally {\n rmSync(temporaryPath, { force: true });\n }\n}\n\nexport function sha256(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nexport function resolveInside(root: string, requestedPath: string): string {\n const resolvedRoot = resolve(root);\n const resolvedPath = resolve(resolvedRoot, requestedPath);\n const rel = relative(resolvedRoot, resolvedPath);\n\n if (rel === \"..\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(`Unsafe path outside root: ${requestedPath}`);\n }\n\n return resolvedPath;\n}\n\nexport function listFilesRecursive(root: string): string[] {\n if (!existsSync(root)) return [];\n\n const out: string[] = [];\n const visit = (dir: string) => {\n for (const entry of readdirSync(dir)) {\n const fullPath = join(dir, entry);\n let stats;\n try {\n stats = lstatSync(fullPath);\n } catch {\n continue;\n }\n\n if (stats.isSymbolicLink()) continue;\n\n if (stats.isDirectory()) {\n if (entry === \"node_modules\" || entry === \".git\") continue;\n visit(fullPath);\n } else {\n out.push(relative(root, fullPath));\n }\n }\n };\n\n visit(root);\n return out.sort();\n}\n\nexport interface CopyResult {\n action: \"created\" | \"unchanged\" | \"conflict\" | \"overwritten\";\n target: string;\n conflictPath?: string;\n}\n\nexport interface ConflictProposalResult {\n conflictPath: string;\n metadataPath: string;\n}\n\nexport function writeConflictProposal(\n targetRoot: string,\n targetRelativePath: string,\n proposedContent: string,\n options: { currentContent?: string | undefined; reason?: string; sourceVersion?: string } = {}\n): ConflictProposalResult {\n const proposalHash = sha256(proposedContent);\n const safeTarget = targetRelativePath.replace(/[^a-zA-Z0-9_.-]/g, \"__\");\n const baseName = `${safeTarget}.${proposalHash.slice(0, 12)}`;\n const conflictRoot = join(targetRoot, \".agent-kit\", \"conflicts\");\n const proposalPath = join(conflictRoot, `${baseName}.proposed`);\n const metadataPath = join(conflictRoot, `${baseName}.json`);\n const normalizedTarget = targetRelativePath.replace(/\\\\/g, \"/\");\n writeText(proposalPath, proposedContent);\n writeText(\n metadataPath,\n `${JSON.stringify(\n {\n schemaVersion: 1,\n target: normalizedTarget,\n proposedSha256: proposalHash,\n ...(options.currentContent !== undefined ? { currentSha256: sha256(options.currentContent) } : {}),\n ...(options.reason ? { reason: options.reason } : {}),\n ...(options.sourceVersion ? { sourceVersion: options.sourceVersion } : {})\n },\n null,\n 2\n )}\\n`\n );\n return {\n conflictPath: relative(targetRoot, proposalPath).replace(/\\\\/g, \"/\"),\n metadataPath: relative(targetRoot, metadataPath).replace(/\\\\/g, \"/\")\n };\n}\n\nexport function copyTextWithConflict(\n sourcePath: string,\n targetRoot: string,\n targetRelativePath: string,\n options: { force?: boolean; conflictRoot?: string } = {}\n): CopyResult {\n const targetPath = resolveInside(targetRoot, targetRelativePath);\n const sourceContent = readFileSync(sourcePath, \"utf8\");\n const existingContent = readTextIfExists(targetPath);\n\n if (existingContent === null) {\n writeText(targetPath, sourceContent);\n return { action: \"created\", target: targetRelativePath };\n }\n\n if (sha256(existingContent) === sha256(sourceContent)) {\n return { action: \"unchanged\", target: targetRelativePath };\n }\n\n if (options.force) {\n writeText(targetPath, sourceContent);\n return { action: \"overwritten\", target: targetRelativePath };\n }\n\n const defaultConflictRoot = join(targetRoot, \".agent-kit\", \"conflicts\");\n if (options.conflictRoot && resolve(options.conflictRoot) !== resolve(defaultConflictRoot)) {\n throw new Error(\"Custom conflict roots are no longer supported; proposals must stay under .agent-kit/conflicts.\");\n }\n const proposal = writeConflictProposal(targetRoot, targetRelativePath, sourceContent, {\n currentContent: existingContent,\n reason: \"Local content differs from the proposed package content.\"\n });\n\n return {\n action: \"conflict\",\n target: targetRelativePath,\n conflictPath: proposal.conflictPath\n };\n}\n\nexport function copyDirectory(sourceRoot: string, targetRoot: string): void {\n ensureDir(dirname(targetRoot));\n cpSync(sourceRoot, targetRoot, {\n recursive: true,\n force: true,\n filter: (source) => !basename(source).startsWith(\".DS_Store\")\n });\n}\n","import { readFileSync } from \"node:fs\";\nimport { agentSourcePath, loadCatalog, parseFrontmatter, skillSourcePath } from \"../catalog.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { writeGenerated, type CopyCollector } from \"./copy-asset.js\";\n\nfunction escapeTomlString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function generateCursorAgents(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultAgents) {\n const content = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/agents/${id}.md`, content, force, collector);\n }\n}\n\nexport function generateCursorSkills(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultSkills) {\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/skills/${id}/SKILL.md`, content, force, collector);\n }\n}\n\nexport function generatePortableSkills(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultSkills) {\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `skills/${id}/SKILL.md`, content, force, collector);\n }\n}\n\nexport function generateClaudeAgents(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultAgents) {\n const content = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.claude/agents/${id}.md`, content, force, collector);\n }\n}\n\nexport function generateCodexAgents(cwd: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultAgents) {\n const markdown = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n const meta = parseFrontmatter(markdown);\n const description = meta.description ?? id;\n const toml = `name = \"${id}\"\ndescription = \"${escapeTomlString(description)}\"\nmodel_reasoning_effort = \"medium\"\n\ndeveloper_instructions = \"\"\"\n${markdown.replace(/\"\"\"/g, '\\\\\"\\\\\"\\\\\"')}\n\"\"\"\n`;\n writeGenerated(cwd, `.codex/agents/${id}.toml`, toml, force, collector);\n }\n}\n\nexport function generateCopilotInstructions(cwd: string, force: boolean, collector: CopyCollector): void {\n const catalog = loadCatalog();\n const content = `# Copilot instructions\n\nThis repo uses a small agent and skill pack. Read \\`AGENTS.md\\` and \\`USER_GUIDE.md\\`.\n\nWhen the user names a role, act as that agent:\n\n${catalog.defaultAgents.map((id) => `- ${id}`).join(\"\\n\")}\n\n${catalog.screenshotFailClosed}\n\nDo not review user-visible work from code alone. Use the browser-qa skill: open the app, capture desktop and mobile screenshots, read the images, then give accept / accept-with-nits / reject.\n\nIf you cannot open a browser, use Playwright:\n\n\\`\\`\\`bash\nnpx playwright screenshot --viewport-size=1280,720 \"$URL\" qa-evidence/<slug>/desktop.png\nnpx playwright screenshot --viewport-size=390,844 \"$URL\" qa-evidence/<slug>/mobile.png\n\\`\\`\\`\n`;\n writeGenerated(cwd, \".github/copilot-instructions.md\", content, force, collector);\n}\n\nexport function generateAntigravityCommands(cwd: string, force: boolean, collector: CopyCollector): void {\n const commands: Array<{ name: string; description: string; prompt: string }> = [\n {\n name: \"plan\",\n description: \"Plan the change and name the owning agent.\",\n prompt:\n \"Act as the planner agent. Plan this change. Name the owning agent, extra reviewers, and which screenshots QA must capture. Do not write code. Read AGENTS.md and USER_GUIDE.md.\"\n },\n {\n name: \"browser-qa\",\n description: \"Live browser QA with desktop and mobile screenshots.\",\n prompt:\n \"Act as the QA agent. Use the browser-qa skill. Do not review code alone. Open the app, capture desktop and mobile screenshots, read the images, then give accept / accept-with-nits / reject.\"\n },\n {\n name: \"security\",\n description: \"Auth, RLS, secrets, and OWASP review.\",\n prompt: \"Act as the security agent. Review auth, RLS, IDOR, and secrets. Exercise login or denied states in the browser when they are user-visible.\"\n },\n {\n name: \"frontend\",\n description: \"UI review from screenshots first.\",\n prompt: \"Act as the design agent. Review the running UI from screenshots first. Desktop and mobile. Reject generic AI-looking layout.\"\n },\n {\n name: \"copy\",\n description: \"Review rendered conversion copy.\",\n prompt: \"Act as the copy agent. Review the rendered words in screenshots, not just strings in source. Run product-copy first, then deslop last. Always.\"\n },\n {\n name: \"test\",\n description: \"Run tests, then browser-qa for UI.\",\n prompt: \"Act as the QA agent. Run applicable tests, then use browser-qa for any user-visible change.\"\n },\n {\n name: \"ship\",\n description: \"Release go / no-go.\",\n prompt: \"Use the ship skill. Confirm env, migrations, rollback, and browser-qa evidence for user-visible changes.\"\n }\n ];\n\n writeGenerated(\n cwd,\n \".antigravity/agent-kit/plugin.json\",\n `${JSON.stringify({ name: \"agents-and-skills\", commands: commands.map((item) => item.name) }, null, 2)}\\n`,\n force,\n collector\n );\n\n for (const command of commands) {\n const toml = `name = \"${command.name}\"\ndescription = \"${command.description}\"\n\nprompt = \"\"\"\n${command.prompt}\n\"\"\"\n`;\n writeGenerated(cwd, `.antigravity/agent-kit/commands/${command.name}.toml`, toml, force, collector);\n }\n\n const packageRoot = findPackageRoot();\n const catalog = loadCatalog(packageRoot);\n for (const id of catalog.defaultSkills) {\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.antigravity/runtime-skills/${id}/SKILL.md`, content, force, collector);\n }\n}\n\nexport function copyOptionalAgent(cwd: string, id: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const content = readFileSync(agentSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/agents/${id}.md`, content, force, collector);\n writeGenerated(cwd, `.claude/agents/${id}.md`, content, force, collector);\n}\n\nexport function copyOptionalSkill(cwd: string, id: string, force: boolean, collector: CopyCollector): void {\n const packageRoot = findPackageRoot();\n const content = readFileSync(skillSourcePath(packageRoot, id), \"utf8\");\n writeGenerated(cwd, `.cursor/skills/${id}/SKILL.md`, content, force, collector);\n}\n","import { listKnownAgents } from \"../catalog.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { emptyCollector } from \"./copy-asset.js\";\nimport { copyOptionalAgent } from \"./roster-adapters.js\";\n\nexport function listAgents(): string[] {\n return listKnownAgents();\n}\n\nexport interface AddAgentResult {\n action: \"created\" | \"unchanged\" | \"conflict\" | \"overwritten\";\n target: string;\n dryRun: boolean;\n}\n\nexport function addAgent(cwd: string, agentName: string, options: { force?: boolean; dryRun?: boolean } = {}): AddAgentResult {\n const packageRoot = findPackageRoot();\n const id = agentName.replace(/\\.md$/, \"\");\n if (!/^[a-z0-9-]+$/.test(id)) {\n throw new Error(\"Agent names may contain only lowercase letters, numbers, and hyphens.\");\n }\n\n const available = listKnownAgents(packageRoot);\n if (!available.includes(id)) {\n throw new Error(`Unknown agent \"${agentName}\". Available agents: ${available.join(\", \")}`);\n }\n\n const target = `.cursor/agents/${id}.md`;\n if (options.dryRun) {\n return { action: \"created\", target, dryRun: true };\n }\n\n const collector = emptyCollector();\n copyOptionalAgent(cwd, id, Boolean(options.force), collector);\n const action = collector.copied.includes(target)\n ? \"created\"\n : collector.unchanged.includes(target)\n ? \"unchanged\"\n : collector.overwritten.includes(target)\n ? \"overwritten\"\n : \"conflict\";\n return { action, target, dryRun: false };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isOptionalSkill, listKnownSkills, skillSourcePath } from \"../catalog.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { emptyCollector } from \"./copy-asset.js\";\nimport { copyOptionalSkill } from \"./roster-adapters.js\";\n\nexport function listSkills(): string[] {\n return listKnownSkills();\n}\n\nexport interface AddSkillResult {\n action: \"created\" | \"unchanged\" | \"conflict\" | \"overwritten\";\n target: string;\n dryRun: boolean;\n}\n\nexport function addSkill(cwd: string, skillName: string, options: { force?: boolean; dryRun?: boolean } = {}): AddSkillResult {\n const packageRoot = findPackageRoot();\n const id = skillName.replace(/\\.md$/, \"\").replace(/\\/SKILL$/, \"\");\n if (!/^[a-z0-9-]+$/.test(id)) {\n throw new Error(\"Skill names may contain only lowercase letters, numbers, and hyphens.\");\n }\n\n const available = listKnownSkills(packageRoot);\n if (!available.includes(id)) {\n throw new Error(`Unknown skill \"${skillName}\". Available skills: ${available.join(\", \")}`);\n }\n\n const sourcePath = skillSourcePath(packageRoot, id);\n const target = `.cursor/skills/${id}/SKILL.md`;\n\n if (options.dryRun) {\n const existing = existsSync(`${cwd}/${target}`) ? readFileSync(`${cwd}/${target}`, \"utf8\") : null;\n const sourceContent = readFileSync(sourcePath, \"utf8\");\n let action: AddSkillResult[\"action\"] = \"created\";\n if (existing === sourceContent) action = \"unchanged\";\n else if (existing) action = options.force ? \"overwritten\" : \"conflict\";\n return { action, target, dryRun: true };\n }\n\n const collector = emptyCollector();\n copyOptionalSkill(cwd, id, Boolean(options.force), collector);\n const action = collector.copied.includes(target)\n ? \"created\"\n : collector.unchanged.includes(target)\n ? \"unchanged\"\n : collector.overwritten.includes(target)\n ? \"overwritten\"\n : \"conflict\";\n return { action, target, dryRun: false };\n}\n\nexport function assertAddableSkill(id: string): void {\n if (!isOptionalSkill(id) && !listKnownSkills().includes(id)) {\n throw new Error(`Unknown skill \"${id}\".`);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadCatalog } from \"../catalog.js\";\nimport { IDE_TARGETS, isIdeTarget, type IdeTarget } from \"./ide-activate.js\";\nimport { readManifest } from \"./install.js\";\n\nexport type ValidationLevel = \"pass\" | \"warn\" | \"fail\";\nexport type AdapterValidationTarget = IdeTarget | \"all\";\n\nexport interface ValidationFinding {\n level: ValidationLevel;\n area: string;\n message: string;\n remediation?: string;\n}\n\nexport interface ValidationReport {\n target: string;\n validated: IdeTarget[];\n summary: Record<ValidationLevel, number>;\n findings: ValidationFinding[];\n}\n\nfunction summary(findings: ValidationFinding[]): Record<ValidationLevel, number> {\n return {\n pass: findings.filter((finding) => finding.level === \"pass\").length,\n warn: findings.filter((finding) => finding.level === \"warn\").length,\n fail: findings.filter((finding) => finding.level === \"fail\").length\n };\n}\n\nfunction report(target: string, findings: ValidationFinding[], validated: IdeTarget[]): ValidationReport {\n return { target, validated, summary: summary(findings), findings };\n}\n\nfunction has(cwd: string, relative: string): boolean {\n return existsSync(join(cwd, relative));\n}\n\nfunction text(cwd: string, relative: string): string {\n return readFileSync(join(cwd, relative), \"utf8\");\n}\n\nfunction validateCursor(cwd: string): ValidationFinding[] {\n const catalog = loadCatalog();\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \".cursor/rules/cursor-agent-kit.mdc\")) {\n findings.push({\n level: \"fail\",\n area: \"cursor\",\n message: \"Missing .cursor/rules/cursor-agent-kit.mdc\",\n remediation: \"Run agent-kit init --activate cursor\"\n });\n } else {\n findings.push({ level: \"pass\", area: \"cursor\", message: \"Cursor rule is present.\" });\n }\n for (const id of catalog.defaultAgents) {\n const path = `.cursor/agents/${id}.md`;\n if (!has(cwd, path)) {\n findings.push({ level: \"fail\", area: \"cursor\", message: `Missing ${path}` });\n } else if (\n id === \"qa\" &&\n !text(cwd, path).includes(\"Do not review user-visible work from code alone\") &&\n !text(cwd, path).includes(\"Do not review code alone\")\n ) {\n findings.push({ level: \"fail\", area: \"cursor\", message: \"Cursor QA agent dropped the screenshot fail-closed rule.\" });\n } else {\n findings.push({ level: \"pass\", area: \"cursor\", message: `${path} is present.` });\n }\n }\n if (!has(cwd, \".cursor/skills/browser-qa/SKILL.md\")) {\n findings.push({ level: \"fail\", area: \"cursor\", message: \"Missing .cursor/skills/browser-qa/SKILL.md\" });\n }\n return findings;\n}\n\nfunction validateClaude(cwd: string): ValidationFinding[] {\n const catalog = loadCatalog();\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \"CLAUDE.md\")) {\n findings.push({ level: \"fail\", area: \"claude\", message: \"Missing CLAUDE.md\", remediation: \"Run agent-kit init --activate claude\" });\n }\n for (const id of catalog.defaultAgents) {\n const path = `.claude/agents/${id}.md`;\n findings.push(\n has(cwd, path) ? { level: \"pass\", area: \"claude\", message: `${path} is present.` } : { level: \"fail\", area: \"claude\", message: `Missing ${path}` }\n );\n if (\n id === \"qa\" &&\n has(cwd, path) &&\n !text(cwd, path).includes(\"Do not review code alone\") &&\n !text(cwd, path).includes(\"Do not review user-visible work from code alone\")\n ) {\n findings.push({ level: \"fail\", area: \"claude\", message: \"Claude QA agent dropped the screenshot fail-closed rule.\" });\n }\n }\n return findings;\n}\n\nfunction validateCodex(cwd: string): ValidationFinding[] {\n const catalog = loadCatalog();\n const findings: ValidationFinding[] = [];\n for (const id of catalog.defaultAgents) {\n const path = `.codex/agents/${id}.toml`;\n findings.push(\n has(cwd, path)\n ? { level: \"pass\", area: \"codex\", message: `${path} is present.` }\n : { level: \"fail\", area: \"codex\", message: `Missing ${path}`, remediation: \"Run agent-kit init --activate codex\" }\n );\n if (id === \"qa\" && has(cwd, path) && !text(cwd, path).includes(\"Do not review\")) {\n findings.push({ level: \"fail\", area: \"codex\", message: \"Codex QA agent dropped the screenshot fail-closed rule.\" });\n }\n }\n return findings;\n}\n\nfunction validateCopilot(cwd: string): ValidationFinding[] {\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \".github/copilot-instructions.md\")) {\n findings.push({ level: \"fail\", area: \"copilot\", message: \"Missing .github/copilot-instructions.md\" });\n } else if (!text(cwd, \".github/copilot-instructions.md\").includes(\"Do not review user-visible work from code alone\")) {\n findings.push({ level: \"fail\", area: \"copilot\", message: \"Copilot instructions dropped the screenshot rule.\" });\n } else {\n findings.push({ level: \"pass\", area: \"copilot\", message: \"Copilot instructions include the screenshot rule.\" });\n }\n return findings;\n}\n\nfunction validateAntigravity(cwd: string): ValidationFinding[] {\n const findings: ValidationFinding[] = [];\n if (!has(cwd, \".antigravity/agent-kit/plugin.json\")) {\n findings.push({ level: \"fail\", area: \"antigravity\", message: \"Missing Antigravity plugin.json\" });\n } else {\n findings.push({ level: \"pass\", area: \"antigravity\", message: \"Antigravity plugin is present.\" });\n }\n if (!has(cwd, \".antigravity/agent-kit/commands/browser-qa.toml\")) {\n findings.push({ level: \"fail\", area: \"antigravity\", message: \"Missing /browser-qa command.\" });\n } else if (!text(cwd, \".antigravity/agent-kit/commands/browser-qa.toml\").includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"antigravity\", message: \"/browser-qa dropped the screenshot rule.\" });\n } else {\n findings.push({ level: \"pass\", area: \"antigravity\", message: \"/browser-qa includes the screenshot rule.\" });\n }\n return findings;\n}\n\nconst validators: Record<IdeTarget, (cwd: string) => ValidationFinding[]> = {\n cursor: validateCursor,\n claude: validateClaude,\n codex: validateCodex,\n copilot: validateCopilot,\n antigravity: validateAntigravity\n};\n\nexport function resolveAdapterTargets(cwd: string, target: AdapterValidationTarget): IdeTarget[] {\n if (target !== \"all\") return [target];\n const activated = (readManifest(cwd)?.activated ?? []).filter(isIdeTarget);\n return activated.length > 0 ? activated : [...IDE_TARGETS];\n}\n\nexport function validateAdapter(cwd: string, target: AdapterValidationTarget): ValidationReport {\n const validated = resolveAdapterTargets(cwd, target);\n const findings = validated.flatMap((ide) => validators[ide](cwd));\n const label = target === \"all\" && validated.length < IDE_TARGETS.length ? `all (${validated.join(\", \")})` : target;\n return report(label, findings, validated);\n}\n\nexport function validatePackage(): ValidationReport {\n const cwd = process.cwd();\n const findings: ValidationFinding[] = [];\n if (!existsSync(join(cwd, \"catalog.json\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"catalog.json is missing.\" });\n } else {\n findings.push({ level: \"pass\", area: \"package\", message: \"catalog.json is present.\" });\n }\n if (!existsSync(join(cwd, \"USER_GUIDE.md\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.md is missing.\" });\n } else if (!readFileSync(join(cwd, \"USER_GUIDE.md\"), \"utf8\").includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.md dropped the screenshot fail-closed sentence.\" });\n } else {\n findings.push({ level: \"pass\", area: \"package\", message: \"USER_GUIDE.md includes the screenshot rule.\" });\n }\n if (!existsSync(join(cwd, \"USER_GUIDE.html\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.html is missing.\" });\n } else if (!readFileSync(join(cwd, \"USER_GUIDE.html\"), \"utf8\").includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"package\", message: \"USER_GUIDE.html dropped the screenshot fail-closed sentence.\" });\n } else {\n findings.push({ level: \"pass\", area: \"package\", message: \"USER_GUIDE.html includes the screenshot rule.\" });\n }\n if (!existsSync(join(cwd, \"skills/browser-qa/SKILL.md\"))) {\n findings.push({ level: \"fail\", area: \"package\", message: \"skills/browser-qa/SKILL.md is missing.\" });\n }\n return report(\"package\", findings, []);\n}\n","import type { AgentKitConfig } from \"./types.js\";\n\nexport const PACKAGE_NAME = \"@appsforgood/next-supabase-kit\";\nexport const PACKAGE_VERSION = \"0.4.3\";\n\nexport const DEFAULT_CONFIG: AgentKitConfig = {\n stack: \"next-supabase\",\n projectType: \"saas\",\n docsMode: \"advisory\",\n githubActions: {\n mode: \"off\"\n },\n agentCouncil: {\n required: false,\n rosterPath: \"\",\n defaultWorkflow: \"planning\",\n coreChangeWorkflow: \"core-change\"\n },\n modelRouting: {\n required: false,\n routingPath: \"\",\n reviewCadence: \"when-needed\"\n },\n designProviders: [\"stitch\", \"claude\", \"figma\", \"human\"],\n research: {\n maxRepos: 40,\n githubTokenEnv: \"GITHUB_TOKEN\",\n workdir: \"research/workdir\"\n }\n};\n\nexport const ROOT_DOCS = [\"AGENTS.md\", \"USER_GUIDE.md\", \"USER_GUIDE.html\"] as const;\n\nexport const CURSOR_RULE_FILE = {\n source: \"assistant-adapters/cursor-agent-kit.mdc\",\n target: \".cursor/rules/cursor-agent-kit.mdc\"\n} as const;\n\nexport const CLAUDE_TEMPLATE = \"templates/next-supabase/CLAUDE.md\";\nexport const USER_GUIDE_SOURCE = \"USER_GUIDE.md\";\nexport const USER_GUIDE_HTML_SOURCE = \"USER_GUIDE.html\";\nexport const AGENTS_DOC_SOURCE = \"templates/next-supabase/AGENTS.md\";\n\nexport const COPILOT_INSTRUCTION_TARGET = \".github/copilot-instructions.md\";\nexport const CODEX_CONFIG_TARGET = \".codex/config.toml\";\n\nexport const ANTIGRAVITY_PLUGIN_TARGET = \".antigravity/agent-kit/plugin.json\";\nexport const ANTIGRAVITY_COMMANDS = [\"plan\", \"browser-qa\", \"security\", \"frontend\", \"copy\", \"test\", \"ship\"] as const;\n\n/** Legacy constants kept so leftover studio/audit modules still typecheck. */\nexport const LIBRARY_FOLDERS = [] as const;\nexport const DEFAULT_AGENT_ROSTER_SOURCE = \"rosters/next-supabase-default-council.json\";\nexport const DEFAULT_AGENT_ROSTER_TARGET = \".agent-kit/agent-roster.json\";\nexport const DEFAULT_MODEL_ROUTING_SOURCE = \"model-routing/default-model-routing.json\";\nexport const DEFAULT_MODEL_ROUTING_TARGET = \".agent-kit/model-routing.json\";\nexport const DEFAULT_ORCHESTRATOR_SOURCE = \"templates/next-supabase/.agent-kit/orchestrator.json\";\nexport const DEFAULT_ORCHESTRATOR_TARGET = \".agent-kit/orchestrator.json\";\nexport const DEFAULT_RUNTIME_IGNORE_SOURCE = \"templates/next-supabase/.agent-kit/runtime/gitignore.template\";\nexport const DEFAULT_RUNTIME_IGNORE_TARGET = \".agent-kit/runtime/.gitignore\";\nexport const CURSOR_ADAPTER_FILES = [CURSOR_RULE_FILE] as const;\nexport const CURSOR_SCOPED_ADAPTER_FILES = [] as const;\nexport const COPILOT_INSTRUCTION_FILES = [{ source: \"assistant-adapters/github-copilot-instructions.md\", target: COPILOT_INSTRUCTION_TARGET }] as const;\nexport const CODEX_CONFIG_SOURCE = \"assistant-adapters/model-selection/codex-config.example.toml\";\nexport const ANTIGRAVITY_PLUGIN_FILES = [{ source: \"antigravity/plugin.json\", target: ANTIGRAVITY_PLUGIN_TARGET }] as const;\nexport const ANTIGRAVITY_COMMANDS_SOURCE_DIR = \"antigravity/commands\";\nexport const ANTIGRAVITY_COMMANDS_TARGET_DIR = \".antigravity/agent-kit/commands\";\nexport const RUNTIME_SKILLS_SOURCE_DIR = \"runtime-skills\";\nexport const ANTIGRAVITY_RUNTIME_SKILLS_TARGET_DIR = \".antigravity/runtime-skills\";\nexport const CI_TEMPLATE_FILES = [\n {\n source: \"templates/next-supabase/.github/workflows/agent-kit-audit.yml\",\n target: \".github/workflows/agent-kit-audit.yml\"\n }\n] as const;\n","import { CLAUDE_TEMPLATE, CURSOR_RULE_FILE } from \"../config/defaults.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { copyFromPackage, emptyCollector, type CopyCollector } from \"./copy-asset.js\";\nimport {\n generateAntigravityCommands,\n generateClaudeAgents,\n generateCodexAgents,\n generateCopilotInstructions,\n generateCursorAgents,\n generateCursorSkills\n} from \"./roster-adapters.js\";\n\nexport const IDE_TARGETS = [\"cursor\", \"claude\", \"codex\", \"copilot\", \"antigravity\"] as const;\nexport type IdeTarget = (typeof IDE_TARGETS)[number];\n\nexport interface ActivateIdeOptions {\n cwd: string;\n targets: Array<IdeTarget | \"all\">;\n force?: boolean;\n}\n\nexport interface ActivateIdeResult extends CopyCollector {\n activated: IdeTarget[];\n}\n\nconst ALLOWED = new Set<IdeTarget>(IDE_TARGETS);\n\nexport function isIdeTarget(value: string): value is IdeTarget {\n return ALLOWED.has(value as IdeTarget);\n}\n\nexport class InvalidActivateTargetError extends Error {\n constructor(public readonly invalid: string[]) {\n super(`Unknown --activate target(s): ${invalid.join(\", \")}. Allowed: cursor, claude, codex, copilot, antigravity, all.`);\n this.name = \"InvalidActivateTargetError\";\n }\n}\n\nexport function parseActivateTargets(raw: string[] | undefined): IdeTarget[] {\n if (!raw || raw.length === 0) return [];\n return normalizeTargets(raw.flatMap((value) => value.split(\",\")));\n}\n\nfunction normalizeTargets(targets: string[]): IdeTarget[] {\n const normalized = new Set<IdeTarget>();\n const invalid: string[] = [];\n for (const target of targets) {\n const value = target.trim().toLowerCase();\n if (!value) continue;\n if (value === \"all\") {\n for (const item of ALLOWED) normalized.add(item);\n continue;\n }\n if (isIdeTarget(value)) {\n normalized.add(value);\n } else {\n invalid.push(target.trim());\n }\n }\n if (invalid.length > 0) throw new InvalidActivateTargetError(invalid);\n return [...normalized];\n}\n\nexport function activateIdeTargets(options: ActivateIdeOptions): ActivateIdeResult {\n const cwd = options.cwd;\n const packageRoot = findPackageRoot();\n const targets = normalizeTargets(options.targets);\n const force = Boolean(options.force);\n const collector = emptyCollector();\n const result: ActivateIdeResult = { activated: targets, ...collector };\n\n if (targets.length === 0) return result;\n\n if (targets.includes(\"cursor\")) {\n copyFromPackage(cwd, packageRoot, CURSOR_RULE_FILE.source, CURSOR_RULE_FILE.target, force, result);\n generateCursorAgents(cwd, force, result);\n generateCursorSkills(cwd, force, result);\n }\n if (targets.includes(\"claude\")) {\n copyFromPackage(cwd, packageRoot, CLAUDE_TEMPLATE, \"CLAUDE.md\", force, result);\n generateClaudeAgents(cwd, force, result);\n }\n if (targets.includes(\"codex\")) {\n generateCodexAgents(cwd, force, result);\n }\n if (targets.includes(\"copilot\")) {\n generateCopilotInstructions(cwd, force, result);\n }\n if (targets.includes(\"antigravity\")) {\n generateAntigravityCommands(cwd, force, result);\n }\n\n return result;\n}\n\nexport function ideSurfaceToActivateTarget(ideSurface: string): IdeTarget | null {\n const value = ideSurface.trim().toLowerCase();\n if (value === \"cursor\" || value === \"claude\" || value === \"codex\" || value === \"copilot\" || value === \"antigravity\") {\n return value;\n }\n return null;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadCatalog } from \"../catalog.js\";\nimport {\n AGENTS_DOC_SOURCE,\n CURSOR_RULE_FILE,\n PACKAGE_NAME,\n PACKAGE_VERSION,\n ROOT_DOCS,\n USER_GUIDE_HTML_SOURCE,\n USER_GUIDE_SOURCE\n} from \"../config/defaults.js\";\nimport type { InstallManifest, StackProfile } from \"../config/types.js\";\nimport { copyTextWithConflict, ensureDir, sha256, writeText } from \"../utils/fs.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { emptyCollector, recordCopy, type CopyCollector } from \"./copy-asset.js\";\nimport { activateIdeTargets, parseActivateTargets, type ActivateIdeResult, type IdeTarget } from \"./ide-activate.js\";\nimport { listManagedAssets } from \"./managed-assets.js\";\nimport { generatePortableSkills } from \"./roster-adapters.js\";\n\nexport interface InitOptions {\n cwd: string;\n stack?: StackProfile;\n force?: boolean;\n activate?: string[];\n legacyDocs?: boolean;\n}\n\nexport interface InitResult extends CopyCollector {\n manifestPath: string;\n activation?: ActivateIdeResult;\n contextPath?: string;\n}\n\nexport function initProject(options: InitOptions): InitResult {\n const cwd = options.cwd;\n const stack = options.stack ?? \"next-supabase\";\n const packageRoot = findPackageRoot();\n const force = Boolean(options.force);\n\n ensureDir(join(cwd, \".agent-kit\", \"conflicts\"));\n\n const result: InitResult = {\n ...emptyCollector(),\n manifestPath: \".agent-kit/manifest.json\"\n };\n\n const templateHashes: Record<string, string> = {};\n const agentsDoc = readFileSync(join(packageRoot, AGENTS_DOC_SOURCE), \"utf8\");\n const userGuide = readFileSync(join(packageRoot, USER_GUIDE_SOURCE), \"utf8\");\n const userGuideHtml = readFileSync(join(packageRoot, USER_GUIDE_HTML_SOURCE), \"utf8\");\n templateHashes[\"AGENTS.md\"] = sha256(agentsDoc);\n templateHashes[\"USER_GUIDE.md\"] = sha256(userGuide);\n templateHashes[\"USER_GUIDE.html\"] = sha256(userGuideHtml);\n\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, AGENTS_DOC_SOURCE), cwd, \"AGENTS.md\", {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, USER_GUIDE_SOURCE), cwd, \"USER_GUIDE.md\", {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, USER_GUIDE_HTML_SOURCE), cwd, \"USER_GUIDE.html\", {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n\n if (options.legacyDocs) {\n const legacyRoot = join(packageRoot, \"templates\", stack);\n const legacyDocs = [\"SPEC.md\", \"DECISIONS.md\", \"DESIGN.md\", \"SECURITY.md\", \"TESTING.md\", \"QUALITY_GATES.md\"];\n for (const doc of legacyDocs) {\n const source = join(legacyRoot, doc);\n if (!existsSync(source)) continue;\n recordCopy(\n result,\n copyTextWithConflict(source, cwd, doc, {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n }\n }\n\n const activateTargets = parseActivateTargets(options.activate);\n const targets: IdeTarget[] = activateTargets.length > 0 ? activateTargets : [\"cursor\"];\n result.activation = activateIdeTargets({ cwd, targets, force });\n generatePortableSkills(cwd, force, result.activation);\n result.copied.push(...result.activation.copied.filter((path) => !result.copied.includes(path)));\n result.unchanged.push(...result.activation.unchanged.filter((path) => !result.unchanged.includes(path)));\n result.conflicts.push(...result.activation.conflicts.filter((path) => !result.conflicts.includes(path)));\n result.overwritten.push(...result.activation.overwritten.filter((path) => !result.overwritten.includes(path)));\n\n const assets = listManagedAssets(packageRoot, { activated: targets });\n const assetHashes: Record<string, string> = {};\n for (const asset of assets) {\n if (existsSync(asset.sourcePath)) assetHashes[asset.target] = sha256(readFileSync(asset.sourcePath, \"utf8\"));\n }\n // Generated files: hash what we just wrote\n for (const relative of [...result.copied, ...result.unchanged, ...result.overwritten]) {\n const path = join(cwd, relative);\n if (existsSync(path) && !assetHashes[relative]) {\n assetHashes[relative] = sha256(readFileSync(path, \"utf8\"));\n }\n }\n\n const catalog = loadCatalog(packageRoot);\n const manifest: InstallManifest = {\n schemaVersion: 3,\n packageName: PACKAGE_NAME,\n packageVersion: PACKAGE_VERSION,\n stack,\n installedAt: new Date().toISOString(),\n docs: [...ROOT_DOCS],\n activated: targets,\n templateHashes,\n assetHashes\n };\n\n writeText(join(cwd, \".agent-kit\", \"manifest.json\"), `${JSON.stringify(manifest, null, 2)}\\n`);\n writeText(\n join(cwd, \".agent-kit\", \"config.json\"),\n `${JSON.stringify({ stack, catalog: { defaultAgents: catalog.defaultAgents, defaultSkills: catalog.defaultSkills } }, null, 2)}\\n`\n );\n\n // Always keep the Cursor rule available even when only other IDEs were requested\n if (!targets.includes(\"cursor\")) {\n recordCopy(\n result,\n copyTextWithConflict(join(packageRoot, CURSOR_RULE_FILE.source), cwd, CURSOR_RULE_FILE.target, {\n force,\n conflictRoot: join(cwd, \".agent-kit\", \"conflicts\")\n })\n );\n }\n\n return result;\n}\n\nexport function readManifest(cwd: string): InstallManifest | null {\n const manifestPath = join(cwd, \".agent-kit\", \"manifest.json\");\n if (!existsSync(manifestPath)) return null;\n return JSON.parse(readFileSync(manifestPath, \"utf8\")) as InstallManifest;\n}\n\nexport function readGithubActionsMode(_cwd: string): \"off\" | \"advisory\" {\n return \"off\";\n}\n\nexport { type IdeTarget };\n","import { join } from \"node:path\";\nimport { AGENTS_DOC_SOURCE, CURSOR_RULE_FILE, USER_GUIDE_HTML_SOURCE, USER_GUIDE_SOURCE } from \"../config/defaults.js\";\nimport type { IdeTarget } from \"./ide-activate.js\";\n\nexport type ManagedAssetCategory = \"root-doc\" | \"adapter\" | \"generated\";\n\nexport interface ManagedAsset {\n target: string;\n sourcePath: string;\n category: ManagedAssetCategory;\n libraryFolder?: string;\n}\n\nexport function listManagedAssets(packageRoot: string, options: { activated?: IdeTarget[] } = {}): ManagedAsset[] {\n const assets: ManagedAsset[] = [\n { target: \"AGENTS.md\", sourcePath: join(packageRoot, AGENTS_DOC_SOURCE), category: \"root-doc\" },\n { target: \"USER_GUIDE.md\", sourcePath: join(packageRoot, USER_GUIDE_SOURCE), category: \"root-doc\" },\n { target: \"USER_GUIDE.html\", sourcePath: join(packageRoot, USER_GUIDE_HTML_SOURCE), category: \"root-doc\" },\n { target: CURSOR_RULE_FILE.target, sourcePath: join(packageRoot, CURSOR_RULE_FILE.source), category: \"adapter\" }\n ];\n\n const activated = new Set(options.activated ?? [\"cursor\"]);\n if (activated.has(\"claude\")) {\n assets.push({\n target: \"CLAUDE.md\",\n sourcePath: join(packageRoot, \"templates/next-supabase/CLAUDE.md\"),\n category: \"adapter\"\n });\n }\n\n return assets;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { agentSourcePath, loadCatalog, parseFrontmatter } from \"../catalog.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\n\nexport type DoctorLevel = \"pass\" | \"warn\" | \"fail\";\n\nexport interface DoctorFinding {\n level: DoctorLevel;\n area: string;\n message: string;\n}\n\nexport interface DoctorReport {\n summary: Record<DoctorLevel, number>;\n findings: DoctorFinding[];\n ok: boolean;\n}\n\n/** Unique 0.3 council-OS files. Product SECURITY.md / DESIGN.md are not listed. */\nexport const LEGACY_LEFTOVER_PATHS = [\n \"AGENT_ROSTER.md\",\n \"COUNCIL.md\",\n \"SKILLS.md\",\n \"QUALITY_GATES.md\",\n \"ASSISTANT_ADAPTERS.md\",\n \".agent-kit/agent-roster.json\",\n \".agent-kit/orchestrator.json\"\n] as const;\n\nfunction summarize(findings: DoctorFinding[]): Record<DoctorLevel, number> {\n return {\n pass: findings.filter((item) => item.level === \"pass\").length,\n warn: findings.filter((item) => item.level === \"warn\").length,\n fail: findings.filter((item) => item.level === \"fail\").length\n };\n}\n\nfunction read(cwd: string, relative: string): string | null {\n const path = join(cwd, relative);\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\n}\n\nexport function listLegacyLeftovers(cwd: string): string[] {\n return LEGACY_LEFTOVER_PATHS.filter((relative) => existsSync(join(cwd, relative)));\n}\n\nexport function createDoctorReport(cwd: string): DoctorReport {\n const catalog = loadCatalog();\n const findings: DoctorFinding[] = [];\n\n const agentsDoc = read(cwd, \"AGENTS.md\");\n findings.push(\n agentsDoc\n ? { level: \"pass\", area: \"docs\", message: \"AGENTS.md is installed.\" }\n : { level: \"fail\", area: \"docs\", message: \"AGENTS.md is missing. Run agent-kit init.\" }\n );\n\n const guide = read(cwd, \"USER_GUIDE.md\");\n if (!guide) {\n findings.push({ level: \"fail\", area: \"docs\", message: \"USER_GUIDE.md is missing. Run agent-kit init.\" });\n } else if (!guide.includes(catalog.screenshotFailClosed) && !guide.includes(\"Do not review code alone\")) {\n findings.push({\n level: \"fail\",\n area: \"docs\",\n message: \"USER_GUIDE.md dropped the screenshot fail-closed rule.\"\n });\n } else {\n findings.push({ level: \"pass\", area: \"docs\", message: \"USER_GUIDE.md includes the screenshot fail-closed rule.\" });\n }\n\n const htmlGuide = read(cwd, \"USER_GUIDE.html\");\n if (!htmlGuide) {\n findings.push({ level: \"fail\", area: \"docs\", message: \"USER_GUIDE.html is missing. Run agent-kit init.\" });\n } else if (!htmlGuide.includes(\"Do not review code alone\") || !htmlGuide.includes('data-view=\"user-guide\"')) {\n findings.push({\n level: \"fail\",\n area: \"docs\",\n message: \"USER_GUIDE.html dropped the screenshot fail-closed rule or assignment-desk layout.\"\n });\n } else {\n findings.push({ level: \"pass\", area: \"docs\", message: \"USER_GUIDE.html is the visual field guide.\" });\n }\n\n const qaSkill = read(cwd, \".cursor/skills/browser-qa/SKILL.md\") ?? read(cwd, \"skills/browser-qa/SKILL.md\");\n if (!qaSkill) {\n findings.push({ level: \"fail\", area: \"skills\", message: \"browser-qa skill is missing.\" });\n } else if (!qaSkill.includes(\"Do not review code alone\")) {\n findings.push({ level: \"fail\", area: \"skills\", message: \"browser-qa no longer forbids code-only review.\" });\n } else {\n findings.push({ level: \"pass\", area: \"skills\", message: \"browser-qa forbids code-only UI review.\" });\n }\n\n for (const id of catalog.defaultAgents) {\n const content = read(cwd, `.cursor/agents/${id}.md`) ?? read(cwd, `agents/${id}/agent.md`);\n if (!content) {\n findings.push({ level: \"warn\", area: \"agents\", message: `${id} agent is not installed in .cursor/agents/.` });\n continue;\n }\n const meta = parseFrontmatter(content);\n if (!meta.tools || meta.tools.length === 0) {\n findings.push({ level: \"fail\", area: \"agents\", message: `${id} is missing a tools list.` });\n continue;\n }\n\n const expectedRequired = packagedRequiredTools(id);\n const actualRequired = meta.requiredTools ?? [];\n const missingRequired = expectedRequired.filter((tool) => !actualRequired.includes(tool));\n if (missingRequired.length > 0) {\n findings.push({\n level: \"fail\",\n area: \"agents\",\n message: `${id} dropped requiredTools: ${missingRequired.join(\", \")}.`\n });\n continue;\n }\n\n const requiredNotAllowed = actualRequired.filter((tool) => !meta.tools?.includes(tool));\n if (requiredNotAllowed.length > 0) {\n findings.push({\n level: \"fail\",\n area: \"agents\",\n message: `${id} lists required tools that are not in tools: ${requiredNotAllowed.join(\", \")}.`\n });\n continue;\n }\n\n findings.push({\n level: \"pass\",\n area: \"agents\",\n message: expectedRequired.length > 0 ? `${id} keeps required tools.` : `${id} declares tools.`\n });\n }\n\n const leftovers = listLegacyLeftovers(cwd);\n if (leftovers.length > 0) {\n const preview = leftovers.slice(0, 6).join(\", \");\n const extra = leftovers.length > 6 ? `, +${leftovers.length - 6} more` : \"\";\n findings.push({\n level: \"warn\",\n area: \"legacy\",\n message: `0.3 leftover files are still here: ${preview}${extra}. 0.4 uses AGENTS.md + USER_GUIDE. update never deletes these.`\n });\n } else {\n findings.push({\n level: \"pass\",\n area: \"legacy\",\n message: \"No 0.3 council leftover files detected.\"\n });\n }\n\n return {\n findings,\n summary: summarize(findings),\n ok: findings.every((item) => item.level !== \"fail\")\n };\n}\n\nfunction packagedRequiredTools(id: string): string[] {\n try {\n const source = readFileSync(agentSourcePath(findPackageRoot(), id), \"utf8\");\n return parseFrontmatter(source).requiredTools ?? [];\n } catch {\n return [];\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\n\nexport interface UserGuideLocation {\n path: string;\n source: \"cwd\" | \"package\";\n fileUrl: string;\n}\n\nexport function resolveUserGuideHtml(cwd: string): UserGuideLocation {\n const local = join(cwd, \"USER_GUIDE.html\");\n if (existsSync(local)) return locate(local, \"cwd\");\n const packaged = join(findPackageRoot(), \"USER_GUIDE.html\");\n if (existsSync(packaged)) return locate(packaged, \"package\");\n throw new Error(\"USER_GUIDE.html is missing. Run agent-kit init, then open the file in a browser.\");\n}\n\nfunction locate(path: string, source: UserGuideLocation[\"source\"]): UserGuideLocation {\n const absolute = resolve(path);\n return { path: absolute, source, fileUrl: pathToFileURL(absolute).href };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { PACKAGE_VERSION } from \"../config/defaults.js\";\nimport type { InstallManifest } from \"../config/types.js\";\nimport { resolveInside, sha256, writeConflictProposal, writeText } from \"../utils/fs.js\";\nimport { findPackageRoot } from \"../utils/package-root.js\";\nimport { planFileUpdate, type PlannedUpdateAction } from \"./file-update-plan.js\";\nimport { initProject, readManifest } from \"./install.js\";\nimport { activateIdeTargets } from \"./ide-activate.js\";\nimport { listManagedAssets } from \"./managed-assets.js\";\nimport { generatePortableSkills } from \"./roster-adapters.js\";\nimport { listLegacyLeftovers } from \"./doctor.js\";\nimport type { CopyCollector } from \"./copy-asset.js\";\nimport type { IdeTarget } from \"./ide-activate.js\";\n\nexport type UpdateAction = PlannedUpdateAction;\n\nexport interface UpdateFileResult {\n target: string;\n action: UpdateAction;\n conflictPath?: string;\n reason: string;\n}\n\nexport interface UpdateResult {\n dryRun: boolean;\n files: UpdateFileResult[];\n libraryFoldersRefreshed: string[];\n manifestPath: string;\n summary: Record<UpdateAction, number>;\n leftoverDocs: string[];\n}\n\nexport interface UpdateOptions {\n cwd: string;\n force?: boolean;\n dryRun?: boolean;\n}\n\nfunction summarize(files: UpdateFileResult[]): Record<UpdateAction, number> {\n return {\n created: files.filter((file) => file.action === \"created\").length,\n unchanged: files.filter((file) => file.action === \"unchanged\").length,\n updated: files.filter((file) => file.action === \"updated\").length,\n \"kept-local\": files.filter((file) => file.action === \"kept-local\").length,\n conflict: files.filter((file) => file.action === \"conflict\").length,\n overwritten: files.filter((file) => file.action === \"overwritten\").length\n };\n}\n\nfunction activationToUpdateFiles(collector: CopyCollector): UpdateFileResult[] {\n const files: UpdateFileResult[] = [];\n for (const target of collector.copied) {\n files.push({ target, action: \"created\", reason: \"Refreshed generated IDE or skill file.\" });\n }\n for (const target of collector.unchanged) {\n files.push({ target, action: \"unchanged\", reason: \"Generated file already matched the package asset.\" });\n }\n for (const target of collector.overwritten) {\n files.push({ target, action: \"overwritten\", reason: \"Overwritten generated IDE or skill file.\" });\n }\n for (const entry of collector.conflicts) {\n const [target, conflictPath] = entry.split(\" -> \");\n files.push({\n target: target ?? entry,\n action: \"conflict\",\n reason: \"Generated file changed while the local target is customized.\",\n ...(conflictPath ? { conflictPath } : {})\n });\n }\n return files;\n}\n\nexport function updateProject(options: UpdateOptions): UpdateResult {\n const cwd = options.cwd;\n const force = Boolean(options.force);\n const dryRun = Boolean(options.dryRun);\n const manifest = readManifest(cwd);\n\n if (!manifest) {\n if (dryRun) {\n throw new Error(\"No .agent-kit/manifest.json found. Run agent-kit init first (or run update without --dry-run to install).\");\n }\n const initResult = initProject({ cwd, force });\n const files: UpdateFileResult[] = [\n ...initResult.copied.map((target): UpdateFileResult => ({ target, action: \"created\", reason: \"Installed by init fallback.\" })),\n ...initResult.unchanged.map((target): UpdateFileResult => ({ target, action: \"unchanged\", reason: \"Already matched the package asset.\" })),\n ...initResult.overwritten.map((target): UpdateFileResult => ({ target, action: \"overwritten\", reason: \"Overwritten by init --force fallback.\" })),\n ...initResult.conflicts.map((entry): UpdateFileResult => {\n const [target, conflictPath] = entry.split(\" -> \");\n return {\n target: target ?? entry,\n action: \"conflict\",\n reason: \"Local file differed from the package asset during init fallback.\",\n ...(conflictPath ? { conflictPath } : {})\n };\n })\n ];\n return {\n dryRun,\n files,\n libraryFoldersRefreshed: [],\n manifestPath: \".agent-kit/manifest.json\",\n summary: summarize(files),\n leftoverDocs: listLegacyLeftovers(cwd)\n };\n }\n\n const packageRoot = findPackageRoot();\n const activated = (manifest.activated ?? [\"cursor\"]) as IdeTarget[];\n const assets = listManagedAssets(packageRoot, { activated });\n const files: UpdateFileResult[] = [];\n\n for (const asset of assets) {\n if (!existsSync(asset.sourcePath)) continue;\n const plan = planFileUpdate({\n target: asset.target,\n sourcePath: asset.sourcePath,\n targetPath: resolveInside(cwd, asset.target),\n installedHash: manifest.assetHashes?.[asset.target] ?? manifest.templateHashes?.[asset.target],\n force\n });\n\n let conflictPath: string | undefined;\n if (!dryRun) {\n if (plan.action === \"created\" || plan.action === \"updated\" || plan.action === \"overwritten\") {\n writeText(resolveInside(cwd, asset.target), plan.sourceContent);\n }\n if (plan.action === \"conflict\") {\n const proposal = writeConflictProposal(cwd, asset.target, plan.sourceContent, {\n currentContent: plan.localContent ?? \"\",\n reason: \"Template changed and the local file was customized.\"\n });\n conflictPath = proposal.conflictPath;\n }\n }\n\n files.push({\n target: asset.target,\n action: plan.action,\n reason: plan.reason,\n ...(conflictPath ? { conflictPath } : {})\n });\n }\n\n if (!dryRun) {\n const activation = activateIdeTargets({ cwd, targets: activated, force });\n generatePortableSkills(cwd, force, activation);\n files.push(...activationToUpdateFiles(activation));\n\n const nextHashes = { ...manifest.assetHashes };\n for (const asset of assets) {\n if (existsSync(asset.sourcePath)) nextHashes[asset.target] = sha256(readFileSync(asset.sourcePath, \"utf8\"));\n }\n for (const relative of [...activation.copied, ...activation.unchanged, ...activation.overwritten]) {\n const path = join(cwd, relative);\n if (existsSync(path)) nextHashes[relative] = sha256(readFileSync(path, \"utf8\"));\n }\n const next: InstallManifest = {\n ...manifest,\n packageVersion: PACKAGE_VERSION,\n schemaVersion: 3,\n updatedAt: new Date().toISOString(),\n docs: [\"AGENTS.md\", \"USER_GUIDE.md\", \"USER_GUIDE.html\"],\n assetHashes: nextHashes\n };\n writeText(join(cwd, \".agent-kit\", \"manifest.json\"), `${JSON.stringify(next, null, 2)}\\n`);\n } else {\n files.push({\n target: \".cursor/agents/\",\n action: \"updated\",\n reason: \"Would refresh activated IDE agents, skills, and portable skills/ copies.\"\n });\n }\n\n return {\n dryRun,\n files,\n libraryFoldersRefreshed: [],\n manifestPath: \".agent-kit/manifest.json\",\n summary: summarize(files),\n leftoverDocs: listLegacyLeftovers(cwd)\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { sha256 } from \"../utils/fs.js\";\n\nexport type PlannedUpdateAction = \"created\" | \"updated\" | \"unchanged\" | \"kept-local\" | \"conflict\" | \"overwritten\";\n\nexport interface FileUpdatePlan {\n target: string;\n action: PlannedUpdateAction;\n reason: string;\n sourceContent: string;\n sourceHash: string;\n localContent?: string;\n}\n\nexport interface FileUpdatePlanInput {\n target: string;\n sourcePath: string;\n targetPath: string;\n installedHash: string | undefined;\n force: boolean;\n}\n\nexport function planFileUpdate(input: FileUpdatePlanInput): FileUpdatePlan {\n const sourceContent = readFileSync(input.sourcePath, \"utf8\");\n const sourceHash = sha256(sourceContent);\n\n if (!existsSync(input.targetPath)) {\n return { target: input.target, action: \"created\", reason: \"File is missing locally.\", sourceContent, sourceHash };\n }\n\n const localContent = readFileSync(input.targetPath, \"utf8\");\n const localHash = sha256(localContent);\n if (localHash === sourceHash) {\n return {\n target: input.target,\n action: \"unchanged\",\n reason: \"File already matches the current package asset.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n if (input.installedHash && localHash === input.installedHash) {\n return {\n target: input.target,\n action: \"updated\",\n reason: \"File was unmodified since install; applied the newer package asset.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n if (input.force) {\n return {\n target: input.target,\n action: \"overwritten\",\n reason: \"Local changes will be overwritten because --force was used.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n if (input.installedHash && input.installedHash === sourceHash) {\n return {\n target: input.target,\n action: \"kept-local\",\n reason: \"File is locally customized and the package asset has not changed.\",\n sourceContent,\n sourceHash,\n localContent\n };\n }\n return {\n target: input.target,\n action: \"conflict\",\n reason: \"File is locally customized and the package asset changed; review the proposed content.\",\n sourceContent,\n sourceHash,\n localContent\n };\n}\n","import pc from \"picocolors\";\n\nconst colorEnabled = process.env.NO_COLOR === undefined && process.stdout.isTTY === true;\n\nfunction paint(painter: (text: string) => string, text: string): string {\n return colorEnabled ? painter(text) : text;\n}\n\nexport const style = {\n heading: (text: string) => paint(pc.cyan, text),\n pass: (text: string) => paint(pc.green, text),\n warn: (text: string) => paint(pc.yellow, text),\n fail: (text: string) => paint(pc.red, text),\n dim: (text: string) => paint(pc.dim, text),\n bold: (text: string) => paint(pc.bold, text)\n};\n\nexport function levelLabel(level: \"pass\" | \"warn\" | \"fail\"): string {\n const label = level.toUpperCase().padEnd(4);\n if (level === \"pass\") return style.pass(label);\n if (level === \"warn\") return style.warn(label);\n return style.fail(label);\n}\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nexport function heading(text: string): void {\n console.log(style.heading(text));\n}\n\nexport function line(text = \"\"): void {\n console.log(text);\n}\n\nexport function detail(text: string): void {\n console.log(style.dim(` ${text}`));\n}\n\nexport function listItem(text: string): void {\n console.log(`- ${text}`);\n}\n\n/** Print a labeled list of file paths, skipping empty groups. */\nexport function fileGroup(label: string, files: string[]): void {\n if (files.length === 0) return;\n console.log(`${style.bold(label)} (${files.length})`);\n for (const file of files) console.log(` ${file}`);\n}\n\nexport function fail(message: string): void {\n console.error(style.fail(`error: ${message}`));\n}\n"],"mappings":"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","names":["existsSync","join","join","main","join","existsSync","line","join","existsSync","readFileSync","dirname","join","resolve","join","readFileSync","resolve","existsSync","readFileSync","join","readFileSync","readFileSync","existsSync","readFileSync","existsSync","readFileSync","action","existsSync","readFileSync","join","existsSync","readFileSync","join","join","join","join","readFileSync","existsSync","relative","relative","existsSync","join","readFileSync","existsSync","readFileSync","join","relative","join","existsSync","readFileSync","existsSync","join","resolve","join","existsSync","resolve","existsSync","readFileSync","join","existsSync","readFileSync","readFileSync","existsSync","summarize","files","existsSync","readFileSync","relative","join","text","report"]}