@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,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Configuration Loader and Validator
|
|
3
|
+
*
|
|
4
|
+
* Reads `.aiwg/storage.config` (project-local), validates it against the
|
|
5
|
+
* v1 schema, and returns a typed `StorageConfig`. Absence of the file is
|
|
6
|
+
* a no-op: every subsystem defaults to `fs` rooted under `.aiwg/`.
|
|
7
|
+
*
|
|
8
|
+
* Validation is hand-rolled rather than schema-validator-driven to avoid
|
|
9
|
+
* adding an `ajv` dependency for a single file. The published JSON
|
|
10
|
+
* Schema (`.aiwg/architecture/schemas/storage.config.v1.json`) remains
|
|
11
|
+
* canonical for editor tooling and external consumers.
|
|
12
|
+
*
|
|
13
|
+
* @design @.aiwg/architecture/storage-design.md
|
|
14
|
+
* @issue #934
|
|
15
|
+
* @issue #953
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync } from 'fs';
|
|
18
|
+
import { readFile } from 'fs/promises';
|
|
19
|
+
import { resolve, isAbsolute, join } from 'path';
|
|
20
|
+
import { homedir } from 'os';
|
|
21
|
+
import { projectAiwgPath, resolveProjectAiwgDir } from '../config/project-artifacts.js';
|
|
22
|
+
import { BACKEND_TYPES, SUBSYSTEM_KEYS, } from './types.js';
|
|
23
|
+
/**
|
|
24
|
+
* Property names that must never appear at any nesting depth in
|
|
25
|
+
* `storage.config`. Defense-in-depth against credentials being written
|
|
26
|
+
* to disk. The published JSON Schema also enforces this; the recursive
|
|
27
|
+
* runtime walk below catches custom backend extensions that bypass the
|
|
28
|
+
* static `additionalProperties: false`.
|
|
29
|
+
*/
|
|
30
|
+
export const FORBIDDEN_CREDENTIAL_KEYS = [
|
|
31
|
+
'token',
|
|
32
|
+
'password',
|
|
33
|
+
'secret',
|
|
34
|
+
'apiKey',
|
|
35
|
+
'api_key',
|
|
36
|
+
'accessKey',
|
|
37
|
+
'accessKeyId',
|
|
38
|
+
'secretAccessKey',
|
|
39
|
+
];
|
|
40
|
+
const STORAGE_CONFIG_FILENAME = 'storage.config';
|
|
41
|
+
/** Default subsystem-to-relative-path mapping for the `fs` backend. */
|
|
42
|
+
export const DEFAULT_SUBSYSTEM_ROOTS = {
|
|
43
|
+
memory: 'memory',
|
|
44
|
+
reflections: 'reflections',
|
|
45
|
+
kb: 'kb',
|
|
46
|
+
activity_log: '.', // activity_log is a single file, not a directory
|
|
47
|
+
provenance: 'provenance',
|
|
48
|
+
research: 'research',
|
|
49
|
+
media: 'media',
|
|
50
|
+
sandbox_identity: 'sandbox-identity',
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Resolve the path where `.aiwg/storage.config` is expected for a given
|
|
54
|
+
* project root. Does not check existence.
|
|
55
|
+
*/
|
|
56
|
+
export function storageConfigPath(projectRoot) {
|
|
57
|
+
return projectAiwgPath(projectRoot, STORAGE_CONFIG_FILENAME);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load and validate `.aiwg/storage.config` from `projectRoot`.
|
|
61
|
+
*
|
|
62
|
+
* Returns `null` if the file is absent (caller falls back to defaults).
|
|
63
|
+
* Throws a descriptive error for malformed JSON, unsupported version,
|
|
64
|
+
* unknown subsystem keys, unknown backend types, or any credential-named
|
|
65
|
+
* property at any depth.
|
|
66
|
+
*/
|
|
67
|
+
export async function loadStorageConfig(projectRoot) {
|
|
68
|
+
const cfgPath = storageConfigPath(projectRoot);
|
|
69
|
+
if (!existsSync(cfgPath))
|
|
70
|
+
return null;
|
|
71
|
+
let raw;
|
|
72
|
+
try {
|
|
73
|
+
raw = await readFile(cfgPath, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
throw new Error(`Failed to read ${cfgPath}: ${err.message}`);
|
|
77
|
+
}
|
|
78
|
+
let parsed;
|
|
79
|
+
try {
|
|
80
|
+
parsed = JSON.parse(raw);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
throw new Error(`Invalid JSON in ${cfgPath}: ${err.message}`);
|
|
84
|
+
}
|
|
85
|
+
return validateStorageConfig(parsed, cfgPath);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate an already-parsed object as a `StorageConfig`. Exposed for
|
|
89
|
+
* use by `aiwg doctor` and tests.
|
|
90
|
+
*/
|
|
91
|
+
export function validateStorageConfig(parsed, source = '<input>') {
|
|
92
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
93
|
+
throw new Error(`${source}: storage config must be an object`);
|
|
94
|
+
}
|
|
95
|
+
const obj = parsed;
|
|
96
|
+
if (obj['version'] !== '1') {
|
|
97
|
+
throw new Error(`${source}: unsupported schema version ${JSON.stringify(obj['version'])} ` +
|
|
98
|
+
`(expected "1"). Update the AIWG CLI to read newer config versions.`);
|
|
99
|
+
}
|
|
100
|
+
walkRejectingCredentials(obj, source, 'storage');
|
|
101
|
+
const roots = validateRoots(obj['roots'], source);
|
|
102
|
+
const backends = validateBackends(obj['backends'], source);
|
|
103
|
+
let fallback;
|
|
104
|
+
if (obj['fallback'] !== undefined) {
|
|
105
|
+
if (obj['fallback'] !== 'cache_and_warn' && obj['fallback'] !== 'block') {
|
|
106
|
+
throw new Error(`${source}: storage.fallback must be "cache_and_warn" or "block" (got ${JSON.stringify(obj['fallback'])})`);
|
|
107
|
+
}
|
|
108
|
+
fallback = obj['fallback'];
|
|
109
|
+
}
|
|
110
|
+
const result = { version: '1' };
|
|
111
|
+
if (roots)
|
|
112
|
+
result.roots = roots;
|
|
113
|
+
if (backends)
|
|
114
|
+
result.backends = backends;
|
|
115
|
+
if (fallback)
|
|
116
|
+
result.fallback = fallback;
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
function validateRoots(raw, source) {
|
|
120
|
+
if (raw === undefined)
|
|
121
|
+
return undefined;
|
|
122
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
123
|
+
throw new Error(`${source}: storage.roots must be an object`);
|
|
124
|
+
}
|
|
125
|
+
const out = {};
|
|
126
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
127
|
+
if (!isSubsystemKey(k)) {
|
|
128
|
+
throw new Error(`${source}: roots.${k} is not a known subsystem. ` +
|
|
129
|
+
`Allowed: ${SUBSYSTEM_KEYS.join(', ')}`);
|
|
130
|
+
}
|
|
131
|
+
if (typeof v !== 'string' || v.length === 0) {
|
|
132
|
+
throw new Error(`${source}: roots.${k} must be a non-empty string path`);
|
|
133
|
+
}
|
|
134
|
+
out[k] = v;
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
function validateBackends(raw, source) {
|
|
139
|
+
if (raw === undefined)
|
|
140
|
+
return undefined;
|
|
141
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
142
|
+
throw new Error(`${source}: storage.backends must be an object`);
|
|
143
|
+
}
|
|
144
|
+
const out = {};
|
|
145
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
146
|
+
if (!isSubsystemKey(k)) {
|
|
147
|
+
throw new Error(`${source}: backends.${k} is not a known subsystem. ` +
|
|
148
|
+
`Allowed: ${SUBSYSTEM_KEYS.join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
out[k] = validateBackendConfig(v, `${source}: backends.${k}`);
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
function validateBackendConfig(raw, source) {
|
|
155
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
156
|
+
throw new Error(`${source} must be an object`);
|
|
157
|
+
}
|
|
158
|
+
const obj = raw;
|
|
159
|
+
const type = obj['type'];
|
|
160
|
+
if (typeof type !== 'string' || !BACKEND_TYPES.includes(type)) {
|
|
161
|
+
throw new Error(`${source}.type must be one of ${BACKEND_TYPES.join(', ')} (got ${JSON.stringify(type)})`);
|
|
162
|
+
}
|
|
163
|
+
// Per-backend required fields. Optional fields are passed through as-is
|
|
164
|
+
// — the adapter is responsible for any further validation it needs.
|
|
165
|
+
switch (type) {
|
|
166
|
+
case 'fs':
|
|
167
|
+
return { type: 'fs' };
|
|
168
|
+
case 'obsidian':
|
|
169
|
+
requireString(obj, 'vault', source);
|
|
170
|
+
return obj;
|
|
171
|
+
case 'logseq':
|
|
172
|
+
requireString(obj, 'graph', source);
|
|
173
|
+
return obj;
|
|
174
|
+
case 'notion': {
|
|
175
|
+
const parent = obj['parent'];
|
|
176
|
+
if (typeof parent !== 'object' || parent === null) {
|
|
177
|
+
throw new Error(`${source}.parent must be an object with pageId or databaseId`);
|
|
178
|
+
}
|
|
179
|
+
const p = parent;
|
|
180
|
+
const hasPage = typeof p['pageId'] === 'string' && p['pageId'].length > 0;
|
|
181
|
+
const hasDb = typeof p['databaseId'] === 'string' && p['databaseId'].length > 0;
|
|
182
|
+
if (hasPage === hasDb) {
|
|
183
|
+
throw new Error(`${source}.parent must specify exactly one of pageId or databaseId`);
|
|
184
|
+
}
|
|
185
|
+
return obj;
|
|
186
|
+
}
|
|
187
|
+
case 'anythingllm':
|
|
188
|
+
requireString(obj, 'baseUrl', source);
|
|
189
|
+
requireString(obj, 'workspace', source);
|
|
190
|
+
return obj;
|
|
191
|
+
case 'fortemi':
|
|
192
|
+
return obj;
|
|
193
|
+
case 's3':
|
|
194
|
+
requireString(obj, 'bucket', source);
|
|
195
|
+
return obj;
|
|
196
|
+
case 'webdav':
|
|
197
|
+
requireString(obj, 'url', source);
|
|
198
|
+
return obj;
|
|
199
|
+
default:
|
|
200
|
+
throw new Error(`${source}: unhandled backend type ${type}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function requireString(obj, key, source) {
|
|
204
|
+
const v = obj[key];
|
|
205
|
+
if (typeof v !== 'string' || v.length === 0) {
|
|
206
|
+
throw new Error(`${source}.${key} must be a non-empty string`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function isSubsystemKey(k) {
|
|
210
|
+
return SUBSYSTEM_KEYS.includes(k);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Recursively reject any property whose name appears in
|
|
214
|
+
* FORBIDDEN_CREDENTIAL_KEYS. Throws on first hit with the full path.
|
|
215
|
+
*/
|
|
216
|
+
export function walkRejectingCredentials(value, source, path) {
|
|
217
|
+
if (Array.isArray(value)) {
|
|
218
|
+
for (let i = 0; i < value.length; i++) {
|
|
219
|
+
walkRejectingCredentials(value[i], source, `${path}[${i}]`);
|
|
220
|
+
}
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (typeof value !== 'object' || value === null)
|
|
224
|
+
return;
|
|
225
|
+
for (const [k, v] of Object.entries(value)) {
|
|
226
|
+
if (FORBIDDEN_CREDENTIAL_KEYS.includes(k)) {
|
|
227
|
+
throw new Error(`${source}: forbidden credential property "${path}.${k}" — ` +
|
|
228
|
+
`tokens, passwords, and API keys must come from environment variables, never from storage.config.`);
|
|
229
|
+
}
|
|
230
|
+
walkRejectingCredentials(v, source, `${path}.${k}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Resolve the absolute filesystem path for an `fs`-backed subsystem,
|
|
235
|
+
* applying `roots` overrides if present. Used by the fs adapter.
|
|
236
|
+
*
|
|
237
|
+
* Resolution order:
|
|
238
|
+
* 1. `roots[subsystem]` if set, expanding `~` and accepting absolute paths
|
|
239
|
+
* 2. `<resolved-aiwg-artifact-dir>/<DEFAULT_SUBSYSTEM_ROOTS[subsystem]>`
|
|
240
|
+
*/
|
|
241
|
+
export function resolveSubsystemRoot(subsystem, projectRoot, config) {
|
|
242
|
+
const override = config?.roots?.[subsystem];
|
|
243
|
+
if (override)
|
|
244
|
+
return expandPath(override, projectRoot);
|
|
245
|
+
return join(resolveProjectAiwgDir(projectRoot), DEFAULT_SUBSYSTEM_ROOTS[subsystem]);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Async variant used by runtime adapter creation. For memory only, it can
|
|
249
|
+
* resolve a user-level private project memory root from ~/.aiwg/projects when
|
|
250
|
+
* no project-local `.aiwg` exists. Explicit storage.config roots still win.
|
|
251
|
+
*/
|
|
252
|
+
export async function resolveSubsystemRootRuntime(subsystem, projectRoot, config) {
|
|
253
|
+
const override = config?.roots?.[subsystem];
|
|
254
|
+
if (override)
|
|
255
|
+
return expandPath(override, projectRoot);
|
|
256
|
+
if (subsystem === 'memory') {
|
|
257
|
+
const { resolveProjectMemoryRoot } = await import('../memory/project-registry.js');
|
|
258
|
+
const resolved = await resolveProjectMemoryRoot(projectRoot);
|
|
259
|
+
return resolved.root;
|
|
260
|
+
}
|
|
261
|
+
return join(resolveProjectAiwgDir(projectRoot), DEFAULT_SUBSYSTEM_ROOTS[subsystem]);
|
|
262
|
+
}
|
|
263
|
+
function expandPath(p, projectRoot) {
|
|
264
|
+
if (p.startsWith('~/'))
|
|
265
|
+
return resolve(homedir(), p.slice(2));
|
|
266
|
+
if (p === '~')
|
|
267
|
+
return homedir();
|
|
268
|
+
if (isAbsolute(p))
|
|
269
|
+
return p;
|
|
270
|
+
return resolve(projectRoot, p);
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Adapter Registry
|
|
3
|
+
*
|
|
4
|
+
* `resolveStorage(subsystem)` is the consumer-facing entry point. Loads
|
|
5
|
+
* `.aiwg/storage.config` lazily, picks the configured backend per
|
|
6
|
+
* subsystem, and memoizes the adapter instance for the lifetime of the
|
|
7
|
+
* process.
|
|
8
|
+
*
|
|
9
|
+
* @design @.aiwg/architecture/storage-design.md
|
|
10
|
+
* @issue #934
|
|
11
|
+
* @issue #953
|
|
12
|
+
*/
|
|
13
|
+
import { loadStorageConfig, resolveSubsystemRootRuntime } from './config.js';
|
|
14
|
+
import { FilesystemAdapter } from './backends/fs.js';
|
|
15
|
+
import { ObsidianAdapter } from './backends/obsidian.js';
|
|
16
|
+
import { LogseqAdapter } from './backends/logseq.js';
|
|
17
|
+
import { FortemiAdapter } from './backends/fortemi.js';
|
|
18
|
+
export { SUBSYSTEM_KEYS, BACKEND_TYPES, } from './types.js';
|
|
19
|
+
export { loadStorageConfig, storageConfigPath, validateStorageConfig, resolveSubsystemRoot, resolveSubsystemRootRuntime, walkRejectingCredentials, FORBIDDEN_CREDENTIAL_KEYS, DEFAULT_SUBSYSTEM_ROOTS, } from './config.js';
|
|
20
|
+
export { FilesystemAdapter } from './backends/fs.js';
|
|
21
|
+
export { ObsidianAdapter } from './backends/obsidian.js';
|
|
22
|
+
export { LogseqAdapter } from './backends/logseq.js';
|
|
23
|
+
export { FortemiAdapter } from './backends/fortemi.js';
|
|
24
|
+
let state = null;
|
|
25
|
+
/**
|
|
26
|
+
* Initialize or reset the registry for a given project root. Most
|
|
27
|
+
* callers use the implicit lazy initialization triggered by
|
|
28
|
+
* `resolveStorage()`; explicit init is useful for tests and for the
|
|
29
|
+
* `aiwg storage` CLI.
|
|
30
|
+
*/
|
|
31
|
+
export async function initStorage(projectRoot = process.cwd()) {
|
|
32
|
+
const config = await loadStorageConfig(projectRoot);
|
|
33
|
+
state = {
|
|
34
|
+
projectRoot,
|
|
35
|
+
config,
|
|
36
|
+
adapters: new Map(),
|
|
37
|
+
loaded: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Reset memoized state. Test-only escape hatch. */
|
|
41
|
+
export function resetStorage() {
|
|
42
|
+
state = null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Return the adapter for a subsystem. Loads `.aiwg/storage.config`
|
|
46
|
+
* lazily on first call.
|
|
47
|
+
*/
|
|
48
|
+
export async function resolveStorage(subsystem) {
|
|
49
|
+
if (!state || !state.loaded) {
|
|
50
|
+
await initStorage(process.cwd());
|
|
51
|
+
}
|
|
52
|
+
const s = state;
|
|
53
|
+
const cached = s.adapters.get(subsystem);
|
|
54
|
+
if (cached)
|
|
55
|
+
return cached;
|
|
56
|
+
const adapter = await createAdapter(subsystem, s);
|
|
57
|
+
s.adapters.set(subsystem, adapter);
|
|
58
|
+
return adapter;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Return the loaded config (or null if `.aiwg/storage.config` does not
|
|
62
|
+
* exist). Triggers a load if not yet initialized. Used by the CLI.
|
|
63
|
+
*/
|
|
64
|
+
export async function getLoadedConfig(projectRoot = process.cwd()) {
|
|
65
|
+
if (!state || state.projectRoot !== projectRoot) {
|
|
66
|
+
await initStorage(projectRoot);
|
|
67
|
+
}
|
|
68
|
+
return state.config;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build the adapter for a subsystem given the current registry state.
|
|
72
|
+
* Pure factory — no I/O beyond the path resolution the backend itself
|
|
73
|
+
* performs in its constructor.
|
|
74
|
+
*/
|
|
75
|
+
async function createAdapter(subsystem, s) {
|
|
76
|
+
const backend = s.config?.backends?.[subsystem] ?? { type: 'fs' };
|
|
77
|
+
switch (backend.type) {
|
|
78
|
+
case 'fs': {
|
|
79
|
+
const root = await resolveSubsystemRootRuntime(subsystem, s.projectRoot, s.config);
|
|
80
|
+
return new FilesystemAdapter(root);
|
|
81
|
+
}
|
|
82
|
+
case 'obsidian':
|
|
83
|
+
return new ObsidianAdapter(backend);
|
|
84
|
+
case 'logseq':
|
|
85
|
+
return new LogseqAdapter(backend);
|
|
86
|
+
case 'fortemi':
|
|
87
|
+
return new FortemiAdapter({ subsystem, config: backend });
|
|
88
|
+
case 'notion':
|
|
89
|
+
case 'anythingllm':
|
|
90
|
+
case 's3':
|
|
91
|
+
case 'webdav': {
|
|
92
|
+
const stubIssues = {
|
|
93
|
+
notion: '#959',
|
|
94
|
+
anythingllm: '#960',
|
|
95
|
+
s3: '#962',
|
|
96
|
+
webdav: '#963',
|
|
97
|
+
};
|
|
98
|
+
throw new Error(`storage: backend "${backend.type}" is declared in storage.config but not yet implemented. ` +
|
|
99
|
+
`Tracked at ${stubIssues[backend.type]} — see https://git.integrolabs.net/roctinam/aiwg/issues/${stubIssues[backend.type].slice(1)} for status.`);
|
|
100
|
+
}
|
|
101
|
+
default: {
|
|
102
|
+
// Exhaustiveness check
|
|
103
|
+
const _exhaustive = backend;
|
|
104
|
+
throw new Error(`storage: unhandled backend type ${_exhaustive.type}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic subsystem CLI runner.
|
|
3
|
+
*
|
|
4
|
+
* Provides path/list/get/put/delete/append-log subcommands for any
|
|
5
|
+
* storage subsystem. Used by `aiwg memory` (#966), `aiwg reflections`
|
|
6
|
+
* (#967), and any future per-subsystem CLI wrappers — keeping the
|
|
7
|
+
* shared logic in one place rather than duplicating it.
|
|
8
|
+
*
|
|
9
|
+
* Each subsystem-specific CLI is a 5-line wrapper:
|
|
10
|
+
*
|
|
11
|
+
* import { runSubsystemCli } from '../storage/subsystem-cli.js';
|
|
12
|
+
* export async function main(args: string[]): Promise<void> {
|
|
13
|
+
* await runSubsystemCli('memory', args);
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* @design @.aiwg/architecture/storage-design.md (§4)
|
|
17
|
+
* @issue #934
|
|
18
|
+
* @issue #966
|
|
19
|
+
* @issue #967
|
|
20
|
+
*/
|
|
21
|
+
import { getLoadedConfig, resolveStorage } from './index.js';
|
|
22
|
+
import { resolveSubsystemRootRuntime } from './config.js';
|
|
23
|
+
export async function runSubsystemCli(subsystem, args, opts = {}) {
|
|
24
|
+
const subcommand = args[0];
|
|
25
|
+
const subArgs = args.slice(1);
|
|
26
|
+
const display = opts.displayName ?? subsystem;
|
|
27
|
+
switch (subcommand) {
|
|
28
|
+
case 'path':
|
|
29
|
+
await handlePath(subsystem, display, subArgs);
|
|
30
|
+
break;
|
|
31
|
+
case 'list':
|
|
32
|
+
await handleList(subsystem, display, subArgs);
|
|
33
|
+
break;
|
|
34
|
+
case 'get':
|
|
35
|
+
await handleGet(subsystem, display, subArgs);
|
|
36
|
+
break;
|
|
37
|
+
case 'put':
|
|
38
|
+
await handlePut(subsystem, display, subArgs);
|
|
39
|
+
break;
|
|
40
|
+
case 'delete':
|
|
41
|
+
await handleDelete(subsystem, display, subArgs);
|
|
42
|
+
break;
|
|
43
|
+
case 'append-log':
|
|
44
|
+
await handleAppendLog(subsystem, display, subArgs);
|
|
45
|
+
break;
|
|
46
|
+
default:
|
|
47
|
+
printUsage(subsystem, display);
|
|
48
|
+
if (subcommand) {
|
|
49
|
+
throw new Error(`Unknown ${display} subcommand: ${subcommand}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function handlePath(subsystem, display, args) {
|
|
54
|
+
const subpath = args.find((a) => !a.startsWith('--'));
|
|
55
|
+
const json = args.includes('--json');
|
|
56
|
+
const projectRoot = process.cwd();
|
|
57
|
+
const config = await getLoadedConfig(projectRoot);
|
|
58
|
+
const backend = config?.backends?.[subsystem]?.type ?? 'fs';
|
|
59
|
+
if (backend !== 'fs') {
|
|
60
|
+
if (json) {
|
|
61
|
+
console.log(JSON.stringify({
|
|
62
|
+
backend,
|
|
63
|
+
note: `${display} subsystem uses backend "${backend}" — physical filesystem path is not applicable. Use \`aiwg ${display} get/list\` instead.`,
|
|
64
|
+
}, null, 2));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(`${display} backend: ${backend}`);
|
|
68
|
+
console.log(` (filesystem path not applicable for this backend; use \`aiwg ${display} get/list\`)`);
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const root = await resolveSubsystemRootRuntime(subsystem, projectRoot, config);
|
|
73
|
+
const fullPath = subpath ? `${root}/${subpath}` : root;
|
|
74
|
+
if (json) {
|
|
75
|
+
console.log(JSON.stringify({ backend, root, path: fullPath }, null, 2));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.log(fullPath);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function handleList(subsystem, display, args) {
|
|
82
|
+
let prefix = '';
|
|
83
|
+
let json = false;
|
|
84
|
+
for (let i = 0; i < args.length; i++) {
|
|
85
|
+
if (args[i] === '--prefix')
|
|
86
|
+
prefix = args[++i] ?? '';
|
|
87
|
+
else if (args[i] === '--json')
|
|
88
|
+
json = true;
|
|
89
|
+
}
|
|
90
|
+
const adapter = await resolveStorage(subsystem);
|
|
91
|
+
const entries = await adapter.list(prefix);
|
|
92
|
+
if (json) {
|
|
93
|
+
console.log(JSON.stringify(entries.map((e) => ({
|
|
94
|
+
path: e.path,
|
|
95
|
+
size: e.size,
|
|
96
|
+
modifiedAt: e.modifiedAt?.toISOString(),
|
|
97
|
+
})), null, 2));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (entries.length === 0) {
|
|
101
|
+
console.log(`No ${display} entries${prefix ? ` matching prefix "${prefix}"` : ''}.`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
for (const e of entries)
|
|
105
|
+
console.log(e.path);
|
|
106
|
+
}
|
|
107
|
+
async function handleGet(subsystem, display, args) {
|
|
108
|
+
const path = args[0];
|
|
109
|
+
if (!path)
|
|
110
|
+
throw new Error(`Usage: aiwg ${display} get <path>`);
|
|
111
|
+
const adapter = await resolveStorage(subsystem);
|
|
112
|
+
const content = await adapter.read(path);
|
|
113
|
+
if (content === null)
|
|
114
|
+
throw new Error(`${display} entry not found: ${path}`);
|
|
115
|
+
process.stdout.write(content);
|
|
116
|
+
}
|
|
117
|
+
async function handlePut(subsystem, display, args) {
|
|
118
|
+
const path = args[0];
|
|
119
|
+
if (!path) {
|
|
120
|
+
throw new Error(`Usage: aiwg ${display} put <path>\n` +
|
|
121
|
+
` Reads content from stdin. Creates parent directories. Overwrites existing.`);
|
|
122
|
+
}
|
|
123
|
+
const content = await readStdin();
|
|
124
|
+
const adapter = await resolveStorage(subsystem);
|
|
125
|
+
await adapter.write(path, content);
|
|
126
|
+
console.log(`Wrote ${content.length} bytes to ${display}:${path}`);
|
|
127
|
+
}
|
|
128
|
+
async function handleDelete(subsystem, display, args) {
|
|
129
|
+
const path = args[0];
|
|
130
|
+
if (!path)
|
|
131
|
+
throw new Error(`Usage: aiwg ${display} delete <path>`);
|
|
132
|
+
const adapter = await resolveStorage(subsystem);
|
|
133
|
+
await adapter.delete(path);
|
|
134
|
+
console.log(`Deleted ${display}:${path} (no-op if missing)`);
|
|
135
|
+
}
|
|
136
|
+
async function handleAppendLog(subsystem, display, args) {
|
|
137
|
+
const logPath = args[0];
|
|
138
|
+
if (!logPath) {
|
|
139
|
+
throw new Error(`Usage: aiwg ${display} append-log <log-path>\n` +
|
|
140
|
+
` Reads a single JSON object from stdin and appends it as one JSONL line.`);
|
|
141
|
+
}
|
|
142
|
+
const stdinContent = (await readStdin()).trim();
|
|
143
|
+
if (stdinContent.length === 0) {
|
|
144
|
+
throw new Error('append-log: stdin must contain a single JSON object (got empty input)');
|
|
145
|
+
}
|
|
146
|
+
let parsed;
|
|
147
|
+
try {
|
|
148
|
+
parsed = JSON.parse(stdinContent);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
throw new Error(`append-log: stdin must be valid JSON: ${err.message}`);
|
|
152
|
+
}
|
|
153
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
154
|
+
throw new Error('append-log: stdin must be a single JSON object (not an array, not a primitive)');
|
|
155
|
+
}
|
|
156
|
+
const line = JSON.stringify(parsed) + '\n';
|
|
157
|
+
const adapter = await resolveStorage(subsystem);
|
|
158
|
+
if (typeof adapter.append === 'function') {
|
|
159
|
+
const existing = (await adapter.read(logPath)) ?? '';
|
|
160
|
+
if (existing.length > 0 && !existing.endsWith('\n')) {
|
|
161
|
+
await adapter.append(logPath, '\n');
|
|
162
|
+
}
|
|
163
|
+
await adapter.append(logPath, line);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const existing = (await adapter.read(logPath)) ?? '';
|
|
167
|
+
const trailing = existing.length === 0 || existing.endsWith('\n') ? '' : '\n';
|
|
168
|
+
await adapter.write(logPath, existing + trailing + line);
|
|
169
|
+
}
|
|
170
|
+
console.log(`Appended JSONL event to ${display}:${logPath}`);
|
|
171
|
+
}
|
|
172
|
+
async function readStdin() {
|
|
173
|
+
const chunks = [];
|
|
174
|
+
for await (const chunk of process.stdin) {
|
|
175
|
+
chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
|
|
176
|
+
}
|
|
177
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
178
|
+
}
|
|
179
|
+
function printUsage(subsystem, display) {
|
|
180
|
+
console.log(`Usage: aiwg ${display} <subcommand>
|
|
181
|
+
|
|
182
|
+
Subcommands:
|
|
183
|
+
path [<subpath>] [--json] Resolved physical path (fs backend)
|
|
184
|
+
list [--prefix <p>] [--json] List entries through the adapter
|
|
185
|
+
get <path> Read entry to stdout
|
|
186
|
+
put <path> Write stdin to entry
|
|
187
|
+
delete <path> Delete entry (no-op if missing)
|
|
188
|
+
append-log <log-path> Append a JSON object from stdin as JSONL
|
|
189
|
+
(atomic when the backend supports adapter.append)
|
|
190
|
+
|
|
191
|
+
Examples:
|
|
192
|
+
aiwg ${display} path
|
|
193
|
+
aiwg ${display} list --prefix some/
|
|
194
|
+
aiwg ${display} get some/page.md
|
|
195
|
+
echo "# page" | aiwg ${display} put some/page.md
|
|
196
|
+
echo '{"event":"x"}' | aiwg ${display} append-log some/log.jsonl
|
|
197
|
+
|
|
198
|
+
The ${display} subsystem persists at .aiwg/${subsystem}/ on the default fs backend.
|
|
199
|
+
Configure .aiwg/storage.config to redirect (#934).`);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=subsystem-cli.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Adapter Types
|
|
3
|
+
*
|
|
4
|
+
* Public contracts for the AIWG storage abstraction. Consumers use
|
|
5
|
+
* `resolveStorage(subsystem)` to obtain a backend-specific adapter
|
|
6
|
+
* conforming to `StorageAdapter`.
|
|
7
|
+
*
|
|
8
|
+
* @design @.aiwg/architecture/storage-design.md
|
|
9
|
+
* @schema @.aiwg/architecture/schemas/storage.config.v1.json
|
|
10
|
+
* @issue #934
|
|
11
|
+
* @issue #953
|
|
12
|
+
*/
|
|
13
|
+
export const SUBSYSTEM_KEYS = [
|
|
14
|
+
'memory',
|
|
15
|
+
'reflections',
|
|
16
|
+
'kb',
|
|
17
|
+
'activity_log',
|
|
18
|
+
'provenance',
|
|
19
|
+
'research',
|
|
20
|
+
'media',
|
|
21
|
+
'sandbox_identity',
|
|
22
|
+
];
|
|
23
|
+
export const BACKEND_TYPES = [
|
|
24
|
+
'fs',
|
|
25
|
+
'obsidian',
|
|
26
|
+
'logseq',
|
|
27
|
+
'notion',
|
|
28
|
+
'anythingllm',
|
|
29
|
+
'fortemi',
|
|
30
|
+
's3',
|
|
31
|
+
'webdav',
|
|
32
|
+
];
|
|
33
|
+
//# sourceMappingURL=types.js.map
|