@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,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory CLI — `aiwg memory <subcommand>`
|
|
3
|
+
*
|
|
4
|
+
* Thin subsystem wrapper around `runSubsystemCli('memory', ...)` for
|
|
5
|
+
* the `memory` storage subsystem. Subcommands and behavior live in
|
|
6
|
+
* `src/storage/subsystem-cli.ts` so memory and reflections share the
|
|
7
|
+
* same implementation.
|
|
8
|
+
*
|
|
9
|
+
* @issue #934
|
|
10
|
+
* @issue #966
|
|
11
|
+
*/
|
|
12
|
+
import { runSubsystemCli } from '../storage/subsystem-cli.js';
|
|
13
|
+
export async function main(args) {
|
|
14
|
+
if (args[0] === 'project') {
|
|
15
|
+
await runProjectMemoryCli(args.slice(1));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
await runSubsystemCli('memory', args);
|
|
19
|
+
}
|
|
20
|
+
async function runProjectMemoryCli(args) {
|
|
21
|
+
const subcommand = args[0];
|
|
22
|
+
const rest = args.slice(1);
|
|
23
|
+
const json = rest.includes('--json');
|
|
24
|
+
const registry = await import('./project-registry.js');
|
|
25
|
+
switch (subcommand) {
|
|
26
|
+
case 'register': {
|
|
27
|
+
const opts = parseProjectMemoryOptions(rest);
|
|
28
|
+
const entry = await registry.registerProjectMemory({
|
|
29
|
+
workspaceRoot: opts.workspace,
|
|
30
|
+
id: opts.id,
|
|
31
|
+
name: opts.name,
|
|
32
|
+
memoryRoot: opts.memoryRoot,
|
|
33
|
+
});
|
|
34
|
+
if (json)
|
|
35
|
+
console.log(JSON.stringify(entry, null, 2));
|
|
36
|
+
else {
|
|
37
|
+
console.log(`Registered project memory: ${entry.id}`);
|
|
38
|
+
console.log(` workspace: ${entry.workspaceRoots.join(', ')}`);
|
|
39
|
+
console.log(` memory: ${entry.memoryRoot}`);
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case 'inspect':
|
|
44
|
+
case 'resolve': {
|
|
45
|
+
const opts = parseProjectMemoryOptions(rest);
|
|
46
|
+
if (subcommand === 'resolve') {
|
|
47
|
+
const resolved = await registry.resolveProjectMemoryRoot(opts.workspace ?? process.cwd());
|
|
48
|
+
if (json)
|
|
49
|
+
console.log(JSON.stringify(resolved, null, 2));
|
|
50
|
+
else {
|
|
51
|
+
console.log(resolved.root);
|
|
52
|
+
console.log(`source: ${resolved.source} (${resolved.reason})`);
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
const lookup = await registry.lookupProjectMemory({
|
|
57
|
+
id: opts.id,
|
|
58
|
+
workspaceRoot: opts.workspace ?? (!opts.id && !opts.remote ? process.cwd() : undefined),
|
|
59
|
+
gitRemote: opts.remote,
|
|
60
|
+
});
|
|
61
|
+
if (json)
|
|
62
|
+
console.log(JSON.stringify(lookup, null, 2));
|
|
63
|
+
else
|
|
64
|
+
printLookup(lookup);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case 'list': {
|
|
68
|
+
const manifest = await registry.readProjectMemoryManifest();
|
|
69
|
+
if (json)
|
|
70
|
+
console.log(JSON.stringify(manifest.projects, null, 2));
|
|
71
|
+
else if (manifest.projects.length === 0)
|
|
72
|
+
console.log('No registered project memory entries.');
|
|
73
|
+
else
|
|
74
|
+
for (const entry of manifest.projects)
|
|
75
|
+
console.log(`${entry.id}\t${entry.name}\t${entry.memoryRoot}`);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case 'reindex': {
|
|
79
|
+
const index = await registry.writeProjectMemoryIndex();
|
|
80
|
+
if (json)
|
|
81
|
+
console.log(JSON.stringify(index, null, 2));
|
|
82
|
+
else
|
|
83
|
+
console.log(`Reindexed ${Object.keys(index.byProjectId).length} project memory entr${Object.keys(index.byProjectId).length === 1 ? 'y' : 'ies'} at ${registry.projectMemoryIndexPath()}`);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case 'relocate': {
|
|
87
|
+
const id = rest.find((arg) => !arg.startsWith('--'));
|
|
88
|
+
const target = rest.filter((arg) => !arg.startsWith('--'))[1];
|
|
89
|
+
if (!id || !target)
|
|
90
|
+
throw new Error('Usage: aiwg memory project relocate <id> <memory-root> [--json]');
|
|
91
|
+
const entry = await registry.relocateProjectMemory(id, target);
|
|
92
|
+
if (json)
|
|
93
|
+
console.log(JSON.stringify(entry, null, 2));
|
|
94
|
+
else
|
|
95
|
+
console.log(`Relocated ${entry.id} to ${entry.memoryRoot}`);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case 'remove': {
|
|
99
|
+
const id = rest.find((arg) => !arg.startsWith('--'));
|
|
100
|
+
if (!id)
|
|
101
|
+
throw new Error('Usage: aiwg memory project remove <id> [--delete-files] [--json]');
|
|
102
|
+
const removed = await registry.removeProjectMemory(id, { deleteFiles: rest.includes('--delete-files') });
|
|
103
|
+
if (json)
|
|
104
|
+
console.log(JSON.stringify({ removed }, null, 2));
|
|
105
|
+
else
|
|
106
|
+
console.log(removed ? `Removed project memory mapping: ${removed.id}` : `No project memory mapping found for: ${id}`);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
default:
|
|
110
|
+
printProjectMemoryUsage();
|
|
111
|
+
if (subcommand)
|
|
112
|
+
throw new Error(`Unknown memory project subcommand: ${subcommand}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function parseProjectMemoryOptions(args) {
|
|
116
|
+
const opts = {};
|
|
117
|
+
for (let i = 0; i < args.length; i++) {
|
|
118
|
+
const arg = args[i];
|
|
119
|
+
if (arg === '--id')
|
|
120
|
+
opts.id = args[++i];
|
|
121
|
+
else if (arg === '--name')
|
|
122
|
+
opts.name = args[++i];
|
|
123
|
+
else if (arg === '--workspace')
|
|
124
|
+
opts.workspace = args[++i];
|
|
125
|
+
else if (arg === '--remote')
|
|
126
|
+
opts.remote = args[++i];
|
|
127
|
+
else if (arg === '--memory-root')
|
|
128
|
+
opts.memoryRoot = args[++i];
|
|
129
|
+
}
|
|
130
|
+
return opts;
|
|
131
|
+
}
|
|
132
|
+
function printLookup(lookup) {
|
|
133
|
+
if (lookup.status === 'missing') {
|
|
134
|
+
console.log(`No project memory mapping found: ${lookup.reason}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (lookup.status === 'ambiguous') {
|
|
138
|
+
console.log(lookup.reason);
|
|
139
|
+
for (const entry of lookup.entries)
|
|
140
|
+
console.log(` ${entry.id}\t${entry.memoryRoot}`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
console.log(`Project memory: ${lookup.entry.id}`);
|
|
144
|
+
console.log(` matched by: ${lookup.matchedBy}`);
|
|
145
|
+
console.log(` name: ${lookup.entry.name}`);
|
|
146
|
+
console.log(` memory: ${lookup.entry.memoryRoot}`);
|
|
147
|
+
console.log(` workspace: ${lookup.entry.workspaceRoots.join(', ')}`);
|
|
148
|
+
if (lookup.entry.gitRemotes.length > 0)
|
|
149
|
+
console.log(` remotes: ${lookup.entry.gitRemotes.join(', ')}`);
|
|
150
|
+
}
|
|
151
|
+
function printProjectMemoryUsage() {
|
|
152
|
+
console.log(`Usage: aiwg memory project <subcommand>
|
|
153
|
+
|
|
154
|
+
Subcommands:
|
|
155
|
+
register [--id <id>] [--name <name>] [--workspace <path>] [--memory-root <path>] [--json]
|
|
156
|
+
inspect [--id <id> | --workspace <path> | --remote <url>] [--json]
|
|
157
|
+
resolve [--workspace <path>] [--json]
|
|
158
|
+
list [--json]
|
|
159
|
+
reindex [--json]
|
|
160
|
+
relocate <id> <memory-root> [--json]
|
|
161
|
+
remove <id> [--delete-files] [--json]
|
|
162
|
+
|
|
163
|
+
The manifest lives at ~/.aiwg/projects/manifest.json and each registered
|
|
164
|
+
project memory root uses a private .aiwg layout under ~/.aiwg/projects/<id>/.aiwg.`);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-level project memory registry (#1750).
|
|
3
|
+
*
|
|
4
|
+
* Stores private, per-project AIWG memory roots under ~/.aiwg/projects while
|
|
5
|
+
* preserving the effective `.aiwg` layout inside each registered memory root.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import { execFileSync } from 'node:child_process';
|
|
13
|
+
import { projectAiwgPath, resolveProjectAiwgDir } from '../config/project-artifacts.js';
|
|
14
|
+
export function projectMemoryHome() {
|
|
15
|
+
const override = process.env.AIWG_PROJECT_MEMORY_HOME;
|
|
16
|
+
if (override)
|
|
17
|
+
return path.resolve(override);
|
|
18
|
+
return path.join(homedir(), '.aiwg', 'projects');
|
|
19
|
+
}
|
|
20
|
+
export function projectMemoryManifestPath() {
|
|
21
|
+
return path.join(projectMemoryHome(), 'manifest.json');
|
|
22
|
+
}
|
|
23
|
+
export function projectMemoryIndexPath() {
|
|
24
|
+
return path.join(projectMemoryHome(), 'index', 'manifest-index.json');
|
|
25
|
+
}
|
|
26
|
+
export function emptyProjectMemoryManifest() {
|
|
27
|
+
return { version: 1, projects: [] };
|
|
28
|
+
}
|
|
29
|
+
export async function readProjectMemoryManifest() {
|
|
30
|
+
const manifestPath = projectMemoryManifestPath();
|
|
31
|
+
if (!existsSync(manifestPath))
|
|
32
|
+
return emptyProjectMemoryManifest();
|
|
33
|
+
const parsed = JSON.parse(await readFile(manifestPath, 'utf-8'));
|
|
34
|
+
if (parsed.version !== 1 || !Array.isArray(parsed.projects)) {
|
|
35
|
+
throw new Error(`${manifestPath}: expected project memory manifest version 1`);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
version: 1,
|
|
39
|
+
projects: parsed.projects.map(normalizeEntry),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export async function writeProjectMemoryManifest(manifest) {
|
|
43
|
+
const manifestPath = projectMemoryManifestPath();
|
|
44
|
+
await mkdir(path.dirname(manifestPath), { recursive: true });
|
|
45
|
+
const normalized = {
|
|
46
|
+
version: 1,
|
|
47
|
+
projects: [...manifest.projects].sort((a, b) => a.id.localeCompare(b.id)).map(normalizeEntry),
|
|
48
|
+
};
|
|
49
|
+
await writeFile(manifestPath, JSON.stringify(normalized, null, 2) + '\n', 'utf-8');
|
|
50
|
+
await writeProjectMemoryIndex(normalized);
|
|
51
|
+
}
|
|
52
|
+
export async function writeProjectMemoryIndex(manifest) {
|
|
53
|
+
manifest ??= await readProjectMemoryManifest();
|
|
54
|
+
const index = {
|
|
55
|
+
version: 1,
|
|
56
|
+
generatedAt: new Date().toISOString(),
|
|
57
|
+
byProjectId: {},
|
|
58
|
+
byWorkspaceRoot: {},
|
|
59
|
+
byGitRemote: {},
|
|
60
|
+
};
|
|
61
|
+
for (const entry of manifest.projects) {
|
|
62
|
+
index.byProjectId[entry.id] = entry.id;
|
|
63
|
+
for (const root of entry.workspaceRoots) {
|
|
64
|
+
addIndexValue(index.byWorkspaceRoot, normalizeWorkspaceRoot(root), entry.id);
|
|
65
|
+
}
|
|
66
|
+
for (const remote of entry.gitRemotes) {
|
|
67
|
+
addIndexValue(index.byGitRemote, normalizeGitRemote(remote), entry.id);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const indexPath = projectMemoryIndexPath();
|
|
71
|
+
await mkdir(path.dirname(indexPath), { recursive: true });
|
|
72
|
+
await writeFile(indexPath, JSON.stringify(index, null, 2) + '\n', 'utf-8');
|
|
73
|
+
return index;
|
|
74
|
+
}
|
|
75
|
+
export async function registerProjectMemory(opts) {
|
|
76
|
+
const workspaceRoot = normalizeWorkspaceRoot(opts.workspaceRoot ?? process.cwd());
|
|
77
|
+
const gitRemotes = uniqueGitRemotes(opts.gitRemotes ?? discoverGitRemotes(workspaceRoot));
|
|
78
|
+
const name = opts.name ?? path.basename(workspaceRoot);
|
|
79
|
+
const metadata = { ...metadataFromRemotes(gitRemotes), ...opts.metadata };
|
|
80
|
+
const id = sanitizeProjectId(opts.id ?? stableProjectId({ name, workspaceRoot, gitRemotes }));
|
|
81
|
+
const now = new Date().toISOString();
|
|
82
|
+
const memoryRoot = expandUserPath(opts.memoryRoot ?? path.join(projectMemoryHome(), id, '.aiwg'));
|
|
83
|
+
const manifest = await readProjectMemoryManifest();
|
|
84
|
+
const existing = manifest.projects.find((p) => p.id === id);
|
|
85
|
+
const entry = {
|
|
86
|
+
id,
|
|
87
|
+
name,
|
|
88
|
+
workspaceRoots: normalizeUnique([...(existing?.workspaceRoots ?? []), workspaceRoot], normalizeWorkspaceRoot),
|
|
89
|
+
gitRemotes: uniqueGitRemotes([...(existing?.gitRemotes ?? []), ...gitRemotes]),
|
|
90
|
+
memoryRoot,
|
|
91
|
+
metadata,
|
|
92
|
+
registeredAt: existing?.registeredAt ?? now,
|
|
93
|
+
updatedAt: now,
|
|
94
|
+
};
|
|
95
|
+
const nextProjects = manifest.projects.filter((p) => p.id !== id);
|
|
96
|
+
nextProjects.push(entry);
|
|
97
|
+
await ensureMemoryLayout(entry.memoryRoot);
|
|
98
|
+
await writeProjectMemoryManifest({ version: 1, projects: nextProjects });
|
|
99
|
+
return entry;
|
|
100
|
+
}
|
|
101
|
+
export async function lookupProjectMemory(opts) {
|
|
102
|
+
const manifest = await readProjectMemoryManifest();
|
|
103
|
+
if (opts.id) {
|
|
104
|
+
const entry = manifest.projects.find((p) => p.id === opts.id);
|
|
105
|
+
return entry
|
|
106
|
+
? { status: 'found', entry, matchedBy: 'id' }
|
|
107
|
+
: { status: 'missing', reason: `No project memory entry with id '${opts.id}'` };
|
|
108
|
+
}
|
|
109
|
+
if (opts.workspaceRoot) {
|
|
110
|
+
const active = normalizeWorkspaceRoot(opts.workspaceRoot);
|
|
111
|
+
const matches = manifest.projects
|
|
112
|
+
.filter((p) => p.workspaceRoots.some((root) => isWithinRoot(active, normalizeWorkspaceRoot(root))))
|
|
113
|
+
.sort((a, b) => longestMatchingRoot(b, active) - longestMatchingRoot(a, active));
|
|
114
|
+
const topLen = matches.length > 0 ? longestMatchingRoot(matches[0], active) : -1;
|
|
115
|
+
const top = matches.filter((p) => longestMatchingRoot(p, active) === topLen);
|
|
116
|
+
if (top.length === 1)
|
|
117
|
+
return { status: 'found', entry: top[0], matchedBy: 'workspaceRoot' };
|
|
118
|
+
if (top.length > 1)
|
|
119
|
+
return { status: 'ambiguous', reason: `Multiple project memory entries match workspace '${active}'`, entries: top };
|
|
120
|
+
}
|
|
121
|
+
if (opts.gitRemote) {
|
|
122
|
+
const remote = normalizeGitRemote(opts.gitRemote);
|
|
123
|
+
const matches = manifest.projects.filter((p) => p.gitRemotes.map(normalizeGitRemote).includes(remote));
|
|
124
|
+
if (matches.length === 1)
|
|
125
|
+
return { status: 'found', entry: matches[0], matchedBy: 'gitRemote' };
|
|
126
|
+
if (matches.length > 1)
|
|
127
|
+
return { status: 'ambiguous', reason: `Multiple project memory entries match remote '${opts.gitRemote}'`, entries: matches };
|
|
128
|
+
}
|
|
129
|
+
return { status: 'missing', reason: 'No project memory entry matched the supplied workspace or remote metadata' };
|
|
130
|
+
}
|
|
131
|
+
export async function resolveProjectMemoryRoot(projectRoot = process.cwd()) {
|
|
132
|
+
const localAiwg = resolveProjectAiwgDir(projectRoot);
|
|
133
|
+
if (existsSync(localAiwg)) {
|
|
134
|
+
return { source: 'project-local', root: path.join(localAiwg, 'memory'), reason: 'configured project AIWG artifact root exists' };
|
|
135
|
+
}
|
|
136
|
+
const byPath = await lookupProjectMemory({ workspaceRoot: projectRoot });
|
|
137
|
+
if (byPath.status === 'found') {
|
|
138
|
+
return { source: 'user', root: path.join(byPath.entry.memoryRoot, 'memory'), entry: byPath.entry, reason: 'matched workspace path' };
|
|
139
|
+
}
|
|
140
|
+
if (byPath.status === 'ambiguous') {
|
|
141
|
+
return { source: 'default', root: projectAiwgPath(projectRoot, 'memory'), reason: byPath.reason };
|
|
142
|
+
}
|
|
143
|
+
for (const remote of discoverGitRemotes(projectRoot)) {
|
|
144
|
+
const byRemote = await lookupProjectMemory({ gitRemote: remote });
|
|
145
|
+
if (byRemote.status === 'found') {
|
|
146
|
+
return { source: 'user', root: path.join(byRemote.entry.memoryRoot, 'memory'), entry: byRemote.entry, reason: 'matched git remote' };
|
|
147
|
+
}
|
|
148
|
+
if (byRemote.status === 'ambiguous') {
|
|
149
|
+
return { source: 'default', root: projectAiwgPath(projectRoot, 'memory'), reason: byRemote.reason };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { source: 'default', root: projectAiwgPath(projectRoot, 'memory'), reason: 'no registered user-level project memory entry' };
|
|
153
|
+
}
|
|
154
|
+
export async function relocateProjectMemory(id, newMemoryRoot) {
|
|
155
|
+
const manifest = await readProjectMemoryManifest();
|
|
156
|
+
const entry = manifest.projects.find((p) => p.id === id);
|
|
157
|
+
if (!entry)
|
|
158
|
+
throw new Error(`No project memory entry with id '${id}'`);
|
|
159
|
+
const oldRoot = entry.memoryRoot;
|
|
160
|
+
const nextRoot = expandUserPath(newMemoryRoot);
|
|
161
|
+
if (oldRoot !== nextRoot && existsSync(oldRoot) && !existsSync(nextRoot)) {
|
|
162
|
+
await mkdir(path.dirname(nextRoot), { recursive: true });
|
|
163
|
+
await rename(oldRoot, nextRoot);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
await ensureMemoryLayout(nextRoot);
|
|
167
|
+
}
|
|
168
|
+
entry.memoryRoot = nextRoot;
|
|
169
|
+
entry.updatedAt = new Date().toISOString();
|
|
170
|
+
await writeProjectMemoryManifest(manifest);
|
|
171
|
+
return entry;
|
|
172
|
+
}
|
|
173
|
+
export async function removeProjectMemory(id, opts = {}) {
|
|
174
|
+
const manifest = await readProjectMemoryManifest();
|
|
175
|
+
const entry = manifest.projects.find((p) => p.id === id);
|
|
176
|
+
if (!entry)
|
|
177
|
+
return null;
|
|
178
|
+
await writeProjectMemoryManifest({ version: 1, projects: manifest.projects.filter((p) => p.id !== id) });
|
|
179
|
+
if (opts.deleteFiles)
|
|
180
|
+
await rm(entry.memoryRoot, { recursive: true, force: true });
|
|
181
|
+
return entry;
|
|
182
|
+
}
|
|
183
|
+
export async function ensureMemoryLayout(memoryRoot) {
|
|
184
|
+
await mkdir(path.join(memoryRoot, 'memory'), { recursive: true });
|
|
185
|
+
await mkdir(path.join(memoryRoot, 'index'), { recursive: true });
|
|
186
|
+
await mkdir(path.join(memoryRoot, 'artifacts'), { recursive: true });
|
|
187
|
+
const configPath = path.join(memoryRoot, 'aiwg.config');
|
|
188
|
+
if (!existsSync(configPath)) {
|
|
189
|
+
await writeFile(configPath, JSON.stringify({ version: '1', projectMemory: { private: true } }, null, 2) + '\n', 'utf-8');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export function normalizeGitRemote(remote) {
|
|
193
|
+
const trimmed = remote.trim();
|
|
194
|
+
const withoutGit = trimmed.endsWith('.git') ? trimmed.slice(0, -4) : trimmed;
|
|
195
|
+
const ssh = withoutGit.match(/^git@([^:]+):(.+)$/);
|
|
196
|
+
if (ssh)
|
|
197
|
+
return `${ssh[1].toLowerCase()}/${ssh[2].replace(/^\/+/, '').toLowerCase()}`;
|
|
198
|
+
try {
|
|
199
|
+
const u = new URL(withoutGit);
|
|
200
|
+
return `${u.hostname.toLowerCase()}/${u.pathname.replace(/^\/+/, '').replace(/\/+$/, '').toLowerCase()}`;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return withoutGit.toLowerCase();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function normalizeEntry(entry) {
|
|
207
|
+
return {
|
|
208
|
+
...entry,
|
|
209
|
+
workspaceRoots: normalizeUnique(entry.workspaceRoots ?? [], normalizeWorkspaceRoot),
|
|
210
|
+
gitRemotes: uniqueGitRemotes(entry.gitRemotes ?? []),
|
|
211
|
+
memoryRoot: expandUserPath(entry.memoryRoot),
|
|
212
|
+
metadata: entry.metadata ?? {},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function addIndexValue(index, key, id) {
|
|
216
|
+
index[key] = Array.from(new Set([...(index[key] ?? []), id])).sort();
|
|
217
|
+
}
|
|
218
|
+
function normalizeUnique(values, normalize) {
|
|
219
|
+
return Array.from(new Set(values.filter(Boolean).map(normalize))).sort();
|
|
220
|
+
}
|
|
221
|
+
function uniqueGitRemotes(values) {
|
|
222
|
+
const byNormalized = new Map();
|
|
223
|
+
for (const value of values.filter(Boolean)) {
|
|
224
|
+
const trimmed = value.trim();
|
|
225
|
+
const normalized = normalizeGitRemote(trimmed);
|
|
226
|
+
if (!byNormalized.has(normalized))
|
|
227
|
+
byNormalized.set(normalized, trimmed);
|
|
228
|
+
}
|
|
229
|
+
return Array.from(byNormalized.values()).sort();
|
|
230
|
+
}
|
|
231
|
+
function normalizeWorkspaceRoot(root) {
|
|
232
|
+
return path.resolve(expandUserPath(root));
|
|
233
|
+
}
|
|
234
|
+
function expandUserPath(value) {
|
|
235
|
+
if (value === '~')
|
|
236
|
+
return homedir();
|
|
237
|
+
if (value.startsWith('~/'))
|
|
238
|
+
return path.join(homedir(), value.slice(2));
|
|
239
|
+
return path.resolve(value);
|
|
240
|
+
}
|
|
241
|
+
function stableProjectId(opts) {
|
|
242
|
+
const seed = opts.gitRemotes[0] ? normalizeGitRemote(opts.gitRemotes[0]) : opts.workspaceRoot;
|
|
243
|
+
const digest = createHash('sha256').update(seed).digest('hex').slice(0, 12);
|
|
244
|
+
return `${opts.name}-${digest}`;
|
|
245
|
+
}
|
|
246
|
+
function sanitizeProjectId(id) {
|
|
247
|
+
return id.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'project';
|
|
248
|
+
}
|
|
249
|
+
function discoverGitRemotes(cwd) {
|
|
250
|
+
try {
|
|
251
|
+
const stdout = execFileSync('git', ['remote', '-v'], { cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
252
|
+
const remotes = stdout
|
|
253
|
+
.split('\n')
|
|
254
|
+
.map((line) => line.trim().split(/\s+/)[1])
|
|
255
|
+
.filter((remote) => Boolean(remote));
|
|
256
|
+
return normalizeUnique(remotes, (v) => v.trim());
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return [];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function metadataFromRemotes(remotes) {
|
|
263
|
+
for (const remote of remotes) {
|
|
264
|
+
const normalized = normalizeGitRemote(remote);
|
|
265
|
+
const parts = normalized.split('/');
|
|
266
|
+
if (parts.length >= 3) {
|
|
267
|
+
return { owner: parts[parts.length - 2], repo: parts[parts.length - 1] };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return {};
|
|
271
|
+
}
|
|
272
|
+
function isWithinRoot(active, root) {
|
|
273
|
+
const rel = path.relative(root, active);
|
|
274
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
275
|
+
}
|
|
276
|
+
function longestMatchingRoot(entry, active) {
|
|
277
|
+
return Math.max(...entry.workspaceRoots.map((root) => {
|
|
278
|
+
const normalized = normalizeWorkspaceRoot(root);
|
|
279
|
+
return isWithinRoot(active, normalized) ? normalized.length : -1;
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=project-registry.js.map
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Artifact Metrics — record and query per-artifact token metrics
|
|
3
|
+
*
|
|
4
|
+
* Hooks into artifact save events, records path/type/agent/timestamp/tokens,
|
|
5
|
+
* and persists to `.aiwg/metrics/tokens/`.
|
|
6
|
+
*
|
|
7
|
+
* @module metrics/artifact-metrics
|
|
8
|
+
* @issue #173
|
|
9
|
+
* @schema @agentic/code/frameworks/sdlc-complete/schemas/flows/token-efficiency.yaml
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs } from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { countTokens, evaluateThreshold, BENCHMARK_TOKENS_PER_LINE, BASELINE_TOKENS_PER_LINE, } from './token-counter.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// ============================================================================
|
|
17
|
+
const METRICS_DIR = '.aiwg/metrics/tokens';
|
|
18
|
+
const RECORDS_FILE = 'records.json';
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// ArtifactMetricsStore
|
|
21
|
+
// ============================================================================
|
|
22
|
+
export class ArtifactMetricsStore {
|
|
23
|
+
projectPath;
|
|
24
|
+
metricsDir;
|
|
25
|
+
records;
|
|
26
|
+
constructor(projectPath) {
|
|
27
|
+
this.projectPath = projectPath;
|
|
28
|
+
this.metricsDir = path.join(projectPath, METRICS_DIR);
|
|
29
|
+
this.records = [];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Record metrics for an artifact after save.
|
|
33
|
+
*/
|
|
34
|
+
async recordArtifact(artifactPath, content, artifactType, agent) {
|
|
35
|
+
const tokenCount = countTokens(content);
|
|
36
|
+
const threshold = evaluateThreshold(tokenCount.tokensPerLine);
|
|
37
|
+
const relativePath = path.isAbsolute(artifactPath)
|
|
38
|
+
? path.relative(this.projectPath, artifactPath)
|
|
39
|
+
: artifactPath;
|
|
40
|
+
const record = {
|
|
41
|
+
artifactPath: relativePath,
|
|
42
|
+
artifactType,
|
|
43
|
+
agent,
|
|
44
|
+
timestamp: new Date().toISOString(),
|
|
45
|
+
tokens: {
|
|
46
|
+
totalTokens: tokenCount.tokens,
|
|
47
|
+
nonBlankLines: tokenCount.nonBlankLines,
|
|
48
|
+
tokensPerLine: tokenCount.tokensPerLine,
|
|
49
|
+
characters: tokenCount.characters,
|
|
50
|
+
},
|
|
51
|
+
thresholdStatus: threshold.level,
|
|
52
|
+
};
|
|
53
|
+
this.records.push(record);
|
|
54
|
+
await this.persist();
|
|
55
|
+
return record;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Query records with optional filters.
|
|
59
|
+
*/
|
|
60
|
+
queryRecords(options = {}) {
|
|
61
|
+
let filtered = [...this.records];
|
|
62
|
+
if (options.agent) {
|
|
63
|
+
const agentLower = options.agent.toLowerCase();
|
|
64
|
+
filtered = filtered.filter((r) => r.agent.toLowerCase() === agentLower);
|
|
65
|
+
}
|
|
66
|
+
if (options.since) {
|
|
67
|
+
const sinceDate = parseSinceDate(options.since);
|
|
68
|
+
if (sinceDate) {
|
|
69
|
+
filtered = filtered.filter((r) => new Date(r.timestamp) >= sinceDate);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return filtered;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get per-agent efficiency summaries.
|
|
76
|
+
*/
|
|
77
|
+
getAgentSummaries(options = {}) {
|
|
78
|
+
const records = this.queryRecords(options);
|
|
79
|
+
const byAgent = new Map();
|
|
80
|
+
for (const record of records) {
|
|
81
|
+
const existing = byAgent.get(record.agent) || [];
|
|
82
|
+
existing.push(record);
|
|
83
|
+
byAgent.set(record.agent, existing);
|
|
84
|
+
}
|
|
85
|
+
const summaries = [];
|
|
86
|
+
for (const [agentName, agentRecords] of byAgent) {
|
|
87
|
+
const totalTokens = agentRecords.reduce((sum, r) => sum + r.tokens.totalTokens, 0);
|
|
88
|
+
const totalLines = agentRecords.reduce((sum, r) => sum + r.tokens.nonBlankLines, 0);
|
|
89
|
+
const avgTokensPerLine = totalLines > 0 ? totalTokens / totalLines : 0;
|
|
90
|
+
const tokensPerLineValues = agentRecords.map((r) => r.tokens.tokensPerLine);
|
|
91
|
+
const minTokensPerLine = Math.min(...tokensPerLineValues);
|
|
92
|
+
const maxTokensPerLine = Math.max(...tokensPerLineValues);
|
|
93
|
+
const vsBenchmark = avgTokensPerLine > 0
|
|
94
|
+
? ((avgTokensPerLine - BENCHMARK_TOKENS_PER_LINE) / BENCHMARK_TOKENS_PER_LINE) * 100
|
|
95
|
+
: 0;
|
|
96
|
+
const vsBaseline = avgTokensPerLine > 0
|
|
97
|
+
? ((avgTokensPerLine - BASELINE_TOKENS_PER_LINE) / BASELINE_TOKENS_PER_LINE) * 100
|
|
98
|
+
: 0;
|
|
99
|
+
const threshold = evaluateThreshold(avgTokensPerLine);
|
|
100
|
+
const trend = calculateTrend(agentRecords);
|
|
101
|
+
summaries.push({
|
|
102
|
+
agentName,
|
|
103
|
+
period: options.since || 'all-time',
|
|
104
|
+
totalArtifacts: agentRecords.length,
|
|
105
|
+
totalTokens,
|
|
106
|
+
totalLines,
|
|
107
|
+
avgTokensPerLine: Math.round(avgTokensPerLine * 100) / 100,
|
|
108
|
+
minTokensPerLine: Math.round(minTokensPerLine * 100) / 100,
|
|
109
|
+
maxTokensPerLine: Math.round(maxTokensPerLine * 100) / 100,
|
|
110
|
+
vsBenchmark: Math.round(vsBenchmark * 100) / 100,
|
|
111
|
+
vsBaseline: Math.round(vsBaseline * 100) / 100,
|
|
112
|
+
trend,
|
|
113
|
+
thresholdStatus: threshold.level,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return summaries;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Load records from disk.
|
|
120
|
+
*/
|
|
121
|
+
async load() {
|
|
122
|
+
try {
|
|
123
|
+
const filePath = path.join(this.metricsDir, RECORDS_FILE);
|
|
124
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
125
|
+
this.records = JSON.parse(content);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
this.records = [];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Persist records to disk.
|
|
133
|
+
*/
|
|
134
|
+
async persist() {
|
|
135
|
+
try {
|
|
136
|
+
await fs.mkdir(this.metricsDir, { recursive: true });
|
|
137
|
+
const filePath = path.join(this.metricsDir, RECORDS_FILE);
|
|
138
|
+
await fs.writeFile(filePath, JSON.stringify(this.records, null, 2), 'utf-8');
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Silently fail persistence — metrics are non-critical
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get all records (for testing).
|
|
146
|
+
*/
|
|
147
|
+
getAllRecords() {
|
|
148
|
+
return [...this.records];
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Helpers
|
|
153
|
+
// ============================================================================
|
|
154
|
+
function parseSinceDate(since) {
|
|
155
|
+
const durationMatch = since.match(/^(\d+)d$/);
|
|
156
|
+
if (durationMatch) {
|
|
157
|
+
const days = parseInt(durationMatch[1], 10);
|
|
158
|
+
const date = new Date();
|
|
159
|
+
date.setDate(date.getDate() - days);
|
|
160
|
+
return date;
|
|
161
|
+
}
|
|
162
|
+
const parsed = new Date(since);
|
|
163
|
+
if (!isNaN(parsed.getTime())) {
|
|
164
|
+
return parsed;
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
function calculateTrend(records) {
|
|
169
|
+
if (records.length < 4)
|
|
170
|
+
return 'stable';
|
|
171
|
+
const sorted = [...records].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
172
|
+
const midpoint = Math.floor(sorted.length / 2);
|
|
173
|
+
const firstHalf = sorted.slice(0, midpoint);
|
|
174
|
+
const secondHalf = sorted.slice(midpoint);
|
|
175
|
+
const avgFirst = firstHalf.reduce((sum, r) => sum + r.tokens.tokensPerLine, 0) / firstHalf.length;
|
|
176
|
+
const avgSecond = secondHalf.reduce((sum, r) => sum + r.tokens.tokensPerLine, 0) / secondHalf.length;
|
|
177
|
+
const changePercent = ((avgSecond - avgFirst) / avgFirst) * 100;
|
|
178
|
+
if (changePercent < -5)
|
|
179
|
+
return 'improving';
|
|
180
|
+
if (changePercent > 5)
|
|
181
|
+
return 'degrading';
|
|
182
|
+
return 'stable';
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=artifact-metrics.js.map
|