@open-mercato/cli 0.6.7-develop.6795.1.8a3f27921c → 0.6.7-develop.6824.1.21fff90682

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 (102) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build.mjs +1 -1
  3. package/dist/agentic/guides/module-facts.json +90266 -20749
  4. package/dist/agentic/guides/modules/ai_assistant.md +170 -60
  5. package/dist/agentic/guides/modules/api_docs.md +26 -1
  6. package/dist/agentic/guides/modules/api_keys.md +57 -17
  7. package/dist/agentic/guides/modules/attachments.md +72 -19
  8. package/dist/agentic/guides/modules/audit_logs.md +95 -29
  9. package/dist/agentic/guides/modules/auth.md +218 -83
  10. package/dist/agentic/guides/modules/business_rules.md +108 -34
  11. package/dist/agentic/guides/modules/catalog.md +386 -157
  12. package/dist/agentic/guides/modules/channel_gmail.md +55 -6
  13. package/dist/agentic/guides/modules/channel_imap.md +55 -6
  14. package/dist/agentic/guides/modules/checkout.md +254 -129
  15. package/dist/agentic/guides/modules/communication_channels.md +280 -109
  16. package/dist/agentic/guides/modules/configs.md +68 -11
  17. package/dist/agentic/guides/modules/content.md +26 -1
  18. package/dist/agentic/guides/modules/currencies.md +109 -44
  19. package/dist/agentic/guides/modules/customer_accounts.md +350 -156
  20. package/dist/agentic/guides/modules/customers.md +642 -294
  21. package/dist/agentic/guides/modules/dashboards.md +122 -28
  22. package/dist/agentic/guides/modules/data_sync.md +117 -37
  23. package/dist/agentic/guides/modules/design_system.md +36 -2
  24. package/dist/agentic/guides/modules/dictionaries.md +78 -20
  25. package/dist/agentic/guides/modules/directory.md +110 -45
  26. package/dist/agentic/guides/modules/entities.md +95 -38
  27. package/dist/agentic/guides/modules/events.md +31 -1
  28. package/dist/agentic/guides/modules/feature_toggles.md +79 -12
  29. package/dist/agentic/guides/modules/gateway_stripe.md +61 -6
  30. package/dist/agentic/guides/modules/generators.md +17 -1
  31. package/dist/agentic/guides/modules/inbox_ops.md +171 -60
  32. package/dist/agentic/guides/modules/integrations.md +116 -30
  33. package/dist/agentic/guides/modules/messages.md +187 -66
  34. package/dist/agentic/guides/modules/notifications.md +64 -9
  35. package/dist/agentic/guides/modules/onboarding.md +47 -8
  36. package/dist/agentic/guides/modules/payment_gateways.md +133 -48
  37. package/dist/agentic/guides/modules/perspectives.md +50 -12
  38. package/dist/agentic/guides/modules/planner.md +102 -32
  39. package/dist/agentic/guides/modules/portal.md +58 -15
  40. package/dist/agentic/guides/modules/progress.md +78 -30
  41. package/dist/agentic/guides/modules/query_index.md +115 -53
  42. package/dist/agentic/guides/modules/record_locks.md +178 -59
  43. package/dist/agentic/guides/modules/resources.md +155 -78
  44. package/dist/agentic/guides/modules/sales.md +620 -257
  45. package/dist/agentic/guides/modules/scheduler.md +95 -19
  46. package/dist/agentic/guides/modules/search.md +124 -20
  47. package/dist/agentic/guides/modules/security.md +251 -105
  48. package/dist/agentic/guides/modules/shipping_carriers.md +106 -37
  49. package/dist/agentic/guides/modules/sso.md +121 -49
  50. package/dist/agentic/guides/modules/staff.md +314 -126
  51. package/dist/agentic/guides/modules/storage_s3.md +55 -6
  52. package/dist/agentic/guides/modules/sync_akeneo.md +54 -4
  53. package/dist/agentic/guides/modules/sync_excel.md +49 -11
  54. package/dist/agentic/guides/modules/system_status_overlays.md +33 -5
  55. package/dist/agentic/guides/modules/translations.md +76 -21
  56. package/dist/agentic/guides/modules/webhooks.md +166 -82
  57. package/dist/agentic/guides/modules/wms.md +383 -223
  58. package/dist/agentic/guides/modules/workflows.md +248 -112
  59. package/dist/agentic/guides/upstream/AGENTS.md +1 -1
  60. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +2 -0
  61. package/dist/agentic/guides/upstream/manifest.json +3 -3
  62. package/dist/agentic/shared/AGENTS.md.template +6 -5
  63. package/dist/agentic/shared/ai/harness/README.md +2 -2
  64. package/dist/agentic/shared/ai/harness/RELEASE.md +4 -4
  65. package/dist/agentic/shared/ai/harness/cases.json +94 -1
  66. package/dist/agentic/shared/ai/harness/cases.schema.json +3 -3
  67. package/dist/agentic/shared/ai/harness/validators.json +1 -1
  68. package/dist/agentic/shared/ai/lessons/_template.md +16 -0
  69. package/dist/agentic/shared/ai/lessons.md +26 -3
  70. package/dist/agentic/shared/ai/skills/om-evolve-harness/SKILL.md +7 -6
  71. package/dist/agentic/shared/ai/skills/om-system-extension/SKILL.md +1 -1
  72. package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +4 -2
  73. package/dist/agentic/shared/scripts/check-lessons.mjs +178 -0
  74. package/dist/agentic/shared/scripts/evaluate-agent-harness.mjs +37 -12
  75. package/dist/lib/agentic-setup.js +2 -2
  76. package/dist/lib/agentic-setup.js.map +2 -2
  77. package/dist/lib/generators/module-extension-facts.js +652 -24
  78. package/dist/lib/generators/module-extension-facts.js.map +3 -3
  79. package/dist/lib/generators/module-fact-sources.js +70 -0
  80. package/dist/lib/generators/module-fact-sources.js.map +7 -0
  81. package/dist/lib/generators/module-facts.js +1001 -26
  82. package/dist/lib/generators/module-facts.js.map +3 -3
  83. package/dist/lib/generators/module-override-targets.js +688 -0
  84. package/dist/lib/generators/module-override-targets.js.map +7 -0
  85. package/dist/lib/testing/integration.js +5 -0
  86. package/dist/lib/testing/integration.js.map +2 -2
  87. package/package.json +5 -5
  88. package/src/lib/__tests__/agentic-setup.ownership.test.ts +6 -0
  89. package/src/lib/agentic-setup.ts +6 -2
  90. package/src/lib/generators/__tests__/activation-adapter-coverage.test.ts +92 -0
  91. package/src/lib/generators/__tests__/module-extension-activations.test.ts +762 -0
  92. package/src/lib/generators/__tests__/module-extension-facts.test.ts +4 -2
  93. package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +37 -3
  94. package/src/lib/generators/__tests__/module-facts.owned-contracts.test.ts +561 -0
  95. package/src/lib/generators/__tests__/module-override-targets.roundtrip.test.ts +149 -0
  96. package/src/lib/generators/__tests__/module-override-targets.test.ts +304 -0
  97. package/src/lib/generators/module-extension-facts.ts +923 -27
  98. package/src/lib/generators/module-fact-sources.ts +108 -0
  99. package/src/lib/generators/module-facts.ts +1360 -25
  100. package/src/lib/generators/module-override-targets.ts +863 -0
  101. package/src/lib/testing/__tests__/integration.test.ts +4 -0
  102. package/src/lib/testing/integration.ts +5 -0
