@open-mercato/cli 0.6.7-develop.6677.1.beabb7ca12 → 0.6.7-develop.6686.1.bdda5ed397

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 (211) hide show
  1. package/.turbo/turbo-build.log +0 -1
  2. package/build.mjs +21 -5
  3. package/dist/agentic/claude-code/hooks/entity-migration-check.ts +32 -88
  4. package/dist/agentic/codex/enforcement-rules.md +2 -16
  5. package/dist/agentic/cursor/hooks/entity-migration-check.mjs +19 -50
  6. package/dist/agentic/cursor/rules/entity-guard.mdc +9 -21
  7. package/dist/agentic/cursor/rules/generated-guard.mdc +3 -5
  8. package/dist/agentic/cursor/rules/open-mercato.mdc +3 -29
  9. package/dist/agentic/guides/ai-workflows.md +76 -0
  10. package/dist/agentic/guides/architecture.md +107 -0
  11. package/dist/agentic/guides/backend-ui.md +80 -0
  12. package/dist/agentic/guides/contracts.md +92 -0
  13. package/dist/agentic/guides/extensions.md +104 -0
  14. package/dist/agentic/guides/integrations.md +81 -0
  15. package/dist/agentic/guides/module-facts.json +217 -81
  16. package/dist/agentic/guides/module-system.md +12 -127
  17. package/dist/agentic/guides/modules/ai_assistant.md +1 -1
  18. package/dist/agentic/guides/modules/api_docs.md +1 -1
  19. package/dist/agentic/guides/modules/api_keys.md +1 -1
  20. package/dist/agentic/guides/modules/attachments.md +2 -2
  21. package/dist/agentic/guides/modules/audit_logs.md +2 -2
  22. package/dist/agentic/guides/modules/auth.md +1 -1
  23. package/dist/agentic/guides/modules/business_rules.md +1 -1
  24. package/dist/agentic/guides/modules/catalog.md +5 -5
  25. package/dist/agentic/guides/modules/channel_gmail.md +1 -1
  26. package/dist/agentic/guides/modules/channel_imap.md +1 -1
  27. package/dist/agentic/guides/modules/checkout.md +1 -1
  28. package/dist/agentic/guides/modules/communication_channels.md +1 -1
  29. package/dist/agentic/guides/modules/configs.md +1 -1
  30. package/dist/agentic/guides/modules/content.md +1 -1
  31. package/dist/agentic/guides/modules/currencies.md +1 -1
  32. package/dist/agentic/guides/modules/customer_accounts.md +1 -1
  33. package/dist/agentic/guides/modules/customers.md +2 -2
  34. package/dist/agentic/guides/modules/dashboards.md +1 -1
  35. package/dist/agentic/guides/modules/data_sync.md +1 -1
  36. package/dist/agentic/guides/modules/dictionaries.md +1 -1
  37. package/dist/agentic/guides/modules/directory.md +1 -1
  38. package/dist/agentic/guides/modules/entities.md +2 -2
  39. package/dist/agentic/guides/modules/events.md +1 -1
  40. package/dist/agentic/guides/modules/feature_toggles.md +1 -1
  41. package/dist/agentic/guides/modules/gateway_stripe.md +1 -1
  42. package/dist/agentic/guides/modules/generators.md +1 -1
  43. package/dist/agentic/guides/modules/inbox_ops.md +1 -1
  44. package/dist/agentic/guides/modules/integrations.md +1 -1
  45. package/dist/agentic/guides/modules/messages.md +1 -1
  46. package/dist/agentic/guides/modules/notifications.md +1 -1
  47. package/dist/agentic/guides/modules/onboarding.md +1 -1
  48. package/dist/agentic/guides/modules/payment_gateways.md +1 -1
  49. package/dist/agentic/guides/modules/perspectives.md +1 -1
  50. package/dist/agentic/guides/modules/planner.md +1 -1
  51. package/dist/agentic/guides/modules/portal.md +1 -1
  52. package/dist/agentic/guides/modules/progress.md +1 -1
  53. package/dist/agentic/guides/modules/query_index.md +2 -2
  54. package/dist/agentic/guides/modules/record_locks.md +1 -1
  55. package/dist/agentic/guides/modules/resources.md +1 -1
  56. package/dist/agentic/guides/modules/sales.md +17 -17
  57. package/dist/agentic/guides/modules/scheduler.md +1 -1
  58. package/dist/agentic/guides/modules/search.md +1 -1
  59. package/dist/agentic/guides/modules/security.md +1 -1
  60. package/dist/agentic/guides/modules/shipping_carriers.md +1 -1
  61. package/dist/agentic/guides/modules/sso.md +1 -1
  62. package/dist/agentic/guides/modules/staff.md +2 -2
  63. package/dist/agentic/guides/modules/storage_s3.md +1 -1
  64. package/dist/agentic/guides/modules/sync_akeneo.md +1 -1
  65. package/dist/agentic/guides/modules/sync_excel.md +1 -1
  66. package/dist/agentic/guides/modules/system_status_overlays.md +1 -1
  67. package/dist/agentic/guides/modules/translations.md +1 -1
  68. package/dist/agentic/guides/modules/webhooks.md +2 -2
  69. package/dist/agentic/guides/modules/wms.md +2 -2
  70. package/dist/agentic/guides/modules/workflows.md +1 -1
  71. package/dist/agentic/guides/testing-debugging.md +74 -0
  72. package/dist/agentic/guides/upstream/AGENTS.md +297 -0
  73. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +303 -0
  74. package/dist/agentic/guides/upstream/manifest.json +8 -0
  75. package/dist/agentic/shared/AGENTS.md.template +123 -311
  76. package/dist/agentic/shared/ai/agentic.config.json +1 -0
  77. package/dist/agentic/shared/ai/harness/README.md +48 -0
  78. package/dist/agentic/shared/ai/harness/RELEASE.md +57 -0
  79. package/dist/agentic/shared/ai/harness/cases.json +13487 -0
  80. package/dist/agentic/shared/ai/harness/cases.schema.json +132 -0
  81. package/dist/agentic/shared/ai/harness/fixtures/index.json +49 -0
  82. package/dist/agentic/shared/ai/harness/fixtures/seeds.json +162 -0
  83. package/dist/agentic/shared/ai/harness/generated-code-review-policy.md +20 -0
  84. package/dist/agentic/shared/ai/harness/generated-code-review-response.schema.json +43 -0
  85. package/dist/agentic/shared/ai/harness/generated-code-review-result.schema.json +110 -0
  86. package/dist/agentic/shared/ai/harness/release-matrix.json +133 -0
  87. package/dist/agentic/shared/ai/harness/release-result.schema.json +219 -0
  88. package/dist/agentic/shared/ai/harness/result.schema.json +76 -0
  89. package/dist/agentic/shared/ai/harness/routing-response.schema.json +12 -0
  90. package/dist/agentic/shared/ai/harness/target-validation-result.schema.json +73 -0
  91. package/dist/agentic/shared/ai/harness/validators.json +78 -0
  92. package/dist/agentic/shared/ai/harness/writable-ast-oracles.mjs +1768 -0
  93. package/dist/agentic/shared/ai/harness/writable-behavior-oracles.mjs +1096 -0
  94. package/dist/agentic/shared/ai/review-checklist.md +36 -0
  95. package/dist/agentic/shared/ai/skills/om-auto-review-pr/SKILL.md +4 -0
  96. package/dist/agentic/shared/ai/skills/om-backend-ui-design/SKILL.md +20 -241
  97. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/crud-surfaces.md +16 -0
  98. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/frontend-and-design-system.md +53 -0
  99. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/page-and-navigation.md +13 -0
  100. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/quality-states.md +11 -0
  101. package/dist/agentic/shared/ai/skills/om-build-workflow/SKILL.md +30 -0
  102. package/dist/agentic/shared/ai/skills/om-build-workflow/references/activity-contracts.md +12 -0
  103. package/dist/agentic/shared/ai/skills/om-build-workflow/references/durability-and-progress.md +13 -0
  104. package/dist/agentic/shared/ai/skills/om-build-workflow/references/workflow-design.md +14 -0
  105. package/dist/agentic/shared/ai/skills/om-create-ai-agent/SKILL.md +28 -0
  106. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/attachments-and-overrides.md +12 -0
  107. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/module-agents-and-tools.md +22 -0
  108. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/orchestrator-agents.md +12 -0
  109. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/surface-selector.md +19 -0
  110. package/dist/agentic/shared/ai/skills/om-data-model-design/SKILL.md +16 -601
  111. package/dist/agentic/shared/ai/skills/om-data-model-design/references/integrity-and-concurrency.md +19 -0
  112. package/dist/agentic/shared/ai/skills/om-data-model-design/references/migration-workflow.md +13 -0
  113. package/dist/agentic/shared/ai/skills/om-data-model-design/references/schema-design.md +14 -0
  114. package/dist/agentic/shared/ai/skills/om-data-model-design/references/sensitive-data.md +10 -0
  115. package/dist/agentic/shared/ai/skills/om-eject-and-customize/SKILL.md +14 -310
  116. package/dist/agentic/shared/ai/skills/om-eject-and-customize/references/decision-and-procedure.md +17 -0
  117. package/dist/agentic/shared/ai/skills/om-evolve-harness/SKILL.md +28 -0
  118. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-template.md +89 -0
  119. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-workflow.md +16 -0
  120. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/owner-selection.md +17 -0
  121. package/dist/agentic/shared/ai/skills/om-framework-context/SKILL.md +25 -0
  122. package/dist/agentic/shared/ai/skills/om-framework-context/references/resolver-procedure.md +11 -0
  123. package/dist/agentic/shared/ai/skills/om-framework-context/references/skew-and-escalation.md +13 -0
  124. package/dist/agentic/shared/ai/skills/om-help/SKILL.md +15 -97
  125. package/dist/agentic/shared/ai/skills/om-help/references/delivery-workflows.md +17 -0
  126. package/dist/agentic/shared/ai/skills/om-help/references/task-families.md +20 -0
  127. package/dist/agentic/shared/ai/skills/om-implement-spec/SKILL.md +15 -156
  128. package/dist/agentic/shared/ai/skills/om-implement-spec/references/phases-and-gates.md +12 -0
  129. package/dist/agentic/shared/ai/skills/om-integration-builder/SKILL.md +24 -708
  130. package/dist/agentic/shared/ai/skills/om-integration-builder/references/package-and-activation.md +16 -0
  131. package/dist/agentic/shared/ai/skills/om-integration-builder/references/provider-families.md +14 -0
  132. package/dist/agentic/shared/ai/skills/om-integration-builder/references/security-and-reliability.md +15 -0
  133. package/dist/agentic/shared/ai/skills/om-integration-builder/references/sync-and-files.md +12 -0
  134. package/dist/agentic/shared/ai/skills/om-module-scaffold/SKILL.md +20 -820
  135. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/api-and-domain.md +19 -0
  136. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/business-one-shot-blueprints.md +107 -0
  137. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/data-and-migrations.md +12 -0
  138. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/discovery-surface-catalog.md +83 -0
  139. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/module-surfaces.md +21 -0
  140. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/planning.md +11 -0
  141. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/runtime-cache-and-queues.md +22 -0
  142. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/verification.md +13 -0
  143. package/dist/agentic/shared/ai/skills/om-system-extension/SKILL.md +19 -843
  144. package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-branches.md +18 -0
  145. package/dist/agentic/shared/ai/skills/om-system-extension/references/mechanism-selector.md +25 -0
  146. package/dist/agentic/shared/ai/skills/om-system-extension/references/read-write-roundtrip.md +13 -0
  147. package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +38 -0
  148. package/dist/agentic/shared/ai/skills/om-system-extension/references/verification.md +11 -0
  149. package/dist/agentic/shared/ai/skills/om-trim-unused-modules/SKILL.md +15 -63
  150. package/dist/agentic/shared/ai/skills/om-trim-unused-modules/references/dependency-and-redirect.md +15 -0
  151. package/dist/agentic/shared/ai/skills/om-troubleshooter/SKILL.md +16 -467
  152. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnosis-map.md +16 -0
  153. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/regression-oracles.md +14 -0
  154. package/dist/agentic/shared/ai/skills/tiers.json +137 -20
  155. package/dist/agentic/shared/ai/skills/tiers.schema.json +52 -40
  156. package/dist/agentic/shared/scripts/agent-harness-tool-server.mjs +174 -0
  157. package/dist/agentic/shared/scripts/evaluate-agent-harness.mjs +2783 -0
  158. package/dist/agentic/shared/scripts/execution-sandbox.mjs +329 -0
  159. package/dist/agentic/shared/scripts/framework-context.mjs +894 -0
  160. package/dist/agentic/shared/scripts/install-skills.mjs +1029 -0
  161. package/dist/agentic/shared/scripts/install-skills.sh +4 -694
  162. package/dist/agentic/shared/scripts/prepare-agent-harness-fixture.mjs +222 -0
  163. package/dist/agentic/shared/scripts/run-agent-harness-release.mjs +1761 -0
  164. package/dist/lib/__integration__/TC-INT-008.spec.js +87 -8
  165. package/dist/lib/__integration__/TC-INT-008.spec.js.map +2 -2
  166. package/dist/lib/agentic-init.js +13 -3
  167. package/dist/lib/agentic-init.js.map +2 -2
  168. package/dist/lib/agentic-setup.js +418 -186
  169. package/dist/lib/agentic-setup.js.map +2 -2
  170. package/dist/lib/generators/module-facts-discovery.js +41 -7
  171. package/dist/lib/generators/module-facts-discovery.js.map +2 -2
  172. package/dist/lib/generators/module-facts.js +65 -17
  173. package/dist/lib/generators/module-facts.js.map +2 -2
  174. package/dist/lib/generators/module-registry.js +5 -4
  175. package/dist/lib/generators/module-registry.js.map +2 -2
  176. package/dist/lib/resolver.js +2 -0
  177. package/dist/lib/resolver.js.map +2 -2
  178. package/package.json +5 -5
  179. package/src/lib/__integration__/TC-INT-008.spec.ts +103 -8
  180. package/src/lib/__tests__/agentic-init.test.ts +41 -5
  181. package/src/lib/__tests__/agentic-setup.ownership.test.ts +380 -0
  182. package/src/lib/agentic-init.ts +15 -3
  183. package/src/lib/agentic-setup.ts +526 -224
  184. package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +6 -0
  185. package/src/lib/generators/__tests__/module-facts.customers.fixture.test.ts +1 -0
  186. package/src/lib/generators/__tests__/module-facts.discovery.test.ts +54 -10
  187. package/src/lib/generators/__tests__/module-facts.extension-hosts.test.ts +108 -0
  188. package/src/lib/generators/__tests__/module-subset.test.ts +18 -0
  189. package/src/lib/generators/module-facts-discovery.ts +58 -7
  190. package/src/lib/generators/module-facts.ts +84 -20
  191. package/src/lib/generators/module-registry.ts +8 -4
  192. package/src/lib/resolver.ts +3 -0
  193. package/dist/agentic/guides/cache.md +0 -45
  194. package/dist/agentic/guides/core.md +0 -453
  195. package/dist/agentic/guides/events.md +0 -117
  196. package/dist/agentic/guides/queue.md +0 -53
  197. package/dist/agentic/guides/search.md +0 -115
  198. package/dist/agentic/guides/shared.md +0 -108
  199. package/dist/agentic/guides/ui.md +0 -347
  200. package/dist/agentic/shared/ai/skills/om-auto-continue-pr-loop/SKILL.md +0 -27
  201. package/dist/agentic/shared/ai/skills/om-auto-create-pr-loop/SKILL.md +0 -27
  202. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/ui-components.md +0 -260
  203. package/dist/agentic/shared/ai/skills/om-data-model-design/references/mikro-orm-cheatsheet.md +0 -146
  204. package/dist/agentic/shared/ai/skills/om-help/references/skills-catalog.md +0 -84
  205. package/dist/agentic/shared/ai/skills/om-help/references/workflow-sequences.md +0 -193
  206. package/dist/agentic/shared/ai/skills/om-integration-builder/STANDALONE.md +0 -34
  207. package/dist/agentic/shared/ai/skills/om-integration-builder/references/adapter-contracts.md +0 -762
  208. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/naming-conventions.md +0 -50
  209. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/navigation-patterns.md +0 -97
  210. package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-contracts.md +0 -271
  211. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnostic-commands.md +0 -101
