@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17
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/README.md +21 -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 +1462 -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 +882 -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 +64 -9
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local issue CLI — `aiwg issue <subcommand>`
|
|
3
|
+
*
|
|
4
|
+
* This command operates on local issue storage under `.aiwg/issues/`. It can
|
|
5
|
+
* also import/export snapshots and opt into live Gitea/GitHub API sync for
|
|
6
|
+
* local issue migration workflows.
|
|
7
|
+
*
|
|
8
|
+
* @issue #1462
|
|
9
|
+
*/
|
|
10
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
11
|
+
import { LocalIssueProviderCore, buildExternalIssueSnapshotFromLocal, buildLocalIssueConflictReport, createLiveIssueClient, localIssueRoot, parseCommentIdMappings, parseExternalIssueSnapshot, } from './index.js';
|
|
12
|
+
export async function main(args, cwd = process.cwd()) {
|
|
13
|
+
const parsed = parseArgs(args);
|
|
14
|
+
const subcommand = parsed.positional[0];
|
|
15
|
+
const rest = parsed.positional.slice(1);
|
|
16
|
+
if (parsed.flags.has('backend')) {
|
|
17
|
+
throw new Error('aiwg issue commands use the local issue provider; --backend is not supported');
|
|
18
|
+
}
|
|
19
|
+
const provider = stringFlag(parsed, 'provider');
|
|
20
|
+
if (provider && provider !== 'local') {
|
|
21
|
+
throw new Error(`aiwg issue is for local issue storage only; configured external trackers use their tracker tools (${provider})`);
|
|
22
|
+
}
|
|
23
|
+
const issues = new LocalIssueProviderCore(localIssueRoot(cwd));
|
|
24
|
+
switch (subcommand) {
|
|
25
|
+
case 'init':
|
|
26
|
+
await handleInit(issues, parsed);
|
|
27
|
+
return;
|
|
28
|
+
case 'new':
|
|
29
|
+
case 'create':
|
|
30
|
+
await handleNew(issues, parsed);
|
|
31
|
+
return;
|
|
32
|
+
case 'list':
|
|
33
|
+
case 'ls':
|
|
34
|
+
await handleList(issues, parsed);
|
|
35
|
+
return;
|
|
36
|
+
case 'show':
|
|
37
|
+
await handleShow(issues, rest, parsed);
|
|
38
|
+
return;
|
|
39
|
+
case 'import':
|
|
40
|
+
await handleImport(issues, parsed);
|
|
41
|
+
return;
|
|
42
|
+
case 'export':
|
|
43
|
+
await handleExport(issues, rest, parsed);
|
|
44
|
+
return;
|
|
45
|
+
case 'sync':
|
|
46
|
+
await handleSync(issues, rest, parsed);
|
|
47
|
+
return;
|
|
48
|
+
case 'comment':
|
|
49
|
+
await handleComment(issues, rest, parsed);
|
|
50
|
+
return;
|
|
51
|
+
case 'close':
|
|
52
|
+
await handleClose(issues, rest, parsed);
|
|
53
|
+
return;
|
|
54
|
+
case 'index':
|
|
55
|
+
await handleIndex(issues, rest, parsed);
|
|
56
|
+
return;
|
|
57
|
+
default:
|
|
58
|
+
printUsage();
|
|
59
|
+
if (subcommand)
|
|
60
|
+
throw new Error(`Unknown issue subcommand: ${subcommand}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function handleInit(issues, args) {
|
|
64
|
+
const padding = stringFlag(args, 'padding');
|
|
65
|
+
const config = await issues.init({
|
|
66
|
+
prefix: stringFlag(args, 'prefix'),
|
|
67
|
+
padding: padding ? Number.parseInt(padding, 10) : undefined,
|
|
68
|
+
});
|
|
69
|
+
printJsonOrText(args, config, `Initialized local issues with prefix ${config.issue_key.prefix}`);
|
|
70
|
+
}
|
|
71
|
+
async function handleNew(issues, args) {
|
|
72
|
+
const title = stringFlag(args, 'title') ?? args.positional[1];
|
|
73
|
+
if (!title)
|
|
74
|
+
throw new Error('Usage: aiwg issue new --title <title> [--body <text>|--body-file <path>]');
|
|
75
|
+
const body = await readBody(args);
|
|
76
|
+
const issue = await issues.createIssue({
|
|
77
|
+
title,
|
|
78
|
+
body,
|
|
79
|
+
type: stringFlag(args, 'type'),
|
|
80
|
+
priority: stringFlag(args, 'priority'),
|
|
81
|
+
labels: csvFlag(args, 'label'),
|
|
82
|
+
assignees: csvFlag(args, 'assignee'),
|
|
83
|
+
author: stringFlag(args, 'author'),
|
|
84
|
+
});
|
|
85
|
+
printJsonOrText(args, issue, `Created ${issue.fields.id}: ${issue.fields.title}`);
|
|
86
|
+
}
|
|
87
|
+
async function handleList(issues, args) {
|
|
88
|
+
const limit = stringFlag(args, 'limit');
|
|
89
|
+
const result = await issues.listIssues({
|
|
90
|
+
limit: limit ? Number.parseInt(limit, 10) : undefined,
|
|
91
|
+
cursor: stringFlag(args, 'cursor'),
|
|
92
|
+
filter: {
|
|
93
|
+
status: stringFlag(args, 'status'),
|
|
94
|
+
labels: csvFlag(args, 'label'),
|
|
95
|
+
type: stringFlag(args, 'type'),
|
|
96
|
+
priority: stringFlag(args, 'priority'),
|
|
97
|
+
assignee: stringFlag(args, 'assignee'),
|
|
98
|
+
search: stringFlag(args, 'search'),
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
if (args.flags.has('json')) {
|
|
102
|
+
console.log(JSON.stringify(result, null, 2));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
for (const issue of result.issues) {
|
|
106
|
+
console.log(`${issue.id}\t${issue.status}\t${issue.priority}\t${issue.title}`);
|
|
107
|
+
}
|
|
108
|
+
if (result.nextCursor)
|
|
109
|
+
console.log(`next cursor: ${result.nextCursor}`);
|
|
110
|
+
}
|
|
111
|
+
async function handleShow(issues, rest, args) {
|
|
112
|
+
const id = rest[0];
|
|
113
|
+
if (!id)
|
|
114
|
+
throw new Error('Usage: aiwg issue show <id> [--comments last:10|all]');
|
|
115
|
+
const issue = await issues.getIssue(id, { comments: (stringFlag(args, 'comments') ?? 'all') });
|
|
116
|
+
if (args.flags.has('json')) {
|
|
117
|
+
console.log(JSON.stringify(issue, null, 2));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log(`# ${issue.fields.id}: ${issue.fields.title}`);
|
|
121
|
+
console.log(`status: ${issue.fields.status}`);
|
|
122
|
+
console.log(`priority: ${issue.fields.priority}`);
|
|
123
|
+
console.log(`labels: ${issue.fields.labels.join(', ') || '(none)'}`);
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log(issue.body);
|
|
126
|
+
if (issue.events.length > 0) {
|
|
127
|
+
console.log('\n## Events');
|
|
128
|
+
for (const event of issue.events) {
|
|
129
|
+
console.log(`- ${event.created_at} ${event.type} by ${event.author}${event.body ? `: ${event.body}` : ''}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function handleImport(issues, args) {
|
|
134
|
+
const from = stringFlag(args, "from");
|
|
135
|
+
if (from !== "gitea" && from !== "github")
|
|
136
|
+
throw new Error("Usage: aiwg issue import --from gitea|github (--snapshot-file path | --live --repo owner/name --external-id N)");
|
|
137
|
+
const snapshot = args.flags.has("live")
|
|
138
|
+
? await createLiveIssueClient({ provider: from, repo: requiredStringFlag(args, "repo"), apiUrl: stringFlag(args, "api-url") }).importIssue(requiredStringFlag(args, "external-id"))
|
|
139
|
+
: parseExternalIssueSnapshot(JSON.parse(await readRequiredFile(args, "snapshot-file")));
|
|
140
|
+
if (from !== snapshot.provider)
|
|
141
|
+
throw new Error(`snapshot provider ${snapshot.provider} does not match --from ${from}`);
|
|
142
|
+
const issue = await issues.importIssue({
|
|
143
|
+
provider: snapshot.provider,
|
|
144
|
+
external_id: snapshot.external_id,
|
|
145
|
+
external_url: snapshot.external_url,
|
|
146
|
+
title: snapshot.title,
|
|
147
|
+
body: snapshot.body,
|
|
148
|
+
status: snapshot.status,
|
|
149
|
+
labels: snapshot.labels,
|
|
150
|
+
created_at: snapshot.created_at,
|
|
151
|
+
updated_at: snapshot.updated_at,
|
|
152
|
+
comments: snapshot.comments,
|
|
153
|
+
});
|
|
154
|
+
printJsonOrText(args, issue, `Imported ${snapshot.provider}#${snapshot.external_id} as ${issue.fields.id}`);
|
|
155
|
+
}
|
|
156
|
+
async function handleExport(issues, rest, args) {
|
|
157
|
+
const id = rest[0];
|
|
158
|
+
if (!id)
|
|
159
|
+
throw new Error("Usage: aiwg issue export <id> --to gitea|github [--out path] [--live --repo owner/name]");
|
|
160
|
+
const provider = stringFlag(args, "to");
|
|
161
|
+
if (provider !== "gitea" && provider !== "github")
|
|
162
|
+
throw new Error("Usage: aiwg issue export <id> --to gitea|github [--out path] [--live --repo owner/name]");
|
|
163
|
+
const issue = await issues.getIssue(id, { body: true, comments: "all" });
|
|
164
|
+
const snapshot = buildExternalIssueSnapshotFromLocal(issue, provider);
|
|
165
|
+
if (!args.flags.has("live")) {
|
|
166
|
+
await writeOptionalOutput(args, snapshot);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const client = createLiveIssueClient({ provider, repo: requiredStringFlag(args, "repo"), apiUrl: stringFlag(args, "api-url") });
|
|
170
|
+
if (snapshot.external_id && !args.flags.has("force")) {
|
|
171
|
+
const remote = await client.fetchIssue(snapshot.external_id);
|
|
172
|
+
const report = buildLocalIssueConflictReport(issue, remote);
|
|
173
|
+
if (report.conflicts.length > 0) {
|
|
174
|
+
throw new Error(`Refusing live export with ${report.conflicts.length} unresolved conflict(s); run sync conflicts or pass --force after review`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const result = await client.exportIssue(snapshot);
|
|
178
|
+
await issues.updateIssueFields(id, {
|
|
179
|
+
source: { provider, external_id: result.snapshot.external_id, external_url: result.snapshot.external_url ?? null },
|
|
180
|
+
links: {
|
|
181
|
+
...issue.fields.links,
|
|
182
|
+
external: result.snapshot.external_url ? [...new Set([...issue.fields.links.external, result.snapshot.external_url])] : issue.fields.links.external,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
if (result.commentMappings.length > 0)
|
|
186
|
+
await issues.applyCommentIdMappings(id, result.commentMappings);
|
|
187
|
+
await writeOptionalOutput(args, result);
|
|
188
|
+
}
|
|
189
|
+
async function handleSync(issues, rest, args) {
|
|
190
|
+
const action = rest[0];
|
|
191
|
+
if (action === 'conflicts' || action === 'conflict-report') {
|
|
192
|
+
const id = rest[1];
|
|
193
|
+
if (!id)
|
|
194
|
+
throw new Error('Usage: aiwg issue sync conflicts <id> --snapshot-file path');
|
|
195
|
+
const issue = await issues.getIssue(id, { body: true, comments: 'all' });
|
|
196
|
+
const snapshot = parseExternalIssueSnapshot(JSON.parse(await readRequiredFile(args, 'snapshot-file')));
|
|
197
|
+
const report = buildLocalIssueConflictReport(issue, snapshot);
|
|
198
|
+
await writeOptionalOutput(args, report);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (action === 'map-comments') {
|
|
202
|
+
const id = rest[1];
|
|
203
|
+
if (!id)
|
|
204
|
+
throw new Error('Usage: aiwg issue sync map-comments <id> --map-file path');
|
|
205
|
+
const mappings = parseCommentIdMappings(JSON.parse(await readRequiredFile(args, 'map-file')));
|
|
206
|
+
const events = await issues.applyCommentIdMappings(id, mappings);
|
|
207
|
+
printJsonOrText(args, events, `Mapped ${mappings.length} external comment id(s) for ${id}`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
throw new Error('Usage: aiwg issue sync conflicts <id> --snapshot-file path | map-comments <id> --map-file path');
|
|
211
|
+
}
|
|
212
|
+
async function handleComment(issues, rest, args) {
|
|
213
|
+
const id = rest[0];
|
|
214
|
+
if (!id)
|
|
215
|
+
throw new Error('Usage: aiwg issue comment <id> --body <text>|--body-file <path>');
|
|
216
|
+
const body = await readBody(args);
|
|
217
|
+
const event = await issues.commentIssue(id, body, { author: stringFlag(args, 'author') });
|
|
218
|
+
printJsonOrText(args, event, `Commented on ${id}`);
|
|
219
|
+
}
|
|
220
|
+
async function handleClose(issues, rest, args) {
|
|
221
|
+
const id = rest[0];
|
|
222
|
+
if (!id)
|
|
223
|
+
throw new Error('Usage: aiwg issue close <id> [--reason <text>|--body-file <path>]');
|
|
224
|
+
const reason = stringFlag(args, 'reason') ?? stringFlag(args, 'body') ?? await optionalBodyFile(args);
|
|
225
|
+
const issue = await issues.closeIssue(id, { author: stringFlag(args, 'author'), reason });
|
|
226
|
+
printJsonOrText(args, issue, `Closed ${issue.fields.id}`);
|
|
227
|
+
}
|
|
228
|
+
async function handleIndex(issues, rest, args) {
|
|
229
|
+
if (rest[0] !== 'rebuild')
|
|
230
|
+
throw new Error('Usage: aiwg issue index rebuild');
|
|
231
|
+
const index = await issues.rebuildIssueIndex();
|
|
232
|
+
printJsonOrText(args, index, `Rebuilt local issue index (${index.issues.length} issues)`);
|
|
233
|
+
}
|
|
234
|
+
function requiredStringFlag(args, flag) {
|
|
235
|
+
const value = stringFlag(args, flag);
|
|
236
|
+
if (!value)
|
|
237
|
+
throw new Error(`Missing required --${flag}`);
|
|
238
|
+
return value;
|
|
239
|
+
}
|
|
240
|
+
async function readRequiredFile(args, flag) {
|
|
241
|
+
const file = stringFlag(args, flag);
|
|
242
|
+
if (!file)
|
|
243
|
+
throw new Error(`Missing required --${flag} path`);
|
|
244
|
+
return readFile(file, 'utf-8');
|
|
245
|
+
}
|
|
246
|
+
async function writeOptionalOutput(args, value) {
|
|
247
|
+
const out = stringFlag(args, 'out');
|
|
248
|
+
const rendered = JSON.stringify(value, null, 2) + '\n';
|
|
249
|
+
if (out) {
|
|
250
|
+
await writeFile(out, rendered, 'utf-8');
|
|
251
|
+
if (!args.flags.has('json'))
|
|
252
|
+
console.log(`Wrote ${out}`);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
console.log(rendered.trimEnd());
|
|
256
|
+
}
|
|
257
|
+
async function readBody(args) {
|
|
258
|
+
const body = stringFlag(args, 'body');
|
|
259
|
+
if (body !== undefined)
|
|
260
|
+
return body;
|
|
261
|
+
const bodyFile = stringFlag(args, 'body-file');
|
|
262
|
+
if (bodyFile)
|
|
263
|
+
return readFile(bodyFile, 'utf-8');
|
|
264
|
+
return '';
|
|
265
|
+
}
|
|
266
|
+
async function optionalBodyFile(args) {
|
|
267
|
+
const bodyFile = stringFlag(args, 'body-file');
|
|
268
|
+
return bodyFile ? readFile(bodyFile, 'utf-8') : undefined;
|
|
269
|
+
}
|
|
270
|
+
function printJsonOrText(args, value, text) {
|
|
271
|
+
if (args.flags.has('json')) {
|
|
272
|
+
console.log(JSON.stringify(value, null, 2));
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.log(text);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function parseArgs(args) {
|
|
279
|
+
const positional = [];
|
|
280
|
+
const flags = new Map();
|
|
281
|
+
for (let i = 0; i < args.length; i++) {
|
|
282
|
+
const arg = args[i];
|
|
283
|
+
if (!arg.startsWith('--')) {
|
|
284
|
+
positional.push(arg);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
const [rawKey, inline] = arg.slice(2).split(/=(.*)/s).filter((part) => part !== undefined);
|
|
288
|
+
if (inline !== undefined && inline !== '') {
|
|
289
|
+
flags.set(rawKey, inline);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const next = args[i + 1];
|
|
293
|
+
if (next && !next.startsWith('--')) {
|
|
294
|
+
flags.set(rawKey, next);
|
|
295
|
+
i++;
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
flags.set(rawKey, true);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return { positional, flags };
|
|
302
|
+
}
|
|
303
|
+
function stringFlag(args, name) {
|
|
304
|
+
const value = args.flags.get(name);
|
|
305
|
+
if (value === undefined || value === true)
|
|
306
|
+
return undefined;
|
|
307
|
+
return String(value);
|
|
308
|
+
}
|
|
309
|
+
function csvFlag(args, name) {
|
|
310
|
+
const value = stringFlag(args, name);
|
|
311
|
+
return value ? value.split(',').map((item) => item.trim()).filter(Boolean) : [];
|
|
312
|
+
}
|
|
313
|
+
function printUsage() {
|
|
314
|
+
console.log(`Usage:
|
|
315
|
+
aiwg issue init [--prefix KEY] [--padding N]
|
|
316
|
+
aiwg issue new --title "..." [--body "..."] [--body-file path]
|
|
317
|
+
aiwg issue list [--status open] [--label bug] [--search text] [--limit 20] [--json]
|
|
318
|
+
aiwg issue show <KEY> [--comments last:10|all]
|
|
319
|
+
aiwg issue import --from gitea|github --snapshot-file path [--json]
|
|
320
|
+
aiwg issue export <KEY> --to gitea|github [--out path]
|
|
321
|
+
aiwg issue sync conflicts <KEY> --snapshot-file path [--out path]
|
|
322
|
+
aiwg issue sync map-comments <KEY> --map-file path [--json]
|
|
323
|
+
aiwg issue comment <KEY> --body "..." [--author name]
|
|
324
|
+
aiwg issue close <KEY> [--reason "..."]
|
|
325
|
+
aiwg issue index rebuild`);
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
export class LiveIssueClient {
|
|
2
|
+
options;
|
|
3
|
+
baseUrl;
|
|
4
|
+
owner;
|
|
5
|
+
name;
|
|
6
|
+
fetchFn;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
const [owner, name] = options.repo.split('/');
|
|
10
|
+
if (!owner || !name || options.repo.split('/').length !== 2) {
|
|
11
|
+
throw new Error('--repo must be in owner/name form');
|
|
12
|
+
}
|
|
13
|
+
this.owner = owner;
|
|
14
|
+
this.name = name;
|
|
15
|
+
this.baseUrl = normalizeApiUrl(options.apiUrl ?? defaultApiUrl(options.provider));
|
|
16
|
+
this.fetchFn = options.fetchFn ?? fetch;
|
|
17
|
+
}
|
|
18
|
+
async fetchIssue(externalId) {
|
|
19
|
+
const issue = await this.request('GET', this.issuePath(externalId));
|
|
20
|
+
const comments = await this.fetchComments(externalId);
|
|
21
|
+
return normalizeIssue(this.options.provider, issue, comments);
|
|
22
|
+
}
|
|
23
|
+
async importIssue(externalId) {
|
|
24
|
+
return this.fetchIssue(externalId);
|
|
25
|
+
}
|
|
26
|
+
async exportIssue(snapshot) {
|
|
27
|
+
const hasExternalId = snapshot.external_id.length > 0;
|
|
28
|
+
const issue = hasExternalId
|
|
29
|
+
? await this.request('PATCH', this.issuePath(snapshot.external_id), issueMutationBody(this.options.provider, snapshot))
|
|
30
|
+
: await this.request('POST', this.issuesPath(), issueMutationBody(this.options.provider, snapshot));
|
|
31
|
+
const externalId = issueNumber(issue);
|
|
32
|
+
const commentMappings = [];
|
|
33
|
+
for (const comment of snapshot.comments) {
|
|
34
|
+
if (comment.external_id)
|
|
35
|
+
continue;
|
|
36
|
+
const posted = await this.request('POST', this.commentsPath(externalId), { body: comment.body });
|
|
37
|
+
const externalCommentId = requireId(posted.id, 'comment id');
|
|
38
|
+
commentMappings.push({ local_event_id: comment.local_event_id, external_comment_id: externalCommentId });
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
snapshot: await this.fetchIssue(externalId),
|
|
42
|
+
commentMappings,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async fetchComments(externalId) {
|
|
46
|
+
const comments = await this.request('GET', this.commentsPath(externalId));
|
|
47
|
+
return comments.map((comment) => normalizeComment(comment));
|
|
48
|
+
}
|
|
49
|
+
issuesPath() {
|
|
50
|
+
return `/repos/${encodeURIComponent(this.owner)}/${encodeURIComponent(this.name)}/issues`;
|
|
51
|
+
}
|
|
52
|
+
issuePath(externalId) {
|
|
53
|
+
return `${this.issuesPath()}/${encodeURIComponent(externalId)}`;
|
|
54
|
+
}
|
|
55
|
+
commentsPath(externalId) {
|
|
56
|
+
return `${this.issuePath(externalId)}/comments`;
|
|
57
|
+
}
|
|
58
|
+
async request(method, path, body) {
|
|
59
|
+
const headers = {
|
|
60
|
+
Accept: 'application/json',
|
|
61
|
+
};
|
|
62
|
+
if (body !== undefined)
|
|
63
|
+
headers['Content-Type'] = 'application/json';
|
|
64
|
+
if (this.options.token)
|
|
65
|
+
headers.Authorization = `Bearer ${this.options.token}`;
|
|
66
|
+
const response = await this.fetchFn(`${this.baseUrl}${path}`, {
|
|
67
|
+
method,
|
|
68
|
+
headers,
|
|
69
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
70
|
+
});
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
const text = await response.text().catch(() => '');
|
|
73
|
+
throw new Error(`${this.options.provider} issue API ${method} ${path} failed: ${response.status}${text ? ` ${redactSecrets(text)}` : ''}`);
|
|
74
|
+
}
|
|
75
|
+
return response.json();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function createLiveIssueClient(options) {
|
|
79
|
+
return new LiveIssueClient({
|
|
80
|
+
...options,
|
|
81
|
+
token: resolveToken(options.provider, options.tokenEnv ?? process.env),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export function resolveToken(provider, env) {
|
|
85
|
+
if (provider === 'gitea')
|
|
86
|
+
return env.AIWG_GITEA_TOKEN ?? env.GITEA_TOKEN;
|
|
87
|
+
return env.AIWG_GITHUB_TOKEN ?? env.GITHUB_TOKEN;
|
|
88
|
+
}
|
|
89
|
+
function defaultApiUrl(provider) {
|
|
90
|
+
if (provider === 'github')
|
|
91
|
+
return 'https://api.github.com';
|
|
92
|
+
return process.env.AIWG_GITEA_API_URL ?? process.env.GITEA_API_URL ?? 'https://git.integrolabs.net/api/v1';
|
|
93
|
+
}
|
|
94
|
+
function normalizeApiUrl(value) {
|
|
95
|
+
return value.replace(/\/+$/, '');
|
|
96
|
+
}
|
|
97
|
+
function issueMutationBody(provider, snapshot) {
|
|
98
|
+
const body = {
|
|
99
|
+
title: snapshot.title,
|
|
100
|
+
body: snapshot.body,
|
|
101
|
+
labels: snapshot.labels,
|
|
102
|
+
};
|
|
103
|
+
if (snapshot.status === 'closed')
|
|
104
|
+
body.state = 'closed';
|
|
105
|
+
if (provider === 'gitea' && snapshot.status !== 'closed')
|
|
106
|
+
body.state = 'open';
|
|
107
|
+
return body;
|
|
108
|
+
}
|
|
109
|
+
function normalizeIssue(provider, issue, comments) {
|
|
110
|
+
const updatedAt = requireString(issue.updated_at, 'updated_at');
|
|
111
|
+
return {
|
|
112
|
+
provider,
|
|
113
|
+
external_id: issueNumber(issue),
|
|
114
|
+
external_url: issue.html_url ?? null,
|
|
115
|
+
title: requireString(issue.title, 'title'),
|
|
116
|
+
body: issue.body ?? '',
|
|
117
|
+
status: issue.state === 'closed' ? 'closed' : 'open',
|
|
118
|
+
labels: normalizeLabels(issue.labels ?? []),
|
|
119
|
+
created_at: issue.created_at,
|
|
120
|
+
updated_at: updatedAt,
|
|
121
|
+
comments,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function normalizeComment(comment) {
|
|
125
|
+
return {
|
|
126
|
+
external_id: requireId(comment.id, 'comment id'),
|
|
127
|
+
author: comment.user?.login ?? comment.user?.username ?? comment.poster?.login ?? comment.poster?.username ?? 'unknown',
|
|
128
|
+
body: comment.body ?? '',
|
|
129
|
+
created_at: requireString(comment.created_at, 'comment created_at'),
|
|
130
|
+
updated_at: comment.updated_at,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function normalizeLabels(labels) {
|
|
134
|
+
return labels.map((label) => typeof label === 'string' ? label : label.name).filter((label) => Boolean(label));
|
|
135
|
+
}
|
|
136
|
+
function issueNumber(issue) {
|
|
137
|
+
return requireId(issue.number ?? issue.index ?? issue.id, 'issue number');
|
|
138
|
+
}
|
|
139
|
+
function requireId(value, field) {
|
|
140
|
+
if (typeof value === 'number')
|
|
141
|
+
return String(value);
|
|
142
|
+
if (typeof value === 'string' && value.length > 0)
|
|
143
|
+
return value;
|
|
144
|
+
throw new Error(`live issue response missing ${field}`);
|
|
145
|
+
}
|
|
146
|
+
function requireString(value, field) {
|
|
147
|
+
if (typeof value === 'string')
|
|
148
|
+
return value;
|
|
149
|
+
throw new Error(`live issue response missing ${field}`);
|
|
150
|
+
}
|
|
151
|
+
function redactSecrets(value) {
|
|
152
|
+
return value.replace(/(token|authorization|password|secret)["':=\s]+[^\s"',}]+/gi, '$1=[REDACTED]');
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=live.js.map
|