@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
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/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScreenReader — PTY screen state parser for Orchestrator-over-PTY
|
|
3
|
+
*
|
|
4
|
+
* Parses raw PTY byte streams into structured, LLM-readable screen state.
|
|
5
|
+
* Uses @xterm/headless as the VT100/ANSI state machine so all escape
|
|
6
|
+
* sequences (colour, cursor movement, clear-screen, etc.) are handled
|
|
7
|
+
* correctly without a DOM.
|
|
8
|
+
*
|
|
9
|
+
* @issue #754
|
|
10
|
+
* @see src/serve/pty-bridge.ts — PTY WebSocket bridge
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
import { createRequire } from 'module';
|
|
14
|
+
// @xterm/headless is an optional dependency. Load it once at module level
|
|
15
|
+
// using createRequire so we can import the CJS bundle from ESM.
|
|
16
|
+
const _require = createRequire(import.meta.url);
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
let XtermTerminal;
|
|
19
|
+
try {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
const xterm = _require('@xterm/headless');
|
|
22
|
+
XtermTerminal = xterm.Terminal;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Will be checked at construction time
|
|
26
|
+
}
|
|
27
|
+
// ============================================================
|
|
28
|
+
// Prompt detection patterns
|
|
29
|
+
// ============================================================
|
|
30
|
+
/** Patterns that indicate the terminal is waiting for input. */
|
|
31
|
+
const PROMPT_PATTERNS = [
|
|
32
|
+
/[$#>%]\s*$/, // bash/zsh/sh: ends with $ # > %
|
|
33
|
+
/^\s*\?\s+/, // inquirer: starts with ?
|
|
34
|
+
/\[y\/n\]/i, // yes/no confirmation
|
|
35
|
+
/\[y\/N\]/, // yes/no (default No)
|
|
36
|
+
/\[Y\/n\]/, // yes/no (default Yes)
|
|
37
|
+
/\(yes\/no\)/i, // SSH-style yes/no
|
|
38
|
+
/\(y\/n\)/i, // generic y/n
|
|
39
|
+
];
|
|
40
|
+
// ============================================================
|
|
41
|
+
// ScreenReader
|
|
42
|
+
// ============================================================
|
|
43
|
+
export class ScreenReader {
|
|
44
|
+
terminal;
|
|
45
|
+
_rows;
|
|
46
|
+
_cols;
|
|
47
|
+
emitter;
|
|
48
|
+
disposed = false;
|
|
49
|
+
constructor(opts) {
|
|
50
|
+
if (!XtermTerminal) {
|
|
51
|
+
throw new Error('@xterm/headless is required for ScreenReader. Install it: npm install @xterm/headless');
|
|
52
|
+
}
|
|
53
|
+
this._rows = opts?.rows ?? 24;
|
|
54
|
+
this._cols = opts?.cols ?? 80;
|
|
55
|
+
this.emitter = new EventEmitter();
|
|
56
|
+
// Suppress Node.js MaxListenersExceededWarning for tests with many awaitChange calls
|
|
57
|
+
this.emitter.setMaxListeners(100);
|
|
58
|
+
this.terminal = new XtermTerminal({
|
|
59
|
+
rows: this._rows,
|
|
60
|
+
cols: this._cols,
|
|
61
|
+
allowProposedApi: true,
|
|
62
|
+
scrollback: 1000,
|
|
63
|
+
logLevel: 'error',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Feed raw PTY data into the parser */
|
|
67
|
+
write(data) {
|
|
68
|
+
if (this.disposed)
|
|
69
|
+
return;
|
|
70
|
+
const coreWriteSync = this.terminal._core?.writeSync;
|
|
71
|
+
if (coreWriteSync) {
|
|
72
|
+
coreWriteSync.call(this.terminal._core, data);
|
|
73
|
+
this.emitter.emit('change');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.terminal.write(data, () => {
|
|
77
|
+
// Fired after xterm has processed the write through its state machine
|
|
78
|
+
this.emitter.emit('change');
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** Get current parsed screen state */
|
|
82
|
+
getState() {
|
|
83
|
+
const buf = this.terminal.buffer.active;
|
|
84
|
+
const viewportRows = this.terminal.rows;
|
|
85
|
+
const viewportCols = this.terminal.cols;
|
|
86
|
+
// ---- visible text grid ----
|
|
87
|
+
const text = [];
|
|
88
|
+
for (let r = 0; r < viewportRows; r++) {
|
|
89
|
+
const line = buf.getLine(buf.viewportY + r);
|
|
90
|
+
if (!line) {
|
|
91
|
+
text.push(Array(viewportCols).fill(''));
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const row = [];
|
|
95
|
+
for (let c = 0; c < viewportCols; c++) {
|
|
96
|
+
const cell = line.getCell(c);
|
|
97
|
+
row.push(cell?.getChars() ?? '');
|
|
98
|
+
}
|
|
99
|
+
text.push(row);
|
|
100
|
+
}
|
|
101
|
+
// ---- cursor ----
|
|
102
|
+
const cursor = {
|
|
103
|
+
row: buf.cursorY,
|
|
104
|
+
col: buf.cursorX,
|
|
105
|
+
};
|
|
106
|
+
// ---- scrollback ----
|
|
107
|
+
// baseY is the line index of the first viewport row in the full buffer.
|
|
108
|
+
// Lines 0..(baseY-1) are scrollback content.
|
|
109
|
+
const scrollback = [];
|
|
110
|
+
const scrollbackStart = Math.max(0, buf.baseY - 50); // keep last 50 scrollback lines
|
|
111
|
+
for (let r = scrollbackStart; r < buf.baseY; r++) {
|
|
112
|
+
const line = buf.getLine(r);
|
|
113
|
+
if (line) {
|
|
114
|
+
const lineStr = line.translateToString(true);
|
|
115
|
+
scrollback.push(lineStr);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ---- summary ----
|
|
119
|
+
const summary = buildSummary(text);
|
|
120
|
+
// ---- prompt detection ----
|
|
121
|
+
const { prompt_detected, prompt_text } = detectPrompt(text, cursor);
|
|
122
|
+
return { text, cursor, scrollback, summary, prompt_detected, prompt_text };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Wait for the next screen change, with timeout.
|
|
126
|
+
* Resolves with updated ScreenState when write() causes a change,
|
|
127
|
+
* or with the current state if the timeout elapses first.
|
|
128
|
+
*/
|
|
129
|
+
awaitChange(opts) {
|
|
130
|
+
const timeoutMs = opts?.timeout ?? 5000;
|
|
131
|
+
return new Promise((resolve) => {
|
|
132
|
+
if (this.disposed) {
|
|
133
|
+
resolve(this.getState());
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
let timer = null;
|
|
137
|
+
const handler = () => {
|
|
138
|
+
if (timer)
|
|
139
|
+
clearTimeout(timer);
|
|
140
|
+
resolve(this.getState());
|
|
141
|
+
};
|
|
142
|
+
this.emitter.once('change', handler);
|
|
143
|
+
timer = setTimeout(() => {
|
|
144
|
+
this.emitter.removeListener('change', handler);
|
|
145
|
+
resolve(this.getState());
|
|
146
|
+
}, timeoutMs);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Flush all pending writes through xterm's internal write queue.
|
|
151
|
+
* Enqueues an empty write and resolves when its callback fires, which
|
|
152
|
+
* guarantees all previously queued writes have been processed.
|
|
153
|
+
*/
|
|
154
|
+
flush() {
|
|
155
|
+
return new Promise((resolve) => {
|
|
156
|
+
if (this.disposed) {
|
|
157
|
+
resolve();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.terminal.write('', () => resolve());
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/** Get human-readable summary of visible screen */
|
|
164
|
+
getSummary() {
|
|
165
|
+
return buildSummary(this.getState().text);
|
|
166
|
+
}
|
|
167
|
+
/** Clean up resources */
|
|
168
|
+
dispose() {
|
|
169
|
+
if (this.disposed)
|
|
170
|
+
return;
|
|
171
|
+
this.disposed = true;
|
|
172
|
+
this.emitter.removeAllListeners();
|
|
173
|
+
try {
|
|
174
|
+
this.terminal.dispose();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// ignore errors during cleanup
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ============================================================
|
|
182
|
+
// Helpers
|
|
183
|
+
// ============================================================
|
|
184
|
+
/**
|
|
185
|
+
* Build a human-readable summary from the visible text grid.
|
|
186
|
+
* Trailing rows that are entirely empty are stripped.
|
|
187
|
+
*/
|
|
188
|
+
function buildSummary(text) {
|
|
189
|
+
const lines = text.map((row) => row.join('').trimEnd());
|
|
190
|
+
// Remove trailing blank lines
|
|
191
|
+
let lastNonEmpty = lines.length - 1;
|
|
192
|
+
while (lastNonEmpty >= 0 && lines[lastNonEmpty].trim() === '') {
|
|
193
|
+
lastNonEmpty--;
|
|
194
|
+
}
|
|
195
|
+
return lines.slice(0, lastNonEmpty + 1).join('\n');
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Heuristic prompt detection.
|
|
199
|
+
* Examines the last non-empty visible line and the line at cursor position.
|
|
200
|
+
*/
|
|
201
|
+
function detectPrompt(text, cursor) {
|
|
202
|
+
// Gather candidate lines: the cursor row and the last non-empty row
|
|
203
|
+
const candidates = [];
|
|
204
|
+
// Line where cursor currently sits
|
|
205
|
+
if (cursor.row >= 0 && cursor.row < text.length) {
|
|
206
|
+
const cursorLine = text[cursor.row].join('').trimEnd();
|
|
207
|
+
if (cursorLine)
|
|
208
|
+
candidates.push(cursorLine);
|
|
209
|
+
}
|
|
210
|
+
// Last non-empty visible line
|
|
211
|
+
for (let r = text.length - 1; r >= 0; r--) {
|
|
212
|
+
const line = text[r].join('').trimEnd();
|
|
213
|
+
if (line) {
|
|
214
|
+
if (!candidates.includes(line))
|
|
215
|
+
candidates.push(line);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const line of candidates) {
|
|
220
|
+
for (const pattern of PROMPT_PATTERNS) {
|
|
221
|
+
if (pattern.test(line)) {
|
|
222
|
+
return { prompt_detected: true, prompt_text: line };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { prompt_detected: false };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=screen-reader.js.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-stack executor adapters (#1546).
|
|
3
|
+
*
|
|
4
|
+
* A Mission conductor (mission-conductor.ts) fans worker cycles out across
|
|
5
|
+
* *heterogeneous* agentic stacks. Each stack advertises itself on the existing
|
|
6
|
+
* executor registry via a `runtime:<name>` capability — the convention proven
|
|
7
|
+
* in slice 1 (see test/unit/serve/agent-router.test.ts "cross-stack Mission
|
|
8
|
+
* dispatch"). A StackAdapter is the conductor-side description of how a worker
|
|
9
|
+
* cycle maps onto that stack's NATIVE long-running primitive, plus the runtime
|
|
10
|
+
* capability token the conductor filters on — so the conductor dispatches and
|
|
11
|
+
* captures results uniformly regardless of which stack runs the worker.
|
|
12
|
+
*
|
|
13
|
+
* The adapter does NOT run the worker. The registered executor on that stack
|
|
14
|
+
* runs it via `aiwg serve`'s dispatch transport (dispatch-router + the WS event
|
|
15
|
+
* stream). The adapter keeps the conductor stack-agnostic: it owns only the
|
|
16
|
+
* `runtime:<name>` token and the native-primitive description.
|
|
17
|
+
*
|
|
18
|
+
* @implements #1546
|
|
19
|
+
*/
|
|
20
|
+
function makeAdapter(runtime, primitive) {
|
|
21
|
+
const runtimeCapability = `runtime:${runtime}`;
|
|
22
|
+
return {
|
|
23
|
+
runtime,
|
|
24
|
+
runtimeCapability,
|
|
25
|
+
primitive,
|
|
26
|
+
invoke(prompt) {
|
|
27
|
+
// prompt is carried by the dispatch payload; the descriptor records the
|
|
28
|
+
// mechanism so the conductor's ledger is identical-shape across stacks.
|
|
29
|
+
const trimmed = prompt.length > 60 ? `${prompt.slice(0, 57)}...` : prompt;
|
|
30
|
+
return {
|
|
31
|
+
runtimeCapability,
|
|
32
|
+
primitive,
|
|
33
|
+
describe: `dispatch worker to ${runtime} executor via ${primitive} (${trimmed})`,
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Codex executor adapter — a dispatched worker drives Codex `/goal` (or `/aiwg-mission`, #1544). */
|
|
39
|
+
export const codexAdapter = makeAdapter('codex', '/goal');
|
|
40
|
+
/** Claude Code executor adapter — a dispatched worker drives the Workflow tool / subagents. */
|
|
41
|
+
export const claudeCodeAdapter = makeAdapter('claude-code', 'workflow-tool');
|
|
42
|
+
/** Built-in adapters for the two stacks the cross-stack proof exercises. */
|
|
43
|
+
export const BUILTIN_STACK_ADAPTERS = [codexAdapter, claudeCodeAdapter];
|
|
44
|
+
/**
|
|
45
|
+
* Registry of per-stack adapters. Operators can register additional stacks
|
|
46
|
+
* (the `runtime:<name>` convention is open-ended); a Mission can then dispatch
|
|
47
|
+
* workers to any registered runtime.
|
|
48
|
+
*/
|
|
49
|
+
export class StackAdapterRegistry {
|
|
50
|
+
byRuntime = new Map();
|
|
51
|
+
constructor(adapters = BUILTIN_STACK_ADAPTERS) {
|
|
52
|
+
for (const a of adapters)
|
|
53
|
+
this.byRuntime.set(a.runtime, a);
|
|
54
|
+
}
|
|
55
|
+
register(adapter) {
|
|
56
|
+
this.byRuntime.set(adapter.runtime, adapter);
|
|
57
|
+
}
|
|
58
|
+
get(runtime) {
|
|
59
|
+
return this.byRuntime.get(runtime);
|
|
60
|
+
}
|
|
61
|
+
has(runtime) {
|
|
62
|
+
return this.byRuntime.has(runtime);
|
|
63
|
+
}
|
|
64
|
+
runtimes() {
|
|
65
|
+
return [...this.byRuntime.keys()];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=stack-adapters.js.map
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Event Schema and In-Memory Store
|
|
3
|
+
*
|
|
4
|
+
* Defines the canonical event types emitted by the agent loop, MC conductor,
|
|
5
|
+
* and ralph launcher. Events are stored in-memory per session and forwarded
|
|
6
|
+
* to the browser via WebSocket push. Persisted to fortemi-react IndexedDB
|
|
7
|
+
* on the browser side (#717).
|
|
8
|
+
*
|
|
9
|
+
* Emission points:
|
|
10
|
+
* - src/cli/handlers/ralph-launcher.ts → iteration.*, gate.*, tokens.used
|
|
11
|
+
* - src/cli/handlers/mc.ts → session.*, mission.*, agent.*
|
|
12
|
+
*
|
|
13
|
+
* @issue #716
|
|
14
|
+
* @see #717 — fortemi-react storage layer (browser)
|
|
15
|
+
*/
|
|
16
|
+
// ============================================================
|
|
17
|
+
// In-Memory Event Store
|
|
18
|
+
// ============================================================
|
|
19
|
+
const MAX_EVENTS_PER_SESSION = 10_000;
|
|
20
|
+
export class TelemetryStore {
|
|
21
|
+
events = new Map();
|
|
22
|
+
listeners = new Set();
|
|
23
|
+
/** Ingest a new event */
|
|
24
|
+
ingest(event) {
|
|
25
|
+
const list = this.events.get(event.sessionId) ?? [];
|
|
26
|
+
list.push(event);
|
|
27
|
+
// Trim oldest events when exceeding limit
|
|
28
|
+
if (list.length > MAX_EVENTS_PER_SESSION) {
|
|
29
|
+
list.splice(0, list.length - MAX_EVENTS_PER_SESSION);
|
|
30
|
+
}
|
|
31
|
+
this.events.set(event.sessionId, list);
|
|
32
|
+
for (const listener of this.listeners) {
|
|
33
|
+
try {
|
|
34
|
+
listener(event);
|
|
35
|
+
}
|
|
36
|
+
catch { /* ignore listener errors */ }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Get all events for a session, optionally filtered by type */
|
|
40
|
+
query(sessionId, opts = {}) {
|
|
41
|
+
let events = this.events.get(sessionId) ?? [];
|
|
42
|
+
if (opts.types?.length) {
|
|
43
|
+
events = events.filter((e) => opts.types.includes(e.type));
|
|
44
|
+
}
|
|
45
|
+
if (opts.since) {
|
|
46
|
+
events = events.filter((e) => e.timestamp >= opts.since);
|
|
47
|
+
}
|
|
48
|
+
if (opts.limit) {
|
|
49
|
+
events = events.slice(-opts.limit);
|
|
50
|
+
}
|
|
51
|
+
return events;
|
|
52
|
+
}
|
|
53
|
+
/** Get aggregate metrics for a session */
|
|
54
|
+
metrics(sessionId) {
|
|
55
|
+
const events = this.events.get(sessionId) ?? [];
|
|
56
|
+
let totalInput = 0;
|
|
57
|
+
let totalOutput = 0;
|
|
58
|
+
const tokensByModel = {};
|
|
59
|
+
let iterations = 0;
|
|
60
|
+
let gatePasses = 0;
|
|
61
|
+
let gateFails = 0;
|
|
62
|
+
let scopeDone = 0;
|
|
63
|
+
let scopeTotal = 0;
|
|
64
|
+
let activeAgents = 0;
|
|
65
|
+
for (const e of events) {
|
|
66
|
+
if (e.type === 'tokens.used') {
|
|
67
|
+
const p = e.payload;
|
|
68
|
+
totalInput += p.input;
|
|
69
|
+
totalOutput += p.output;
|
|
70
|
+
const m = tokensByModel[p.model] ?? { input: 0, output: 0 };
|
|
71
|
+
m.input += p.input;
|
|
72
|
+
m.output += p.output;
|
|
73
|
+
tokensByModel[p.model] = m;
|
|
74
|
+
}
|
|
75
|
+
else if (e.type === 'iteration.complete') {
|
|
76
|
+
iterations++;
|
|
77
|
+
}
|
|
78
|
+
else if (e.type === 'gate.pass') {
|
|
79
|
+
gatePasses++;
|
|
80
|
+
}
|
|
81
|
+
else if (e.type === 'gate.fail') {
|
|
82
|
+
gateFails++;
|
|
83
|
+
}
|
|
84
|
+
else if (e.type === 'scope.unit.complete') {
|
|
85
|
+
const p = e.payload;
|
|
86
|
+
scopeDone = p.done;
|
|
87
|
+
scopeTotal = p.total;
|
|
88
|
+
}
|
|
89
|
+
else if (e.type === 'agent.spawn') {
|
|
90
|
+
activeAgents++;
|
|
91
|
+
}
|
|
92
|
+
else if (e.type === 'agent.complete') {
|
|
93
|
+
activeAgents = Math.max(0, activeAgents - 1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const passRate = gatePasses + gateFails > 0
|
|
97
|
+
? Math.round((gatePasses / (gatePasses + gateFails)) * 100)
|
|
98
|
+
: null;
|
|
99
|
+
return {
|
|
100
|
+
sessionId,
|
|
101
|
+
totalInputTokens: totalInput,
|
|
102
|
+
totalOutputTokens: totalOutput,
|
|
103
|
+
tokensByModel,
|
|
104
|
+
iterations,
|
|
105
|
+
gatePasses,
|
|
106
|
+
gateFails,
|
|
107
|
+
passRate,
|
|
108
|
+
scopeDone,
|
|
109
|
+
scopeTotal,
|
|
110
|
+
activeAgents,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/** Subscribe to new events (returns unsubscribe fn) */
|
|
114
|
+
subscribe(listener) {
|
|
115
|
+
this.listeners.add(listener);
|
|
116
|
+
return () => { this.listeners.delete(listener); };
|
|
117
|
+
}
|
|
118
|
+
/** Clear all events for a session */
|
|
119
|
+
clear(sessionId) {
|
|
120
|
+
this.events.delete(sessionId);
|
|
121
|
+
}
|
|
122
|
+
/** Get all known session IDs */
|
|
123
|
+
sessions() {
|
|
124
|
+
return [...this.events.keys()];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Singleton store
|
|
128
|
+
export const telemetryStore = new TelemetryStore();
|
|
129
|
+
// ============================================================
|
|
130
|
+
// Event Factory
|
|
131
|
+
// ============================================================
|
|
132
|
+
let eventCounter = 0;
|
|
133
|
+
export function createEvent(type, sessionId, payload, missionId) {
|
|
134
|
+
return {
|
|
135
|
+
id: `evt-${Date.now()}-${++eventCounter}`,
|
|
136
|
+
sessionId,
|
|
137
|
+
missionId,
|
|
138
|
+
timestamp: new Date().toISOString(),
|
|
139
|
+
type,
|
|
140
|
+
payload,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawHub Registry Adapter
|
|
3
|
+
*
|
|
4
|
+
* Connects to the ClawHub REST API at clawhub.ai for
|
|
5
|
+
* community skill discovery and publishing.
|
|
6
|
+
*
|
|
7
|
+
* Supports both the ClawHub web API and the `clawhub` CLI
|
|
8
|
+
* if installed. Falls back gracefully when neither is available.
|
|
9
|
+
*
|
|
10
|
+
* @implements #539
|
|
11
|
+
* @see https://clawhub.ai
|
|
12
|
+
* @see https://docs.openclaw.ai/tools/clawhub
|
|
13
|
+
*/
|
|
14
|
+
import { execSync } from 'child_process';
|
|
15
|
+
import fs from 'fs';
|
|
16
|
+
import path from 'path';
|
|
17
|
+
import { getProviderDefinition, resolveProviderPathValue, } from '../../providers/provider-definitions.js';
|
|
18
|
+
const CLAWHUB_API_BASE = 'https://clawhub.ai/api/v1';
|
|
19
|
+
function resolveSkillFallbackPath(target, projectDir, name) {
|
|
20
|
+
const definition = getProviderDefinition(target);
|
|
21
|
+
if (!definition)
|
|
22
|
+
return path.join(projectDir, `.${target}/skills`, name);
|
|
23
|
+
const basePath = definition.skillNamespace.pathType === 'home-dir'
|
|
24
|
+
? `~/${definition.skillNamespace.skillsBaseDir}`
|
|
25
|
+
: definition.skillNamespace.skillsBaseDir;
|
|
26
|
+
return path.join(resolveProviderPathValue(basePath, projectDir), name);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Attempt a ClawHub API request
|
|
30
|
+
*/
|
|
31
|
+
async function clawHubFetch(endpoint) {
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetch(`${CLAWHUB_API_BASE}${endpoint}`, {
|
|
34
|
+
headers: { 'Accept': 'application/json' },
|
|
35
|
+
signal: AbortSignal.timeout(10000),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok)
|
|
38
|
+
return null;
|
|
39
|
+
return await response.json();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Try clawhub CLI command
|
|
47
|
+
*/
|
|
48
|
+
function runClawHub(args) {
|
|
49
|
+
try {
|
|
50
|
+
return execSync(`clawhub ${args}`, {
|
|
51
|
+
encoding: 'utf-8',
|
|
52
|
+
timeout: 30000,
|
|
53
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
54
|
+
}).trim();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class ClawHubAdapter {
|
|
61
|
+
id = 'clawhub';
|
|
62
|
+
name = 'ClawHub Registry';
|
|
63
|
+
available = null;
|
|
64
|
+
async isAvailable() {
|
|
65
|
+
if (this.available !== null)
|
|
66
|
+
return this.available;
|
|
67
|
+
// Check CLI
|
|
68
|
+
const cliAvailable = runClawHub('--version 2>/dev/null') !== null;
|
|
69
|
+
if (cliAvailable) {
|
|
70
|
+
this.available = true;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
// Check API
|
|
74
|
+
const apiResult = await clawHubFetch('/health');
|
|
75
|
+
this.available = apiResult !== null;
|
|
76
|
+
return this.available;
|
|
77
|
+
}
|
|
78
|
+
async search(query) {
|
|
79
|
+
// Try API
|
|
80
|
+
const apiResult = await clawHubFetch(`/skills/search?q=${encodeURIComponent(query)}`);
|
|
81
|
+
if (apiResult && Array.isArray(apiResult.results)) {
|
|
82
|
+
return apiResult.results.map((s) => ({
|
|
83
|
+
name: s.name,
|
|
84
|
+
description: s.description || '',
|
|
85
|
+
source: 'clawhub',
|
|
86
|
+
package: s.package || s.author,
|
|
87
|
+
platforms: s.platforms || [],
|
|
88
|
+
installed: false,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
// Try CLI
|
|
92
|
+
const cliOutput = runClawHub(`search "${query}" --json 2>/dev/null`);
|
|
93
|
+
if (cliOutput) {
|
|
94
|
+
try {
|
|
95
|
+
const parsed = JSON.parse(cliOutput);
|
|
96
|
+
if (Array.isArray(parsed)) {
|
|
97
|
+
return parsed.map((s) => ({
|
|
98
|
+
name: s.name,
|
|
99
|
+
description: s.description || '',
|
|
100
|
+
source: 'clawhub',
|
|
101
|
+
package: s.package || s.author,
|
|
102
|
+
platforms: s.platforms || [],
|
|
103
|
+
installed: false,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Fall through
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
async info(name) {
|
|
114
|
+
// Try API
|
|
115
|
+
const apiResult = await clawHubFetch(`/skills/${encodeURIComponent(name)}`);
|
|
116
|
+
if (apiResult && apiResult.name) {
|
|
117
|
+
return {
|
|
118
|
+
name: apiResult.name,
|
|
119
|
+
description: apiResult.description || '',
|
|
120
|
+
source: 'clawhub',
|
|
121
|
+
package: apiResult.package || apiResult.author,
|
|
122
|
+
platforms: apiResult.platforms || [],
|
|
123
|
+
version: apiResult.version,
|
|
124
|
+
triggers: apiResult.triggers || [],
|
|
125
|
+
tools: apiResult.tools || [],
|
|
126
|
+
installed: false,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Try CLI
|
|
130
|
+
const cliOutput = runClawHub(`info "${name}" --json 2>/dev/null`);
|
|
131
|
+
if (cliOutput) {
|
|
132
|
+
try {
|
|
133
|
+
const parsed = JSON.parse(cliOutput);
|
|
134
|
+
return {
|
|
135
|
+
name: parsed.name || name,
|
|
136
|
+
description: parsed.description || '',
|
|
137
|
+
source: 'clawhub',
|
|
138
|
+
package: parsed.package || parsed.author,
|
|
139
|
+
platforms: parsed.platforms || [],
|
|
140
|
+
version: parsed.version,
|
|
141
|
+
triggers: parsed.triggers || [],
|
|
142
|
+
installed: false,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
async list() {
|
|
152
|
+
// Try API
|
|
153
|
+
const apiResult = await clawHubFetch('/skills?limit=200');
|
|
154
|
+
if (apiResult && Array.isArray(apiResult.results)) {
|
|
155
|
+
return apiResult.results.map((s) => ({
|
|
156
|
+
name: s.name,
|
|
157
|
+
description: s.description || '',
|
|
158
|
+
source: 'clawhub',
|
|
159
|
+
package: s.package || s.author,
|
|
160
|
+
platforms: s.platforms || [],
|
|
161
|
+
installed: false,
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
// Try CLI
|
|
165
|
+
const cliOutput = runClawHub('list --json 2>/dev/null');
|
|
166
|
+
if (cliOutput) {
|
|
167
|
+
try {
|
|
168
|
+
const parsed = JSON.parse(cliOutput);
|
|
169
|
+
if (Array.isArray(parsed)) {
|
|
170
|
+
return parsed.map((s) => ({
|
|
171
|
+
name: s.name,
|
|
172
|
+
description: s.description || '',
|
|
173
|
+
source: 'clawhub',
|
|
174
|
+
package: s.package || s.author,
|
|
175
|
+
platforms: s.platforms || [],
|
|
176
|
+
installed: false,
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Fall through
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
async install(name, options) {
|
|
187
|
+
const target = options.target || 'claude';
|
|
188
|
+
// Determine target directory
|
|
189
|
+
let targetDir;
|
|
190
|
+
try {
|
|
191
|
+
const { PlatformSkillResolver } = await import('../../smiths/skillsmith/platform-resolver.js');
|
|
192
|
+
targetDir = PlatformSkillResolver.getSkillPath(target, options.projectDir, name);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
targetDir = resolveSkillFallbackPath(target, options.projectDir, name);
|
|
196
|
+
}
|
|
197
|
+
// Try CLI install (downloads to a temp location, then we copy)
|
|
198
|
+
const cliResult = runClawHub(`install "${name}" --output "${targetDir}" 2>/dev/null`);
|
|
199
|
+
if (cliResult !== null)
|
|
200
|
+
return;
|
|
201
|
+
// Try API download
|
|
202
|
+
const apiResult = await clawHubFetch(`/skills/${encodeURIComponent(name)}/download`);
|
|
203
|
+
if (apiResult && apiResult.content) {
|
|
204
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
205
|
+
const skillMdPath = path.join(targetDir, 'SKILL.md');
|
|
206
|
+
fs.writeFileSync(skillMdPath, apiResult.content, 'utf-8');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
throw new Error(`Could not install '${name}' from ClawHub. ` +
|
|
210
|
+
`Ensure the skill exists at https://clawhub.ai and the API is accessible.`);
|
|
211
|
+
}
|
|
212
|
+
async publish(packageDir) {
|
|
213
|
+
// Ensure clawhub.json exists — generate from manifest.json if missing
|
|
214
|
+
const clawHubManifestPath = path.join(packageDir, 'clawhub.json');
|
|
215
|
+
if (!fs.existsSync(clawHubManifestPath)) {
|
|
216
|
+
const manifestPath = path.join(packageDir, 'manifest.json');
|
|
217
|
+
if (fs.existsSync(manifestPath)) {
|
|
218
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
219
|
+
const pkgJsonPath = path.resolve(packageDir, '..', '..', '..', '..', 'package.json');
|
|
220
|
+
let version = '0.0.0';
|
|
221
|
+
try {
|
|
222
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
|
|
223
|
+
version = pkg.version || version;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// Use default version
|
|
227
|
+
}
|
|
228
|
+
const clawHubManifest = {
|
|
229
|
+
name: manifest.name || path.basename(packageDir),
|
|
230
|
+
version,
|
|
231
|
+
description: manifest.description || '',
|
|
232
|
+
homepage: 'https://aiwg.io',
|
|
233
|
+
repository: 'https://github.com/jmagly/aiwg',
|
|
234
|
+
skills: './skills',
|
|
235
|
+
tags: manifest.tags || manifest.keywords || [],
|
|
236
|
+
license: 'MIT',
|
|
237
|
+
author: 'AIWG Contributors',
|
|
238
|
+
};
|
|
239
|
+
fs.writeFileSync(clawHubManifestPath, JSON.stringify(clawHubManifest, null, 2) + '\n', 'utf-8');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Try CLI publish
|
|
243
|
+
const cliResult = runClawHub(`publish "${packageDir}" 2>/dev/null`);
|
|
244
|
+
if (cliResult !== null)
|
|
245
|
+
return;
|
|
246
|
+
throw new Error('ClawHub publish requires the clawhub CLI. ' +
|
|
247
|
+
'Install it from https://docs.openclaw.ai/tools/clawhub');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=clawhub.js.map
|