@@ -3,30 +3,146 @@
3
3
  "default": ["core"],
4
4
  "external": {
5
5
  "source": "open-mercato/skills",
6
- "description": "Skills installed from the shared open-mercato/skills collection via `npx skills add` (see scripts/install-skills.sh). Only the subset this standalone app ships is installed. A folder under .ai/skills/ matching one of these names is a repo-local override read by the external skill, never symlinked into the harness directories.",
6
+ "ref": "c6103c034571f3610323a1b53d97c81abe110b58",
7
+ "description": "Tier-selected delivery workflows installed at an exact tested collection commit. Same-name folders under .ai/skills are repo-local overrides and never replace these copies.",
8
+ "tiers": {
9
+ "core": {
10
+ "description": "Smallest dependency-closed set for daily standalone delivery.",
11
+ "skills": [
12
+ "om-spec-writing",
13
+ "om-code-review",
14
+ "om-integration-tests",
15
+ "om-prepare-test-env",
16
+ "om-auto-create-pr",
17
+ "om-auto-continue-pr",
18
+ "om-auto-review-pr",
19
+ "om-auto-implement-spec",
20
+ "om-auto-qa-pr",
21
+ "om-auto-fix-issue",
22
+ "om-verify-in-repo",
23
+ "om-root-cause",
24
+ "om-fix",
25
+ "om-open-pr",
26
+ "om-setup-agent-pipeline"
27
+ ]
28
+ },
29
+ "automation": {
30
+ "description": "Opt-in loop engines, issue authoring, and release-upgrade maintenance.",
31
+ "skills": [
32
+ "om-apply-upgrade-notes",
33
+ "om-auto-create-pr-loop",
34
+ "om-auto-continue-pr-loop",
35
+ "om-auto-write-spec",
36
+ "om-prepare-issue"
37
+ ]
38
+ }
39
+ },
7
40
  "skills": [
41
+ "om-spec-writing",
42
+ "om-code-review",
43
+ "om-integration-tests",
44
+ "om-prepare-test-env",
8
45
  "om-apply-upgrade-notes",
9
- "om-auto-continue-pr",
10
- "om-auto-continue-pr-loop",
11
46
  "om-auto-create-pr",
47
+ "om-auto-continue-pr",
12
48
  "om-auto-create-pr-loop",
13
- "om-auto-fix-issue",
49
+ "om-auto-continue-pr-loop",
14
50
  "om-auto-review-pr",
15
- "om-code-review",
16
- "om-fix",
17
- "om-integration-tests",
18
- "om-open-pr",
51
+ "om-auto-implement-spec",
52
+ "om-auto-write-spec",
53
+ "om-auto-qa-pr",
54
+ "om-auto-fix-issue",
19
55
  "om-prepare-issue",
20
- "om-prepare-test-env",
56
+ "om-verify-in-repo",
21
57
  "om-root-cause",
22
- "om-setup-agent-pipeline",
23
- "om-spec-writing",
24
- "om-verify-in-repo"
25
- ]
58
+ "om-fix",
59
+ "om-open-pr",
60
+ "om-setup-agent-pipeline"
61
+ ],
62
+ "dependencies": {
63
+ "om-spec-writing": [],
64
+ "om-code-review": ["om-setup-agent-pipeline"],
65
+ "om-integration-tests": ["om-prepare-test-env"],
66
+ "om-prepare-test-env": [],
67
+ "om-apply-upgrade-notes": ["om-setup-agent-pipeline"],
68
+ "om-auto-create-pr": ["om-auto-review-pr", "om-setup-agent-pipeline"],
69
+ "om-auto-continue-pr": ["om-auto-review-pr", "om-setup-agent-pipeline"],
70
+ "om-auto-create-pr-loop": [
71
+ "om-auto-continue-pr-loop",
72
+ "om-auto-review-pr",
73
+ "om-integration-tests",
74
+ "om-setup-agent-pipeline"
75
+ ],
76
+ "om-auto-continue-pr-loop": [
77
+ "om-auto-review-pr",
78
+ "om-integration-tests",
79
+ "om-open-pr",
80
+ "om-setup-agent-pipeline"
81
+ ],
82
+ "om-auto-review-pr": ["om-code-review", "om-setup-agent-pipeline"],
83
+ "om-auto-implement-spec": [
84
+ "om-auto-create-pr",
85
+ "om-auto-continue-pr",
86
+ "om-auto-review-pr",
87
+ "om-auto-qa-pr",
88
+ "om-setup-agent-pipeline"
89
+ ],
90
+ "om-auto-qa-pr": [
91
+ "om-auto-review-pr",
92
+ "om-integration-tests",
93
+ "om-prepare-test-env",
94
+ "om-setup-agent-pipeline"
95
+ ],
96
+ "om-auto-write-spec": ["om-spec-writing", "om-open-pr", "om-setup-agent-pipeline"],
97
+ "om-auto-fix-issue": [
98
+ "om-auto-implement-spec",
99
+ "om-auto-qa-pr",
100
+ "om-auto-review-pr",
101
+ "om-verify-in-repo",
102
+ "om-root-cause",
103
+ "om-fix",
104
+ "om-open-pr",
105
+ "om-setup-agent-pipeline"
106
+ ],
107
+ "om-prepare-issue": [
108
+ "om-auto-write-spec",
109
+ "om-auto-fix-issue",
110
+ "om-auto-implement-spec",
111
+ "om-spec-writing",
112
+ "om-setup-agent-pipeline"
113
+ ],
114
+ "om-verify-in-repo": ["om-setup-agent-pipeline"],
115
+ "om-root-cause": ["om-setup-agent-pipeline"],
116
+ "om-fix": ["om-setup-agent-pipeline"],
117
+ "om-open-pr": ["om-setup-agent-pipeline"],
118
+ "om-setup-agent-pipeline": []
119
+ },
120
+ "contentHashes": {
121
+ "om-spec-writing": "sha256:80d5def47ff844748b1c7407cae8b8ee8588ccdfaee54022e15de885d59fa398",
122
+ "om-code-review": "sha256:f4503da210e6e5eb7d79a0972d3922a2888d8aed93e98a1bb73091c0dc2a750e",
123
+ "om-integration-tests": "sha256:a1385dbb9fe11fe8c7a16dbe8576e44b9e03f34254e5575955d5a6ea862ee741",
124
+ "om-prepare-test-env": "sha256:ccfeb9accfffeaf35423576aacc08c9a6e3d3b07ecf8f72da694878fb3a571ab",
125
+ "om-apply-upgrade-notes": "sha256:15d4166a9229ebe15365ad3ef50919443478ef5f4c1f2e7cccbf1b8a61482d0d",
126
+ "om-auto-create-pr": "sha256:fe5a8ff632234c74cd1b948dfa2f69bf79683df067d3b8bc116d7a954d017138",
127
+ "om-auto-continue-pr": "sha256:ced195e0e571672188b34322a9c215df225a9a1822e1db27f6b864b01624e66e",
128
+ "om-auto-create-pr-loop": "sha256:0e7c015705a89e623c4f6865901121404feb1f443e0e096facb2a337ad9d33a5",
129
+ "om-auto-continue-pr-loop": "sha256:2997eb7cbf131e1b88abf05ad930e793675c3cd1db1fece18438ec21b327c6ef",
130
+ "om-auto-review-pr": "sha256:c05b3f45de9563faa0561a3a12129f4fda8bb1780f60d1cdcce7383e75e2d1c5",
131
+ "om-auto-implement-spec": "sha256:f5408771aa3765c9c8f2709f5d17247d9b8fef19fd2461c2fedf25c90bb8cda7",
132
+ "om-auto-write-spec": "sha256:b0d79e189fef7f5c03540becda01d933f5153e39276988f58f9c1dd81e9887f7",
133
+ "om-auto-qa-pr": "sha256:bff71bf4020a1e92b56a17f35f9c63c5f8f942e95048d5bbdf5589443c2cbda9",
134
+ "om-auto-fix-issue": "sha256:8ca990752fc1e73f2a70902d567b94da6c74b15f4e409410aa27ba09b1506521",
135
+ "om-prepare-issue": "sha256:07dd578b00902e65abb408e233688675cc92d6783af1a43257ebfd2d5be34663",
136
+ "om-verify-in-repo": "sha256:2fcf67187b129261aeb59b53c8058e95eb91c1f3c0314756ff5f432a34c43a62",
137
+ "om-root-cause": "sha256:7c14fd6388ff72c8bb058de905264899b7ee9797bb4985b1891ec2da0ec1c815",
138
+ "om-fix": "sha256:c9eb58f7834026c13f2533ae6fc4987d32a0e3cec1fd7b220b47d7154ee6e804",
139
+ "om-open-pr": "sha256:18ef43308dd3e5aff2099b38779cb7447ae26b754d31e18a0f49f857bafdcba7",
140
+ "om-setup-agent-pipeline": "sha256:6f906df68194af5ef4d40ccaf6f4335d44f45ddcffa6e1f36331291ac90377c8"
141
+ }
26
142
  },
27
143
  "tiers": {
28
144
  "core": {
29
- "description": "Daily-driver standalone skills installed by default.",
145
+ "description": "Daily standalone architecture, implementation, extension, debugging, and harness-maintenance skills.",
30
146
  "skills": [
31
147
  "om-help",
32
148
  "om-implement-spec",
@@ -34,20 +150,21 @@
34
150
  "om-module-scaffold",
35
151
  "om-data-model-design",
36
152
  "om-system-extension",
153
+ "om-integration-builder",
154
+ "om-create-ai-agent",
155
+ "om-build-workflow",
37
156
  "om-troubleshooter",
157
+ "om-framework-context",
158
+ "om-evolve-harness",
38
159
  "om-eject-and-customize"
39
160
  ]
40
161
  },
41
162
  "automation": {
42
- "description": "Module-management helpers. Opt-in.",
163
+ "description": "Optional advanced delivery workflows and module-footprint maintenance.",
43
164
  "skills": ["om-trim-unused-modules"]
44
165
  },
45
- "infra": {
46
- "description": "Rare, special-case skills.",
47
- "skills": ["om-integration-builder"]
48
- },
49
166
  "migration": {
50
- "description": "One-shot, version-pinned migrations. Install only when needed.",
167
+ "description": "One-shot, version-pinned migrations. Install only for the named upgrade.",
51
168
  "skills": ["om-auto-upgrade-0.4.10-to-0.5.0"]
52
169
  }
53
170
  }