@@ -518,8 +518,8 @@ function validateCatalog({ root, cases, registry, releaseMatrix, fixtures, seeds
518
518
  for (const related of item.relatedCases ?? []) if (!idSet.has(related)) add(id, `dangling related case ${related}`)
519
519
  const writable = WRITABLE_KINDS.has(item.evaluationKind)
520
520
  if (item.frameworkContext !== undefined) {
521
- if (!writable || !Array.isArray(item.frameworkContext) || item.frameworkContext.length === 0 || item.frameworkContext.length > 3) {
522
- add(id, 'frameworkContext requires one to three writable-case queries')
521
+ if (!Array.isArray(item.frameworkContext) || item.frameworkContext.length === 0 || item.frameworkContext.length > 3) {
522
+ add(id, 'frameworkContext requires one to three queries')
523
523
  }
524
524
  for (const request of item.frameworkContext ?? []) {
525
525
  const selectors = [request?.module, request?.package].filter((value) => value !== undefined)
@@ -1420,7 +1420,16 @@ function prepareCaseFrameworkContext(caseRecord, controllerRoot, runRoot) {
1420
1420
  throw new Error(`framework context queries resolved to the same output root for ${caseRecord.id}: ${outputRoot}`)
1421
1421
  }
1422
1422
  patterns.add(outputPattern)
1423
- entries.push({ manifest, searchResult, sourceRoot, query: request.query })
1423
+ const sourceFiles = [...new Set(fs.readFileSync(searchPath, 'utf8')
1424
+ .split(/\r?\n/)
1425
+ .flatMap((line) => {
1426
+ const match = /^(.+?):\d+:/.exec(line)
1427
+ return match && isSafeRelative(match[1]) && match[1].startsWith(`${sourceRoot}/`) ? [match[1]] : []
1428
+ }))].sort()
1429
+ if (sourceFiles.length === 0) {
1430
+ throw new Error(`framework context query returned no exact source matches for ${caseRecord.id}: ${request.query}`)
1431
+ }
1432
+ entries.push({ manifest, searchResult, sourceRoot, sourceFiles, query: request.query })
1424
1433
  }
1425
1434
  return { patterns: [...patterns].sort(), entries }
1426
1435
  }
@@ -1515,6 +1524,7 @@ function observedContext(stdout, root, caseRecord, writable, reviewExpectedReads
1515
1524
  for (const event of events) collectRefusedToolCallIds(event, state.refusedCallIds)
1516
1525
  for (const event of events) recursivelyFindTraceCandidates(event, state)
1517
1526
  const paths = new Set()
1527
+ const readOrder = []
1518
1528
  const refusedReads = new Set()
1519
1529
  const metadataPaths = new Set()
1520
1530
  let metadataEntries = 0
@@ -1595,7 +1605,10 @@ function observedContext(stdout, root, caseRecord, writable, reviewExpectedReads
1595
1605
  // Keep it out of instruction/fact budgets and selectedContext accounting while
1596
1606
  // still failing closed above for every non-allowlisted read.
1597
1607
  else if (isAllowedObservedPath(file, caseRecord, writable)) {
1598
- if (!writable || reviewExpectedReads || permittedContextPath(file, caseRecord)) paths.add(file)
1608
+ if (!writable || reviewExpectedReads || permittedContextPath(file, caseRecord)) {
1609
+ paths.add(file)
1610
+ if (!readOrder.includes(file)) readOrder.push(file)
1611
+ }
1599
1612
  }
1600
1613
  else violations.add(`unsafe arbitrary app-root read ${file}`)
1601
1614
  }
@@ -1610,6 +1623,7 @@ function observedContext(stdout, root, caseRecord, writable, reviewExpectedReads
1610
1623
  return {
1611
1624
  available: state.available,
1612
1625
  paths: [...paths].sort(),
1626
+ readOrder,
1613
1627
  refusedPaths: [...refusedReads].sort(),
1614
1628
  metadataPaths: [...metadataPaths].sort(),
1615
1629
  metadataEntries,
@@ -1666,7 +1680,7 @@ function contextStats(root, paths, metadata = {}) {
1666
1680
  }
1667
1681
  }
1668
1682
 
1669
- function evaluateRouting(caseRecord, response, stats) {
1683
+ function evaluateRouting(caseRecord, response, stats, readOrder = []) {
1670
1684
  const failures = []
1671
1685
  const selectedRoutes = new Set(response.selectedRouter)
1672
1686
  for (const required of caseRecord.expectedRouter.required) if (!selectedRoutes.has(required)) failures.push(`missing route ${required}`)
@@ -1709,6 +1723,19 @@ function evaluateRouting(caseRecord, response, stats) {
1709
1723
  failures.push(`observed context not declared ${observed}`)
1710
1724
  }
1711
1725
  }
1726
+ if (caseRecord.materializedFrameworkContextPatterns?.length) {
1727
+ const frameworkReads = readOrder.filter((observed) =>
1728
+ caseRecord.materializedFrameworkContextPatterns.some((pattern) => globToRegExp(pattern).test(observed)))
1729
+ const sourceReads = frameworkReads.filter((observed) => observed.includes('/source/'))
1730
+ if (sourceReads.length === 0) failures.push('framework context source not observed')
1731
+ const firstFrameworkRead = frameworkReads.length ? readOrder.indexOf(frameworkReads[0]) : -1
1732
+ if (firstFrameworkRead >= 0) {
1733
+ for (const required of caseRecord.context.required.filter((reference) => !reference.startsWith('.ai/framework-context/'))) {
1734
+ const guidanceRead = readOrder.findIndex((observed) => globToRegExp(required).test(observed))
1735
+ if (guidanceRead > firstFrameworkRead) failures.push(`framework context read before required guidance ${required}`)
1736
+ }
1737
+ }
1738
+ }
1712
1739
  const standardGuides = new Map()
1713
1740
  for (const [route, standard] of Object.entries(ROUTE_STANDARD_CONTEXT)) {
1714
1741
  for (const guide of standard.guides) {
@@ -1738,7 +1765,7 @@ function evaluateRouting(caseRecord, response, stats) {
1738
1765
  }
1739
1766
 
1740
1767
  function isCorrectableRoutingFailure(violation) {
1741
- return /^(?:missing (?:route|skill|context|decision)|unexpected (?:route|skill|context|decision)|unmandated decision|selected skill context (?:missing|not observed)|optional skill .+ requires route|standard (?:skill|context) .+ requires route|required context not observed|selected context not observed|observed context not declared|initial context (?:file|byte) budget exceeded|context byte budget exceeded)/.test(violation)
1768
+ return /^(?:missing (?:route|skill|context|decision)|unexpected (?:route|skill|context|decision)|unmandated decision|selected skill context (?:missing|not observed)|optional skill .+ requires route|standard (?:skill|context) .+ requires route|required context not observed|selected context not observed|observed context not declared|framework context (?:source not observed|read before required guidance)|initial context (?:file|byte) budget exceeded|context byte budget exceeded)/.test(violation)
1742
1769
  }
1743
1770
 
1744
1771
  function isCorrectableTraceStartupFailure(violation) {
@@ -1800,7 +1827,7 @@ function buildPrompt(caseRecord, root, writable, frameworkContextEntries = []) {
1800
1827
  ? 'This is an explicitly disposable writable evaluation. You must implement the complete request with repeated use of the allowlisted harness write tool before returning the routing object, then re-read the completed implementation. A manifest of intended files, metadata-only stub, TODO, placeholder, or response that only plans/routes fails: create every requested source, API, command, UI, registration, locale, migration snapshot, and focused test surface inside the write allowlist. You may read allowlisted target source files as implementation inputs, but selectedContext records only instruction/fact paths and must never include those target source paths. Write only inside the allowlist provided after the task; do not use network access or inspect environment values.'
1801
1828
  : 'Work read-only: do not edit files, run mutations, use network access, or inspect environment values. Do not implement the request. Accept the task premise for routing; fixture and implementation-target paths may be absent in this controller, so do not inspect them or report their absence as a blocker.'
1802
1829
  const frameworkContextInstruction = frameworkContextEntries.length
1803
- ? ` The controller has already materialized bounded read-only installed-package evidence for this case. Read each exact manifest and search result first, then read only exact source paths named by those search results beneath the supplied source root: ${frameworkContextEntries.map((entry) => `manifest=${entry.manifest}; search=${entry.searchResult}; source=${entry.sourceRoot}; query=${JSON.stringify(entry.query)}`).join(' | ')}. You may also follow an exact installed-source link from a generated module fact when it is useful; never enumerate node_modules or read outside @open-mercato package src trees. These successful reads belong in selectedContext.`
1830
+ ? ` The controller has already materialized bounded read-only installed-package evidence for this case. Read every required routed guide and skill before this evidence, then read each exact manifest and search result and every exact source path named by those search results beneath the supplied source root: ${frameworkContextEntries.map((entry) => `manifest=${entry.manifest}; search=${entry.searchResult}; source=${entry.sourceRoot}; query=${JSON.stringify(entry.query)}`).join(' | ')}. You may also follow an exact installed-source link from a generated module fact when it is useful; never enumerate node_modules or read outside @open-mercato package src trees. These successful reads belong in selectedContext.`
1804
1831
  : ''
1805
1832
  const toolInstruction = `The only MCP server is harness. Its exact-path tool is named read and takes JSON arguments {"path":"<exact app-relative path>"}${writable ? '; its allowlisted replacement tool is named write and takes {"path":"<exact app-relative path>","content":"<complete file>"}' : ''}. Call harness.read${writable ? ' or harness.write' : ''}; never call read_mcp_resource or any resource API.`
1806
1833
  return `You are evaluating routing for a standalone Open Mercato application. ${modeInstruction}${frameworkContextInstruction} ${toolInstruction} No shell, process, environment, discovery, or network tool exists. Your first tool action must call harness.read with {"path":"AGENTS.md"}, even when the runner auto-injected it, then load only the smallest task-matching context. Do not execute framework-context, generation, test, package, release, installer, or skill workflow commands during routing; select the instructions that would govern that later execution. Do not emit a provisional structured response. Do not inspect .ai/harness/**; those are evaluator internals, and decision labels never name readable paths. Never enumerate, glob, recursively search, or bulk-read .ai/guides, .ai/skills, .agents/skills, or module fact directories; an all-guides/all-skills/all-facts read is an automatic failure. The emitted AGENTS.md and the context it routes are the only task-routing authority. Before the final response, open every instruction or fact path you will put in selectedContext with direct harness read calls. Never rely only on skill descriptions, filenames, discovery, metadata, or prior knowledge: an unobserved selected path automatically fails this evaluation.
@@ -2705,9 +2732,7 @@ function liveRun({ options, selected, registry, releaseMatrix, fixtures, root, h
2705
2732
  const targetErrors = verifyWritableTarget(runRoot, root, caseRecord, fixtures)
2706
2733
  if (targetErrors.length) throw new Error(`${caseRecord.id}: ${targetErrors.join('; ')}`)
2707
2734
  }
2708
- const preparedFrameworkContext = writable
2709
- ? prepareCaseFrameworkContext(caseRecord, root, runRoot)
2710
- : { patterns: [], entries: [] }
2735
+ const preparedFrameworkContext = prepareCaseFrameworkContext(caseRecord, root, runRoot)
2711
2736
  const evaluationCase = preparedFrameworkContext.patterns.length
2712
2737
  ? {
2713
2738
  ...caseRecord,
@@ -2715,7 +2740,7 @@ function liveRun({ options, selected, registry, releaseMatrix, fixtures, root, h
2715
2740
  ...caseRecord.context,
2716
2741
  required: [
2717
2742
  ...caseRecord.context.required,
2718
- ...preparedFrameworkContext.entries.flatMap(({ manifest, searchResult }) => [manifest, searchResult]),
2743
+ ...preparedFrameworkContext.entries.flatMap(({ manifest, searchResult, sourceFiles }) => [manifest, searchResult, ...sourceFiles]),
2719
2744
  ],
2720
2745
  },
2721
2746
  materializedFrameworkContextPatterns: preparedFrameworkContext.patterns,
@@ -2771,7 +2796,7 @@ function liveRun({ options, selected, registry, releaseMatrix, fixtures, root, h
2771
2796
  const declared = response.selectedContext
2772
2797
  .filter((entry) => isSafeRelative(entry) && isPathInside(runRoot, path.resolve(runRoot, entry)) && fs.existsSync(path.resolve(runRoot, entry)))
2773
2798
  declaredStats = contextStats(runRoot, [...new Set(declared)].sort())
2774
- violations.push(...evaluateRouting(evaluationCase, response, stats))
2799
+ violations.push(...evaluateRouting(evaluationCase, response, stats, trace.readOrder))
2775
2800
  } else violations.push(`${attempt.kind}: ${sanitize(attempt.error, runRoot)}`)
2776
2801
  return { response, trace, stats, declaredStats, violations }
2777
2802
  }
@@ -78,7 +78,7 @@ function renderModuleGuidesBlock(selected) {
78
78
  return [
79
79
  `Enabled module facts: ${selected.map((moduleId) => `\`${moduleId}\``).join(",")}.`,
80
80
  "",
81
- "Load `.ai/guides/modules/<id>.md` only when `<id>` is explicitly named or is the targeted installed module/host; never preload all module facts."
81
+ "Load `.ai/guides/modules/<id>.md` only for a named or targeted installed module/host; never preload all module facts."
82
82
  ].join("\n");
83
83
  }
84
84
  function injectModuleGuides(agentsMdPath, selected) {
@@ -322,7 +322,7 @@ function finalizeHarnessManifest(config, selectedTools) {
322
322
  path: relativePath,
323
323
  sha256: hashFile(path),
324
324
  source: skillName ? externalSkills.has(skillName) ? "external-override" : "local-skill" : "generated",
325
- userEditable: relativePath === "AGENTS.md" || relativePath === ".ai/agentic.config.json" || relativePath === ".ai/lessons.md"
325
+ userEditable: relativePath === "AGENTS.md" || relativePath === ".ai/agentic.config.json" || relativePath === ".ai/lessons.md" || relativePath.startsWith(".ai/lessons/")
326
326
  };
327
327
  });
328
328
  atomicWriteFile(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/agentic-setup.ts"],
4
- "sourcesContent": ["/**\n * Agentic setup for the CLI `agentic:init` command.\n *\n * Source files live in packages/create-app/agentic/ and are copied\n * to packages/cli/dist/agentic/ during build (see build.mjs).\n * This module reads those files at runtime \u2014 no embedded string constants.\n */\n\nimport {\n chmodSync,\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n readdirSync,\n realpathSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs'\nimport { createHash } from 'node:crypto'\nimport { spawnSync } from 'node:child_process'\nimport { tmpdir } from 'node:os'\nimport { join, dirname, basename, relative, resolve, sep } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { Project, SyntaxKind } from 'ts-morph'\n\nconst moduleDir = dirname(fileURLToPath(import.meta.url))\n// In the built output (dist/lib/agentic-setup.js), moduleDir is dist/lib/.\n// agentic/ is copied to dist/agentic/ by build.mjs.\nconst bundledAgenticDir = join(moduleDir, '..', 'agentic')\nconst AGENTIC_DIR = existsSync(bundledAgenticDir)\n ? bundledAgenticDir\n : join(moduleDir, '..', '..', '..', 'create-app', 'agentic')\nconst GUIDES_DIR = join(AGENTIC_DIR, 'guides')\n\ntype AskFn = (question: string) => Promise<string>\n\ninterface AgenticSetupOptions {\n tool?: string\n force?: boolean\n updateHarness?: boolean\n}\n\ninterface AgenticConfig {\n projectName: string\n targetDir: string\n}\n\ninterface HarnessManifestFile {\n path: string\n sha256: string\n source: string\n userEditable: boolean\n}\n\ninterface HarnessManifest {\n version: number\n generator: string\n files: HarnessManifestFile[]\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction resolvePlaceholders(content: string, config: AgenticConfig): string {\n return content.replace(/\\{\\{PROJECT_NAME\\}\\}/g, config.projectName)\n}\n\nfunction ensureDir(filePath: string): void {\n const dir = dirname(filePath)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n}\n\nfunction writeTemplate(srcDir: string, srcRelative: string, destPath: string, config: AgenticConfig): void {\n const srcPath = join(srcDir, srcRelative)\n const content = readFileSync(srcPath, 'utf-8')\n ensureDir(destPath)\n writeFileSync(destPath, resolvePlaceholders(content, config))\n}\n\nfunction copyFile(srcDir: string, srcRelative: string, destPath: string): void {\n const srcPath = join(srcDir, srcRelative)\n ensureDir(destPath)\n copyFileSync(srcPath, destPath)\n}\n\n// \u2500\u2500\u2500 Module fact-sheet selection (mirrors packages/create-app/src/setup/tools/shared.ts) \u2500\u2500\n\n// AST-parse the static `enabledModules` array literal in the app's src/modules.ts\n// and collect each entry's `id`. Only the static literal is read (conditional\n// .push()/spread entries are intentionally not seen \u2014 see spec D6).\nfunction readEnabledModuleIds(modulesPath: string): { parsed: boolean; ids: string[] } {\n if (!existsSync(modulesPath)) return { parsed: false, ids: [] }\n try {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('modules.ts', readFileSync(modulesPath, 'utf-8'))\n const declaration = sourceFile.getVariableDeclaration('enabledModules')\n const arrayLiteral = declaration?.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression)\n if (!arrayLiteral) return { parsed: false, ids: [] }\n const ids: string[] = []\n for (const element of arrayLiteral.getElements()) {\n const objectLiteral = element.asKind(SyntaxKind.ObjectLiteralExpression)\n if (!objectLiteral) continue\n const idProperty = objectLiteral.getProperty('id')?.asKind(SyntaxKind.PropertyAssignment)\n const idValue = idProperty?.getInitializerIfKind(SyntaxKind.StringLiteral)?.getLiteralValue()\n if (idValue) ids.push(idValue)\n }\n return { parsed: true, ids }\n } catch {\n return { parsed: false, ids: [] }\n }\n}\n\n// Resolve which per-module fact-sheets to ship: the intersection of the bundled\n// fact-sheets (the D5 allowlist, materialized by build.mjs) with the app's enabled\n// modules. Falls back to the full bundled set when the enabled set cannot be read\n// (R5 \u2014 degraded, never empty).\nfunction selectModuleFactSheets(targetDir: string, modulesSubdir: string): string[] {\n const available = existsSync(modulesSubdir)\n ? readdirSync(modulesSubdir)\n .filter((file) => file.endsWith('.md'))\n .map((file) => file.replace(/\\.md$/, ''))\n : []\n if (available.length === 0) return []\n const parsed = readEnabledModuleIds(join(targetDir, 'src', 'modules.ts'))\n if (!parsed.parsed) return available\n const enabled = new Set(parsed.ids)\n const selected = available.filter((moduleId) => enabled.has(moduleId))\n return selected\n}\n\nconst MODULE_GUIDES_START = '<!-- om:module-guides:start -->'\nconst MODULE_GUIDES_END = '<!-- om:module-guides:end -->'\n\nexport function renderModuleGuidesBlock(selected: string[]): string {\n if (selected.length === 0) return '_No module fact-sheets are bundled for this app._'\n return [\n `Enabled module facts: ${selected.map((moduleId) => `\\`${moduleId}\\``).join(',')}.`,\n '',\n 'Load `.ai/guides/modules/<id>.md` only when `<id>` is explicitly named or is the targeted installed module/host; never preload all module facts.',\n ].join('\\n')\n}\n\n// Regenerate the marker-delimited Module-Specific Guides block in the written\n// AGENTS.md from the selected module set. Replaces strictly between the markers so\n// surrounding prose is untouched and repeat runs are idempotent.\nfunction injectModuleGuides(\n agentsMdPath: string,\n selected: string[],\n): void {\n if (!existsSync(agentsMdPath)) return\n const content = readFileSync(agentsMdPath, 'utf-8')\n const startIndex = content.indexOf(MODULE_GUIDES_START)\n const endIndex = content.indexOf(MODULE_GUIDES_END)\n if (startIndex === -1 || endIndex === -1 || endIndex < startIndex) {\n console.warn(\n `[agentic] Module-Specific Guides markers (${MODULE_GUIDES_START} \u2026 ${MODULE_GUIDES_END}) not found in ${agentsMdPath}; the per-module guide list was not generated.`,\n )\n return\n }\n const before = content.slice(0, startIndex + MODULE_GUIDES_START.length)\n const after = content.slice(endIndex)\n const next = `${before}\\n${renderModuleGuidesBlock(selected)}\\n${after}`\n if (next !== content) writeFileSync(agentsMdPath, next)\n}\n\nconst TEXT_EXTENSIONS = new Set(['.cjs', '.json', '.md', '.mdc', '.mjs', '.sh', '.ts', '.txt'])\n\nfunction isTextAsset(path: string): boolean {\n const dot = path.lastIndexOf('.')\n return dot === -1 || TEXT_EXTENSIONS.has(path.slice(dot))\n}\n\nfunction listFiles(root: string): string[] {\n if (!existsSync(root)) return []\n const files: string[] = []\n for (const entry of readdirSync(root, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {\n const absolute = join(root, entry.name)\n if (entry.isDirectory()) files.push(...listFiles(absolute))\n else if (entry.isFile()) files.push(absolute)\n }\n return files\n}\n\nfunction copyTree(sourceRoot: string, destinationRoot: string, config: AgenticConfig): void {\n for (const sourcePath of listFiles(sourceRoot)) {\n const destinationPath = join(destinationRoot, relative(sourceRoot, sourcePath))\n ensureDir(destinationPath)\n if (isTextAsset(sourcePath)) {\n writeFileSync(destinationPath, resolvePlaceholders(readFileSync(sourcePath, 'utf8'), config))\n } else {\n copyFileSync(sourcePath, destinationPath)\n }\n if (process.platform !== 'win32') chmodSync(destinationPath, statSync(sourcePath).mode & 0o777)\n }\n}\n\nfunction hashFile(path: string): string {\n return createHash('sha256').update(readFileSync(path)).digest('hex')\n}\n\nfunction canonicalHarnessRoot(root: string): string {\n const resolved = resolve(root)\n if (!existsSync(resolved)) {\n throw new Error(`Harness root must be an existing directory: ${resolved}`)\n }\n const canonical = realpathSync(resolved)\n const entry = lstatSync(canonical, { throwIfNoEntry: false })\n if (!entry || !entry.isDirectory()) {\n throw new Error(`Harness root must be an existing directory: ${resolved}`)\n }\n return canonical\n}\n\n/**\n * Validate a managed path without following any link below the canonical app\n * root. A lexical containment check alone is insufficient: `app/.ai -> /tmp`\n * would otherwise make an apparently safe update write outside the app.\n */\nfunction assertManagedPath(root: string, path: string, options: { leaf?: 'file' | 'any' } = {}): void {\n const absolutePath = resolve(path)\n const normalizedRelative = relative(root, absolutePath)\n if (\n normalizedRelative === '..' ||\n normalizedRelative.startsWith(`..${sep}`)\n ) {\n throw new Error(`Harness-managed path escapes its root: ${absolutePath}`)\n }\n if (normalizedRelative === '') return\n\n const components = normalizedRelative.split(sep).filter(Boolean)\n let current = root\n for (let index = 0; index < components.length; index += 1) {\n current = join(current, components[index])\n const entry = lstatSync(current, { throwIfNoEntry: false })\n if (!entry) return\n if (entry.isSymbolicLink()) {\n throw new Error(`Harness-managed path contains a symbolic-link component: ${current}`)\n }\n const isLeaf = index === components.length - 1\n if (!isLeaf && !entry.isDirectory()) {\n throw new Error(`Harness-managed path component is not a directory: ${current}`)\n }\n if (isLeaf && options.leaf === 'file' && !entry.isFile()) {\n throw new Error(`Harness-managed file is not a regular file: ${current}`)\n }\n }\n}\n\nfunction ensureManagedParent(root: string, filePath: string): void {\n const parent = dirname(filePath)\n const normalizedRelative = relative(root, parent)\n if (normalizedRelative === '..' || normalizedRelative.startsWith(`..${sep}`)) {\n throw new Error(`Harness-managed path escapes its root: ${filePath}`)\n }\n let current = root\n for (const component of normalizedRelative.split(sep).filter(Boolean)) {\n assertManagedPath(root, current)\n current = join(current, component)\n const entry = lstatSync(current, { throwIfNoEntry: false })\n if (!entry) mkdirSync(current)\n const created = lstatSync(current, { throwIfNoEntry: false })\n if (!created || created.isSymbolicLink() || !created.isDirectory()) {\n throw new Error(`Harness-managed path component is not a real directory: ${current}`)\n }\n }\n}\n\nfunction harnessGeneratorId(): string {\n try {\n const upstream = JSON.parse(readFileSync(join(GUIDES_DIR, 'upstream', 'manifest.json'), 'utf8')) as {\n generator?: unknown\n }\n const generator = typeof upstream.generator === 'string' ? upstream.generator : ''\n const version = generator.slice(generator.lastIndexOf('@') + 1)\n if (version && version !== generator) return `open-mercato-agentic@${version}`\n } catch {\n // Source-mode tests may not have built upstream snapshots yet.\n }\n return 'open-mercato-agentic@unknown'\n}\n\nfunction externalSkillNames(targetDir: string): Set<string> {\n try {\n const tiers = JSON.parse(readFileSync(join(targetDir, '.ai', 'skills', 'tiers.json'), 'utf8')) as {\n external?: { skills?: unknown }\n }\n return new Set(Array.isArray(tiers.external?.skills) ? tiers.external.skills.filter((name): name is string => typeof name === 'string') : [])\n } catch {\n return new Set()\n }\n}\n\nfunction atomicCopyFile(sourcePath: string, destinationPath: string, managedRoot?: string): void {\n if (managedRoot) {\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n ensureManagedParent(managedRoot, destinationPath)\n } else {\n ensureDir(destinationPath)\n }\n const temporaryPath = `${destinationPath}.tmp-${process.pid}-${Date.now()}`\n try {\n if (managedRoot) assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n copyFileSync(sourcePath, temporaryPath)\n if (process.platform !== 'win32') chmodSync(temporaryPath, statSync(sourcePath).mode & 0o777)\n if (managedRoot) {\n assertManagedPath(managedRoot, dirname(destinationPath))\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n }\n renameSync(temporaryPath, destinationPath)\n } finally {\n if (!managedRoot || !lstatSync(temporaryPath, { throwIfNoEntry: false })?.isSymbolicLink()) {\n rmSync(temporaryPath, { force: true })\n }\n }\n}\n\nfunction atomicWriteFile(destinationPath: string, content: string, managedRoot?: string): void {\n if (managedRoot) {\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n ensureManagedParent(managedRoot, destinationPath)\n } else {\n ensureDir(destinationPath)\n }\n const temporaryPath = `${destinationPath}.tmp-${process.pid}-${Date.now()}`\n try {\n if (managedRoot) assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n writeFileSync(temporaryPath, content)\n if (managedRoot) {\n assertManagedPath(managedRoot, dirname(destinationPath))\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n }\n renameSync(temporaryPath, destinationPath)\n } finally {\n if (!managedRoot || !lstatSync(temporaryPath, { throwIfNoEntry: false })?.isSymbolicLink()) {\n rmSync(temporaryPath, { force: true })\n }\n }\n}\n\nfunction resolveManifestPath(root: string, relativePath: string): string | null {\n if (!relativePath || relativePath.includes('\\0')) return null\n const absolutePath = resolve(root, relativePath)\n const normalizedRelative = relative(root, absolutePath)\n if (\n normalizedRelative === '' ||\n normalizedRelative === '..' ||\n normalizedRelative.startsWith(`..${sep}`)\n ) {\n return null\n }\n return absolutePath\n}\n\nfunction normalizeManifestRelativePath(path: string): string {\n return path.replace(/\\\\/g, '/')\n}\n\nfunction readHarnessManifest(manifestPath: string): HarnessManifest | null {\n if (!existsSync(manifestPath)) return null\n try {\n const parsed = JSON.parse(readFileSync(manifestPath, 'utf8')) as Partial<HarnessManifest>\n if (\n typeof parsed.version !== 'number' ||\n typeof parsed.generator !== 'string' ||\n !Array.isArray(parsed.files)\n ) {\n return null\n }\n const files: HarnessManifestFile[] = []\n for (const entry of parsed.files) {\n if (\n !entry ||\n typeof entry.path !== 'string' ||\n typeof entry.sha256 !== 'string' ||\n !/^[a-f0-9]{64}$/.test(entry.sha256) ||\n typeof entry.source !== 'string' ||\n typeof entry.userEditable !== 'boolean'\n ) {\n return null\n }\n files.push({ ...entry, path: normalizeManifestRelativePath(entry.path) })\n }\n return { version: parsed.version, generator: parsed.generator, files }\n } catch {\n return null\n }\n}\n\nfunction targetPathsForTree(sourceRoot: string, destinationRoot: string): string[] {\n return listFiles(sourceRoot).map((sourcePath) => join(destinationRoot, relative(sourceRoot, sourcePath)))\n}\n\nfunction finalizeHarnessManifest(config: AgenticConfig, selectedTools: string[]): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'shared')\n const selectedModules = selectModuleFactSheets(targetDir, join(GUIDES_DIR, 'modules'))\n const paths = new Set<string>([\n join(targetDir, 'AGENTS.md'),\n ...targetPathsForTree(join(srcDir, 'ai'), join(targetDir, '.ai')),\n ...targetPathsForTree(join(srcDir, 'scripts'), join(targetDir, 'scripts')),\n ])\n for (const file of readdirSync(GUIDES_DIR)) {\n if (file.endsWith('.md') || file === 'module-facts.json') paths.add(join(targetDir, '.ai', 'guides', file))\n }\n for (const file of listFiles(join(GUIDES_DIR, 'upstream'))) {\n paths.add(join(targetDir, '.ai', 'guides', 'upstream', relative(join(GUIDES_DIR, 'upstream'), file)))\n }\n for (const moduleId of selectedModules) paths.add(join(targetDir, '.ai', 'guides', 'modules', `${moduleId}.md`))\n if (selectedTools.includes('claude-code')) {\n paths.add(join(targetDir, 'CLAUDE.md'))\n paths.add(join(targetDir, '.claude', 'settings.json'))\n paths.add(join(targetDir, '.claude', 'hooks', 'entity-migration-check.ts'))\n paths.add(join(targetDir, '.mcp.json.example'))\n }\n if (selectedTools.includes('codex')) paths.add(join(targetDir, '.codex', 'mcp.json.example'))\n if (selectedTools.includes('cursor')) {\n for (const file of listFiles(join(AGENTIC_DIR, 'cursor'))) {\n const rel = relative(join(AGENTIC_DIR, 'cursor'), file)\n paths.add(join(targetDir, '.cursor', rel))\n }\n }\n const manifestPath = join(targetDir, '.ai', 'harness', 'manifest.json')\n const externalSkills = externalSkillNames(targetDir)\n paths.delete(manifestPath)\n const files = [...paths]\n .filter((path) => existsSync(path))\n .sort((left, right) => left.localeCompare(right))\n .map((path) => {\n const relativePath = normalizeManifestRelativePath(relative(targetDir, path))\n const skillName = relativePath.match(/^\\.ai\\/skills\\/([^/]+)\\//)?.[1]\n return {\n path: relativePath,\n sha256: hashFile(path),\n source: skillName ? (externalSkills.has(skillName) ? 'external-override' : 'local-skill') : 'generated',\n userEditable: relativePath === 'AGENTS.md' || relativePath === '.ai/agentic.config.json' || relativePath === '.ai/lessons.md',\n }\n })\n atomicWriteFile(\n manifestPath,\n `${JSON.stringify({ version: 1, generator: harnessGeneratorId(), files }, null, 2)}\\n`,\n )\n}\n\n/**\n * Publish a fully generated harness candidate using the previous ownership\n * manifest as the only source of ownership. Modified owned files and exact-path\n * collisions with unknown files stay untouched; their candidate is written next\n * to them as `<path>.incoming` for explicit review.\n */\nexport type HarnessUpdateConflict = { path: string; candidate: string | null }\n\nfunction preserveIncomingCandidate(\n targetRoot: string,\n destinationPath: string,\n sourcePath: string,\n relativePath: string,\n): string {\n for (let suffix = 1; ; suffix += 1) {\n const label = suffix === 1 ? '.incoming' : `.incoming.${suffix}`\n const candidatePath = `${destinationPath}${label}`\n assertManagedPath(targetRoot, candidatePath, { leaf: 'file' })\n if (!existsSync(candidatePath)) {\n atomicCopyFile(sourcePath, candidatePath, targetRoot)\n return `${relativePath}${label}`\n }\n if (hashFile(candidatePath) === hashFile(sourcePath)) return `${relativePath}${label}`\n }\n}\n\nexport function applyHarnessUpdate(\n targetDir: string,\n stagingDir: string,\n options: { force?: boolean } = {},\n): HarnessUpdateConflict[] {\n const targetRoot = canonicalHarnessRoot(targetDir)\n const stagingRoot = canonicalHarnessRoot(stagingDir)\n const targetManifestPath = join(targetRoot, '.ai', 'harness', 'manifest.json')\n const stagingManifestPath = join(stagingRoot, '.ai', 'harness', 'manifest.json')\n assertManagedPath(targetRoot, targetManifestPath, { leaf: 'file' })\n assertManagedPath(stagingRoot, stagingManifestPath, { leaf: 'file' })\n const candidateManifest = readHarnessManifest(stagingManifestPath)\n if (!candidateManifest) {\n throw new Error('Generated harness candidate has a missing or invalid ownership manifest.')\n }\n\n const previousManifest = readHarnessManifest(targetManifestPath)\n const previousFiles = new Map(previousManifest?.files.map((entry) => [entry.path, entry]) ?? [])\n const candidatePaths = new Set(candidateManifest.files.map((entry) => entry.path))\n const candidates: Array<{\n entry: HarnessManifestFile\n sourcePath: string\n destinationPath: string\n }> = []\n\n // Validate the complete candidate before writing anything into the app.\n for (const entry of candidateManifest.files) {\n const sourcePath = resolveManifestPath(stagingRoot, entry.path)\n const destinationPath = resolveManifestPath(targetRoot, entry.path)\n if (sourcePath) assertManagedPath(stagingRoot, sourcePath, { leaf: 'file' })\n if (destinationPath) assertManagedPath(targetRoot, destinationPath, { leaf: 'file' })\n if (!sourcePath || !destinationPath || !existsSync(sourcePath) || hashFile(sourcePath) !== entry.sha256) {\n throw new Error(`Generated harness candidate is invalid for ${JSON.stringify(entry.path)}.`)\n }\n candidates.push({ entry, sourcePath, destinationPath })\n }\n\n const conflicts: HarnessUpdateConflict[] = []\n for (const { entry, sourcePath, destinationPath } of candidates) {\n if (options.force) {\n atomicCopyFile(sourcePath, destinationPath, targetRoot)\n continue\n }\n if (!existsSync(destinationPath)) {\n atomicCopyFile(sourcePath, destinationPath, targetRoot)\n continue\n }\n\n const currentHash = hashFile(destinationPath)\n const previousEntry = previousFiles.get(entry.path)\n if (currentHash === entry.sha256 || (previousEntry && currentHash === previousEntry.sha256)) {\n atomicCopyFile(sourcePath, destinationPath, targetRoot)\n continue\n }\n\n const candidate = preserveIncomingCandidate(targetRoot, destinationPath, sourcePath, entry.path)\n conflicts.push({ path: entry.path, candidate })\n }\n\n const retainedRetiredEntries: HarnessManifestFile[] = []\n for (const previousEntry of previousManifest?.files ?? []) {\n if (candidatePaths.has(previousEntry.path)) continue\n const destinationPath = resolveManifestPath(targetRoot, previousEntry.path)\n if (!destinationPath || !existsSync(destinationPath)) continue\n assertManagedPath(targetRoot, destinationPath, { leaf: 'file' })\n let unchanged = false\n try {\n unchanged = hashFile(destinationPath) === previousEntry.sha256\n } catch {\n // A user may replace a generated file with another filesystem object.\n // Preserve it and retain the ownership tombstone for a later review.\n }\n if (unchanged) {\n assertManagedPath(targetRoot, dirname(destinationPath))\n assertManagedPath(targetRoot, destinationPath, { leaf: 'file' })\n rmSync(destinationPath, { force: true })\n } else {\n retainedRetiredEntries.push(previousEntry)\n conflicts.push({ path: previousEntry.path, candidate: null })\n }\n }\n\n // The candidate hashes deliberately remain in the manifest for conflicts. If\n // the user accepts an .incoming file, a later update can recognize it as an\n // unmodified owned file. Until then the hash mismatch keeps preserving it.\n const finalManifest: HarnessManifest = {\n ...candidateManifest,\n files: [...candidateManifest.files, ...retainedRetiredEntries],\n }\n atomicWriteFile(targetManifestPath, `${JSON.stringify(finalManifest, null, 2)}\\n`, targetRoot)\n return conflicts\n}\n\n// \u2500\u2500\u2500 Generators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction generateShared(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'shared')\n\n // Resolve which per-module fact-sheets this app gets (enabled \u2229 bundled allowlist).\n const selectedModules = selectModuleFactSheets(targetDir, join(GUIDES_DIR, 'modules'))\n\n // One recursive mapping mirrors create-app's shared emitter.\n writeTemplate(srcDir, 'AGENTS.md.template', join(targetDir, 'AGENTS.md'), config)\n copyTree(join(srcDir, 'ai'), join(targetDir, '.ai'), config)\n copyTree(join(srcDir, 'scripts'), join(targetDir, 'scripts'), config)\n\n // Routed conceptual guides are copied wholesale (framework-wide). Per-module\n // fact-sheets (.ai/guides/modules/<module>.md) are filtered to the app's enabled\n // module set; the combined module-facts.json sidecar is copied as-is.\n if (existsSync(GUIDES_DIR)) {\n const guidesDestDir = join(targetDir, '.ai', 'guides')\n for (const file of readdirSync(GUIDES_DIR)) {\n if (!file.endsWith('.md')) continue\n const srcPath = join(GUIDES_DIR, file)\n const destPath = join(guidesDestDir, file)\n ensureDir(destPath)\n copyFileSync(srcPath, destPath)\n }\n\n const moduleFactsPath = join(GUIDES_DIR, 'module-facts.json')\n if (existsSync(moduleFactsPath)) {\n const destPath = join(guidesDestDir, 'module-facts.json')\n ensureDir(destPath)\n copyFileSync(moduleFactsPath, destPath)\n }\n\n\n copyTree(join(GUIDES_DIR, 'upstream'), join(guidesDestDir, 'upstream'), config)\n\n const modulesSubdir = join(GUIDES_DIR, 'modules')\n for (const moduleId of selectedModules) {\n const destPath = join(guidesDestDir, 'modules', `${moduleId}.md`)\n ensureDir(destPath)\n copyFileSync(join(modulesSubdir, `${moduleId}.md`), destPath)\n }\n }\n\n injectModuleGuides(join(targetDir, 'AGENTS.md'), selectedModules)\n}\n\nfunction generateClaudeCode(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'claude-code')\n\n writeTemplate(srcDir, 'CLAUDE.md.template', join(targetDir, 'CLAUDE.md'), config)\n copyFile(srcDir, 'settings.json', join(targetDir, '.claude', 'settings.json'))\n copyFile(srcDir, 'hooks/entity-migration-check.ts', join(targetDir, '.claude', 'hooks', 'entity-migration-check.ts'))\n copyFile(srcDir, 'mcp.json.example', join(targetDir, '.mcp.json.example'))\n\n // The installer exclusively owns Claude's per-skill compatibility links.\n}\n\nfunction generateCodex(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'codex')\n\n const agentsPath = join(targetDir, 'AGENTS.md')\n if (existsSync(agentsPath)) {\n const enforcement = readFileSync(join(srcDir, 'enforcement-rules.md'), 'utf-8')\n let agents = readFileSync(agentsPath, 'utf-8')\n const MARKER_START = '<!-- CODEX_ENFORCEMENT_RULES_START -->'\n const MARKER_END = '<!-- CODEX_ENFORCEMENT_RULES_END -->'\n\n if (agents.includes(MARKER_START)) {\n const startIdx = agents.indexOf(MARKER_START)\n const endIdx = agents.indexOf(MARKER_END)\n if (endIdx !== -1) {\n agents = agents.slice(0, startIdx) + enforcement + agents.slice(endIdx + MARKER_END.length)\n }\n } else {\n const firstNewline = agents.indexOf('\\n')\n if (firstNewline !== -1) {\n agents = agents.slice(0, firstNewline + 1) + '\\n' + enforcement + '\\n' + agents.slice(firstNewline + 1)\n } else {\n agents = agents + '\\n\\n' + enforcement\n }\n }\n writeFileSync(agentsPath, agents)\n }\n\n copyFile(srcDir, 'mcp.json.example', join(targetDir, '.codex', 'mcp.json.example'))\n\n // No .codex/skills directory: Codex reads the canonical .agents/skills/,\n // which scripts/install-skills.sh populates.\n}\n\nfunction generateCursor(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'cursor')\n\n writeTemplate(srcDir, 'rules/open-mercato.mdc', join(targetDir, '.cursor', 'rules', 'open-mercato.mdc'), config)\n copyFile(srcDir, 'rules/entity-guard.mdc', join(targetDir, '.cursor', 'rules', 'entity-guard.mdc'))\n copyFile(srcDir, 'rules/generated-guard.mdc', join(targetDir, '.cursor', 'rules', 'generated-guard.mdc'))\n copyFile(srcDir, 'hooks.json', join(targetDir, '.cursor', 'hooks.json'))\n copyFile(srcDir, 'hooks/entity-migration-check.mjs', join(targetDir, '.cursor', 'hooks', 'entity-migration-check.mjs'))\n copyFile(srcDir, 'mcp.json.example', join(targetDir, '.cursor', 'mcp.json.example'))\n\n // No .cursor/skills directory: Cursor reads the canonical .agents/skills/,\n // which scripts/install-skills.sh populates.\n}\n\n// \u2500\u2500\u2500 Wizard \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst TOOLS = [\n { key: '1', label: 'Claude Code (Anthropic)', id: 'claude-code' },\n { key: '2', label: 'Codex (OpenAI)', id: 'codex' },\n { key: '3', label: 'Cursor (Anysphere)', id: 'cursor' },\n { key: '4', label: 'Multiple tools (select individually)', id: 'multiple' },\n { key: '5', label: 'Skip \u2014 set up manually later', id: 'skip' },\n] as const\n\nconst SELECTABLE = TOOLS.filter((t) => t.id !== 'multiple' && t.id !== 'skip')\n\nfunction persistedAgentSelection(targetDir: string): string[] | null {\n const selectableIds = SELECTABLE.map((tool) => tool.id)\n const tiersPath = join(targetDir, '.ai', 'skills', 'tiers.json')\n try {\n const tiers = JSON.parse(readFileSync(tiersPath, 'utf8')) as { agents?: { ignore?: unknown } }\n if (Array.isArray(tiers.agents?.ignore)\n && tiers.agents.ignore.every((id): id is string => typeof id === 'string')) {\n const ignored = new Set(tiers.agents.ignore)\n return selectableIds.filter((id) => !ignored.has(id))\n }\n } catch {\n // Fall through to the ownership manifest and existing generated assets.\n }\n\n const manifest = readHarnessManifest(join(targetDir, '.ai', 'harness', 'manifest.json'))\n const owned = new Set(manifest?.files.map((entry) => entry.path) ?? [])\n const selected = SELECTABLE.filter((tool) => {\n if (tool.id === 'claude-code') {\n return owned.has('CLAUDE.md') || owned.has('.claude/settings.json')\n || existsSync(join(targetDir, 'CLAUDE.md')) || existsSync(join(targetDir, '.claude', 'settings.json'))\n }\n if (tool.id === 'codex') {\n return owned.has('.codex/mcp.json.example') || existsSync(join(targetDir, '.codex', 'mcp.json.example'))\n }\n return owned.has('.cursor/hooks.json') || existsSync(join(targetDir, '.cursor', 'hooks.json'))\n }).map((tool) => tool.id)\n return selected.length > 0 ? selected : null\n}\n\nasync function promptSelection(ask: AskFn): Promise<string[]> {\n console.log('')\n console.log('\uD83E\uDD16 Agentic workflow setup')\n console.log('')\n console.log(' Which AI coding tool will you use with this project?')\n console.log('')\n for (const tool of TOOLS) {\n console.log(` ${tool.key}. ${tool.label}`)\n }\n console.log('')\n\n const answer = (await ask(' Enter number(s) separated by comma [1]: ')).trim() || '1'\n\n if (answer === '5') return ['skip']\n\n if (answer === '4') {\n const selected: string[] = []\n for (const tool of SELECTABLE) {\n const yn = await ask(` Include ${tool.label}? [y/N]: `)\n if (yn.toLowerCase() === 'y' || yn.toLowerCase() === 'yes') {\n selected.push(tool.id)\n }\n }\n return selected.length > 0 ? selected : ['skip']\n }\n\n const keys = answer.split(',').map((s) => s.trim())\n const ids: string[] = []\n for (const key of keys) {\n const tool = TOOLS.find((t) => t.key === key)\n if (tool && tool.id !== 'multiple' && tool.id !== 'skip') {\n ids.push(tool.id)\n }\n }\n return ids.length > 0 ? ids : ['skip']\n}\n\nexport async function runAgenticSetup(\n targetDir: string,\n ask: AskFn,\n options?: AgenticSetupOptions,\n): Promise<void> {\n let selectedIds: string[]\n\n if (options?.tool) {\n selectedIds = options.tool.split(',').map((t) => t.trim())\n } else if (options?.updateHarness) {\n selectedIds = persistedAgentSelection(targetDir) ?? await promptSelection(ask)\n } else {\n selectedIds = await promptSelection(ask)\n }\n\n if (selectedIds.includes('skip')) {\n console.log('')\n console.log(' Skipped agentic setup.')\n console.log('')\n return\n }\n\n const config: AgenticConfig = {\n projectName: basename(targetDir),\n targetDir,\n }\n\n const stagingDir = mkdtempSync(join(tmpdir(), 'open-mercato-harness-'))\n try {\n const modulesSourcePath = join(targetDir, 'src', 'modules.ts')\n const modulesCandidatePath = join(stagingDir, 'src', 'modules.ts')\n if (existsSync(modulesSourcePath)) {\n ensureDir(modulesCandidatePath)\n copyFileSync(modulesSourcePath, modulesCandidatePath)\n }\n\n const stagingConfig: AgenticConfig = {\n projectName: config.projectName,\n targetDir: stagingDir,\n }\n generateHarness(stagingConfig, selectedIds)\n const conflicts = applyHarnessUpdate(targetDir, stagingDir, {\n force: options?.force,\n })\n if (conflicts.length > 0) {\n console.warn('')\n console.warn(' \u26A0 Preserved locally modified harness files:')\n for (const conflict of conflicts) {\n const detail = conflict.candidate\n ? `candidate: ${conflict.candidate}`\n : 'retired asset kept because it has local changes'\n console.warn(` \u2022 ${conflict.path} (${detail})`)\n }\n }\n } finally {\n rmSync(stagingDir, { recursive: true, force: true })\n }\n\n installSkills(targetDir)\n\n console.log('')\n console.log(' Agentic setup complete:')\n if (selectedIds.includes('claude-code')) {\n console.log(' \u2713 Claude Code \u2014 CLAUDE.md, .claude/hooks/, .mcp.json.example')\n }\n if (selectedIds.includes('codex')) {\n console.log(' \u2713 Codex \u2014 AGENTS.md enforcement rules, .codex/mcp.json.example')\n }\n if (selectedIds.includes('cursor')) {\n console.log(' \u2713 Cursor \u2014 .cursor/rules/, .cursor/hooks/, .cursor/mcp.json.example')\n }\n console.log('')\n console.log(' .ai/agentic.config.json ships preconfigured (GitHub tracker, labels off);')\n console.log(' run /om-setup-agent-pipeline in your agent CLI to tailor labels, QA gate,')\n console.log(' tracker, or validation commands. Re-run `yarn install-skills` anytime to')\n console.log(' refresh the external open-mercato/skills subset.')\n console.log('')\n}\n\nfunction generateHarness(config: AgenticConfig, selectedIds: string[]): void {\n generateShared(config)\n if (selectedIds.includes('claude-code')) generateClaudeCode(config)\n if (selectedIds.includes('codex')) generateCodex(config)\n if (selectedIds.includes('cursor')) generateCursor(config)\n\n persistAgentSelection(config.targetDir, selectedIds)\n finalizeHarnessManifest(config, selectedIds)\n}\n\n/**\n * Persist the agent selection so later `yarn install-skills` runs keep honoring\n * it: agents the user did not pick go into `agents.ignore` in tiers.json and\n * never get a skills directory of their own.\n */\nfunction persistAgentSelection(targetDir: string, selectedIds: string[]): void {\n const manifestPath = join(targetDir, '.ai', 'skills', 'tiers.json')\n if (!existsSync(manifestPath)) return\n const ignore = SELECTABLE.map((tool) => tool.id).filter((id) => !selectedIds.includes(id))\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as Record<string, unknown>\n if (ignore.length > 0) {\n manifest.agents = { ignore }\n } else {\n delete manifest.agents\n }\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`)\n}\n\nfunction installSkills(targetDir: string): void {\n const installScript = join(targetDir, 'scripts', 'install-skills.mjs')\n if (!existsSync(installScript)) return\n console.log('')\n console.log(' Installing agent skills (local tiers + external open-mercato/skills subset)...')\n const result = spawnSync(process.execPath, [installScript], { cwd: targetDir, stdio: 'inherit' })\n if (result.error || result.status !== 0) {\n console.log(' \u26A0 Skill installation did not complete; run `yarn install-skills` inside the app when online.')\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Agentic setup for the CLI `agentic:init` command.\n *\n * Source files live in packages/create-app/agentic/ and are copied\n * to packages/cli/dist/agentic/ during build (see build.mjs).\n * This module reads those files at runtime \u2014 no embedded string constants.\n */\n\nimport {\n chmodSync,\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n readdirSync,\n realpathSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs'\nimport { createHash } from 'node:crypto'\nimport { spawnSync } from 'node:child_process'\nimport { tmpdir } from 'node:os'\nimport { join, dirname, basename, relative, resolve, sep } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { Project, SyntaxKind } from 'ts-morph'\n\nconst moduleDir = dirname(fileURLToPath(import.meta.url))\n// In the built output (dist/lib/agentic-setup.js), moduleDir is dist/lib/.\n// agentic/ is copied to dist/agentic/ by build.mjs.\nconst bundledAgenticDir = join(moduleDir, '..', 'agentic')\nconst AGENTIC_DIR = existsSync(bundledAgenticDir)\n ? bundledAgenticDir\n : join(moduleDir, '..', '..', '..', 'create-app', 'agentic')\nconst GUIDES_DIR = join(AGENTIC_DIR, 'guides')\n\ntype AskFn = (question: string) => Promise<string>\n\ninterface AgenticSetupOptions {\n tool?: string\n force?: boolean\n updateHarness?: boolean\n}\n\ninterface AgenticConfig {\n projectName: string\n targetDir: string\n}\n\ninterface HarnessManifestFile {\n path: string\n sha256: string\n source: string\n userEditable: boolean\n}\n\ninterface HarnessManifest {\n version: number\n generator: string\n files: HarnessManifestFile[]\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction resolvePlaceholders(content: string, config: AgenticConfig): string {\n return content.replace(/\\{\\{PROJECT_NAME\\}\\}/g, config.projectName)\n}\n\nfunction ensureDir(filePath: string): void {\n const dir = dirname(filePath)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n}\n\nfunction writeTemplate(srcDir: string, srcRelative: string, destPath: string, config: AgenticConfig): void {\n const srcPath = join(srcDir, srcRelative)\n const content = readFileSync(srcPath, 'utf-8')\n ensureDir(destPath)\n writeFileSync(destPath, resolvePlaceholders(content, config))\n}\n\nfunction copyFile(srcDir: string, srcRelative: string, destPath: string): void {\n const srcPath = join(srcDir, srcRelative)\n ensureDir(destPath)\n copyFileSync(srcPath, destPath)\n}\n\n// \u2500\u2500\u2500 Module fact-sheet selection (mirrors packages/create-app/src/setup/tools/shared.ts) \u2500\u2500\n\n// AST-parse the static `enabledModules` array literal in the app's src/modules.ts\n// and collect each entry's `id`. Only the static literal is read (conditional\n// .push()/spread entries are intentionally not seen \u2014 see spec D6).\nfunction readEnabledModuleIds(modulesPath: string): { parsed: boolean; ids: string[] } {\n if (!existsSync(modulesPath)) return { parsed: false, ids: [] }\n try {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('modules.ts', readFileSync(modulesPath, 'utf-8'))\n const declaration = sourceFile.getVariableDeclaration('enabledModules')\n const arrayLiteral = declaration?.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression)\n if (!arrayLiteral) return { parsed: false, ids: [] }\n const ids: string[] = []\n for (const element of arrayLiteral.getElements()) {\n const objectLiteral = element.asKind(SyntaxKind.ObjectLiteralExpression)\n if (!objectLiteral) continue\n const idProperty = objectLiteral.getProperty('id')?.asKind(SyntaxKind.PropertyAssignment)\n const idValue = idProperty?.getInitializerIfKind(SyntaxKind.StringLiteral)?.getLiteralValue()\n if (idValue) ids.push(idValue)\n }\n return { parsed: true, ids }\n } catch {\n return { parsed: false, ids: [] }\n }\n}\n\n// Resolve which per-module fact-sheets to ship: the intersection of the bundled\n// fact-sheets (the D5 allowlist, materialized by build.mjs) with the app's enabled\n// modules. Falls back to the full bundled set when the enabled set cannot be read\n// (R5 \u2014 degraded, never empty).\nfunction selectModuleFactSheets(targetDir: string, modulesSubdir: string): string[] {\n const available = existsSync(modulesSubdir)\n ? readdirSync(modulesSubdir)\n .filter((file) => file.endsWith('.md'))\n .map((file) => file.replace(/\\.md$/, ''))\n : []\n if (available.length === 0) return []\n const parsed = readEnabledModuleIds(join(targetDir, 'src', 'modules.ts'))\n if (!parsed.parsed) return available\n const enabled = new Set(parsed.ids)\n const selected = available.filter((moduleId) => enabled.has(moduleId))\n return selected\n}\n\nconst MODULE_GUIDES_START = '<!-- om:module-guides:start -->'\nconst MODULE_GUIDES_END = '<!-- om:module-guides:end -->'\n\nexport function renderModuleGuidesBlock(selected: string[]): string {\n if (selected.length === 0) return '_No module fact-sheets are bundled for this app._'\n return [\n `Enabled module facts: ${selected.map((moduleId) => `\\`${moduleId}\\``).join(',')}.`,\n '',\n 'Load `.ai/guides/modules/<id>.md` only for a named or targeted installed module/host; never preload all module facts.',\n ].join('\\n')\n}\n\n// Regenerate the marker-delimited Module-Specific Guides block in the written\n// AGENTS.md from the selected module set. Replaces strictly between the markers so\n// surrounding prose is untouched and repeat runs are idempotent.\nfunction injectModuleGuides(\n agentsMdPath: string,\n selected: string[],\n): void {\n if (!existsSync(agentsMdPath)) return\n const content = readFileSync(agentsMdPath, 'utf-8')\n const startIndex = content.indexOf(MODULE_GUIDES_START)\n const endIndex = content.indexOf(MODULE_GUIDES_END)\n if (startIndex === -1 || endIndex === -1 || endIndex < startIndex) {\n console.warn(\n `[agentic] Module-Specific Guides markers (${MODULE_GUIDES_START} \u2026 ${MODULE_GUIDES_END}) not found in ${agentsMdPath}; the per-module guide list was not generated.`,\n )\n return\n }\n const before = content.slice(0, startIndex + MODULE_GUIDES_START.length)\n const after = content.slice(endIndex)\n const next = `${before}\\n${renderModuleGuidesBlock(selected)}\\n${after}`\n if (next !== content) writeFileSync(agentsMdPath, next)\n}\n\nconst TEXT_EXTENSIONS = new Set(['.cjs', '.json', '.md', '.mdc', '.mjs', '.sh', '.ts', '.txt'])\n\nfunction isTextAsset(path: string): boolean {\n const dot = path.lastIndexOf('.')\n return dot === -1 || TEXT_EXTENSIONS.has(path.slice(dot))\n}\n\nfunction listFiles(root: string): string[] {\n if (!existsSync(root)) return []\n const files: string[] = []\n for (const entry of readdirSync(root, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {\n const absolute = join(root, entry.name)\n if (entry.isDirectory()) files.push(...listFiles(absolute))\n else if (entry.isFile()) files.push(absolute)\n }\n return files\n}\n\nfunction copyTree(sourceRoot: string, destinationRoot: string, config: AgenticConfig): void {\n for (const sourcePath of listFiles(sourceRoot)) {\n const destinationPath = join(destinationRoot, relative(sourceRoot, sourcePath))\n ensureDir(destinationPath)\n if (isTextAsset(sourcePath)) {\n writeFileSync(destinationPath, resolvePlaceholders(readFileSync(sourcePath, 'utf8'), config))\n } else {\n copyFileSync(sourcePath, destinationPath)\n }\n if (process.platform !== 'win32') chmodSync(destinationPath, statSync(sourcePath).mode & 0o777)\n }\n}\n\nfunction hashFile(path: string): string {\n return createHash('sha256').update(readFileSync(path)).digest('hex')\n}\n\nfunction canonicalHarnessRoot(root: string): string {\n const resolved = resolve(root)\n if (!existsSync(resolved)) {\n throw new Error(`Harness root must be an existing directory: ${resolved}`)\n }\n const canonical = realpathSync(resolved)\n const entry = lstatSync(canonical, { throwIfNoEntry: false })\n if (!entry || !entry.isDirectory()) {\n throw new Error(`Harness root must be an existing directory: ${resolved}`)\n }\n return canonical\n}\n\n/**\n * Validate a managed path without following any link below the canonical app\n * root. A lexical containment check alone is insufficient: `app/.ai -> /tmp`\n * would otherwise make an apparently safe update write outside the app.\n */\nfunction assertManagedPath(root: string, path: string, options: { leaf?: 'file' | 'any' } = {}): void {\n const absolutePath = resolve(path)\n const normalizedRelative = relative(root, absolutePath)\n if (\n normalizedRelative === '..' ||\n normalizedRelative.startsWith(`..${sep}`)\n ) {\n throw new Error(`Harness-managed path escapes its root: ${absolutePath}`)\n }\n if (normalizedRelative === '') return\n\n const components = normalizedRelative.split(sep).filter(Boolean)\n let current = root\n for (let index = 0; index < components.length; index += 1) {\n current = join(current, components[index])\n const entry = lstatSync(current, { throwIfNoEntry: false })\n if (!entry) return\n if (entry.isSymbolicLink()) {\n throw new Error(`Harness-managed path contains a symbolic-link component: ${current}`)\n }\n const isLeaf = index === components.length - 1\n if (!isLeaf && !entry.isDirectory()) {\n throw new Error(`Harness-managed path component is not a directory: ${current}`)\n }\n if (isLeaf && options.leaf === 'file' && !entry.isFile()) {\n throw new Error(`Harness-managed file is not a regular file: ${current}`)\n }\n }\n}\n\nfunction ensureManagedParent(root: string, filePath: string): void {\n const parent = dirname(filePath)\n const normalizedRelative = relative(root, parent)\n if (normalizedRelative === '..' || normalizedRelative.startsWith(`..${sep}`)) {\n throw new Error(`Harness-managed path escapes its root: ${filePath}`)\n }\n let current = root\n for (const component of normalizedRelative.split(sep).filter(Boolean)) {\n assertManagedPath(root, current)\n current = join(current, component)\n const entry = lstatSync(current, { throwIfNoEntry: false })\n if (!entry) mkdirSync(current)\n const created = lstatSync(current, { throwIfNoEntry: false })\n if (!created || created.isSymbolicLink() || !created.isDirectory()) {\n throw new Error(`Harness-managed path component is not a real directory: ${current}`)\n }\n }\n}\n\nfunction harnessGeneratorId(): string {\n try {\n const upstream = JSON.parse(readFileSync(join(GUIDES_DIR, 'upstream', 'manifest.json'), 'utf8')) as {\n generator?: unknown\n }\n const generator = typeof upstream.generator === 'string' ? upstream.generator : ''\n const version = generator.slice(generator.lastIndexOf('@') + 1)\n if (version && version !== generator) return `open-mercato-agentic@${version}`\n } catch {\n // Source-mode tests may not have built upstream snapshots yet.\n }\n return 'open-mercato-agentic@unknown'\n}\n\nfunction externalSkillNames(targetDir: string): Set<string> {\n try {\n const tiers = JSON.parse(readFileSync(join(targetDir, '.ai', 'skills', 'tiers.json'), 'utf8')) as {\n external?: { skills?: unknown }\n }\n return new Set(Array.isArray(tiers.external?.skills) ? tiers.external.skills.filter((name): name is string => typeof name === 'string') : [])\n } catch {\n return new Set()\n }\n}\n\nfunction atomicCopyFile(sourcePath: string, destinationPath: string, managedRoot?: string): void {\n if (managedRoot) {\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n ensureManagedParent(managedRoot, destinationPath)\n } else {\n ensureDir(destinationPath)\n }\n const temporaryPath = `${destinationPath}.tmp-${process.pid}-${Date.now()}`\n try {\n if (managedRoot) assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n copyFileSync(sourcePath, temporaryPath)\n if (process.platform !== 'win32') chmodSync(temporaryPath, statSync(sourcePath).mode & 0o777)\n if (managedRoot) {\n assertManagedPath(managedRoot, dirname(destinationPath))\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n }\n renameSync(temporaryPath, destinationPath)\n } finally {\n if (!managedRoot || !lstatSync(temporaryPath, { throwIfNoEntry: false })?.isSymbolicLink()) {\n rmSync(temporaryPath, { force: true })\n }\n }\n}\n\nfunction atomicWriteFile(destinationPath: string, content: string, managedRoot?: string): void {\n if (managedRoot) {\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n ensureManagedParent(managedRoot, destinationPath)\n } else {\n ensureDir(destinationPath)\n }\n const temporaryPath = `${destinationPath}.tmp-${process.pid}-${Date.now()}`\n try {\n if (managedRoot) assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n writeFileSync(temporaryPath, content)\n if (managedRoot) {\n assertManagedPath(managedRoot, dirname(destinationPath))\n assertManagedPath(managedRoot, destinationPath, { leaf: 'file' })\n assertManagedPath(managedRoot, temporaryPath, { leaf: 'file' })\n }\n renameSync(temporaryPath, destinationPath)\n } finally {\n if (!managedRoot || !lstatSync(temporaryPath, { throwIfNoEntry: false })?.isSymbolicLink()) {\n rmSync(temporaryPath, { force: true })\n }\n }\n}\n\nfunction resolveManifestPath(root: string, relativePath: string): string | null {\n if (!relativePath || relativePath.includes('\\0')) return null\n const absolutePath = resolve(root, relativePath)\n const normalizedRelative = relative(root, absolutePath)\n if (\n normalizedRelative === '' ||\n normalizedRelative === '..' ||\n normalizedRelative.startsWith(`..${sep}`)\n ) {\n return null\n }\n return absolutePath\n}\n\nfunction normalizeManifestRelativePath(path: string): string {\n return path.replace(/\\\\/g, '/')\n}\n\nfunction readHarnessManifest(manifestPath: string): HarnessManifest | null {\n if (!existsSync(manifestPath)) return null\n try {\n const parsed = JSON.parse(readFileSync(manifestPath, 'utf8')) as Partial<HarnessManifest>\n if (\n typeof parsed.version !== 'number' ||\n typeof parsed.generator !== 'string' ||\n !Array.isArray(parsed.files)\n ) {\n return null\n }\n const files: HarnessManifestFile[] = []\n for (const entry of parsed.files) {\n if (\n !entry ||\n typeof entry.path !== 'string' ||\n typeof entry.sha256 !== 'string' ||\n !/^[a-f0-9]{64}$/.test(entry.sha256) ||\n typeof entry.source !== 'string' ||\n typeof entry.userEditable !== 'boolean'\n ) {\n return null\n }\n files.push({ ...entry, path: normalizeManifestRelativePath(entry.path) })\n }\n return { version: parsed.version, generator: parsed.generator, files }\n } catch {\n return null\n }\n}\n\nfunction targetPathsForTree(sourceRoot: string, destinationRoot: string): string[] {\n return listFiles(sourceRoot).map((sourcePath) => join(destinationRoot, relative(sourceRoot, sourcePath)))\n}\n\nfunction finalizeHarnessManifest(config: AgenticConfig, selectedTools: string[]): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'shared')\n const selectedModules = selectModuleFactSheets(targetDir, join(GUIDES_DIR, 'modules'))\n const paths = new Set<string>([\n join(targetDir, 'AGENTS.md'),\n ...targetPathsForTree(join(srcDir, 'ai'), join(targetDir, '.ai')),\n ...targetPathsForTree(join(srcDir, 'scripts'), join(targetDir, 'scripts')),\n ])\n for (const file of readdirSync(GUIDES_DIR)) {\n if (file.endsWith('.md') || file === 'module-facts.json') paths.add(join(targetDir, '.ai', 'guides', file))\n }\n for (const file of listFiles(join(GUIDES_DIR, 'upstream'))) {\n paths.add(join(targetDir, '.ai', 'guides', 'upstream', relative(join(GUIDES_DIR, 'upstream'), file)))\n }\n for (const moduleId of selectedModules) paths.add(join(targetDir, '.ai', 'guides', 'modules', `${moduleId}.md`))\n if (selectedTools.includes('claude-code')) {\n paths.add(join(targetDir, 'CLAUDE.md'))\n paths.add(join(targetDir, '.claude', 'settings.json'))\n paths.add(join(targetDir, '.claude', 'hooks', 'entity-migration-check.ts'))\n paths.add(join(targetDir, '.mcp.json.example'))\n }\n if (selectedTools.includes('codex')) paths.add(join(targetDir, '.codex', 'mcp.json.example'))\n if (selectedTools.includes('cursor')) {\n for (const file of listFiles(join(AGENTIC_DIR, 'cursor'))) {\n const rel = relative(join(AGENTIC_DIR, 'cursor'), file)\n paths.add(join(targetDir, '.cursor', rel))\n }\n }\n const manifestPath = join(targetDir, '.ai', 'harness', 'manifest.json')\n const externalSkills = externalSkillNames(targetDir)\n paths.delete(manifestPath)\n const files = [...paths]\n .filter((path) => existsSync(path))\n .sort((left, right) => left.localeCompare(right))\n .map((path) => {\n const relativePath = normalizeManifestRelativePath(relative(targetDir, path))\n const skillName = relativePath.match(/^\\.ai\\/skills\\/([^/]+)\\//)?.[1]\n return {\n path: relativePath,\n sha256: hashFile(path),\n source: skillName ? (externalSkills.has(skillName) ? 'external-override' : 'local-skill') : 'generated',\n userEditable:\n relativePath === 'AGENTS.md'\n || relativePath === '.ai/agentic.config.json'\n || relativePath === '.ai/lessons.md'\n || relativePath.startsWith('.ai/lessons/'),\n }\n })\n atomicWriteFile(\n manifestPath,\n `${JSON.stringify({ version: 1, generator: harnessGeneratorId(), files }, null, 2)}\\n`,\n )\n}\n\n/**\n * Publish a fully generated harness candidate using the previous ownership\n * manifest as the only source of ownership. Modified owned files and exact-path\n * collisions with unknown files stay untouched; their candidate is written next\n * to them as `<path>.incoming` for explicit review.\n */\nexport type HarnessUpdateConflict = { path: string; candidate: string | null }\n\nfunction preserveIncomingCandidate(\n targetRoot: string,\n destinationPath: string,\n sourcePath: string,\n relativePath: string,\n): string {\n for (let suffix = 1; ; suffix += 1) {\n const label = suffix === 1 ? '.incoming' : `.incoming.${suffix}`\n const candidatePath = `${destinationPath}${label}`\n assertManagedPath(targetRoot, candidatePath, { leaf: 'file' })\n if (!existsSync(candidatePath)) {\n atomicCopyFile(sourcePath, candidatePath, targetRoot)\n return `${relativePath}${label}`\n }\n if (hashFile(candidatePath) === hashFile(sourcePath)) return `${relativePath}${label}`\n }\n}\n\nexport function applyHarnessUpdate(\n targetDir: string,\n stagingDir: string,\n options: { force?: boolean } = {},\n): HarnessUpdateConflict[] {\n const targetRoot = canonicalHarnessRoot(targetDir)\n const stagingRoot = canonicalHarnessRoot(stagingDir)\n const targetManifestPath = join(targetRoot, '.ai', 'harness', 'manifest.json')\n const stagingManifestPath = join(stagingRoot, '.ai', 'harness', 'manifest.json')\n assertManagedPath(targetRoot, targetManifestPath, { leaf: 'file' })\n assertManagedPath(stagingRoot, stagingManifestPath, { leaf: 'file' })\n const candidateManifest = readHarnessManifest(stagingManifestPath)\n if (!candidateManifest) {\n throw new Error('Generated harness candidate has a missing or invalid ownership manifest.')\n }\n\n const previousManifest = readHarnessManifest(targetManifestPath)\n const previousFiles = new Map(previousManifest?.files.map((entry) => [entry.path, entry]) ?? [])\n const candidatePaths = new Set(candidateManifest.files.map((entry) => entry.path))\n const candidates: Array<{\n entry: HarnessManifestFile\n sourcePath: string\n destinationPath: string\n }> = []\n\n // Validate the complete candidate before writing anything into the app.\n for (const entry of candidateManifest.files) {\n const sourcePath = resolveManifestPath(stagingRoot, entry.path)\n const destinationPath = resolveManifestPath(targetRoot, entry.path)\n if (sourcePath) assertManagedPath(stagingRoot, sourcePath, { leaf: 'file' })\n if (destinationPath) assertManagedPath(targetRoot, destinationPath, { leaf: 'file' })\n if (!sourcePath || !destinationPath || !existsSync(sourcePath) || hashFile(sourcePath) !== entry.sha256) {\n throw new Error(`Generated harness candidate is invalid for ${JSON.stringify(entry.path)}.`)\n }\n candidates.push({ entry, sourcePath, destinationPath })\n }\n\n const conflicts: HarnessUpdateConflict[] = []\n for (const { entry, sourcePath, destinationPath } of candidates) {\n if (options.force) {\n atomicCopyFile(sourcePath, destinationPath, targetRoot)\n continue\n }\n if (!existsSync(destinationPath)) {\n atomicCopyFile(sourcePath, destinationPath, targetRoot)\n continue\n }\n\n const currentHash = hashFile(destinationPath)\n const previousEntry = previousFiles.get(entry.path)\n if (currentHash === entry.sha256 || (previousEntry && currentHash === previousEntry.sha256)) {\n atomicCopyFile(sourcePath, destinationPath, targetRoot)\n continue\n }\n\n const candidate = preserveIncomingCandidate(targetRoot, destinationPath, sourcePath, entry.path)\n conflicts.push({ path: entry.path, candidate })\n }\n\n const retainedRetiredEntries: HarnessManifestFile[] = []\n for (const previousEntry of previousManifest?.files ?? []) {\n if (candidatePaths.has(previousEntry.path)) continue\n const destinationPath = resolveManifestPath(targetRoot, previousEntry.path)\n if (!destinationPath || !existsSync(destinationPath)) continue\n assertManagedPath(targetRoot, destinationPath, { leaf: 'file' })\n let unchanged = false\n try {\n unchanged = hashFile(destinationPath) === previousEntry.sha256\n } catch {\n // A user may replace a generated file with another filesystem object.\n // Preserve it and retain the ownership tombstone for a later review.\n }\n if (unchanged) {\n assertManagedPath(targetRoot, dirname(destinationPath))\n assertManagedPath(targetRoot, destinationPath, { leaf: 'file' })\n rmSync(destinationPath, { force: true })\n } else {\n retainedRetiredEntries.push(previousEntry)\n conflicts.push({ path: previousEntry.path, candidate: null })\n }\n }\n\n // The candidate hashes deliberately remain in the manifest for conflicts. If\n // the user accepts an .incoming file, a later update can recognize it as an\n // unmodified owned file. Until then the hash mismatch keeps preserving it.\n const finalManifest: HarnessManifest = {\n ...candidateManifest,\n files: [...candidateManifest.files, ...retainedRetiredEntries],\n }\n atomicWriteFile(targetManifestPath, `${JSON.stringify(finalManifest, null, 2)}\\n`, targetRoot)\n return conflicts\n}\n\n// \u2500\u2500\u2500 Generators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction generateShared(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'shared')\n\n // Resolve which per-module fact-sheets this app gets (enabled \u2229 bundled allowlist).\n const selectedModules = selectModuleFactSheets(targetDir, join(GUIDES_DIR, 'modules'))\n\n // One recursive mapping mirrors create-app's shared emitter.\n writeTemplate(srcDir, 'AGENTS.md.template', join(targetDir, 'AGENTS.md'), config)\n copyTree(join(srcDir, 'ai'), join(targetDir, '.ai'), config)\n copyTree(join(srcDir, 'scripts'), join(targetDir, 'scripts'), config)\n\n // Routed conceptual guides are copied wholesale (framework-wide). Per-module\n // fact-sheets (.ai/guides/modules/<module>.md) are filtered to the app's enabled\n // module set; the combined module-facts.json sidecar is copied as-is.\n if (existsSync(GUIDES_DIR)) {\n const guidesDestDir = join(targetDir, '.ai', 'guides')\n for (const file of readdirSync(GUIDES_DIR)) {\n if (!file.endsWith('.md')) continue\n const srcPath = join(GUIDES_DIR, file)\n const destPath = join(guidesDestDir, file)\n ensureDir(destPath)\n copyFileSync(srcPath, destPath)\n }\n\n const moduleFactsPath = join(GUIDES_DIR, 'module-facts.json')\n if (existsSync(moduleFactsPath)) {\n const destPath = join(guidesDestDir, 'module-facts.json')\n ensureDir(destPath)\n copyFileSync(moduleFactsPath, destPath)\n }\n\n\n copyTree(join(GUIDES_DIR, 'upstream'), join(guidesDestDir, 'upstream'), config)\n\n const modulesSubdir = join(GUIDES_DIR, 'modules')\n for (const moduleId of selectedModules) {\n const destPath = join(guidesDestDir, 'modules', `${moduleId}.md`)\n ensureDir(destPath)\n copyFileSync(join(modulesSubdir, `${moduleId}.md`), destPath)\n }\n }\n\n injectModuleGuides(join(targetDir, 'AGENTS.md'), selectedModules)\n}\n\nfunction generateClaudeCode(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'claude-code')\n\n writeTemplate(srcDir, 'CLAUDE.md.template', join(targetDir, 'CLAUDE.md'), config)\n copyFile(srcDir, 'settings.json', join(targetDir, '.claude', 'settings.json'))\n copyFile(srcDir, 'hooks/entity-migration-check.ts', join(targetDir, '.claude', 'hooks', 'entity-migration-check.ts'))\n copyFile(srcDir, 'mcp.json.example', join(targetDir, '.mcp.json.example'))\n\n // The installer exclusively owns Claude's per-skill compatibility links.\n}\n\nfunction generateCodex(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'codex')\n\n const agentsPath = join(targetDir, 'AGENTS.md')\n if (existsSync(agentsPath)) {\n const enforcement = readFileSync(join(srcDir, 'enforcement-rules.md'), 'utf-8')\n let agents = readFileSync(agentsPath, 'utf-8')\n const MARKER_START = '<!-- CODEX_ENFORCEMENT_RULES_START -->'\n const MARKER_END = '<!-- CODEX_ENFORCEMENT_RULES_END -->'\n\n if (agents.includes(MARKER_START)) {\n const startIdx = agents.indexOf(MARKER_START)\n const endIdx = agents.indexOf(MARKER_END)\n if (endIdx !== -1) {\n agents = agents.slice(0, startIdx) + enforcement + agents.slice(endIdx + MARKER_END.length)\n }\n } else {\n const firstNewline = agents.indexOf('\\n')\n if (firstNewline !== -1) {\n agents = agents.slice(0, firstNewline + 1) + '\\n' + enforcement + '\\n' + agents.slice(firstNewline + 1)\n } else {\n agents = agents + '\\n\\n' + enforcement\n }\n }\n writeFileSync(agentsPath, agents)\n }\n\n copyFile(srcDir, 'mcp.json.example', join(targetDir, '.codex', 'mcp.json.example'))\n\n // No .codex/skills directory: Codex reads the canonical .agents/skills/,\n // which scripts/install-skills.sh populates.\n}\n\nfunction generateCursor(config: AgenticConfig): void {\n const { targetDir } = config\n const srcDir = join(AGENTIC_DIR, 'cursor')\n\n writeTemplate(srcDir, 'rules/open-mercato.mdc', join(targetDir, '.cursor', 'rules', 'open-mercato.mdc'), config)\n copyFile(srcDir, 'rules/entity-guard.mdc', join(targetDir, '.cursor', 'rules', 'entity-guard.mdc'))\n copyFile(srcDir, 'rules/generated-guard.mdc', join(targetDir, '.cursor', 'rules', 'generated-guard.mdc'))\n copyFile(srcDir, 'hooks.json', join(targetDir, '.cursor', 'hooks.json'))\n copyFile(srcDir, 'hooks/entity-migration-check.mjs', join(targetDir, '.cursor', 'hooks', 'entity-migration-check.mjs'))\n copyFile(srcDir, 'mcp.json.example', join(targetDir, '.cursor', 'mcp.json.example'))\n\n // No .cursor/skills directory: Cursor reads the canonical .agents/skills/,\n // which scripts/install-skills.sh populates.\n}\n\n// \u2500\u2500\u2500 Wizard \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst TOOLS = [\n { key: '1', label: 'Claude Code (Anthropic)', id: 'claude-code' },\n { key: '2', label: 'Codex (OpenAI)', id: 'codex' },\n { key: '3', label: 'Cursor (Anysphere)', id: 'cursor' },\n { key: '4', label: 'Multiple tools (select individually)', id: 'multiple' },\n { key: '5', label: 'Skip \u2014 set up manually later', id: 'skip' },\n] as const\n\nconst SELECTABLE = TOOLS.filter((t) => t.id !== 'multiple' && t.id !== 'skip')\n\nfunction persistedAgentSelection(targetDir: string): string[] | null {\n const selectableIds = SELECTABLE.map((tool) => tool.id)\n const tiersPath = join(targetDir, '.ai', 'skills', 'tiers.json')\n try {\n const tiers = JSON.parse(readFileSync(tiersPath, 'utf8')) as { agents?: { ignore?: unknown } }\n if (Array.isArray(tiers.agents?.ignore)\n && tiers.agents.ignore.every((id): id is string => typeof id === 'string')) {\n const ignored = new Set(tiers.agents.ignore)\n return selectableIds.filter((id) => !ignored.has(id))\n }\n } catch {\n // Fall through to the ownership manifest and existing generated assets.\n }\n\n const manifest = readHarnessManifest(join(targetDir, '.ai', 'harness', 'manifest.json'))\n const owned = new Set(manifest?.files.map((entry) => entry.path) ?? [])\n const selected = SELECTABLE.filter((tool) => {\n if (tool.id === 'claude-code') {\n return owned.has('CLAUDE.md') || owned.has('.claude/settings.json')\n || existsSync(join(targetDir, 'CLAUDE.md')) || existsSync(join(targetDir, '.claude', 'settings.json'))\n }\n if (tool.id === 'codex') {\n return owned.has('.codex/mcp.json.example') || existsSync(join(targetDir, '.codex', 'mcp.json.example'))\n }\n return owned.has('.cursor/hooks.json') || existsSync(join(targetDir, '.cursor', 'hooks.json'))\n }).map((tool) => tool.id)\n return selected.length > 0 ? selected : null\n}\n\nasync function promptSelection(ask: AskFn): Promise<string[]> {\n console.log('')\n console.log('\uD83E\uDD16 Agentic workflow setup')\n console.log('')\n console.log(' Which AI coding tool will you use with this project?')\n console.log('')\n for (const tool of TOOLS) {\n console.log(` ${tool.key}. ${tool.label}`)\n }\n console.log('')\n\n const answer = (await ask(' Enter number(s) separated by comma [1]: ')).trim() || '1'\n\n if (answer === '5') return ['skip']\n\n if (answer === '4') {\n const selected: string[] = []\n for (const tool of SELECTABLE) {\n const yn = await ask(` Include ${tool.label}? [y/N]: `)\n if (yn.toLowerCase() === 'y' || yn.toLowerCase() === 'yes') {\n selected.push(tool.id)\n }\n }\n return selected.length > 0 ? selected : ['skip']\n }\n\n const keys = answer.split(',').map((s) => s.trim())\n const ids: string[] = []\n for (const key of keys) {\n const tool = TOOLS.find((t) => t.key === key)\n if (tool && tool.id !== 'multiple' && tool.id !== 'skip') {\n ids.push(tool.id)\n }\n }\n return ids.length > 0 ? ids : ['skip']\n}\n\nexport async function runAgenticSetup(\n targetDir: string,\n ask: AskFn,\n options?: AgenticSetupOptions,\n): Promise<void> {\n let selectedIds: string[]\n\n if (options?.tool) {\n selectedIds = options.tool.split(',').map((t) => t.trim())\n } else if (options?.updateHarness) {\n selectedIds = persistedAgentSelection(targetDir) ?? await promptSelection(ask)\n } else {\n selectedIds = await promptSelection(ask)\n }\n\n if (selectedIds.includes('skip')) {\n console.log('')\n console.log(' Skipped agentic setup.')\n console.log('')\n return\n }\n\n const config: AgenticConfig = {\n projectName: basename(targetDir),\n targetDir,\n }\n\n const stagingDir = mkdtempSync(join(tmpdir(), 'open-mercato-harness-'))\n try {\n const modulesSourcePath = join(targetDir, 'src', 'modules.ts')\n const modulesCandidatePath = join(stagingDir, 'src', 'modules.ts')\n if (existsSync(modulesSourcePath)) {\n ensureDir(modulesCandidatePath)\n copyFileSync(modulesSourcePath, modulesCandidatePath)\n }\n\n const stagingConfig: AgenticConfig = {\n projectName: config.projectName,\n targetDir: stagingDir,\n }\n generateHarness(stagingConfig, selectedIds)\n const conflicts = applyHarnessUpdate(targetDir, stagingDir, {\n force: options?.force,\n })\n if (conflicts.length > 0) {\n console.warn('')\n console.warn(' \u26A0 Preserved locally modified harness files:')\n for (const conflict of conflicts) {\n const detail = conflict.candidate\n ? `candidate: ${conflict.candidate}`\n : 'retired asset kept because it has local changes'\n console.warn(` \u2022 ${conflict.path} (${detail})`)\n }\n }\n } finally {\n rmSync(stagingDir, { recursive: true, force: true })\n }\n\n installSkills(targetDir)\n\n console.log('')\n console.log(' Agentic setup complete:')\n if (selectedIds.includes('claude-code')) {\n console.log(' \u2713 Claude Code \u2014 CLAUDE.md, .claude/hooks/, .mcp.json.example')\n }\n if (selectedIds.includes('codex')) {\n console.log(' \u2713 Codex \u2014 AGENTS.md enforcement rules, .codex/mcp.json.example')\n }\n if (selectedIds.includes('cursor')) {\n console.log(' \u2713 Cursor \u2014 .cursor/rules/, .cursor/hooks/, .cursor/mcp.json.example')\n }\n console.log('')\n console.log(' .ai/agentic.config.json ships preconfigured (GitHub tracker, labels off);')\n console.log(' run /om-setup-agent-pipeline in your agent CLI to tailor labels, QA gate,')\n console.log(' tracker, or validation commands. Re-run `yarn install-skills` anytime to')\n console.log(' refresh the external open-mercato/skills subset.')\n console.log('')\n}\n\nfunction generateHarness(config: AgenticConfig, selectedIds: string[]): void {\n generateShared(config)\n if (selectedIds.includes('claude-code')) generateClaudeCode(config)\n if (selectedIds.includes('codex')) generateCodex(config)\n if (selectedIds.includes('cursor')) generateCursor(config)\n\n persistAgentSelection(config.targetDir, selectedIds)\n finalizeHarnessManifest(config, selectedIds)\n}\n\n/**\n * Persist the agent selection so later `yarn install-skills` runs keep honoring\n * it: agents the user did not pick go into `agents.ignore` in tiers.json and\n * never get a skills directory of their own.\n */\nfunction persistAgentSelection(targetDir: string, selectedIds: string[]): void {\n const manifestPath = join(targetDir, '.ai', 'skills', 'tiers.json')\n if (!existsSync(manifestPath)) return\n const ignore = SELECTABLE.map((tool) => tool.id).filter((id) => !selectedIds.includes(id))\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as Record<string, unknown>\n if (ignore.length > 0) {\n manifest.agents = { ignore }\n } else {\n delete manifest.agents\n }\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`)\n}\n\nfunction installSkills(targetDir: string): void {\n const installScript = join(targetDir, 'scripts', 'install-skills.mjs')\n if (!existsSync(installScript)) return\n console.log('')\n console.log(' Installing agent skills (local tiers + external open-mercato/skills subset)...')\n const result = spawnSync(process.execPath, [installScript], { cwd: targetDir, stdio: 'inherit' })\n if (result.error || result.status !== 0) {\n console.log(' \u26A0 Skill installation did not complete; run `yarn install-skills` inside the app when online.')\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }