@open-mercato/cli 0.6.7-develop.6685.1.77c0a5591b → 0.6.7-develop.6687.1.46a258e592
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -3
- package/build.mjs +21 -5
- package/dist/agentic/claude-code/hooks/entity-migration-check.ts +32 -88
- package/dist/agentic/codex/enforcement-rules.md +2 -16
- package/dist/agentic/cursor/hooks/entity-migration-check.mjs +19 -50
- package/dist/agentic/cursor/rules/entity-guard.mdc +9 -21
- package/dist/agentic/cursor/rules/generated-guard.mdc +3 -5
- package/dist/agentic/cursor/rules/open-mercato.mdc +3 -29
- package/dist/agentic/guides/ai-workflows.md +76 -0
- package/dist/agentic/guides/architecture.md +107 -0
- package/dist/agentic/guides/backend-ui.md +80 -0
- package/dist/agentic/guides/contracts.md +92 -0
- package/dist/agentic/guides/extensions.md +104 -0
- package/dist/agentic/guides/integrations.md +81 -0
- package/dist/agentic/guides/module-facts.json +217 -81
- package/dist/agentic/guides/module-system.md +12 -127
- package/dist/agentic/guides/modules/ai_assistant.md +1 -1
- package/dist/agentic/guides/modules/api_docs.md +1 -1
- package/dist/agentic/guides/modules/api_keys.md +1 -1
- package/dist/agentic/guides/modules/attachments.md +2 -2
- package/dist/agentic/guides/modules/audit_logs.md +2 -2
- package/dist/agentic/guides/modules/auth.md +1 -1
- package/dist/agentic/guides/modules/business_rules.md +1 -1
- package/dist/agentic/guides/modules/catalog.md +5 -5
- package/dist/agentic/guides/modules/channel_gmail.md +1 -1
- package/dist/agentic/guides/modules/channel_imap.md +1 -1
- package/dist/agentic/guides/modules/checkout.md +1 -1
- package/dist/agentic/guides/modules/communication_channels.md +1 -1
- package/dist/agentic/guides/modules/configs.md +1 -1
- package/dist/agentic/guides/modules/content.md +1 -1
- package/dist/agentic/guides/modules/currencies.md +1 -1
- package/dist/agentic/guides/modules/customer_accounts.md +1 -1
- package/dist/agentic/guides/modules/customers.md +2 -2
- package/dist/agentic/guides/modules/dashboards.md +1 -1
- package/dist/agentic/guides/modules/data_sync.md +1 -1
- package/dist/agentic/guides/modules/dictionaries.md +1 -1
- package/dist/agentic/guides/modules/directory.md +1 -1
- package/dist/agentic/guides/modules/entities.md +2 -2
- package/dist/agentic/guides/modules/events.md +1 -1
- package/dist/agentic/guides/modules/feature_toggles.md +1 -1
- package/dist/agentic/guides/modules/gateway_stripe.md +1 -1
- package/dist/agentic/guides/modules/generators.md +1 -1
- package/dist/agentic/guides/modules/inbox_ops.md +1 -1
- package/dist/agentic/guides/modules/integrations.md +1 -1
- package/dist/agentic/guides/modules/messages.md +1 -1
- package/dist/agentic/guides/modules/notifications.md +1 -1
- package/dist/agentic/guides/modules/onboarding.md +1 -1
- package/dist/agentic/guides/modules/payment_gateways.md +1 -1
- package/dist/agentic/guides/modules/perspectives.md +1 -1
- package/dist/agentic/guides/modules/planner.md +1 -1
- package/dist/agentic/guides/modules/portal.md +1 -1
- package/dist/agentic/guides/modules/progress.md +1 -1
- package/dist/agentic/guides/modules/query_index.md +2 -2
- package/dist/agentic/guides/modules/record_locks.md +1 -1
- package/dist/agentic/guides/modules/resources.md +1 -1
- package/dist/agentic/guides/modules/sales.md +17 -17
- package/dist/agentic/guides/modules/scheduler.md +1 -1
- package/dist/agentic/guides/modules/search.md +1 -1
- package/dist/agentic/guides/modules/security.md +1 -1
- package/dist/agentic/guides/modules/shipping_carriers.md +1 -1
- package/dist/agentic/guides/modules/sso.md +1 -1
- package/dist/agentic/guides/modules/staff.md +2 -2
- package/dist/agentic/guides/modules/storage_s3.md +1 -1
- package/dist/agentic/guides/modules/sync_akeneo.md +1 -1
- package/dist/agentic/guides/modules/sync_excel.md +1 -1
- package/dist/agentic/guides/modules/system_status_overlays.md +1 -1
- package/dist/agentic/guides/modules/translations.md +1 -1
- package/dist/agentic/guides/modules/webhooks.md +2 -2
- package/dist/agentic/guides/modules/wms.md +2 -2
- package/dist/agentic/guides/modules/workflows.md +1 -1
- package/dist/agentic/guides/testing-debugging.md +74 -0
- package/dist/agentic/guides/upstream/AGENTS.md +297 -0
- package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +303 -0
- package/dist/agentic/guides/upstream/manifest.json +8 -0
- package/dist/agentic/shared/AGENTS.md.template +123 -311
- package/dist/agentic/shared/ai/agentic.config.json +1 -0
- package/dist/agentic/shared/ai/harness/README.md +48 -0
- package/dist/agentic/shared/ai/harness/RELEASE.md +57 -0
- package/dist/agentic/shared/ai/harness/cases.json +13487 -0
- package/dist/agentic/shared/ai/harness/cases.schema.json +132 -0
- package/dist/agentic/shared/ai/harness/fixtures/index.json +49 -0
- package/dist/agentic/shared/ai/harness/fixtures/seeds.json +162 -0
- package/dist/agentic/shared/ai/harness/generated-code-review-policy.md +20 -0
- package/dist/agentic/shared/ai/harness/generated-code-review-response.schema.json +43 -0
- package/dist/agentic/shared/ai/harness/generated-code-review-result.schema.json +110 -0
- package/dist/agentic/shared/ai/harness/release-matrix.json +133 -0
- package/dist/agentic/shared/ai/harness/release-result.schema.json +219 -0
- package/dist/agentic/shared/ai/harness/result.schema.json +76 -0
- package/dist/agentic/shared/ai/harness/routing-response.schema.json +12 -0
- package/dist/agentic/shared/ai/harness/target-validation-result.schema.json +73 -0
- package/dist/agentic/shared/ai/harness/validators.json +78 -0
- package/dist/agentic/shared/ai/harness/writable-ast-oracles.mjs +1768 -0
- package/dist/agentic/shared/ai/harness/writable-behavior-oracles.mjs +1096 -0
- package/dist/agentic/shared/ai/review-checklist.md +36 -0
- package/dist/agentic/shared/ai/skills/om-auto-review-pr/SKILL.md +4 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/SKILL.md +20 -241
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/crud-surfaces.md +16 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/frontend-and-design-system.md +53 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/page-and-navigation.md +13 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/quality-states.md +11 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/SKILL.md +30 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/references/activity-contracts.md +12 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/references/durability-and-progress.md +13 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/references/workflow-design.md +14 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/SKILL.md +28 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/attachments-and-overrides.md +12 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/module-agents-and-tools.md +22 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/orchestrator-agents.md +12 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/surface-selector.md +19 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/SKILL.md +16 -601
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/integrity-and-concurrency.md +19 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/migration-workflow.md +13 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/schema-design.md +14 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/sensitive-data.md +10 -0
- package/dist/agentic/shared/ai/skills/om-eject-and-customize/SKILL.md +14 -310
- package/dist/agentic/shared/ai/skills/om-eject-and-customize/references/decision-and-procedure.md +17 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/SKILL.md +28 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-template.md +89 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-workflow.md +16 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/references/owner-selection.md +17 -0
- package/dist/agentic/shared/ai/skills/om-framework-context/SKILL.md +25 -0
- package/dist/agentic/shared/ai/skills/om-framework-context/references/resolver-procedure.md +11 -0
- package/dist/agentic/shared/ai/skills/om-framework-context/references/skew-and-escalation.md +13 -0
- package/dist/agentic/shared/ai/skills/om-help/SKILL.md +15 -97
- package/dist/agentic/shared/ai/skills/om-help/references/delivery-workflows.md +17 -0
- package/dist/agentic/shared/ai/skills/om-help/references/task-families.md +20 -0
- package/dist/agentic/shared/ai/skills/om-implement-spec/SKILL.md +15 -156
- package/dist/agentic/shared/ai/skills/om-implement-spec/references/phases-and-gates.md +12 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/SKILL.md +24 -708
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/package-and-activation.md +16 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/provider-families.md +14 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/security-and-reliability.md +15 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/sync-and-files.md +12 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/SKILL.md +20 -820
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/api-and-domain.md +19 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/business-one-shot-blueprints.md +107 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/data-and-migrations.md +12 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/discovery-surface-catalog.md +83 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/module-surfaces.md +21 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/planning.md +11 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/runtime-cache-and-queues.md +22 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/verification.md +13 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/SKILL.md +19 -843
- package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-branches.md +18 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/mechanism-selector.md +25 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/read-write-roundtrip.md +13 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +38 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/verification.md +11 -0
- package/dist/agentic/shared/ai/skills/om-trim-unused-modules/SKILL.md +15 -63
- package/dist/agentic/shared/ai/skills/om-trim-unused-modules/references/dependency-and-redirect.md +15 -0
- package/dist/agentic/shared/ai/skills/om-troubleshooter/SKILL.md +16 -467
- package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnosis-map.md +16 -0
- package/dist/agentic/shared/ai/skills/om-troubleshooter/references/regression-oracles.md +14 -0
- package/dist/agentic/shared/ai/skills/tiers.json +137 -20
- package/dist/agentic/shared/ai/skills/tiers.schema.json +52 -40
- package/dist/agentic/shared/scripts/agent-harness-tool-server.mjs +174 -0
- package/dist/agentic/shared/scripts/evaluate-agent-harness.mjs +2783 -0
- package/dist/agentic/shared/scripts/execution-sandbox.mjs +329 -0
- package/dist/agentic/shared/scripts/framework-context.mjs +894 -0
- package/dist/agentic/shared/scripts/install-skills.mjs +1029 -0
- package/dist/agentic/shared/scripts/install-skills.sh +4 -694
- package/dist/agentic/shared/scripts/prepare-agent-harness-fixture.mjs +222 -0
- package/dist/agentic/shared/scripts/run-agent-harness-release.mjs +1761 -0
- package/dist/lib/__integration__/TC-INT-008.spec.js +87 -8
- package/dist/lib/__integration__/TC-INT-008.spec.js.map +2 -2
- package/dist/lib/agentic-init.js +13 -3
- package/dist/lib/agentic-init.js.map +2 -2
- package/dist/lib/agentic-setup.js +418 -186
- package/dist/lib/agentic-setup.js.map +2 -2
- package/dist/lib/generators/extensions/injection-widgets.js +20 -0
- package/dist/lib/generators/extensions/injection-widgets.js.map +2 -2
- package/dist/lib/generators/module-facts-discovery.js +41 -7
- package/dist/lib/generators/module-facts-discovery.js.map +2 -2
- package/dist/lib/generators/module-facts.js +65 -17
- package/dist/lib/generators/module-facts.js.map +2 -2
- package/dist/lib/generators/module-registry.js +5 -4
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/dist/lib/resolver.js +2 -0
- package/dist/lib/resolver.js.map +2 -2
- package/package.json +5 -5
- package/src/lib/__integration__/TC-INT-008.spec.ts +103 -8
- package/src/lib/__tests__/agentic-init.test.ts +41 -5
- package/src/lib/__tests__/agentic-setup.ownership.test.ts +380 -0
- package/src/lib/__tests__/injection-widget-id-validation.test.ts +184 -0
- package/src/lib/agentic-init.ts +15 -3
- package/src/lib/agentic-setup.ts +526 -224
- package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +6 -0
- package/src/lib/generators/__tests__/module-facts.customers.fixture.test.ts +1 -0
- package/src/lib/generators/__tests__/module-facts.discovery.test.ts +54 -10
- package/src/lib/generators/__tests__/module-facts.extension-hosts.test.ts +108 -0
- package/src/lib/generators/__tests__/module-subset.test.ts +18 -0
- package/src/lib/generators/extensions/injection-widgets.ts +51 -0
- package/src/lib/generators/module-facts-discovery.ts +58 -7
- package/src/lib/generators/module-facts.ts +84 -20
- package/src/lib/generators/module-registry.ts +8 -4
- package/src/lib/resolver.ts +3 -0
- package/dist/agentic/guides/cache.md +0 -45
- package/dist/agentic/guides/core.md +0 -453
- package/dist/agentic/guides/events.md +0 -117
- package/dist/agentic/guides/queue.md +0 -53
- package/dist/agentic/guides/search.md +0 -115
- package/dist/agentic/guides/shared.md +0 -108
- package/dist/agentic/guides/ui.md +0 -347
- package/dist/agentic/shared/ai/skills/om-auto-continue-pr-loop/SKILL.md +0 -27
- package/dist/agentic/shared/ai/skills/om-auto-create-pr-loop/SKILL.md +0 -27
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/ui-components.md +0 -260
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/mikro-orm-cheatsheet.md +0 -146
- package/dist/agentic/shared/ai/skills/om-help/references/skills-catalog.md +0 -84
- package/dist/agentic/shared/ai/skills/om-help/references/workflow-sequences.md +0 -193
- package/dist/agentic/shared/ai/skills/om-integration-builder/STANDALONE.md +0 -34
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/adapter-contracts.md +0 -762
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/naming-conventions.md +0 -50
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/navigation-patterns.md +0 -97
- package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-contracts.md +0 -271
- 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
|
-
"
|
|
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-
|
|
49
|
+
"om-auto-continue-pr-loop",
|
|
14
50
|
"om-auto-review-pr",
|
|
15
|
-
"om-
|
|
16
|
-
"om-
|
|
17
|
-
"om-
|
|
18
|
-
"om-
|
|
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-
|
|
56
|
+
"om-verify-in-repo",
|
|
21
57
|
"om-root-cause",
|
|
22
|
-
"om-
|
|
23
|
-
"om-
|
|
24
|
-
"om-
|
|
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
|
|
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": "
|
|
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
|
|
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
|
|
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
|
-
"
|
|
17
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
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
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
"
|
|
80
|
-
|
|
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
|
+
})
|