@@ -1,88 +1,100 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://open-mercato.dev/schemas/skills/tiers.schema.json",
4
- "title": "Open Mercato skills tier manifest",
5
- "description": "Manifest mapping skill folders under .ai/skills/ to install tiers consumed by scripts/install-skills.sh.",
4
+ "title": "Standalone Open Mercato skill manifest",
6
5
  "type": "object",
7
6
  "additionalProperties": false,
8
- "required": ["default", "tiers"],
7
+ "required": ["default", "external", "tiers"],
9
8
  "properties": {
10
- "$schema": {
11
- "type": "string"
12
- },
9
+ "$schema": { "type": "string" },
13
10
  "default": {
14
11
  "type": "array",
15
12
  "minItems": 1,
16
- "items": {
17
- "type": "string",
18
- "minLength": 1
19
- },
20
- "description": "Tier names installed when install-skills.sh is invoked with no flags."
13
+ "uniqueItems": true,
14
+ "items": { "$ref": "#/$defs/tierName" }
21
15
  },
22
16
  "agents": {
23
17
  "type": "object",
24
18
  "additionalProperties": false,
25
- "description": "Agent harness settings for install-skills.sh. Skills always install into the canonical .agents/skills/ directory; per-agent symlinks are created only for agents that cannot read it.",
26
19
  "properties": {
27
20
  "ignore": {
28
21
  "type": "array",
29
- "description": "Agents whose directories install-skills.sh must never write. Overridden by --ignore-agents.",
30
- "items": {
31
- "type": "string",
32
- "enum": ["claude-code", "codex", "cursor"]
33
- }
22
+ "uniqueItems": true,
23
+ "items": { "enum": ["claude-code", "codex", "cursor"] }
34
24
  }
35
25
  }
36
26
  },
37
27
  "external": {
38
28
  "type": "object",
39
29
  "additionalProperties": false,
40
- "required": ["source", "skills"],
41
- "description": "Skills owned by an external collection and installed via `npx skills add` instead of local symlinks. Folders under .ai/skills/ matching these names are repo-local overrides, not installable skills.",
30
+ "required": ["source", "ref", "tiers", "skills", "dependencies", "contentHashes"],
42
31
  "properties": {
43
- "source": {
44
- "type": "string",
45
- "minLength": 1,
46
- "description": "The skills package source, e.g. a GitHub owner/repo."
47
- },
48
- "description": {
49
- "type": "string"
32
+ "source": { "type": "string", "pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$" },
33
+ "ref": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
34
+ "description": { "type": "string" },
35
+ "tiers": {
36
+ "type": "object",
37
+ "minProperties": 1,
38
+ "propertyNames": { "$ref": "#/$defs/tierName" },
39
+ "additionalProperties": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["description", "skills"],
43
+ "properties": {
44
+ "description": { "type": "string", "minLength": 1 },
45
+ "skills": {
46
+ "type": "array",
47
+ "minItems": 1,
48
+ "uniqueItems": true,
49
+ "items": { "$ref": "#/$defs/skillName" }
50
+ }
51
+ }
52
+ }
50
53
  },
51
54
  "skills": {
52
55
  "type": "array",
53
56
  "minItems": 1,
54
- "items": {
55
- "type": "string",
56
- "pattern": "^[a-z0-9][a-z0-9._-]*$"
57
+ "uniqueItems": true,
58
+ "items": { "$ref": "#/$defs/skillName" }
59
+ },
60
+ "dependencies": {
61
+ "type": "object",
62
+ "propertyNames": { "pattern": "^[a-z0-9][a-z0-9._-]*$" },
63
+ "additionalProperties": {
64
+ "type": "array",
65
+ "uniqueItems": true,
66
+ "items": { "$ref": "#/$defs/skillName" }
57
67
  }
68
+ },
69
+ "contentHashes": {
70
+ "type": "object",
71
+ "propertyNames": { "pattern": "^[a-z0-9][a-z0-9._-]*$" },
72
+ "additionalProperties": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }
58
73
  }
59
74
  }
60
75
  },
61
76
  "tiers": {
62
77
  "type": "object",
63
78
  "minProperties": 1,
64
- "propertyNames": {
65
- "pattern": "^[a-z][a-z0-9-]*$"
66
- },
79
+ "propertyNames": { "pattern": "^[a-z][a-z0-9-]*$" },
67
80
  "additionalProperties": {
68
81
  "type": "object",
69
82
  "additionalProperties": false,
70
83
  "required": ["description", "skills"],
71
84
  "properties": {
72
- "description": {
73
- "type": "string",
74
- "minLength": 1
75
- },
85
+ "description": { "type": "string", "minLength": 1 },
76
86
  "skills": {
77
87
  "type": "array",
78
88
  "minItems": 1,
79
- "items": {
80
- "type": "string",
81
- "pattern": "^[a-z0-9][a-z0-9._-]*$"
82
- }
89
+ "uniqueItems": true,
90
+ "items": { "$ref": "#/$defs/skillName" }
83
91
  }
84
92
  }
85
93
  }
86
94
  }
95
+ },
96
+ "$defs": {
97
+ "skillName": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$" },
98
+ "tierName": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" }
87
99
  }
