@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1462 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +882 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +64 -9
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Acquisition service for downloading and validating research papers
|
|
3
|
+
*
|
|
4
|
+
* @module research/services/acquisition
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { createHash } from 'crypto';
|
|
9
|
+
import { UnpaywallClient } from '../clients/unpaywall.js';
|
|
10
|
+
/**
|
|
11
|
+
* Acquisition service for downloading research papers
|
|
12
|
+
*/
|
|
13
|
+
export class AcquisitionService {
|
|
14
|
+
unpaywall;
|
|
15
|
+
downloadDir;
|
|
16
|
+
downloadTimeout;
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
this.unpaywall = config.unpaywall || new UnpaywallClient({ email: config.email });
|
|
19
|
+
this.downloadDir = config.downloadDir || '.aiwg/research/sources';
|
|
20
|
+
this.downloadTimeout = config.downloadTimeout || 300000; // 5 minutes
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Acquire a paper (download + metadata extraction)
|
|
24
|
+
*/
|
|
25
|
+
async acquire(paper) {
|
|
26
|
+
// Determine PDF URL
|
|
27
|
+
let pdfUrl = paper.pdfUrl;
|
|
28
|
+
if (!pdfUrl && paper.doi) {
|
|
29
|
+
// Try to get open access PDF from Unpaywall
|
|
30
|
+
const oaUrl = await this.unpaywall.checkOpenAccess(paper.doi);
|
|
31
|
+
if (oaUrl) {
|
|
32
|
+
pdfUrl = oaUrl;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!pdfUrl) {
|
|
36
|
+
throw new Error(`No PDF URL available for paper: ${paper.id}`);
|
|
37
|
+
}
|
|
38
|
+
// Download PDF
|
|
39
|
+
const filename = this.generateFilename(paper);
|
|
40
|
+
const filePath = join(this.downloadDir, filename);
|
|
41
|
+
await this.ensureDir(dirname(filePath));
|
|
42
|
+
await this.downloadFile(pdfUrl, filePath);
|
|
43
|
+
// Compute checksum
|
|
44
|
+
const checksum = await this.computeChecksum(filePath);
|
|
45
|
+
// Get file size
|
|
46
|
+
const stats = await fs.stat(filePath);
|
|
47
|
+
const sizeBytes = stats.size;
|
|
48
|
+
// Get next REF-XXX ID
|
|
49
|
+
const refId = await this.assignRefId();
|
|
50
|
+
// Validate FAIR compliance
|
|
51
|
+
const fairScore = await this.validateFAIR({
|
|
52
|
+
paper,
|
|
53
|
+
filePath,
|
|
54
|
+
checksum,
|
|
55
|
+
refId,
|
|
56
|
+
acquiredAt: new Date().toISOString(),
|
|
57
|
+
sizeBytes,
|
|
58
|
+
});
|
|
59
|
+
const source = {
|
|
60
|
+
paper,
|
|
61
|
+
filePath,
|
|
62
|
+
checksum,
|
|
63
|
+
refId,
|
|
64
|
+
acquiredAt: new Date().toISOString(),
|
|
65
|
+
sizeBytes,
|
|
66
|
+
fairScore,
|
|
67
|
+
};
|
|
68
|
+
return source;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compute SHA-256 checksum of a file
|
|
72
|
+
*/
|
|
73
|
+
async computeChecksum(filePath) {
|
|
74
|
+
const content = await fs.readFile(filePath);
|
|
75
|
+
const hash = createHash('sha256');
|
|
76
|
+
hash.update(content);
|
|
77
|
+
return hash.digest('hex');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Assign next REF-XXX identifier
|
|
81
|
+
*/
|
|
82
|
+
async assignRefId(existingRefs) {
|
|
83
|
+
let refs = existingRefs;
|
|
84
|
+
// If not provided, scan sources directory
|
|
85
|
+
if (!refs) {
|
|
86
|
+
refs = await this.scanExistingRefs();
|
|
87
|
+
}
|
|
88
|
+
// Extract numbers from REF-XXX format
|
|
89
|
+
const refNumbers = refs
|
|
90
|
+
.filter((ref) => /^REF-\d{3}$/.test(ref))
|
|
91
|
+
.map((ref) => parseInt(ref.substring(4), 10))
|
|
92
|
+
.filter((n) => !isNaN(n));
|
|
93
|
+
// Find next available number
|
|
94
|
+
const maxNumber = refNumbers.length > 0 ? Math.max(...refNumbers) : 0;
|
|
95
|
+
const nextNumber = maxNumber + 1;
|
|
96
|
+
// Format as REF-XXX with zero padding
|
|
97
|
+
return `REF-${String(nextNumber).padStart(3, '0')}`;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate FAIR compliance
|
|
101
|
+
*/
|
|
102
|
+
async validateFAIR(source) {
|
|
103
|
+
const findable = this.assessFindable(source);
|
|
104
|
+
const accessible = this.assessAccessible(source);
|
|
105
|
+
const interoperable = this.assessInteroperable(source);
|
|
106
|
+
const reusable = this.assessReusable(source);
|
|
107
|
+
const overall = (findable.score +
|
|
108
|
+
accessible.score +
|
|
109
|
+
interoperable.score +
|
|
110
|
+
reusable.score) / 4;
|
|
111
|
+
const notes = [];
|
|
112
|
+
if (findable.score < 1.0) {
|
|
113
|
+
notes.push('Findability can be improved by adding more metadata');
|
|
114
|
+
}
|
|
115
|
+
if (accessible.score < 1.0) {
|
|
116
|
+
notes.push('Accessibility requires proper file permissions');
|
|
117
|
+
}
|
|
118
|
+
if (interoperable.score < 1.0) {
|
|
119
|
+
notes.push('Interoperability requires standard metadata format');
|
|
120
|
+
}
|
|
121
|
+
if (reusable.score < 1.0) {
|
|
122
|
+
notes.push('Reusability requires license information');
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
overall,
|
|
126
|
+
findable,
|
|
127
|
+
accessible,
|
|
128
|
+
interoperable,
|
|
129
|
+
reusable,
|
|
130
|
+
notes,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Assess Findable dimension
|
|
135
|
+
*/
|
|
136
|
+
assessFindable(source) {
|
|
137
|
+
const criteria = [
|
|
138
|
+
{
|
|
139
|
+
id: 'F1',
|
|
140
|
+
description: 'Assigned globally unique identifier (REF-XXX)',
|
|
141
|
+
met: !!source.refId && /^REF-\d{3}$/.test(source.refId),
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: 'F2',
|
|
145
|
+
description: 'Data described with rich metadata',
|
|
146
|
+
met: !!source.paper.title && source.paper.authors.length > 0,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
id: 'F3',
|
|
150
|
+
description: 'Metadata includes identifier',
|
|
151
|
+
met: !!(source.paper.doi || source.paper.arxivId),
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: 'F4',
|
|
155
|
+
description: 'Indexed in searchable resource',
|
|
156
|
+
met: true, // Assumed for papers from APIs
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
const metCount = criteria.filter((c) => c.met).length;
|
|
160
|
+
const score = metCount / criteria.length;
|
|
161
|
+
return { score, criteria };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Assess Accessible dimension
|
|
165
|
+
*/
|
|
166
|
+
assessAccessible(source) {
|
|
167
|
+
const criteria = [
|
|
168
|
+
{
|
|
169
|
+
id: 'A1',
|
|
170
|
+
description: 'Retrievable by identifier using standard protocol',
|
|
171
|
+
met: !!source.filePath,
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: 'A2',
|
|
175
|
+
description: 'Metadata accessible even when data unavailable',
|
|
176
|
+
met: true, // Paper metadata stored separately
|
|
177
|
+
},
|
|
178
|
+
];
|
|
179
|
+
const metCount = criteria.filter((c) => c.met).length;
|
|
180
|
+
const score = metCount / criteria.length;
|
|
181
|
+
return { score, criteria };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Assess Interoperable dimension
|
|
185
|
+
*/
|
|
186
|
+
assessInteroperable(source) {
|
|
187
|
+
const criteria = [
|
|
188
|
+
{
|
|
189
|
+
id: 'I1',
|
|
190
|
+
description: 'Uses formal, accessible knowledge representation',
|
|
191
|
+
met: true, // JSON metadata
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
id: 'I2',
|
|
195
|
+
description: 'Uses FAIR-compliant vocabularies',
|
|
196
|
+
met: true, // Standard paper metadata fields
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: 'I3',
|
|
200
|
+
description: 'Includes qualified references to other data',
|
|
201
|
+
met: !!(source.paper.doi || source.paper.arxivId),
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
const metCount = criteria.filter((c) => c.met).length;
|
|
205
|
+
const score = metCount / criteria.length;
|
|
206
|
+
return { score, criteria };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Assess Reusable dimension
|
|
210
|
+
*/
|
|
211
|
+
assessReusable(source) {
|
|
212
|
+
const criteria = [
|
|
213
|
+
{
|
|
214
|
+
id: 'R1',
|
|
215
|
+
description: 'Described with accurate metadata',
|
|
216
|
+
met: !!source.paper.abstract,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
id: 'R2',
|
|
220
|
+
description: 'Detailed provenance',
|
|
221
|
+
met: !!source.acquiredAt && !!source.paper.source,
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
id: 'R3',
|
|
225
|
+
description: 'Meets community standards',
|
|
226
|
+
met: true, // Academic paper from recognized source
|
|
227
|
+
},
|
|
228
|
+
];
|
|
229
|
+
const metCount = criteria.filter((c) => c.met).length;
|
|
230
|
+
const score = metCount / criteria.length;
|
|
231
|
+
return { score, criteria };
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Download file from URL
|
|
235
|
+
*/
|
|
236
|
+
async downloadFile(url, destination) {
|
|
237
|
+
const controller = new AbortController();
|
|
238
|
+
const timeoutId = setTimeout(() => controller.abort(), this.downloadTimeout);
|
|
239
|
+
try {
|
|
240
|
+
const response = await fetch(url, {
|
|
241
|
+
signal: controller.signal,
|
|
242
|
+
});
|
|
243
|
+
clearTimeout(timeoutId);
|
|
244
|
+
if (!response.ok) {
|
|
245
|
+
throw new Error(`Download failed: ${response.status}`);
|
|
246
|
+
}
|
|
247
|
+
const buffer = await response.arrayBuffer();
|
|
248
|
+
await fs.writeFile(destination, Buffer.from(buffer));
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
clearTimeout(timeoutId);
|
|
252
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
253
|
+
throw new Error(`Download timeout after ${this.downloadTimeout}ms`);
|
|
254
|
+
}
|
|
255
|
+
throw error;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Generate filename for paper
|
|
260
|
+
*/
|
|
261
|
+
generateFilename(paper) {
|
|
262
|
+
// Use first author's last name if available
|
|
263
|
+
let authorPart = 'unknown';
|
|
264
|
+
if (paper.authors.length > 0) {
|
|
265
|
+
const firstName = paper.authors[0].name;
|
|
266
|
+
const parts = firstName.split(' ');
|
|
267
|
+
authorPart = parts[parts.length - 1].toLowerCase();
|
|
268
|
+
}
|
|
269
|
+
// Use year
|
|
270
|
+
const yearPart = paper.year || 'unknown';
|
|
271
|
+
// Create slug from title (first 3 words)
|
|
272
|
+
const titleWords = paper.title
|
|
273
|
+
.toLowerCase()
|
|
274
|
+
.replace(/[^\w\s]/g, '')
|
|
275
|
+
.split(/\s+/)
|
|
276
|
+
.slice(0, 3)
|
|
277
|
+
.join('-');
|
|
278
|
+
return `${authorPart}-${yearPart}-${titleWords}.pdf`;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Scan existing REF-XXX identifiers
|
|
282
|
+
*/
|
|
283
|
+
async scanExistingRefs() {
|
|
284
|
+
const refs = [];
|
|
285
|
+
try {
|
|
286
|
+
const files = await fs.readdir(this.downloadDir);
|
|
287
|
+
for (const file of files) {
|
|
288
|
+
if (file.startsWith('REF-') && file.endsWith('.pdf')) {
|
|
289
|
+
const refId = file.substring(0, 7); // REF-XXX
|
|
290
|
+
refs.push(refId);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
// Directory doesn't exist yet
|
|
296
|
+
}
|
|
297
|
+
return refs;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Ensure directory exists
|
|
301
|
+
*/
|
|
302
|
+
async ensureDir(dir) {
|
|
303
|
+
try {
|
|
304
|
+
await fs.mkdir(dir, { recursive: true });
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
if (error.code !== 'EEXIST') {
|
|
308
|
+
throw error;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=acquisition.js.map
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archival service for OAIS-compliant packaging
|
|
3
|
+
*
|
|
4
|
+
* @module research/services/archival
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { createHash } from 'crypto';
|
|
9
|
+
/**
|
|
10
|
+
* Archival service for OAIS package management
|
|
11
|
+
*/
|
|
12
|
+
export class ArchivalService {
|
|
13
|
+
archiveDir;
|
|
14
|
+
formatVersion;
|
|
15
|
+
constructor(config = {}) {
|
|
16
|
+
this.archiveDir = config.archiveDir || '.aiwg/research/archives';
|
|
17
|
+
this.formatVersion = config.formatVersion || '1.0';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create OAIS archive package
|
|
21
|
+
*/
|
|
22
|
+
async createPackage(sources, type) {
|
|
23
|
+
const id = this.generatePackageId(type);
|
|
24
|
+
const packagePath = join(this.archiveDir, type.toLowerCase(), id);
|
|
25
|
+
// Create package directory
|
|
26
|
+
await this.ensureDir(packagePath);
|
|
27
|
+
// Create subdirectories
|
|
28
|
+
await this.ensureDir(join(packagePath, 'data'));
|
|
29
|
+
await this.ensureDir(join(packagePath, 'metadata'));
|
|
30
|
+
// Copy source files and metadata
|
|
31
|
+
const refIds = [];
|
|
32
|
+
const manifestEntries = [];
|
|
33
|
+
for (const source of sources) {
|
|
34
|
+
refIds.push(source.refId);
|
|
35
|
+
// Copy PDF to package
|
|
36
|
+
const destPath = join(packagePath, 'data', `${source.refId}.pdf`);
|
|
37
|
+
await fs.copyFile(source.filePath, destPath);
|
|
38
|
+
// Create metadata file
|
|
39
|
+
const metadataPath = join(packagePath, 'metadata', `${source.refId}.json`);
|
|
40
|
+
await fs.writeFile(metadataPath, JSON.stringify({
|
|
41
|
+
paper: source.paper,
|
|
42
|
+
refId: source.refId,
|
|
43
|
+
acquiredAt: source.acquiredAt,
|
|
44
|
+
originalChecksum: source.checksum,
|
|
45
|
+
}, null, 2), 'utf-8');
|
|
46
|
+
manifestEntries.push({
|
|
47
|
+
refId: source.refId,
|
|
48
|
+
originalPath: source.filePath,
|
|
49
|
+
packagePath: destPath,
|
|
50
|
+
checksum: source.checksum,
|
|
51
|
+
sizeBytes: source.sizeBytes,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Create manifest
|
|
55
|
+
const manifestPath = join(packagePath, 'manifest.json');
|
|
56
|
+
const manifest = {
|
|
57
|
+
packageId: id,
|
|
58
|
+
packageType: type,
|
|
59
|
+
formatVersion: this.formatVersion,
|
|
60
|
+
createdAt: new Date().toISOString(),
|
|
61
|
+
sourceCount: sources.length,
|
|
62
|
+
entries: manifestEntries,
|
|
63
|
+
};
|
|
64
|
+
await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');
|
|
65
|
+
// Calculate total size
|
|
66
|
+
let totalSize = 0;
|
|
67
|
+
for (const entry of manifestEntries) {
|
|
68
|
+
totalSize += entry.sizeBytes;
|
|
69
|
+
}
|
|
70
|
+
// Compute package checksum
|
|
71
|
+
const packageChecksum = await this.computeDirectoryChecksum(packagePath);
|
|
72
|
+
const archivePackage = {
|
|
73
|
+
type,
|
|
74
|
+
id,
|
|
75
|
+
path: packagePath,
|
|
76
|
+
createdAt: new Date().toISOString(),
|
|
77
|
+
sources: refIds,
|
|
78
|
+
manifestPath,
|
|
79
|
+
sizeBytes: totalSize,
|
|
80
|
+
packageChecksum,
|
|
81
|
+
};
|
|
82
|
+
return archivePackage;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Verify integrity of archive package
|
|
86
|
+
*/
|
|
87
|
+
async verifyIntegrity(packagePath) {
|
|
88
|
+
const manifestPath = join(packagePath, 'manifest.json');
|
|
89
|
+
// Load manifest
|
|
90
|
+
let manifest;
|
|
91
|
+
try {
|
|
92
|
+
const data = await fs.readFile(manifestPath, 'utf-8');
|
|
93
|
+
manifest = JSON.parse(data);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return {
|
|
97
|
+
valid: false,
|
|
98
|
+
verifiedAt: new Date().toISOString(),
|
|
99
|
+
files: [],
|
|
100
|
+
missingFiles: [],
|
|
101
|
+
extraFiles: [],
|
|
102
|
+
summary: 'Failed to load manifest',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const fileResults = [];
|
|
106
|
+
const missingFiles = [];
|
|
107
|
+
const expectedFiles = new Set();
|
|
108
|
+
// Verify each file in manifest
|
|
109
|
+
for (const entry of manifest.entries) {
|
|
110
|
+
expectedFiles.add(entry.packagePath);
|
|
111
|
+
try {
|
|
112
|
+
const actualChecksum = await this.computeChecksum(entry.packagePath);
|
|
113
|
+
const valid = actualChecksum === entry.checksum;
|
|
114
|
+
fileResults.push({
|
|
115
|
+
path: entry.packagePath,
|
|
116
|
+
expectedChecksum: entry.checksum,
|
|
117
|
+
actualChecksum,
|
|
118
|
+
valid,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
missingFiles.push(entry.packagePath);
|
|
123
|
+
fileResults.push({
|
|
124
|
+
path: entry.packagePath,
|
|
125
|
+
expectedChecksum: entry.checksum,
|
|
126
|
+
actualChecksum: '',
|
|
127
|
+
valid: false,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Check for extra files
|
|
132
|
+
const actualFiles = await this.listFilesRecursive(join(packagePath, 'data'));
|
|
133
|
+
const extraFiles = actualFiles.filter((f) => !expectedFiles.has(f));
|
|
134
|
+
const allValid = fileResults.every((f) => f.valid) &&
|
|
135
|
+
missingFiles.length === 0 &&
|
|
136
|
+
extraFiles.length === 0;
|
|
137
|
+
const summary = allValid
|
|
138
|
+
? 'Package integrity verified'
|
|
139
|
+
: `Integrity check failed: ${fileResults.filter((f) => !f.valid).length} invalid, ${missingFiles.length} missing, ${extraFiles.length} extra`;
|
|
140
|
+
return {
|
|
141
|
+
valid: allValid,
|
|
142
|
+
verifiedAt: new Date().toISOString(),
|
|
143
|
+
files: fileResults,
|
|
144
|
+
missingFiles,
|
|
145
|
+
extraFiles,
|
|
146
|
+
summary,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Export reproducibility package for workflow
|
|
151
|
+
*/
|
|
152
|
+
async exportReproducibilityPackage(workflowId) {
|
|
153
|
+
const exportPath = join(this.archiveDir, 'reproducibility', `${workflowId}-${Date.now()}.zip`);
|
|
154
|
+
await this.ensureDir(dirname(exportPath));
|
|
155
|
+
// Create a simple marker file (full implementation would create ZIP)
|
|
156
|
+
await fs.writeFile(exportPath.replace('.zip', '.txt'), `Reproducibility package for workflow ${workflowId}\nCreated: ${new Date().toISOString()}`, 'utf-8');
|
|
157
|
+
return exportPath;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Compute checksum of file
|
|
161
|
+
*/
|
|
162
|
+
async computeChecksum(filePath) {
|
|
163
|
+
const content = await fs.readFile(filePath);
|
|
164
|
+
const hash = createHash('sha256');
|
|
165
|
+
hash.update(content);
|
|
166
|
+
return hash.digest('hex');
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Compute checksum of directory contents
|
|
170
|
+
*/
|
|
171
|
+
async computeDirectoryChecksum(dirPath) {
|
|
172
|
+
const files = await this.listFilesRecursive(dirPath);
|
|
173
|
+
files.sort(); // Ensure consistent ordering
|
|
174
|
+
const hash = createHash('sha256');
|
|
175
|
+
for (const file of files) {
|
|
176
|
+
const content = await fs.readFile(file);
|
|
177
|
+
hash.update(content);
|
|
178
|
+
}
|
|
179
|
+
return hash.digest('hex');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* List all files recursively
|
|
183
|
+
*/
|
|
184
|
+
async listFilesRecursive(dirPath) {
|
|
185
|
+
const files = [];
|
|
186
|
+
try {
|
|
187
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
188
|
+
for (const entry of entries) {
|
|
189
|
+
const fullPath = join(dirPath, entry.name);
|
|
190
|
+
if (entry.isDirectory()) {
|
|
191
|
+
const subFiles = await this.listFilesRecursive(fullPath);
|
|
192
|
+
files.push(...subFiles);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
files.push(fullPath);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
// Directory doesn't exist
|
|
201
|
+
}
|
|
202
|
+
return files;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Generate package ID
|
|
206
|
+
*/
|
|
207
|
+
generatePackageId(type) {
|
|
208
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
209
|
+
return `${type.toLowerCase()}-${timestamp}`;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Ensure directory exists
|
|
213
|
+
*/
|
|
214
|
+
async ensureDir(dir) {
|
|
215
|
+
try {
|
|
216
|
+
await fs.mkdir(dir, { recursive: true });
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (error.code !== 'EEXIST') {
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=archival.js.map
|