oh-my-knowledge 0.33.0 → 0.35.0
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 -5
- package/README.zh.md +25 -9
- package/dist/analysis/coverage-analyzer.d.ts +0 -1
- package/dist/analysis/coverage-analyzer.js +0 -1
- package/dist/analysis/failure-clusterer.d.ts +0 -1
- package/dist/analysis/failure-clusterer.js +0 -1
- package/dist/analysis/gap-analyzer.d.ts +0 -1
- package/dist/analysis/gap-analyzer.js +0 -1
- package/dist/analysis/hedging-classifier.d.ts +0 -1
- package/dist/analysis/hedging-classifier.js +1 -2
- package/dist/analysis/report-diagnostics.d.ts +0 -1
- package/dist/analysis/report-diagnostics.js +0 -1
- package/dist/analysis/sample-diagnostics.d.ts +1 -2
- package/dist/analysis/sample-diagnostics.js +18 -19
- package/dist/analysis/saturation.d.ts +0 -1
- package/dist/analysis/saturation.js +0 -1
- package/dist/assets/agent-skills/omk/SKILL.md +197 -0
- package/dist/assets/agent-skills/omk/references/commands.md +556 -0
- package/dist/authoring/evolver.d.ts +130 -6
- package/dist/authoring/evolver.js +233 -35
- package/dist/authoring/generator.d.ts +0 -1
- package/dist/authoring/generator.js +0 -1
- package/dist/authoring/sample-fixer.d.ts +0 -1
- package/dist/authoring/sample-fixer.js +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -1
- package/dist/cli/commands/doctor.js +2 -3
- package/dist/cli/commands/eval/gold/compare.d.ts +0 -1
- package/dist/cli/commands/eval/gold/compare.js +0 -1
- package/dist/cli/commands/eval/gold/index.d.ts +0 -1
- package/dist/cli/commands/eval/gold/index.js +0 -1
- package/dist/cli/commands/eval/gold/init.d.ts +0 -1
- package/dist/cli/commands/eval/gold/init.js +0 -1
- package/dist/cli/commands/eval/gold/validate.d.ts +0 -1
- package/dist/cli/commands/eval/gold/validate.js +0 -1
- package/dist/cli/commands/eval/index.d.ts +3 -1
- package/dist/cli/commands/eval/index.js +56 -11
- package/dist/cli/commands/evolve.d.ts +6 -1
- package/dist/cli/commands/evolve.js +77 -6
- package/dist/cli/commands/init.d.ts +0 -1
- package/dist/cli/commands/init.js +0 -1
- package/dist/cli/commands/install.d.ts +24 -0
- package/dist/cli/commands/install.js +436 -0
- package/dist/cli/commands/observe/inbox.d.ts +0 -1
- package/dist/cli/commands/observe/inbox.js +0 -1
- package/dist/cli/commands/observe/index.d.ts +0 -1
- package/dist/cli/commands/observe/index.js +0 -1
- package/dist/cli/commands/observe/ingest.d.ts +0 -1
- package/dist/cli/commands/observe/ingest.js +0 -1
- package/dist/cli/commands/observe/show.d.ts +0 -1
- package/dist/cli/commands/observe/show.js +0 -1
- package/dist/cli/commands/sample.d.ts +1 -2
- package/dist/cli/commands/sample.js +27 -15
- package/dist/cli/commands/studio.d.ts +0 -1
- package/dist/cli/commands/studio.js +0 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.js +1 -2
- package/dist/cli/lib/cli-exit.d.ts +0 -1
- package/dist/cli/lib/cli-exit.js +0 -1
- package/dist/cli/lib/cmd-flags.d.ts +7 -1
- package/dist/cli/lib/cmd-flags.js +0 -1
- package/dist/cli/lib/i18n-dict/common.d.ts +0 -1
- package/dist/cli/lib/i18n-dict/common.js +0 -1
- package/dist/cli/lib/i18n-dict/evolve.d.ts +1 -2
- package/dist/cli/lib/i18n-dict/evolve.js +16 -1
- package/dist/cli/lib/i18n-dict/gen.d.ts +0 -1
- package/dist/cli/lib/i18n-dict/gen.js +0 -1
- package/dist/cli/lib/i18n-dict/help.d.ts +0 -1
- package/dist/cli/lib/i18n-dict/help.js +0 -1
- package/dist/cli/lib/i18n-dict/init.d.ts +0 -1
- package/dist/cli/lib/i18n-dict/init.js +0 -1
- package/dist/cli/lib/i18n-dict/install.d.ts +3 -0
- package/dist/cli/lib/i18n-dict/install.js +110 -0
- package/dist/cli/lib/i18n-dict/run.d.ts +1 -2
- package/dist/cli/lib/i18n-dict/run.js +8 -1
- package/dist/cli/lib/i18n-dict/types.d.ts +0 -1
- package/dist/cli/lib/i18n-dict/types.js +0 -1
- package/dist/cli/lib/i18n-dict.d.ts +2 -2
- package/dist/cli/lib/i18n-dict.js +2 -1
- package/dist/cli/lib/i18n.d.ts +0 -1
- package/dist/cli/lib/i18n.js +0 -1
- package/dist/cli/lib/parse-run-config/judge-models.d.ts +0 -1
- package/dist/cli/lib/parse-run-config/judge-models.js +0 -1
- package/dist/cli/lib/parse-run-config/samples-discovery.d.ts +0 -1
- package/dist/cli/lib/parse-run-config/samples-discovery.js +1 -4
- package/dist/cli/lib/parse-run-config/variant-resolution.d.ts +0 -1
- package/dist/cli/lib/parse-run-config/variant-resolution.js +41 -8
- package/dist/cli/lib/parse-run-config.d.ts +0 -1
- package/dist/cli/lib/parse-run-config.js +1 -2
- package/dist/cli/lib/progress.d.ts +0 -1
- package/dist/cli/lib/progress.js +0 -1
- package/dist/cli/lib/resolve-skill-input.d.ts +0 -1
- package/dist/cli/lib/resolve-skill-input.js +0 -1
- package/dist/cli/lib/run-tally.d.ts +0 -1
- package/dist/cli/lib/run-tally.js +1 -2
- package/dist/cli/lib/shared.d.ts +0 -1
- package/dist/cli/lib/shared.js +1 -2
- package/dist/cli/lib/update-check.d.ts +0 -1
- package/dist/cli/lib/update-check.js +0 -1
- package/dist/cli/lib/update-fetch-worker.d.ts +0 -1
- package/dist/cli/lib/update-fetch-worker.js +0 -1
- package/dist/cli/oclif/base-command.d.ts +0 -1
- package/dist/cli/oclif/base-command.js +0 -1
- package/dist/cli/oclif/help.d.ts +0 -1
- package/dist/cli/oclif/help.js +0 -1
- package/dist/cli/oclif/i18n.d.ts +0 -1
- package/dist/cli/oclif/i18n.js +0 -1
- package/dist/cli/oclif/parsers.d.ts +0 -1
- package/dist/cli/oclif/parsers.js +0 -1
- package/dist/cli/oclif/projection.d.ts +0 -1
- package/dist/cli/oclif/projection.js +0 -1
- package/dist/cli/oclif/run.d.ts +0 -1
- package/dist/cli/oclif/run.js +0 -1
- package/dist/diagnosis/observe-mapper.d.ts +2 -3
- package/dist/diagnosis/observe-mapper.js +6 -7
- package/dist/diagnosis/observe-producer.d.ts +0 -1
- package/dist/diagnosis/observe-producer.js +3 -4
- package/dist/diagnosis/studio-projection.d.ts +0 -1
- package/dist/diagnosis/studio-projection.js +0 -1
- package/dist/diagnosis/types.d.ts +0 -1
- package/dist/diagnosis/types.js +0 -1
- package/dist/doctor/fixer.d.ts +0 -1
- package/dist/doctor/fixer.js +0 -1
- package/dist/doctor/health/builtin-dimensions.d.ts +0 -1
- package/dist/doctor/health/builtin-dimensions.js +0 -1
- package/dist/doctor/health/composer.d.ts +0 -1
- package/dist/doctor/health/composer.js +1 -2
- package/dist/doctor/health/dimension-registry.d.ts +0 -1
- package/dist/doctor/health/dimension-registry.js +0 -1
- package/dist/doctor/health/dimension-spec.d.ts +0 -1
- package/dist/doctor/health/dimension-spec.js +0 -1
- package/dist/doctor/health/load-custom-dimensions.d.ts +0 -1
- package/dist/doctor/health/load-custom-dimensions.js +0 -1
- package/dist/doctor/health/parser.d.ts +0 -1
- package/dist/doctor/health/parser.js +0 -1
- package/dist/doctor/health/prompt-builder.d.ts +0 -1
- package/dist/doctor/health/prompt-builder.js +0 -1
- package/dist/doctor/health/register.d.ts +0 -1
- package/dist/doctor/health/register.js +0 -1
- package/dist/doctor/index.d.ts +0 -1
- package/dist/doctor/index.js +6 -7
- package/dist/doctor/messages.d.ts +0 -1
- package/dist/doctor/messages.js +1 -2
- package/dist/doctor/preflight.d.ts +0 -1
- package/dist/doctor/preflight.js +0 -1
- package/dist/doctor/renderer.d.ts +0 -1
- package/dist/doctor/renderer.js +0 -1
- package/dist/doctor/rules.d.ts +0 -1
- package/dist/doctor/rules.js +0 -1
- package/dist/eval-core/bootstrap.d.ts +0 -1
- package/dist/eval-core/bootstrap.js +0 -1
- package/dist/eval-core/cache.d.ts +11 -4
- package/dist/eval-core/cache.js +13 -6
- package/dist/eval-core/comparability.d.ts +0 -1
- package/dist/eval-core/comparability.js +3 -4
- package/dist/eval-core/dependency-checker.d.ts +0 -1
- package/dist/eval-core/dependency-checker.js +5 -3
- package/dist/eval-core/evaluation-execution.d.ts +0 -1
- package/dist/eval-core/evaluation-execution.js +4 -2
- package/dist/eval-core/evaluation-job.d.ts +0 -1
- package/dist/eval-core/evaluation-job.js +0 -1
- package/dist/eval-core/evaluation-reporting.d.ts +0 -1
- package/dist/eval-core/evaluation-reporting.js +18 -8
- package/dist/eval-core/execution-strategy.d.ts +0 -1
- package/dist/eval-core/execution-strategy.js +8 -3
- package/dist/eval-core/fact-checker.d.ts +0 -1
- package/dist/eval-core/fact-checker.js +0 -1
- package/dist/eval-core/layer-gates.d.ts +0 -1
- package/dist/eval-core/layer-gates.js +0 -1
- package/dist/eval-core/mocks-runtime.d.ts +0 -1
- package/dist/eval-core/mocks-runtime.js +0 -1
- package/dist/eval-core/schema.d.ts +0 -1
- package/dist/eval-core/schema.js +0 -1
- package/dist/eval-core/statistics.d.ts +0 -1
- package/dist/eval-core/statistics.js +0 -1
- package/dist/eval-core/task-planner.d.ts +0 -1
- package/dist/eval-core/task-planner.js +2 -2
- package/dist/eval-core/verdict.d.ts +0 -1
- package/dist/eval-core/verdict.js +0 -1
- package/dist/eval-workflows/batch-evaluation-workflow.d.ts +18 -3
- package/dist/eval-workflows/batch-evaluation-workflow.js +31 -15
- package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.d.ts +0 -1
- package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.js +0 -1
- package/dist/eval-workflows/evaluation-pipeline/report-finalize.d.ts +0 -1
- package/dist/eval-workflows/evaluation-pipeline/report-finalize.js +0 -1
- package/dist/eval-workflows/evaluation-pipeline/run-state.d.ts +0 -1
- package/dist/eval-workflows/evaluation-pipeline/run-state.js +0 -1
- package/dist/eval-workflows/evaluation-pipeline/test-set-hash.d.ts +0 -1
- package/dist/eval-workflows/evaluation-pipeline/test-set-hash.js +0 -1
- package/dist/eval-workflows/evaluation-pipeline.d.ts +0 -1
- package/dist/eval-workflows/evaluation-pipeline.js +0 -1
- package/dist/eval-workflows/evaluation-preparation.d.ts +1 -5
- package/dist/eval-workflows/evaluation-preparation.js +22 -44
- package/dist/eval-workflows/messages.d.ts +0 -1
- package/dist/eval-workflows/messages.js +0 -1
- package/dist/eval-workflows/run-evaluation.d.ts +3 -8
- package/dist/eval-workflows/run-evaluation.js +9 -19
- package/dist/executors/anthropic-api.d.ts +0 -1
- package/dist/executors/anthropic-api.js +1 -2
- package/dist/executors/claude-cli.d.ts +0 -1
- package/dist/executors/claude-cli.js +0 -1
- package/dist/executors/claude-sdk-trace.d.ts +0 -1
- package/dist/executors/claude-sdk-trace.js +0 -1
- package/dist/executors/claude-sdk.d.ts +0 -1
- package/dist/executors/claude-sdk.js +0 -1
- package/dist/executors/codex-cli-trace.d.ts +0 -1
- package/dist/executors/codex-cli-trace.js +0 -1
- package/dist/executors/codex-cli.d.ts +0 -1
- package/dist/executors/codex-cli.js +0 -1
- package/dist/executors/codex-sdk.d.ts +0 -1
- package/dist/executors/codex-sdk.js +0 -1
- package/dist/executors/gemini.d.ts +0 -1
- package/dist/executors/gemini.js +0 -1
- package/dist/executors/index.d.ts +0 -1
- package/dist/executors/index.js +0 -1
- package/dist/executors/openai-api.d.ts +0 -1
- package/dist/executors/openai-api.js +0 -1
- package/dist/executors/runtime-fingerprint.d.ts +0 -1
- package/dist/executors/runtime-fingerprint.js +2 -3
- package/dist/executors/script.d.ts +0 -1
- package/dist/executors/script.js +0 -1
- package/dist/executors/shared.d.ts +0 -2
- package/dist/executors/shared.js +0 -1
- package/dist/grading/assertions.d.ts +0 -1
- package/dist/grading/assertions.js +0 -1
- package/dist/grading/debias-validate.d.ts +0 -1
- package/dist/grading/debias-validate.js +0 -1
- package/dist/grading/diagnostic.d.ts +0 -1
- package/dist/grading/diagnostic.js +0 -1
- package/dist/grading/gold-cli.d.ts +0 -1
- package/dist/grading/gold-cli.js +0 -1
- package/dist/grading/gold-dataset.d.ts +0 -1
- package/dist/grading/gold-dataset.js +0 -1
- package/dist/grading/human-gold.d.ts +0 -1
- package/dist/grading/human-gold.js +0 -1
- package/dist/grading/index.d.ts +0 -1
- package/dist/grading/index.js +0 -1
- package/dist/grading/judge.d.ts +0 -1
- package/dist/grading/judge.js +0 -1
- package/dist/grading/layered-scores.d.ts +0 -1
- package/dist/grading/layered-scores.js +0 -1
- package/dist/inputs/content-hash.d.ts +28 -0
- package/dist/inputs/content-hash.js +106 -0
- package/dist/inputs/eval-config.d.ts +0 -1
- package/dist/inputs/eval-config.js +44 -11
- package/dist/inputs/load-samples.d.ts +0 -1
- package/dist/inputs/load-samples.js +0 -1
- package/dist/inputs/materialize-copy.d.ts +37 -0
- package/dist/inputs/materialize-copy.js +193 -0
- package/dist/inputs/mcp-resolver.d.ts +0 -1
- package/dist/inputs/mcp-resolver.js +0 -1
- package/dist/inputs/skill-loader.d.ts +145 -12
- package/dist/inputs/skill-loader.js +476 -60
- package/dist/inputs/source-resolver.d.ts +35 -0
- package/dist/inputs/source-resolver.js +105 -0
- package/dist/inputs/url-fetcher.d.ts +0 -1
- package/dist/inputs/url-fetcher.js +0 -1
- package/dist/managed/evidence.d.ts +22 -0
- package/dist/managed/evidence.js +143 -0
- package/dist/managed/index.d.ts +6 -0
- package/dist/managed/index.js +6 -0
- package/dist/managed/store.d.ts +72 -0
- package/dist/managed/store.js +224 -0
- package/dist/observability/experience-frontmatter.d.ts +0 -1
- package/dist/observability/experience-frontmatter.js +0 -1
- package/dist/observability/experience.d.ts +1 -2
- package/dist/observability/experience.js +1 -2
- package/dist/observability/feedback-matchers.d.ts +0 -1
- package/dist/observability/feedback-matchers.js +0 -1
- package/dist/observability/feedback-projection.d.ts +0 -1
- package/dist/observability/feedback-projection.js +0 -1
- package/dist/observability/inbox-view-model.d.ts +0 -1
- package/dist/observability/inbox-view-model.js +0 -1
- package/dist/observability/inbox.d.ts +0 -1
- package/dist/observability/inbox.js +2 -3
- package/dist/observability/problem-patterns.d.ts +0 -1
- package/dist/observability/problem-patterns.js +0 -1
- package/dist/observability/resolved-review.d.ts +0 -1
- package/dist/observability/resolved-review.js +4 -5
- package/dist/observability/review-state.d.ts +0 -1
- package/dist/observability/review-state.js +3 -4
- package/dist/observability/skill-chain-advisories.d.ts +0 -1
- package/dist/observability/skill-chain-advisories.js +0 -1
- package/dist/observability/skill-chain.d.ts +0 -1
- package/dist/observability/skill-chain.js +5 -6
- package/dist/observability/skill-health-analyzer.d.ts +0 -1
- package/dist/observability/skill-health-analyzer.js +0 -1
- package/dist/observability/soft-standards/constants.d.ts +0 -1
- package/dist/observability/soft-standards/constants.js +0 -1
- package/dist/observability/soft-standards/index.d.ts +0 -1
- package/dist/observability/soft-standards/index.js +0 -1
- package/dist/observability/soft-standards/llm-extractor.d.ts +0 -1
- package/dist/observability/soft-standards/llm-extractor.js +7 -8
- package/dist/observability/soft-standards/runtime-evaluator.d.ts +0 -1
- package/dist/observability/soft-standards/runtime-evaluator.js +2 -3
- package/dist/observability/soft-standards/skill-standards-store.d.ts +0 -1
- package/dist/observability/soft-standards/skill-standards-store.js +5 -6
- package/dist/observability/soft-standards/types.d.ts +10 -11
- package/dist/observability/soft-standards/types.js +0 -1
- package/dist/observability/text-signals.d.ts +0 -1
- package/dist/observability/text-signals.js +0 -1
- package/dist/observability/trace-adapter.d.ts +0 -1
- package/dist/observability/trace-adapter.js +0 -1
- package/dist/observability/trace-attribution.d.ts +0 -1
- package/dist/observability/trace-attribution.js +0 -1
- package/dist/observability/trace-segmenter.d.ts +0 -1
- package/dist/observability/trace-segmenter.js +0 -1
- package/dist/observability/trace-source.d.ts +0 -1
- package/dist/observability/trace-source.js +0 -1
- package/dist/renderer/html-renderer.d.ts +0 -1
- package/dist/renderer/html-renderer.js +4 -5
- package/dist/renderer/layout.d.ts +0 -1
- package/dist/renderer/layout.js +2 -3
- package/dist/renderer/observation-inbox/helpers.d.ts +0 -1
- package/dist/renderer/observation-inbox/helpers.js +0 -1
- package/dist/renderer/observation-inbox/styles.d.ts +0 -1
- package/dist/renderer/observation-inbox/styles.js +0 -1
- package/dist/renderer/observation-inbox-renderer.d.ts +0 -1
- package/dist/renderer/observation-inbox-renderer.js +13 -14
- package/dist/renderer/skill-detail-renderer.d.ts +0 -1
- package/dist/renderer/skill-detail-renderer.js +3 -4
- package/dist/renderer/skill-health-renderer.d.ts +0 -1
- package/dist/renderer/skill-health-renderer.js +0 -1
- package/dist/renderer/skill-list-renderer.d.ts +0 -1
- package/dist/renderer/skill-list-renderer.js +0 -1
- package/dist/renderer/summary.d.ts +0 -1
- package/dist/renderer/summary.js +1 -2
- package/dist/renderer/table.d.ts +0 -1
- package/dist/renderer/table.js +0 -1
- package/dist/renderer/test-view.d.ts +0 -1
- package/dist/renderer/test-view.js +0 -1
- package/dist/renderer/trends.d.ts +0 -1
- package/dist/renderer/trends.js +0 -1
- package/dist/server/job-store.d.ts +0 -1
- package/dist/server/job-store.js +0 -1
- package/dist/server/report-server.d.ts +0 -1
- package/dist/server/report-server.js +1 -2
- package/dist/server/report-store.d.ts +1 -2
- package/dist/server/report-store.js +6 -7
- package/dist/server/skill-index.d.ts +0 -1
- package/dist/server/skill-index.js +4 -5
- package/dist/server/skill-insights.d.ts +0 -1
- package/dist/server/skill-insights.js +8 -9
- package/dist/shared/hard-rules.d.ts +0 -1
- package/dist/shared/hard-rules.js +0 -1
- package/dist/shared/llm-prompts/index.d.ts +0 -1
- package/dist/shared/llm-prompts/index.js +0 -1
- package/dist/shared/llm-prompts/skill-health.d.ts +0 -1
- package/dist/shared/llm-prompts/skill-health.js +0 -1
- package/dist/shared/time.d.ts +0 -1
- package/dist/shared/time.js +0 -1
- package/dist/shared/tool-search.d.ts +0 -1
- package/dist/shared/tool-search.js +0 -1
- package/dist/types/dependencies.d.ts +0 -1
- package/dist/types/dependencies.js +0 -1
- package/dist/types/diagnosis.d.ts +0 -1
- package/dist/types/diagnosis.js +0 -1
- package/dist/types/doctor.d.ts +4 -5
- package/dist/types/doctor.js +2 -3
- package/dist/types/eval.d.ts +13 -2
- package/dist/types/eval.js +0 -1
- package/dist/types/executor.d.ts +1 -2
- package/dist/types/executor.js +0 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/judge.d.ts +0 -1
- package/dist/types/judge.js +0 -1
- package/dist/types/managed.d.ts +110 -0
- package/dist/types/managed.js +1 -0
- package/dist/types/observability.d.ts +5 -6
- package/dist/types/observability.js +0 -1
- package/dist/types/report.d.ts +19 -6
- package/dist/types/report.js +0 -1
- package/dist/types/shared.d.ts +0 -1
- package/dist/types/shared.js +0 -1
- package/dist/types/skill-index.d.ts +0 -1
- package/dist/types/skill-index.js +0 -1
- package/dist/types/storage.d.ts +0 -1
- package/dist/types/storage.js +0 -1
- package/dist/util/safe-slice.d.ts +0 -1
- package/dist/util/safe-slice.js +0 -1
- package/package.json +9 -4
- package/dist/analysis/coverage-analyzer.d.ts.map +0 -1
- package/dist/analysis/coverage-analyzer.js.map +0 -1
- package/dist/analysis/failure-clusterer.d.ts.map +0 -1
- package/dist/analysis/failure-clusterer.js.map +0 -1
- package/dist/analysis/gap-analyzer.d.ts.map +0 -1
- package/dist/analysis/gap-analyzer.js.map +0 -1
- package/dist/analysis/hedging-classifier.d.ts.map +0 -1
- package/dist/analysis/hedging-classifier.js.map +0 -1
- package/dist/analysis/report-diagnostics.d.ts.map +0 -1
- package/dist/analysis/report-diagnostics.js.map +0 -1
- package/dist/analysis/sample-diagnostics.d.ts.map +0 -1
- package/dist/analysis/sample-diagnostics.js.map +0 -1
- package/dist/analysis/saturation.d.ts.map +0 -1
- package/dist/analysis/saturation.js.map +0 -1
- package/dist/authoring/evolver.d.ts.map +0 -1
- package/dist/authoring/evolver.js.map +0 -1
- package/dist/authoring/generator.d.ts.map +0 -1
- package/dist/authoring/generator.js.map +0 -1
- package/dist/authoring/sample-fixer.d.ts.map +0 -1
- package/dist/authoring/sample-fixer.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/eval/gold/compare.d.ts.map +0 -1
- package/dist/cli/commands/eval/gold/compare.js.map +0 -1
- package/dist/cli/commands/eval/gold/index.d.ts.map +0 -1
- package/dist/cli/commands/eval/gold/index.js.map +0 -1
- package/dist/cli/commands/eval/gold/init.d.ts.map +0 -1
- package/dist/cli/commands/eval/gold/init.js.map +0 -1
- package/dist/cli/commands/eval/gold/validate.d.ts.map +0 -1
- package/dist/cli/commands/eval/gold/validate.js.map +0 -1
- package/dist/cli/commands/eval/index.d.ts.map +0 -1
- package/dist/cli/commands/eval/index.js.map +0 -1
- package/dist/cli/commands/evolve.d.ts.map +0 -1
- package/dist/cli/commands/evolve.js.map +0 -1
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/observe/inbox.d.ts.map +0 -1
- package/dist/cli/commands/observe/inbox.js.map +0 -1
- package/dist/cli/commands/observe/index.d.ts.map +0 -1
- package/dist/cli/commands/observe/index.js.map +0 -1
- package/dist/cli/commands/observe/ingest.d.ts.map +0 -1
- package/dist/cli/commands/observe/ingest.js.map +0 -1
- package/dist/cli/commands/observe/show.d.ts.map +0 -1
- package/dist/cli/commands/observe/show.js.map +0 -1
- package/dist/cli/commands/sample.d.ts.map +0 -1
- package/dist/cli/commands/sample.js.map +0 -1
- package/dist/cli/commands/studio.d.ts.map +0 -1
- package/dist/cli/commands/studio.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/lib/cli-exit.d.ts.map +0 -1
- package/dist/cli/lib/cli-exit.js.map +0 -1
- package/dist/cli/lib/cmd-flags.d.ts.map +0 -1
- package/dist/cli/lib/cmd-flags.js.map +0 -1
- package/dist/cli/lib/i18n-dict/common.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict/common.js.map +0 -1
- package/dist/cli/lib/i18n-dict/evolve.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict/evolve.js.map +0 -1
- package/dist/cli/lib/i18n-dict/gen.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict/gen.js.map +0 -1
- package/dist/cli/lib/i18n-dict/help.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict/help.js.map +0 -1
- package/dist/cli/lib/i18n-dict/init.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict/init.js.map +0 -1
- package/dist/cli/lib/i18n-dict/run.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict/run.js.map +0 -1
- package/dist/cli/lib/i18n-dict/types.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict/types.js.map +0 -1
- package/dist/cli/lib/i18n-dict.d.ts.map +0 -1
- package/dist/cli/lib/i18n-dict.js.map +0 -1
- package/dist/cli/lib/i18n.d.ts.map +0 -1
- package/dist/cli/lib/i18n.js.map +0 -1
- package/dist/cli/lib/parse-run-config/judge-models.d.ts.map +0 -1
- package/dist/cli/lib/parse-run-config/judge-models.js.map +0 -1
- package/dist/cli/lib/parse-run-config/samples-discovery.d.ts.map +0 -1
- package/dist/cli/lib/parse-run-config/samples-discovery.js.map +0 -1
- package/dist/cli/lib/parse-run-config/variant-resolution.d.ts.map +0 -1
- package/dist/cli/lib/parse-run-config/variant-resolution.js.map +0 -1
- package/dist/cli/lib/parse-run-config.d.ts.map +0 -1
- package/dist/cli/lib/parse-run-config.js.map +0 -1
- package/dist/cli/lib/progress.d.ts.map +0 -1
- package/dist/cli/lib/progress.js.map +0 -1
- package/dist/cli/lib/resolve-skill-input.d.ts.map +0 -1
- package/dist/cli/lib/resolve-skill-input.js.map +0 -1
- package/dist/cli/lib/run-tally.d.ts.map +0 -1
- package/dist/cli/lib/run-tally.js.map +0 -1
- package/dist/cli/lib/shared.d.ts.map +0 -1
- package/dist/cli/lib/shared.js.map +0 -1
- package/dist/cli/lib/update-check.d.ts.map +0 -1
- package/dist/cli/lib/update-check.js.map +0 -1
- package/dist/cli/lib/update-fetch-worker.d.ts.map +0 -1
- package/dist/cli/lib/update-fetch-worker.js.map +0 -1
- package/dist/cli/oclif/base-command.d.ts.map +0 -1
- package/dist/cli/oclif/base-command.js.map +0 -1
- package/dist/cli/oclif/help.d.ts.map +0 -1
- package/dist/cli/oclif/help.js.map +0 -1
- package/dist/cli/oclif/i18n.d.ts.map +0 -1
- package/dist/cli/oclif/i18n.js.map +0 -1
- package/dist/cli/oclif/parsers.d.ts.map +0 -1
- package/dist/cli/oclif/parsers.js.map +0 -1
- package/dist/cli/oclif/projection.d.ts.map +0 -1
- package/dist/cli/oclif/projection.js.map +0 -1
- package/dist/cli/oclif/run.d.ts.map +0 -1
- package/dist/cli/oclif/run.js.map +0 -1
- package/dist/diagnosis/observe-mapper.d.ts.map +0 -1
- package/dist/diagnosis/observe-mapper.js.map +0 -1
- package/dist/diagnosis/observe-producer.d.ts.map +0 -1
- package/dist/diagnosis/observe-producer.js.map +0 -1
- package/dist/diagnosis/studio-projection.d.ts.map +0 -1
- package/dist/diagnosis/studio-projection.js.map +0 -1
- package/dist/diagnosis/types.d.ts.map +0 -1
- package/dist/diagnosis/types.js.map +0 -1
- package/dist/doctor/fixer.d.ts.map +0 -1
- package/dist/doctor/fixer.js.map +0 -1
- package/dist/doctor/health/builtin-dimensions.d.ts.map +0 -1
- package/dist/doctor/health/builtin-dimensions.js.map +0 -1
- package/dist/doctor/health/composer.d.ts.map +0 -1
- package/dist/doctor/health/composer.js.map +0 -1
- package/dist/doctor/health/dimension-registry.d.ts.map +0 -1
- package/dist/doctor/health/dimension-registry.js.map +0 -1
- package/dist/doctor/health/dimension-spec.d.ts.map +0 -1
- package/dist/doctor/health/dimension-spec.js.map +0 -1
- package/dist/doctor/health/load-custom-dimensions.d.ts.map +0 -1
- package/dist/doctor/health/load-custom-dimensions.js.map +0 -1
- package/dist/doctor/health/parser.d.ts.map +0 -1
- package/dist/doctor/health/parser.js.map +0 -1
- package/dist/doctor/health/prompt-builder.d.ts.map +0 -1
- package/dist/doctor/health/prompt-builder.js.map +0 -1
- package/dist/doctor/health/register.d.ts.map +0 -1
- package/dist/doctor/health/register.js.map +0 -1
- package/dist/doctor/index.d.ts.map +0 -1
- package/dist/doctor/index.js.map +0 -1
- package/dist/doctor/messages.d.ts.map +0 -1
- package/dist/doctor/messages.js.map +0 -1
- package/dist/doctor/preflight.d.ts.map +0 -1
- package/dist/doctor/preflight.js.map +0 -1
- package/dist/doctor/renderer.d.ts.map +0 -1
- package/dist/doctor/renderer.js.map +0 -1
- package/dist/doctor/rules.d.ts.map +0 -1
- package/dist/doctor/rules.js.map +0 -1
- package/dist/eval-core/bootstrap.d.ts.map +0 -1
- package/dist/eval-core/bootstrap.js.map +0 -1
- package/dist/eval-core/cache.d.ts.map +0 -1
- package/dist/eval-core/cache.js.map +0 -1
- package/dist/eval-core/comparability.d.ts.map +0 -1
- package/dist/eval-core/comparability.js.map +0 -1
- package/dist/eval-core/dependency-checker.d.ts.map +0 -1
- package/dist/eval-core/dependency-checker.js.map +0 -1
- package/dist/eval-core/evaluation-execution.d.ts.map +0 -1
- package/dist/eval-core/evaluation-execution.js.map +0 -1
- package/dist/eval-core/evaluation-job.d.ts.map +0 -1
- package/dist/eval-core/evaluation-job.js.map +0 -1
- package/dist/eval-core/evaluation-reporting.d.ts.map +0 -1
- package/dist/eval-core/evaluation-reporting.js.map +0 -1
- package/dist/eval-core/execution-strategy.d.ts.map +0 -1
- package/dist/eval-core/execution-strategy.js.map +0 -1
- package/dist/eval-core/fact-checker.d.ts.map +0 -1
- package/dist/eval-core/fact-checker.js.map +0 -1
- package/dist/eval-core/layer-gates.d.ts.map +0 -1
- package/dist/eval-core/layer-gates.js.map +0 -1
- package/dist/eval-core/mocks-runtime.d.ts.map +0 -1
- package/dist/eval-core/mocks-runtime.js.map +0 -1
- package/dist/eval-core/schema.d.ts.map +0 -1
- package/dist/eval-core/schema.js.map +0 -1
- package/dist/eval-core/statistics.d.ts.map +0 -1
- package/dist/eval-core/statistics.js.map +0 -1
- package/dist/eval-core/task-planner.d.ts.map +0 -1
- package/dist/eval-core/task-planner.js.map +0 -1
- package/dist/eval-core/verdict.d.ts.map +0 -1
- package/dist/eval-core/verdict.js.map +0 -1
- package/dist/eval-workflows/batch-evaluation-workflow.d.ts.map +0 -1
- package/dist/eval-workflows/batch-evaluation-workflow.js.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.d.ts.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.js.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/report-finalize.d.ts.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/report-finalize.js.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/run-state.d.ts.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/run-state.js.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/test-set-hash.d.ts.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline/test-set-hash.js.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline.d.ts.map +0 -1
- package/dist/eval-workflows/evaluation-pipeline.js.map +0 -1
- package/dist/eval-workflows/evaluation-preparation.d.ts.map +0 -1
- package/dist/eval-workflows/evaluation-preparation.js.map +0 -1
- package/dist/eval-workflows/messages.d.ts.map +0 -1
- package/dist/eval-workflows/messages.js.map +0 -1
- package/dist/eval-workflows/run-evaluation.d.ts.map +0 -1
- package/dist/eval-workflows/run-evaluation.js.map +0 -1
- package/dist/executors/anthropic-api.d.ts.map +0 -1
- package/dist/executors/anthropic-api.js.map +0 -1
- package/dist/executors/claude-cli.d.ts.map +0 -1
- package/dist/executors/claude-cli.js.map +0 -1
- package/dist/executors/claude-sdk-trace.d.ts.map +0 -1
- package/dist/executors/claude-sdk-trace.js.map +0 -1
- package/dist/executors/claude-sdk.d.ts.map +0 -1
- package/dist/executors/claude-sdk.js.map +0 -1
- package/dist/executors/codex-cli-trace.d.ts.map +0 -1
- package/dist/executors/codex-cli-trace.js.map +0 -1
- package/dist/executors/codex-cli.d.ts.map +0 -1
- package/dist/executors/codex-cli.js.map +0 -1
- package/dist/executors/codex-sdk.d.ts.map +0 -1
- package/dist/executors/codex-sdk.js.map +0 -1
- package/dist/executors/gemini.d.ts.map +0 -1
- package/dist/executors/gemini.js.map +0 -1
- package/dist/executors/index.d.ts.map +0 -1
- package/dist/executors/index.js.map +0 -1
- package/dist/executors/openai-api.d.ts.map +0 -1
- package/dist/executors/openai-api.js.map +0 -1
- package/dist/executors/runtime-fingerprint.d.ts.map +0 -1
- package/dist/executors/runtime-fingerprint.js.map +0 -1
- package/dist/executors/script.d.ts.map +0 -1
- package/dist/executors/script.js.map +0 -1
- package/dist/executors/shared.d.ts.map +0 -1
- package/dist/executors/shared.js.map +0 -1
- package/dist/grading/assertions.d.ts.map +0 -1
- package/dist/grading/assertions.js.map +0 -1
- package/dist/grading/debias-validate.d.ts.map +0 -1
- package/dist/grading/debias-validate.js.map +0 -1
- package/dist/grading/diagnostic.d.ts.map +0 -1
- package/dist/grading/diagnostic.js.map +0 -1
- package/dist/grading/gold-cli.d.ts.map +0 -1
- package/dist/grading/gold-cli.js.map +0 -1
- package/dist/grading/gold-dataset.d.ts.map +0 -1
- package/dist/grading/gold-dataset.js.map +0 -1
- package/dist/grading/human-gold.d.ts.map +0 -1
- package/dist/grading/human-gold.js.map +0 -1
- package/dist/grading/index.d.ts.map +0 -1
- package/dist/grading/index.js.map +0 -1
- package/dist/grading/judge.d.ts.map +0 -1
- package/dist/grading/judge.js.map +0 -1
- package/dist/grading/layered-scores.d.ts.map +0 -1
- package/dist/grading/layered-scores.js.map +0 -1
- package/dist/inputs/eval-config.d.ts.map +0 -1
- package/dist/inputs/eval-config.js.map +0 -1
- package/dist/inputs/load-samples.d.ts.map +0 -1
- package/dist/inputs/load-samples.js.map +0 -1
- package/dist/inputs/mcp-resolver.d.ts.map +0 -1
- package/dist/inputs/mcp-resolver.js.map +0 -1
- package/dist/inputs/skill-loader.d.ts.map +0 -1
- package/dist/inputs/skill-loader.js.map +0 -1
- package/dist/inputs/url-fetcher.d.ts.map +0 -1
- package/dist/inputs/url-fetcher.js.map +0 -1
- package/dist/observability/experience-frontmatter.d.ts.map +0 -1
- package/dist/observability/experience-frontmatter.js.map +0 -1
- package/dist/observability/experience.d.ts.map +0 -1
- package/dist/observability/experience.js.map +0 -1
- package/dist/observability/feedback-matchers.d.ts.map +0 -1
- package/dist/observability/feedback-matchers.js.map +0 -1
- package/dist/observability/feedback-projection.d.ts.map +0 -1
- package/dist/observability/feedback-projection.js.map +0 -1
- package/dist/observability/inbox-view-model.d.ts.map +0 -1
- package/dist/observability/inbox-view-model.js.map +0 -1
- package/dist/observability/inbox.d.ts.map +0 -1
- package/dist/observability/inbox.js.map +0 -1
- package/dist/observability/problem-patterns.d.ts.map +0 -1
- package/dist/observability/problem-patterns.js.map +0 -1
- package/dist/observability/resolved-review.d.ts.map +0 -1
- package/dist/observability/resolved-review.js.map +0 -1
- package/dist/observability/review-state.d.ts.map +0 -1
- package/dist/observability/review-state.js.map +0 -1
- package/dist/observability/skill-chain-advisories.d.ts.map +0 -1
- package/dist/observability/skill-chain-advisories.js.map +0 -1
- package/dist/observability/skill-chain.d.ts.map +0 -1
- package/dist/observability/skill-chain.js.map +0 -1
- package/dist/observability/skill-health-analyzer.d.ts.map +0 -1
- package/dist/observability/skill-health-analyzer.js.map +0 -1
- package/dist/observability/soft-standards/constants.d.ts.map +0 -1
- package/dist/observability/soft-standards/constants.js.map +0 -1
- package/dist/observability/soft-standards/index.d.ts.map +0 -1
- package/dist/observability/soft-standards/index.js.map +0 -1
- package/dist/observability/soft-standards/llm-extractor.d.ts.map +0 -1
- package/dist/observability/soft-standards/llm-extractor.js.map +0 -1
- package/dist/observability/soft-standards/runtime-evaluator.d.ts.map +0 -1
- package/dist/observability/soft-standards/runtime-evaluator.js.map +0 -1
- package/dist/observability/soft-standards/skill-standards-store.d.ts.map +0 -1
- package/dist/observability/soft-standards/skill-standards-store.js.map +0 -1
- package/dist/observability/soft-standards/types.d.ts.map +0 -1
- package/dist/observability/soft-standards/types.js.map +0 -1
- package/dist/observability/text-signals.d.ts.map +0 -1
- package/dist/observability/text-signals.js.map +0 -1
- package/dist/observability/trace-adapter.d.ts.map +0 -1
- package/dist/observability/trace-adapter.js.map +0 -1
- package/dist/observability/trace-attribution.d.ts.map +0 -1
- package/dist/observability/trace-attribution.js.map +0 -1
- package/dist/observability/trace-segmenter.d.ts.map +0 -1
- package/dist/observability/trace-segmenter.js.map +0 -1
- package/dist/observability/trace-source.d.ts.map +0 -1
- package/dist/observability/trace-source.js.map +0 -1
- package/dist/renderer/html-renderer.d.ts.map +0 -1
- package/dist/renderer/html-renderer.js.map +0 -1
- package/dist/renderer/layout.d.ts.map +0 -1
- package/dist/renderer/layout.js.map +0 -1
- package/dist/renderer/observation-inbox/helpers.d.ts.map +0 -1
- package/dist/renderer/observation-inbox/helpers.js.map +0 -1
- package/dist/renderer/observation-inbox/styles.d.ts.map +0 -1
- package/dist/renderer/observation-inbox/styles.js.map +0 -1
- package/dist/renderer/observation-inbox-renderer.d.ts.map +0 -1
- package/dist/renderer/observation-inbox-renderer.js.map +0 -1
- package/dist/renderer/skill-detail-renderer.d.ts.map +0 -1
- package/dist/renderer/skill-detail-renderer.js.map +0 -1
- package/dist/renderer/skill-health-renderer.d.ts.map +0 -1
- package/dist/renderer/skill-health-renderer.js.map +0 -1
- package/dist/renderer/skill-list-renderer.d.ts.map +0 -1
- package/dist/renderer/skill-list-renderer.js.map +0 -1
- package/dist/renderer/summary.d.ts.map +0 -1
- package/dist/renderer/summary.js.map +0 -1
- package/dist/renderer/table.d.ts.map +0 -1
- package/dist/renderer/table.js.map +0 -1
- package/dist/renderer/test-view.d.ts.map +0 -1
- package/dist/renderer/test-view.js.map +0 -1
- package/dist/renderer/trends.d.ts.map +0 -1
- package/dist/renderer/trends.js.map +0 -1
- package/dist/server/job-store.d.ts.map +0 -1
- package/dist/server/job-store.js.map +0 -1
- package/dist/server/report-server.d.ts.map +0 -1
- package/dist/server/report-server.js.map +0 -1
- package/dist/server/report-store.d.ts.map +0 -1
- package/dist/server/report-store.js.map +0 -1
- package/dist/server/skill-index.d.ts.map +0 -1
- package/dist/server/skill-index.js.map +0 -1
- package/dist/server/skill-insights.d.ts.map +0 -1
- package/dist/server/skill-insights.js.map +0 -1
- package/dist/shared/hard-rules.d.ts.map +0 -1
- package/dist/shared/hard-rules.js.map +0 -1
- package/dist/shared/llm-prompts/index.d.ts.map +0 -1
- package/dist/shared/llm-prompts/index.js.map +0 -1
- package/dist/shared/llm-prompts/skill-health.d.ts.map +0 -1
- package/dist/shared/llm-prompts/skill-health.js.map +0 -1
- package/dist/shared/time.d.ts.map +0 -1
- package/dist/shared/time.js.map +0 -1
- package/dist/shared/tool-search.d.ts.map +0 -1
- package/dist/shared/tool-search.js.map +0 -1
- package/dist/types/dependencies.d.ts.map +0 -1
- package/dist/types/dependencies.js.map +0 -1
- package/dist/types/diagnosis.d.ts.map +0 -1
- package/dist/types/diagnosis.js.map +0 -1
- package/dist/types/doctor.d.ts.map +0 -1
- package/dist/types/doctor.js.map +0 -1
- package/dist/types/eval.d.ts.map +0 -1
- package/dist/types/eval.js.map +0 -1
- package/dist/types/executor.d.ts.map +0 -1
- package/dist/types/executor.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/judge.d.ts.map +0 -1
- package/dist/types/judge.js.map +0 -1
- package/dist/types/observability.d.ts.map +0 -1
- package/dist/types/observability.js.map +0 -1
- package/dist/types/report.d.ts.map +0 -1
- package/dist/types/report.js.map +0 -1
- package/dist/types/shared.d.ts.map +0 -1
- package/dist/types/shared.js.map +0 -1
- package/dist/types/skill-index.d.ts.map +0 -1
- package/dist/types/skill-index.js.map +0 -1
- package/dist/types/storage.d.ts.map +0 -1
- package/dist/types/storage.js.map +0 -1
- package/dist/util/safe-slice.d.ts.map +0 -1
- package/dist/util/safe-slice.js.map +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安装源解析器 —— 把"各种源"物化成统一的本地形态,让 install / managed 主干**源无关**。
|
|
3
|
+
* 新增一种源 = 加一个分支,install.ts 不动。本模块不依赖 CLI(不打印、不 tCli):错误以
|
|
4
|
+
* `SourceResolveError(messageKey)` 抛出,由调用方(install)映射成本地化文案。
|
|
5
|
+
*
|
|
6
|
+
* 当前支持:`file`(本地路径)、`git`(当前仓库的某个 ref)、远端 git(URL + ref,fetch 到临时 bare)。
|
|
7
|
+
* 三者沿同一 `ResolvedSource` 契约,install / managed 主干源无关。
|
|
8
|
+
*/
|
|
9
|
+
export { SourceResolveError } from './skill-loader.js';
|
|
10
|
+
export type SourceKind = 'file' | 'git';
|
|
11
|
+
export interface ResolvedSource {
|
|
12
|
+
sourceKind: SourceKind;
|
|
13
|
+
/** 物化后的本地根:目录-skill 为目录、文件-skill 为 .md;喂 hashArtifactSource + 分发。 */
|
|
14
|
+
localRoot: string;
|
|
15
|
+
/** skill 短名(分发落点 / 记录 name)。 */
|
|
16
|
+
name: string;
|
|
17
|
+
isDirectorySkill: boolean;
|
|
18
|
+
/** 记录身份:file=绝对路径;本地 git=`git:<ref>:<spec>`;远端 git=`git+<url>@<sha>:<spec>`
|
|
19
|
+
* (均非临时物化路径;远端身份串仅作记录/相等比较,绝不回喂 parseGitInput 的 `:` 切分)。 */
|
|
20
|
+
locator: string;
|
|
21
|
+
/** git 来源的 ref;远端为 fetch 后 pin 的实际 SHA。 */
|
|
22
|
+
ref?: string;
|
|
23
|
+
/** 远端 git 的 URL(本地源 / 本地 git 无)。供受管记录结构化存、drift 重取,不挤进 locator 再 split。 */
|
|
24
|
+
url?: string;
|
|
25
|
+
/** 释放临时资源(git 删临时目录 / 远端另删 bare);file 源为 noop。 */
|
|
26
|
+
cleanup: () => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function resolveInstallSource(input: string): ResolvedSource;
|
|
29
|
+
/**
|
|
30
|
+
* 远端 git 源:`<url>` + `<ref>` + repo 相对 `<spec>`(三者结构化传入,URL 不经任何字符串切分,
|
|
31
|
+
* 避开 `parseGitInput` 的 `:` 与 `parseVariantCwd` 的 `@`)。fetch 到临时 bare → 复用既有
|
|
32
|
+
* classifyGitSkillRef / materializeGitSkillTree(repoRoot 换成 bare)。locator 落 `git+<url>@<sha>:<spec>`
|
|
33
|
+
* 仅作记录身份;url 另以结构化字段携带,供 drift 重取。失败 fail-closed 并清临时资源。
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveRemoteGitSource(url: string, ref: string, spec: string): ResolvedSource;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { existsSync, lstatSync, realpathSync, statSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { classifyGitSkillRef, parseGitInput, resolveGitRepoContext, materializeGitSkillTree, skillNameFromPath, SourceResolveError, fetchRemoteGitRef } from './skill-loader.js';
|
|
4
|
+
/**
|
|
5
|
+
* 安装源解析器 —— 把"各种源"物化成统一的本地形态,让 install / managed 主干**源无关**。
|
|
6
|
+
* 新增一种源 = 加一个分支,install.ts 不动。本模块不依赖 CLI(不打印、不 tCli):错误以
|
|
7
|
+
* `SourceResolveError(messageKey)` 抛出,由调用方(install)映射成本地化文案。
|
|
8
|
+
*
|
|
9
|
+
* 当前支持:`file`(本地路径)、`git`(当前仓库的某个 ref)、远端 git(URL + ref,fetch 到临时 bare)。
|
|
10
|
+
* 三者沿同一 `ResolvedSource` 契约,install / managed 主干源无关。
|
|
11
|
+
*/
|
|
12
|
+
// SourceResolveError 住在 skill-loader(让共享 materializeGitSkillTree 能抛它而不成环);此处 re-export
|
|
13
|
+
// 保持 install 既有 import 不破。
|
|
14
|
+
export { SourceResolveError } from './skill-loader.js';
|
|
15
|
+
const noop = () => { };
|
|
16
|
+
export function resolveInstallSource(input) {
|
|
17
|
+
if (input.startsWith('git:'))
|
|
18
|
+
return resolveGitSource(input);
|
|
19
|
+
return resolveFileSource(input);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 远端 git 源:`<url>` + `<ref>` + repo 相对 `<spec>`(三者结构化传入,URL 不经任何字符串切分,
|
|
23
|
+
* 避开 `parseGitInput` 的 `:` 与 `parseVariantCwd` 的 `@`)。fetch 到临时 bare → 复用既有
|
|
24
|
+
* classifyGitSkillRef / materializeGitSkillTree(repoRoot 换成 bare)。locator 落 `git+<url>@<sha>:<spec>`
|
|
25
|
+
* 仅作记录身份;url 另以结构化字段携带,供 drift 重取。失败 fail-closed 并清临时资源。
|
|
26
|
+
*/
|
|
27
|
+
export function resolveRemoteGitSource(url, ref, spec) {
|
|
28
|
+
const checkout = fetchRemoteGitRef(url, ref);
|
|
29
|
+
try {
|
|
30
|
+
// 远端 URL 指向仓库根,spec 是仓库相对路径 → gitRelDir 为空。
|
|
31
|
+
const resolved = classifyGitSkillRef(checkout.ref, '', spec, checkout.repoRoot);
|
|
32
|
+
if (!resolved)
|
|
33
|
+
throw new SourceResolveError('cli.install.remote_skill_not_found', { url, ref: checkout.ref, name: spec });
|
|
34
|
+
const mat = materializeGitSkillTree(checkout.ref, resolved, checkout.repoRoot);
|
|
35
|
+
return {
|
|
36
|
+
sourceKind: 'git',
|
|
37
|
+
localRoot: mat.localRoot,
|
|
38
|
+
name: mat.name,
|
|
39
|
+
isDirectorySkill: mat.isDirectorySkill,
|
|
40
|
+
locator: `git+${url}@${checkout.ref}:${spec}`,
|
|
41
|
+
ref: checkout.ref,
|
|
42
|
+
url,
|
|
43
|
+
cleanup: () => {
|
|
44
|
+
mat.cleanup();
|
|
45
|
+
checkout.cleanup();
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
checkout.cleanup();
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function resolveFileSource(input) {
|
|
55
|
+
const abs = resolve(input);
|
|
56
|
+
if (!existsSync(abs))
|
|
57
|
+
throw new SourceResolveError('cli.install.path_not_found', { path: abs });
|
|
58
|
+
const isDir = statSync(abs).isDirectory();
|
|
59
|
+
if (isDir) {
|
|
60
|
+
const skillMd = join(abs, 'SKILL.md');
|
|
61
|
+
if (!existsSync(skillMd)) {
|
|
62
|
+
throw new SourceResolveError('cli.install.skillmd_missing', { path: abs });
|
|
63
|
+
}
|
|
64
|
+
// 软链 SKILL.md 会被分发跳过(与 git 物化、cpSync 的软链策略一致)→ 装出空壳。指向真源,让记录落在真源上。
|
|
65
|
+
if (lstatSync(skillMd).isSymbolicLink()) {
|
|
66
|
+
throw new SourceResolveError('cli.install.skillmd_is_symlink', { target: realpathSync(skillMd) });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!isDir && !/\.md$/i.test(abs)) {
|
|
70
|
+
throw new SourceResolveError('cli.install.not_a_skill', { path: abs });
|
|
71
|
+
}
|
|
72
|
+
const name = isDir ? skillNameFromPath(join(abs, 'SKILL.md')) : skillNameFromPath(abs);
|
|
73
|
+
return { sourceKind: 'file', localRoot: abs, name, isDirectorySkill: isDir, locator: abs, cleanup: noop };
|
|
74
|
+
}
|
|
75
|
+
function resolveGitSource(input) {
|
|
76
|
+
// 空 spec / 空 ref 由共享 parseGitInput 拒(返回 null):空 ref(`git::x`)会被 git 当 index/stage-0
|
|
77
|
+
// 解析,破坏"可复现、可重取"的前提;eval 与 install 经同一 helper 判定一致。
|
|
78
|
+
const parsed = parseGitInput(input);
|
|
79
|
+
if (!parsed)
|
|
80
|
+
throw new SourceResolveError('cli.install.git_skill_not_found', { ref: '', name: input });
|
|
81
|
+
const { ref, spec } = parsed;
|
|
82
|
+
let ctx;
|
|
83
|
+
try {
|
|
84
|
+
ctx = resolveGitRepoContext(resolve('.'));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new SourceResolveError('cli.install.not_a_git_repo', {});
|
|
88
|
+
}
|
|
89
|
+
const resolved = classifyGitSkillRef(ref, ctx.relDir, spec, ctx.repoRoot);
|
|
90
|
+
if (!resolved) {
|
|
91
|
+
throw new SourceResolveError('cli.install.git_skill_not_found', { ref, name: spec });
|
|
92
|
+
}
|
|
93
|
+
// 物化复用共享 materializeGitSkillTree(install 与 eval 同一条物化路径);install 只需在其上补
|
|
94
|
+
// locator / sourceKind 包成 ResolvedSource。
|
|
95
|
+
const mat = materializeGitSkillTree(ref, resolved, ctx.repoRoot);
|
|
96
|
+
return {
|
|
97
|
+
sourceKind: 'git',
|
|
98
|
+
localRoot: mat.localRoot,
|
|
99
|
+
name: mat.name,
|
|
100
|
+
isDirectorySkill: mat.isDirectorySkill,
|
|
101
|
+
locator: `git:${ref}:${spec}`,
|
|
102
|
+
ref,
|
|
103
|
+
cleanup: mat.cleanup,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -16,4 +16,3 @@ export declare function isPlaceholderUrl(url: string): boolean;
|
|
|
16
16
|
* @param skipUrls - URLs already resolved (e.g. by MCP), will be skipped
|
|
17
17
|
*/
|
|
18
18
|
export declare function resolveUrls(samples: Sample[], skipUrls?: Set<string>): Promise<void>;
|
|
19
|
-
//# sourceMappingURL=url-fetcher.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EvaluationReport, ManagedEvidenceRef } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 为某个变体组装一条 evidence ref;变体无真实内容(baseline / no-skill / 缺 hash)→ null。
|
|
4
|
+
* `verdict` 由调用方传入(CLI 已 computeVerdict,避免在此重算)。
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildEvidenceRef(report: EvaluationReport, variant: string, verdict: string, recordedAt: string): ManagedEvidenceRef | null;
|
|
7
|
+
export interface RecordedEvidence {
|
|
8
|
+
recordId: string;
|
|
9
|
+
name: string;
|
|
10
|
+
contentHash: string;
|
|
11
|
+
/** true ⇒ evidence.contentHash 等于记录当前 contentHash → deriveManagedState 计为当前证据 →
|
|
12
|
+
* measurable。false ⇒ 测的是旧内容(已 drift),证据留存但不绑当前版本。 */
|
|
13
|
+
bound: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 驱动:对每个能在报告里(按 contentHash 主键 / 同名回退)匹配到被测 variant 的**已纳管**记录,
|
|
17
|
+
* 追加一条 evidence。返回实际写入的清单(供 CLI 提示,`name` 取受管记录名而非 variant 键)。
|
|
18
|
+
* 无任何记录匹配 → 返回空(常见的非管理用户场景,静默无副作用)。
|
|
19
|
+
*/
|
|
20
|
+
export declare function recordEvalEvidence(report: EvaluationReport, verdict: string, recordedAt: string, opts?: {
|
|
21
|
+
dir?: string;
|
|
22
|
+
}): RecordedEvidence[];
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* eval → managed evidence 写入(承接 #203 管理支柱 / #214 验收第 3 条)。
|
|
3
|
+
*
|
|
4
|
+
* 一次 `omk eval` 跑完,把结果落成一条 `ManagedEvidenceRef` 追加进**已纳管**记录的 evidence[],
|
|
5
|
+
* 让 skill 从 `installed` 走到 `measurable`(由 `deriveManagedState` 读时推导)。承重前提是 #214/#218
|
|
6
|
+
* 已把 install 与 eval 的内容指纹统一到同一空间(整树哈),所以 `report.artifactHashes[variant]` 与
|
|
7
|
+
* `record.contentHash` 可直接相等比对、evidence 绑得上。
|
|
8
|
+
*
|
|
9
|
+
* 三条设计取舍(对应 issue #221 的"待定决策"):
|
|
10
|
+
* - **触发**:eval 完成**自动**写,但只写**已存在**的受管记录 —— install 是显式 opt-in,未纳管的
|
|
11
|
+
* skill 永不被凭空建记录(零副作用惊吓)。CLI 另给 `--no-evidence` 关闭。
|
|
12
|
+
* - **多对一**:append-only + 按 (reportId, contentHash) 去重;保留全部历史条目,当前有效性仍由
|
|
13
|
+
* `deriveManagedState` 按 contentHash 匹配裁定(重装新内容后旧证据留存供回滚,却不让新内容显得已测)。
|
|
14
|
+
* - **跨源**:用三级身份消歧把被测 variant 对到受管记录(install 与 eval 命名不一致:记录名是
|
|
15
|
+
* skill 短名 `review`,而 eval 报告 variant key 可能是整串表达式 `git:HEAD:skills/review`、
|
|
16
|
+
* eval.yaml 别名 `candidate`、blind 模式的 `A`/`B`)。`applyBlindMode` 盲化 `variants` 但**不**动
|
|
17
|
+
* `artifactHashes` / `variantConfigs` 的键面,故三级都按真实键工作:
|
|
18
|
+
* (a) 显式**同名** variant —— 最强身份(本地 `--treatment <name>` 与 drift);
|
|
19
|
+
* (b) **结构化源匹配** —— `variantConfigs[].locator(+ref)` 与 `record.source` 对齐(git / 远端 /
|
|
20
|
+
* 别名),即便内容撞哈也能精确消歧;
|
|
21
|
+
* (c) **纯 contentHash 回退** —— 仅当该内容哈在受管记录中**唯一**才用。否则两条不同记录恰好当前
|
|
22
|
+
* 内容相同(同模板复制 / 刚装)时,只测了一条的 report 会把同哈的另一条也推成 measurable ——
|
|
23
|
+
* 唯一性闸门挡掉这种越权写入(撞哈又非同名 / 无结构化身份 → 跳过,不乱绑)。
|
|
24
|
+
*
|
|
25
|
+
* bundle 按 evidence-gated-management.md §5 denormalize 进记录(reportId / contentHash /
|
|
26
|
+
* verdict / sampleCoverage / comparability),不依赖 report 文件仍在盘。
|
|
27
|
+
*/
|
|
28
|
+
import { basename, dirname } from 'node:path';
|
|
29
|
+
import { hashString } from '../eval-core/evaluation-reporting.js';
|
|
30
|
+
import { loadAllManagedRecords, appendManagedEvidence, managedDir, resolveManagedDir } from './store.js';
|
|
31
|
+
/** baseline / 无 skill 变体的 artifactHash 哨兵(见 report.ts artifactHashes 注释)——不产证据。 */
|
|
32
|
+
const NO_SKILL = 'no-skill';
|
|
33
|
+
/** 样本集覆盖摘要:report 的 sampleHashes 排序后取一个稳定 digest(同一样本集 ⇒ 同 hash)。
|
|
34
|
+
* 缺 sampleHashes(旧报告 / --dry-run)→ undefined,bundle 仍含其余三项 mandatory。 */
|
|
35
|
+
function sampleCoverage(report) {
|
|
36
|
+
const sh = report.meta?.sampleHashes;
|
|
37
|
+
if (!sh)
|
|
38
|
+
return undefined;
|
|
39
|
+
const entries = Object.entries(sh).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
40
|
+
return { count: entries.length, hash: hashString(JSON.stringify(entries)) };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 为某个变体组装一条 evidence ref;变体无真实内容(baseline / no-skill / 缺 hash)→ null。
|
|
44
|
+
* `verdict` 由调用方传入(CLI 已 computeVerdict,避免在此重算)。
|
|
45
|
+
*/
|
|
46
|
+
export function buildEvidenceRef(report, variant, verdict, recordedAt) {
|
|
47
|
+
const contentHash = report.meta?.artifactHashes?.[variant];
|
|
48
|
+
if (!contentHash || contentHash === NO_SKILL)
|
|
49
|
+
return null;
|
|
50
|
+
const meta = report.meta;
|
|
51
|
+
const cov = sampleCoverage(report);
|
|
52
|
+
return {
|
|
53
|
+
reportId: report.id,
|
|
54
|
+
contentHash,
|
|
55
|
+
recordedAt,
|
|
56
|
+
verdict,
|
|
57
|
+
...(cov ? { sampleCoverage: cov } : {}),
|
|
58
|
+
comparability: {
|
|
59
|
+
cliVersion: meta.cliVersion,
|
|
60
|
+
...(meta.judgePromptHash ? { judgePromptHash: meta.judgePromptHash } : {}),
|
|
61
|
+
...(meta.debiasMode ? { debiasMode: meta.debiasMode } : {}),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* variantConfig 的源身份是否与受管记录 source 对得上 —— install 与 eval 两侧 locator **口径不同**,
|
|
67
|
+
* 必须先归一化再比,不能裸字符串相等(否则同 hash 多记录场景下正确的本地 git / 目录-skill 也会因
|
|
68
|
+
* locator 不等而漏写):
|
|
69
|
+
* - 直接相等:远端 git(两侧都 `git+<url>@<sha>:<spec>`)、本地 file-skill(两侧都是 .md 路径);
|
|
70
|
+
* - 本地 git:install 记完整身份串 `git:<ref>:<spec>`,eval 把 spec 落 `cfg.locator`、ref 另存 `cfg.ref`
|
|
71
|
+
* → 归一化成 `git:<cfg.ref>:<cfg.locator>` 再比;
|
|
72
|
+
* - 本地目录-skill:install 记目录根,eval 记 `<dir>/SKILL.md` → 比 `dirname(cfg.locator)`。
|
|
73
|
+
*/
|
|
74
|
+
function sourceMatches(cfg, source) {
|
|
75
|
+
if (!cfg.locator)
|
|
76
|
+
return false;
|
|
77
|
+
if (cfg.locator === source.locator)
|
|
78
|
+
return true;
|
|
79
|
+
if (source.sourceKind === 'git' && cfg.ref && `git:${cfg.ref}:${cfg.locator}` === source.locator)
|
|
80
|
+
return true;
|
|
81
|
+
if (source.isDirectorySkill && basename(cfg.locator) === 'SKILL.md' && dirname(cfg.locator) === source.locator)
|
|
82
|
+
return true;
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 给某条受管记录在报告里找该绑定的 variant key,三级身份消歧(见文件头「跨源」)。
|
|
87
|
+
* `hashIsUnique` 由调用方按全体受管记录的 contentHash 计数提供 —— 纯 hash 回退的越权闸门。
|
|
88
|
+
*/
|
|
89
|
+
function matchVariantKey(report, record, hashIsUnique) {
|
|
90
|
+
const hashes = report.meta?.artifactHashes ?? {};
|
|
91
|
+
// (a) 显式同名 variant(本地 --treatment <name> / drift)。
|
|
92
|
+
if (hashes[record.name] && hashes[record.name] !== NO_SKILL)
|
|
93
|
+
return record.name;
|
|
94
|
+
// (b) 结构化源匹配:variantConfig.locator(+ref) 对齐记录 source(git / 远端 / 别名)。
|
|
95
|
+
for (const cfg of report.meta?.variantConfigs ?? []) {
|
|
96
|
+
const h = hashes[cfg.variant];
|
|
97
|
+
if (!h || h === NO_SKILL)
|
|
98
|
+
continue;
|
|
99
|
+
if (sourceMatches(cfg, record.source))
|
|
100
|
+
return cfg.variant;
|
|
101
|
+
}
|
|
102
|
+
// (c) 纯 contentHash 回退 —— 仅当该哈在受管记录中唯一(否则撞哈会越权写到没测的记录)。
|
|
103
|
+
if (hashIsUnique(record.contentHash)) {
|
|
104
|
+
for (const [key, hash] of Object.entries(hashes)) {
|
|
105
|
+
if (hash !== NO_SKILL && hash === record.contentHash)
|
|
106
|
+
return key;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 驱动:对每个能在报告里(按 contentHash 主键 / 同名回退)匹配到被测 variant 的**已纳管**记录,
|
|
113
|
+
* 追加一条 evidence。返回实际写入的清单(供 CLI 提示,`name` 取受管记录名而非 variant 键)。
|
|
114
|
+
* 无任何记录匹配 → 返回空(常见的非管理用户场景,静默无副作用)。
|
|
115
|
+
*/
|
|
116
|
+
export function recordEvalEvidence(report, verdict, recordedAt, opts = {}) {
|
|
117
|
+
const out = [];
|
|
118
|
+
if (Object.keys(report.meta?.artifactHashes ?? {}).length === 0)
|
|
119
|
+
return out;
|
|
120
|
+
// 写回读方实际取记录的同一目录(project→global 同口径)。
|
|
121
|
+
const dir = resolveManagedDir(opts.dir ?? managedDir());
|
|
122
|
+
const records = loadAllManagedRecords(dir);
|
|
123
|
+
if (records.length === 0)
|
|
124
|
+
return out;
|
|
125
|
+
// 全体记录的 contentHash 计数 —— 纯 hash 回退只在唯一时放行(挡同内容多记录的越权写)。
|
|
126
|
+
const hashCount = new Map();
|
|
127
|
+
for (const r of records)
|
|
128
|
+
hashCount.set(r.contentHash, (hashCount.get(r.contentHash) ?? 0) + 1);
|
|
129
|
+
const hashIsUnique = (hash) => (hashCount.get(hash) ?? 0) === 1;
|
|
130
|
+
for (const rec of records) {
|
|
131
|
+
const variantKey = matchVariantKey(report, rec, hashIsUnique);
|
|
132
|
+
if (!variantKey)
|
|
133
|
+
continue;
|
|
134
|
+
const ref = buildEvidenceRef(report, variantKey, verdict, recordedAt);
|
|
135
|
+
if (!ref)
|
|
136
|
+
continue;
|
|
137
|
+
const merged = appendManagedEvidence(dir, rec.id, ref);
|
|
138
|
+
if (!merged)
|
|
139
|
+
continue;
|
|
140
|
+
out.push({ recordId: rec.id, name: rec.name, contentHash: ref.contentHash, bound: ref.contentHash === merged.contentHash });
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ArtifactKind, DeriveManagedStateInput, DerivedManagedState, ManagedArtifactRecord, ManagedArtifactSource, ManagedDistributionTarget, ManagedEvidenceRef } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 受管记录的 per-record 文件存储。一条记录一个 `.omk/managed/<id>.json`,镜像 report-store 的
|
|
4
|
+
* 成熟模式(原子 tmp+rename):每次 install 只碰自己那个文件,independent write、不丢别人、
|
|
5
|
+
* 天然可扩展。无数据库——这个规模(每项目几十条、CLI 单写者)JSON 文件足够,且保住"可读可
|
|
6
|
+
* grep 可 diff"的透明价值。
|
|
7
|
+
*
|
|
8
|
+
* **消费方无关的核心层**:本模块不依赖 CLI、不打印、不退出,所有函数接收显式 `dir`。CLI 命令只是
|
|
9
|
+
* 众多消费方之一;omk 长成平台后 server / web / SDK 复用同一模块,甚至换 DB 实现也只需镜像这组
|
|
10
|
+
* load/upsert 签名。记录的构造统一走 `buildManagedArtifactRecord`,新增字段只改这一处、所有消费方继承。
|
|
11
|
+
*/
|
|
12
|
+
export declare function managedDir(cwd?: string): string;
|
|
13
|
+
export declare function globalManagedDir(): string;
|
|
14
|
+
export declare function recordPath(dir: string, id: string): string;
|
|
15
|
+
/** 稳定身份 = hash(kind, name)。源路径是可变属性、不进 id。kind 取自固定枚举(无 `|`),分隔可注入。 */
|
|
16
|
+
export declare function managedRecordId(kind: ArtifactKind, name: string): string;
|
|
17
|
+
export { hashArtifactSource, isDistributablePath, distributableCopyFilter } from '../inputs/content-hash.js';
|
|
18
|
+
export declare function loadManagedRecord(dir: string, id: string): ManagedArtifactRecord | null;
|
|
19
|
+
/** 读全部记录。项目目录空 → 兜底全局(镜像 observe inbox 的 project→global)。 */
|
|
20
|
+
export declare function loadAllManagedRecords(dir?: string): ManagedArtifactRecord[];
|
|
21
|
+
/**
|
|
22
|
+
* 哪个 managed 目录是权威(有记录的那个):项目目录非空取项目,否则全局非空取全局,都空回项目。
|
|
23
|
+
* 与 `loadAllManagedRecords` 的 project→global 回退**同口径** —— 写方(append evidence)据此写回
|
|
24
|
+
* 读方实际取记录的同一目录,避免"读全局、写项目"把证据落到空目录。
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveManagedDir(dir?: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* 纯合并逻辑(无 IO):install 写的是事实,绝不动 evidence/decisions(那是 eval/promote 的地盘)。
|
|
29
|
+
* - distribution 按 path 去重(同路径以新值替换);
|
|
30
|
+
* - evidence / decisions 一律保留旧值(install 带来的恒为空)——这是设计要的"版本历史 + 附带证据",
|
|
31
|
+
* 用来支撑 rollback;**但保留 ≠ 当作当前有效**:每条 evidence 携带它测的 contentHash,读时由
|
|
32
|
+
* `deriveManagedState` 只把与当前 contentHash 匹配的 evidence 算作当前证据,所以重装到新内容后
|
|
33
|
+
* 旧证据仍在记录里(可回滚),却不会让新内容被读成 measurable;
|
|
34
|
+
* - installedAt 保留首次("under management since");contentHash / source 刷新到本次安装。
|
|
35
|
+
*/
|
|
36
|
+
export declare function mergeManagedRecord(prev: ManagedArtifactRecord | null, next: ManagedArtifactRecord): ManagedArtifactRecord;
|
|
37
|
+
/** 读旧记录 → 合并 → 原子 tmp+rename 只写该 id 的文件。返回合并后记录。 */
|
|
38
|
+
export declare function upsertManagedRecord(dir: string, record: ManagedArtifactRecord): ManagedArtifactRecord;
|
|
39
|
+
/**
|
|
40
|
+
* 追加一条评测证据(append-only)。与 install 的 upsert 路径相反——`mergeManagedRecord` 刻意**保留旧
|
|
41
|
+
* evidence、丢弃 next.evidence**(install 只写事实),所以证据写入不能走 upsert,必须独立 load→push→
|
|
42
|
+
* 原子重写。按 `(reportId, contentHash)` 去重:重跑同一份 eval 不堆重复条目(reportId 含运行身份,
|
|
43
|
+
* 同内容重测会是新 reportId → 新条目,正是要的版本史)。记录不存在(未 install / 名字不匹配)返回
|
|
44
|
+
* null —— 这是"管理是 install 显式 opt-in"的体现:eval 绝不为未纳管的 skill 凭空建记录。
|
|
45
|
+
*/
|
|
46
|
+
export declare function appendManagedEvidence(dir: string, recordId: string, evidence: ManagedEvidenceRef): ManagedArtifactRecord | null;
|
|
47
|
+
/**
|
|
48
|
+
* 统一的记录构造点——所有消费方(CLI / 未来 server / SDK)经此组装,保证 schema 一致。
|
|
49
|
+
* 只接收事实(身份、源、hash、分发落点);evidence/decisions 恒为空(eval/promote 的地盘)。
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildManagedArtifactRecord(input: {
|
|
52
|
+
name: string;
|
|
53
|
+
kind: ArtifactKind;
|
|
54
|
+
source: ManagedArtifactSource;
|
|
55
|
+
contentHash: string;
|
|
56
|
+
installedAt: string;
|
|
57
|
+
distribution: ManagedDistributionTarget[];
|
|
58
|
+
id?: string;
|
|
59
|
+
}): ManagedArtifactRecord;
|
|
60
|
+
/** install 调用的便捷封装。 */
|
|
61
|
+
export declare function recordManagedArtifact(record: ManagedArtifactRecord, opts?: {
|
|
62
|
+
dir?: string;
|
|
63
|
+
}): ManagedArtifactRecord;
|
|
64
|
+
/**
|
|
65
|
+
* 读时推导生命周期标签。
|
|
66
|
+
* - 源缺失或 hash 漂(当前内容 ≠ 记录 contentHash)→ stale;
|
|
67
|
+
* - 否则有**当前**证据 / samples → measurable;
|
|
68
|
+
* - 否则 installed。
|
|
69
|
+
* 「当前证据」= contentHash 与记录当前 contentHash 匹配的 evidence —— 旧内容的 evidence 不算数,
|
|
70
|
+
* 这正是 #203「证据必须跟 artifact 一起走」的读时保证。`'discovered'` 留给无分发的记录,此函数不产生。
|
|
71
|
+
*/
|
|
72
|
+
export declare function deriveManagedState(input: DeriveManagedStateInput): DerivedManagedState;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join, normalize } from 'node:path';
|
|
4
|
+
import { hashString } from '../eval-core/evaluation-reporting.js';
|
|
5
|
+
/**
|
|
6
|
+
* 受管记录的 per-record 文件存储。一条记录一个 `.omk/managed/<id>.json`,镜像 report-store 的
|
|
7
|
+
* 成熟模式(原子 tmp+rename):每次 install 只碰自己那个文件,independent write、不丢别人、
|
|
8
|
+
* 天然可扩展。无数据库——这个规模(每项目几十条、CLI 单写者)JSON 文件足够,且保住"可读可
|
|
9
|
+
* grep 可 diff"的透明价值。
|
|
10
|
+
*
|
|
11
|
+
* **消费方无关的核心层**:本模块不依赖 CLI、不打印、不退出,所有函数接收显式 `dir`。CLI 命令只是
|
|
12
|
+
* 众多消费方之一;omk 长成平台后 server / web / SDK 复用同一模块,甚至换 DB 实现也只需镜像这组
|
|
13
|
+
* load/upsert 签名。记录的构造统一走 `buildManagedArtifactRecord`,新增字段只改这一处、所有消费方继承。
|
|
14
|
+
*/
|
|
15
|
+
export function managedDir(cwd = process.cwd()) {
|
|
16
|
+
return join(cwd, '.omk', 'managed');
|
|
17
|
+
}
|
|
18
|
+
export function globalManagedDir() {
|
|
19
|
+
return join(homedir(), '.oh-my-knowledge', 'managed');
|
|
20
|
+
}
|
|
21
|
+
export function recordPath(dir, id) {
|
|
22
|
+
return join(dir, `${id}.json`);
|
|
23
|
+
}
|
|
24
|
+
/** 稳定身份 = hash(kind, name)。源路径是可变属性、不进 id。kind 取自固定枚举(无 `|`),分隔可注入。 */
|
|
25
|
+
export function managedRecordId(kind, name) {
|
|
26
|
+
return hashString(`${kind}|${name}`);
|
|
27
|
+
}
|
|
28
|
+
// 内容指纹工具已下沉到 inputs 层(install 与 eval 共用同一处,保证指纹同空间);此处 re-export
|
|
29
|
+
// 保持 managed 公共入口不破(install 仍从 managed 取 hashArtifactSource / isDistributablePath)。
|
|
30
|
+
export { hashArtifactSource, isDistributablePath, distributableCopyFilter } from '../inputs/content-hash.js';
|
|
31
|
+
function isStringField(v) {
|
|
32
|
+
return typeof v === 'string';
|
|
33
|
+
}
|
|
34
|
+
// 校验到元素级:记录文件是用户可手改的(透明性是设计价值),`evidence:[null]` / 缺字段的 distribution
|
|
35
|
+
// 都是现实的坏手改;若只查 Array.isArray,坏元素会在 deriveManagedState / mergeManagedRecord 里
|
|
36
|
+
// 解引用崩溃(且在 load 的 try/catch 之外)。这里直接判脏 → load 丢弃该文件,消费方永远拿不到半成品。
|
|
37
|
+
function isManagedArtifactRecord(value) {
|
|
38
|
+
if (!value || typeof value !== 'object')
|
|
39
|
+
return false;
|
|
40
|
+
const r = value;
|
|
41
|
+
if (!(r.recordKind === 'managed-artifact'
|
|
42
|
+
&& r.schemaVersion === 2
|
|
43
|
+
&& isStringField(r.id)
|
|
44
|
+
&& isStringField(r.name)
|
|
45
|
+
&& isStringField(r.kind)
|
|
46
|
+
&& isStringField(r.contentHash)
|
|
47
|
+
&& r.source && typeof r.source === 'object'
|
|
48
|
+
&& isStringField(r.source.locator)
|
|
49
|
+
&& isStringField(r.source.sourceKind)
|
|
50
|
+
&& Array.isArray(r.distribution)
|
|
51
|
+
&& Array.isArray(r.evidence)
|
|
52
|
+
&& Array.isArray(r.decisions)))
|
|
53
|
+
return false;
|
|
54
|
+
const okDist = r.distribution.every((d) => d && typeof d === 'object'
|
|
55
|
+
&& isStringField(d.path) && isStringField(d.contentHash));
|
|
56
|
+
const okEv = r.evidence.every((e) => e && typeof e === 'object'
|
|
57
|
+
&& isStringField(e.reportId) && isStringField(e.contentHash));
|
|
58
|
+
const okDec = r.decisions.every((d) => d && typeof d === 'object'
|
|
59
|
+
&& isStringField(d.decisionKind));
|
|
60
|
+
return okDist && okEv && okDec;
|
|
61
|
+
}
|
|
62
|
+
export function loadManagedRecord(dir, id) {
|
|
63
|
+
const path = recordPath(dir, id);
|
|
64
|
+
if (!existsSync(path))
|
|
65
|
+
return null;
|
|
66
|
+
try {
|
|
67
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
68
|
+
return isManagedArtifactRecord(parsed) ? parsed : null;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function readRecordsFromDir(dir) {
|
|
75
|
+
if (!existsSync(dir))
|
|
76
|
+
return [];
|
|
77
|
+
const out = [];
|
|
78
|
+
for (const entry of readdirSync(dir)) {
|
|
79
|
+
if (!entry.endsWith('.json'))
|
|
80
|
+
continue;
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(readFileSync(join(dir, entry), 'utf-8'));
|
|
83
|
+
if (isManagedArtifactRecord(parsed))
|
|
84
|
+
out.push(parsed);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// 跳过损坏文件
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
/** 读全部记录。项目目录空 → 兜底全局(镜像 observe inbox 的 project→global)。 */
|
|
93
|
+
export function loadAllManagedRecords(dir = managedDir()) {
|
|
94
|
+
const local = readRecordsFromDir(dir);
|
|
95
|
+
if (local.length > 0)
|
|
96
|
+
return local;
|
|
97
|
+
const global = globalManagedDir();
|
|
98
|
+
if (dir !== global) {
|
|
99
|
+
const fallback = readRecordsFromDir(global);
|
|
100
|
+
if (fallback.length > 0)
|
|
101
|
+
return fallback;
|
|
102
|
+
}
|
|
103
|
+
return local;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 哪个 managed 目录是权威(有记录的那个):项目目录非空取项目,否则全局非空取全局,都空回项目。
|
|
107
|
+
* 与 `loadAllManagedRecords` 的 project→global 回退**同口径** —— 写方(append evidence)据此写回
|
|
108
|
+
* 读方实际取记录的同一目录,避免"读全局、写项目"把证据落到空目录。
|
|
109
|
+
*/
|
|
110
|
+
export function resolveManagedDir(dir = managedDir()) {
|
|
111
|
+
if (readRecordsFromDir(dir).length > 0)
|
|
112
|
+
return dir;
|
|
113
|
+
const global = globalManagedDir();
|
|
114
|
+
if (dir !== global && readRecordsFromDir(global).length > 0)
|
|
115
|
+
return global;
|
|
116
|
+
return dir;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 纯合并逻辑(无 IO):install 写的是事实,绝不动 evidence/decisions(那是 eval/promote 的地盘)。
|
|
120
|
+
* - distribution 按 path 去重(同路径以新值替换);
|
|
121
|
+
* - evidence / decisions 一律保留旧值(install 带来的恒为空)——这是设计要的"版本历史 + 附带证据",
|
|
122
|
+
* 用来支撑 rollback;**但保留 ≠ 当作当前有效**:每条 evidence 携带它测的 contentHash,读时由
|
|
123
|
+
* `deriveManagedState` 只把与当前 contentHash 匹配的 evidence 算作当前证据,所以重装到新内容后
|
|
124
|
+
* 旧证据仍在记录里(可回滚),却不会让新内容被读成 measurable;
|
|
125
|
+
* - installedAt 保留首次("under management since");contentHash / source 刷新到本次安装。
|
|
126
|
+
*/
|
|
127
|
+
export function mergeManagedRecord(prev, next) {
|
|
128
|
+
if (!prev)
|
|
129
|
+
return next;
|
|
130
|
+
// 按归一化路径去重(消除尾斜杠 / `.` / 重复分隔导致同一物理目标被记两条)。normalize 保留尾斜杠,故再去尾。
|
|
131
|
+
const normKey = (p) => normalize(p).replace(/[\\/]+$/, '') || p;
|
|
132
|
+
const byPath = new Map();
|
|
133
|
+
for (const t of prev.distribution)
|
|
134
|
+
byPath.set(normKey(t.path), t);
|
|
135
|
+
for (const t of next.distribution)
|
|
136
|
+
byPath.set(normKey(t.path), t);
|
|
137
|
+
// 维护点:`...next` 取本次安装的事实,下面四个字段从 prev 保留(历史 / 首次时间)。
|
|
138
|
+
// 将来若新增任何"必须从安装基线保留"的字段,务必加进这份覆盖清单,否则会被 next 静默覆盖成 undefined。
|
|
139
|
+
// 注意语义边界:distribution 是**多源容忍**的(按归一化 path 累积去重),而 source / contentHash 是
|
|
140
|
+
// **末次写入(单源)**。同一 (kind,name) 先 file 后 git 重装会得到一条 source=git 的记录,但 distribution
|
|
141
|
+
// 仍含 file 时代的落点 —— 那些落点会按 git 的 contentHash 被判 drift。这是"换源即重基线"的有意取舍。
|
|
142
|
+
return {
|
|
143
|
+
...next,
|
|
144
|
+
installedAt: prev.installedAt,
|
|
145
|
+
distribution: [...byPath.values()],
|
|
146
|
+
evidence: prev.evidence,
|
|
147
|
+
decisions: prev.decisions,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/** 读旧记录 → 合并 → 原子 tmp+rename 只写该 id 的文件。返回合并后记录。 */
|
|
151
|
+
export function upsertManagedRecord(dir, record) {
|
|
152
|
+
const merged = mergeManagedRecord(loadManagedRecord(dir, record.id), record);
|
|
153
|
+
mkdirSync(dir, { recursive: true });
|
|
154
|
+
const path = recordPath(dir, record.id);
|
|
155
|
+
const tmp = `${path}.tmp.${process.pid}.${Date.now()}`;
|
|
156
|
+
writeFileSync(tmp, JSON.stringify(merged, null, 2));
|
|
157
|
+
renameSync(tmp, path);
|
|
158
|
+
return merged;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 追加一条评测证据(append-only)。与 install 的 upsert 路径相反——`mergeManagedRecord` 刻意**保留旧
|
|
162
|
+
* evidence、丢弃 next.evidence**(install 只写事实),所以证据写入不能走 upsert,必须独立 load→push→
|
|
163
|
+
* 原子重写。按 `(reportId, contentHash)` 去重:重跑同一份 eval 不堆重复条目(reportId 含运行身份,
|
|
164
|
+
* 同内容重测会是新 reportId → 新条目,正是要的版本史)。记录不存在(未 install / 名字不匹配)返回
|
|
165
|
+
* null —— 这是"管理是 install 显式 opt-in"的体现:eval 绝不为未纳管的 skill 凭空建记录。
|
|
166
|
+
*/
|
|
167
|
+
export function appendManagedEvidence(dir, recordId, evidence) {
|
|
168
|
+
const prev = loadManagedRecord(dir, recordId);
|
|
169
|
+
if (!prev)
|
|
170
|
+
return null;
|
|
171
|
+
const dup = prev.evidence.some((e) => e.reportId === evidence.reportId && e.contentHash === evidence.contentHash);
|
|
172
|
+
const merged = dup
|
|
173
|
+
? prev
|
|
174
|
+
: { ...prev, evidence: [...prev.evidence, evidence] };
|
|
175
|
+
if (!dup) {
|
|
176
|
+
mkdirSync(dir, { recursive: true });
|
|
177
|
+
const path = recordPath(dir, recordId);
|
|
178
|
+
const tmp = `${path}.tmp.${process.pid}.${Date.now()}`;
|
|
179
|
+
writeFileSync(tmp, JSON.stringify(merged, null, 2));
|
|
180
|
+
renameSync(tmp, path);
|
|
181
|
+
}
|
|
182
|
+
return merged;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 统一的记录构造点——所有消费方(CLI / 未来 server / SDK)经此组装,保证 schema 一致。
|
|
186
|
+
* 只接收事实(身份、源、hash、分发落点);evidence/decisions 恒为空(eval/promote 的地盘)。
|
|
187
|
+
*/
|
|
188
|
+
export function buildManagedArtifactRecord(input) {
|
|
189
|
+
return {
|
|
190
|
+
recordKind: 'managed-artifact',
|
|
191
|
+
schemaVersion: 2,
|
|
192
|
+
id: input.id ?? managedRecordId(input.kind, input.name),
|
|
193
|
+
name: input.name,
|
|
194
|
+
kind: input.kind,
|
|
195
|
+
source: input.source,
|
|
196
|
+
contentHash: input.contentHash,
|
|
197
|
+
installedAt: input.installedAt,
|
|
198
|
+
distribution: input.distribution,
|
|
199
|
+
evidence: [],
|
|
200
|
+
decisions: [],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/** install 调用的便捷封装。 */
|
|
204
|
+
export function recordManagedArtifact(record, opts = {}) {
|
|
205
|
+
return upsertManagedRecord(opts.dir ?? managedDir(), record);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 读时推导生命周期标签。
|
|
209
|
+
* - 源缺失或 hash 漂(当前内容 ≠ 记录 contentHash)→ stale;
|
|
210
|
+
* - 否则有**当前**证据 / samples → measurable;
|
|
211
|
+
* - 否则 installed。
|
|
212
|
+
* 「当前证据」= contentHash 与记录当前 contentHash 匹配的 evidence —— 旧内容的 evidence 不算数,
|
|
213
|
+
* 这正是 #203「证据必须跟 artifact 一起走」的读时保证。`'discovered'` 留给无分发的记录,此函数不产生。
|
|
214
|
+
*/
|
|
215
|
+
export function deriveManagedState(input) {
|
|
216
|
+
const { record, currentContentHash, hasSamplesOrDoctorPass } = input;
|
|
217
|
+
const hasEvidence = record.evidence.some((e) => e.contentHash === record.contentHash);
|
|
218
|
+
const drifted = currentContentHash === undefined || currentContentHash !== record.contentHash;
|
|
219
|
+
if (drifted)
|
|
220
|
+
return { label: 'stale', drifted: true, hasEvidence };
|
|
221
|
+
if (hasEvidence || hasSamplesOrDoctorPass)
|
|
222
|
+
return { label: 'measurable', drifted: false, hasEvidence };
|
|
223
|
+
return { label: 'installed', drifted: false, hasEvidence };
|
|
224
|
+
}
|
|
@@ -34,4 +34,3 @@ export interface SkillDeclarationCheck {
|
|
|
34
34
|
export declare function loadFrontmatterSkillType(skillName: string, cwd?: string): ExperienceRuntimeSkillType | undefined;
|
|
35
35
|
export declare function loadSkillDeclarationCheck(skillName: string, cwd?: string): SkillDeclarationCheck;
|
|
36
36
|
export declare function loadExpectedToolsForSkill(skillName: string, cwd?: string): string[];
|
|
37
|
-
//# sourceMappingURL=experience-frontmatter.d.ts.map
|