88
100
  }
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from 'node:fs'
4
+ import path from 'node:path'
5
+ import process from 'node:process'
6
+
7
+ const MAX_READ_BYTES = 256 * 1024
8
+ const MAX_WRITE_BYTES = 256 * 1024
9
+ const SAFE_TEXT_EXTENSIONS = new Set([
10
+ '.cjs', '.css', '.graphql', '.html', '.js', '.json', '.jsx', '.md', '.mdx',
11
+ '.mjs', '.prisma', '.sql', '.ts', '.tsx', '.txt', '.xml', '.yaml', '.yml',
12
+ ])
13
+ const FORBIDDEN_SEGMENTS = new Set(['.git', '.docker', '.kube', '.aws', '.ssh', '.codex', '.claude', 'node_modules', '.next', 'dist'])
14
+ const FORBIDDEN_BASENAMES = new Set([
15
+ '.npmrc', '.netrc', '.pypirc', '.git-credentials', 'secrets.json', 'credentials.json',
16
+ 'service-account-credentials.json',
17
+ ])
18
+ const FORBIDDEN_SECRET_EXTENSIONS = new Set(['.key', '.pem', '.p12', '.pfx'])
19
+
20
+ function fail(message) {
21
+ process.stderr.write(`agent-harness-tool-server: ${message}\n`)
22
+ process.exit(2)
23
+ }
24
+
25
+ function isInside(root, candidate) {
26
+ const relative = path.relative(root, candidate)
27
+ return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative))
28
+ }
29
+
30
+ function safeRelative(value) {
31
+ if (typeof value !== 'string' || !value || value.includes('\0') || path.isAbsolute(value)) return false
32
+ const normalized = value.replaceAll('\\', '/')
33
+ if (normalized === '.' || normalized.startsWith('../') || normalized.includes('/../')) return false
34
+ const segments = normalized.split('/')
35
+ const basename = segments.at(-1) ?? ''
36
+ if (segments.some((entry) => FORBIDDEN_SEGMENTS.has(entry))) return false
37
+ if (normalized === '.ai/harness' || normalized.startsWith('.ai/harness/')) return false
38
+ if (basename === '.env' || basename.startsWith('.env.') || FORBIDDEN_BASENAMES.has(basename)) return false
39
+ return !FORBIDDEN_SECRET_EXTENSIONS.has(path.extname(basename).toLowerCase())
40
+ }
41
+
42
+ function globToRegExp(pattern) {
43
+ let source = '^'
44
+ for (let index = 0; index < pattern.length; index += 1) {
45
+ const char = pattern[index]
46
+ if (char === '*' && pattern[index + 1] === '*') { source += '.*'; index += 1 }
47
+ else if (char === '*') source += '[^/]*'
48
+ else if (char === '?') source += '[^/]'
49
+ else source += char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
50
+ }
51
+ return new RegExp(`${source}$`)
52
+ }
53
+
54
+ const rootArg = process.argv[2]
55
+ const mode = process.argv[3]
56
+ let allowedReads
57
+ let allowedWrites
58
+ try { allowedReads = JSON.parse(process.argv[4] ?? '[]') } catch { fail('allowed read set is invalid JSON') }
59
+ try { allowedWrites = JSON.parse(process.argv[5] ?? '[]') } catch { fail('allowed write set is invalid JSON') }
60
+ if (!path.isAbsolute(rootArg ?? '')) fail('root must be absolute')
61
+ if (!['read-only', 'writable'].includes(mode)) fail('mode must be read-only or writable')
62
+ if (!Array.isArray(allowedReads) || allowedReads.some((entry) => !safeRelative(entry) || ['*', '**'].includes(entry))) fail('allowed read set is invalid')
63
+ if (!Array.isArray(allowedWrites) || allowedWrites.some((entry) => !safeRelative(entry))) fail('allowed write set is invalid')
64
+ const root = fs.realpathSync(rootArg)
65
+ const readMatchers = allowedReads.map(globToRegExp)
66
+ const writeMatchers = allowedWrites.map(globToRegExp)
67
+
68
+ function resolveRead(relative) {
69
+ if (!safeRelative(relative)) throw new Error('path is outside the allowed app context')
70
+ const normalized = relative.replaceAll('\\', '/')
71
+ if (!readMatchers.some((matcher) => matcher.test(normalized))) throw new Error('path is outside the case read allowlist')
72
+ const lexical = path.resolve(root, relative)
73
+ if (!isInside(root, lexical)) throw new Error('path escapes the app root')
74
+ const real = fs.realpathSync(lexical)
75
+ if (!isInside(root, real)) throw new Error('path resolves outside the app root')
76
+ const stat = fs.statSync(real)
77
+ if (!stat.isFile() || stat.size > MAX_READ_BYTES) throw new Error('path must be a bounded regular file')
78
+ if (!SAFE_TEXT_EXTENSIONS.has(path.extname(real).toLowerCase()) && path.basename(real) !== 'AGENTS.md') throw new Error('path is not an allowed text file')
79
+ return { real, stat }
80
+ }
81
+
82
+ function resolveWrite(relative) {
83
+ if (mode !== 'writable') throw new Error('writes are disabled for this evaluation')
84
+ if (!safeRelative(relative) || !writeMatchers.some((matcher) => matcher.test(relative.replaceAll('\\', '/')))) throw new Error('path is outside the case write allowlist')
85
+ const lexical = path.resolve(root, relative)
86
+ if (!isInside(root, lexical)) throw new Error('path escapes the app root')
87
+ let cursor = path.dirname(lexical)
88
+ const missing = []
89
+ while (cursor !== root && !fs.existsSync(cursor)) { missing.push(cursor); cursor = path.dirname(cursor) }
90
+ if (!isInside(root, cursor)) throw new Error('write ancestor escapes the app root')
91
+ for (let current = cursor; current !== root; current = path.dirname(current)) {
92
+ const stat = fs.lstatSync(current)
93
+ if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error('write ancestor must be a regular directory')
94
+ }
95
+ if (fs.existsSync(lexical)) {
96
+ const stat = fs.lstatSync(lexical)
97
+ if (!stat.isFile() || stat.isSymbolicLink() || !isInside(root, fs.realpathSync(lexical))) throw new Error('write target must be a contained regular file')
98
+ }
99
+ for (const directory of missing.reverse()) fs.mkdirSync(directory, { mode: 0o700 })
100
+ return lexical
101
+ }
102
+
103
+ const tools = [
104
+ {
105
+ name: 'read',
106
+ description: 'Read one exact app-relative instruction, fact, source, or allowed target file. Absolute paths, discovery, credentials, dependencies, Git, and harness internals are rejected.',
107
+ inputSchema: { type: 'object', additionalProperties: false, required: ['path'], properties: { path: { type: 'string' } } },
108
+ },
109
+ ...(mode === 'writable' ? [{
110
+ name: 'write',
111
+ description: 'Replace one exact app-relative file declared in the current case write allowlist. The content must be the complete file.',
112
+ inputSchema: { type: 'object', additionalProperties: false, required: ['path', 'content'], properties: { path: { type: 'string' }, content: { type: 'string' } } },
113
+ }] : []),
114
+ ]
115
+
116
+ function result(id, value) {
117
+ process.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id, result: value })}\n`)
118
+ }
119
+
120
+ function toolResult(id, text, isError = false) {
121
+ result(id, { content: [{ type: 'text', text }], ...(isError ? { isError: true } : {}) })
122
+ }
123
+
124
+ function handle(message) {
125
+ if (!message || message.jsonrpc !== '2.0') return
126
+ if (message.method === 'initialize') {
127
+ result(message.id, {
128
+ protocolVersion: message.params?.protocolVersion ?? '2025-06-18',
129
+ capabilities: { tools: { listChanged: false } },
130
+ serverInfo: { name: 'open-mercato-agent-harness', version: '1.0.0' },
131
+ })
132
+ return
133
+ }
134
+ if (message.method === 'ping') { result(message.id, {}); return }
135
+ if (message.method === 'tools/list') { result(message.id, { tools }); return }
136
+ if (message.method !== 'tools/call') return
137
+ try {
138
+ const name = message.params?.name
139
+ const input = message.params?.arguments ?? {}
140
+ if (name === 'read') {
141
+ const { real } = resolveRead(input.path)
142
+ toolResult(message.id, fs.readFileSync(real, 'utf8'))
143
+ return
144
+ }
145
+ if (name === 'write') {
146
+ if (typeof input.content !== 'string' || Buffer.byteLength(input.content) > MAX_WRITE_BYTES) throw new Error('content must be a bounded string')
147
+ const target = resolveWrite(input.path)
148
+ const temporary = `${target}.om-harness-${process.pid}.tmp`
149
+ fs.writeFileSync(temporary, input.content, { encoding: 'utf8', mode: 0o600, flag: 'wx' })
150
+ fs.renameSync(temporary, target)
151
+ toolResult(message.id, `wrote ${input.path}`)
152
+ return
153
+ }
154
+ throw new Error('unknown tool')
155
+ } catch (error) {
156
+ toolResult(message.id, error instanceof Error ? error.message : String(error), true)
157
+ }
158
+ }
159
+
160
+ let buffer = ''
161
+ process.stdin.setEncoding('utf8')
162
+ process.stdin.on('data', (chunk) => {
163
+ buffer += chunk
164
+ while (true) {
165
+ const newline = buffer.indexOf('\n')
166
+ if (newline < 0) break
167
+ const line = buffer.slice(0, newline).replace(/\r$/, '')
168
+ buffer = buffer.slice(newline + 1)
169
+ if (!line.trim()) continue
170
+ try { handle(JSON.parse(line)) } catch (error) {
171
+ process.stderr.write(`agent-harness-tool-server: invalid request: ${error instanceof Error ? error.message : String(error)}\n`)
172
+ }
173
+ }
174
+ })