@b00dea/cockpit 0.0.0-stage → 0.1.1
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/CHANGELOG.md +474 -0
- package/LICENSE +21 -0
- package/README.md +25 -2
- package/bin/cockpit.mjs +33 -0
- package/cockpit.schema.json +2644 -0
- package/dist/autonomy.d.ts +45 -0
- package/dist/autonomy.js +173 -0
- package/dist/bounded-read.d.ts +14 -0
- package/dist/bounded-read.js +42 -0
- package/dist/browser/commands.d.ts +117 -0
- package/dist/browser/commands.js +453 -0
- package/dist/browser/package-paths.d.ts +1 -0
- package/dist/browser/package-paths.js +6 -0
- package/dist/browser/proxy.d.ts +22 -0
- package/dist/browser/proxy.js +37 -0
- package/dist/browser/runtime.d.ts +118 -0
- package/dist/browser/runtime.js +186 -0
- package/dist/browser/surfaces.d.ts +141 -0
- package/dist/browser/surfaces.js +561 -0
- package/dist/browser/ui-gate.d.ts +15 -0
- package/dist/browser/ui-gate.js +18 -0
- package/dist/canonical-json.d.ts +2 -0
- package/dist/canonical-json.js +5 -0
- package/dist/cli-guard.d.ts +5 -0
- package/dist/cli-guard.js +71 -0
- package/dist/cli-main.d.ts +176 -0
- package/dist/cli-main.js +1584 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +16 -0
- package/dist/command-table.d.ts +121 -0
- package/dist/command-table.js +664 -0
- package/dist/config/load.d.ts +183 -0
- package/dist/config/load.js +367 -0
- package/dist/config/sibling-toml.d.ts +48 -0
- package/dist/config/sibling-toml.js +160 -0
- package/dist/config/surface-tools-toml.d.ts +9 -0
- package/dist/config/surface-tools-toml.js +37 -0
- package/dist/config/unconfirmed-toml.d.ts +9 -0
- package/dist/config/unconfirmed-toml.js +29 -0
- package/dist/config/verified-write.d.ts +43 -0
- package/dist/config/verified-write.js +89 -0
- package/dist/diagnostics.d.ts +26 -0
- package/dist/diagnostics.js +344 -0
- package/dist/docs/check.d.ts +16 -0
- package/dist/docs/check.js +197 -0
- package/dist/docs/decision-record.d.ts +34 -0
- package/dist/docs/decision-record.js +135 -0
- package/dist/docs/decisions.d.ts +16 -0
- package/dist/docs/decisions.js +103 -0
- package/dist/docs/markdown.d.ts +36 -0
- package/dist/docs/markdown.js +88 -0
- package/dist/docs/references.d.ts +32 -0
- package/dist/docs/references.js +148 -0
- package/dist/emit.d.ts +22 -0
- package/dist/emit.js +43 -0
- package/dist/entrypoint-kinds.d.ts +3 -0
- package/dist/entrypoint-kinds.js +11 -0
- package/dist/environment/application/confirm.d.ts +35 -0
- package/dist/environment/application/confirm.js +122 -0
- package/dist/environment/application/destructive.d.ts +6 -0
- package/dist/environment/application/destructive.js +429 -0
- package/dist/environment/application/doctor.d.ts +94 -0
- package/dist/environment/application/doctor.js +247 -0
- package/dist/environment/application/guard.d.ts +49 -0
- package/dist/environment/application/guard.js +677 -0
- package/dist/environment/application/health.d.ts +143 -0
- package/dist/environment/application/health.js +385 -0
- package/dist/environment/application/lifecycle-context.d.ts +235 -0
- package/dist/environment/application/lifecycle-context.js +154 -0
- package/dist/environment/application/lifecycle-state.d.ts +25 -0
- package/dist/environment/application/lifecycle-state.js +202 -0
- package/dist/environment/application/lifecycle.d.ts +18 -0
- package/dist/environment/application/lifecycle.js +737 -0
- package/dist/environment/application/logs.d.ts +45 -0
- package/dist/environment/application/logs.js +127 -0
- package/dist/environment/application/services.d.ts +60 -0
- package/dist/environment/application/services.js +89 -0
- package/dist/environment/application/setup.d.ts +129 -0
- package/dist/environment/application/setup.js +741 -0
- package/dist/environment/application/shared.d.ts +11 -0
- package/dist/environment/application/shared.js +61 -0
- package/dist/environment/application/siblings.d.ts +43 -0
- package/dist/environment/application/siblings.js +269 -0
- package/dist/environment/claims.d.ts +389 -0
- package/dist/environment/claims.js +1701 -0
- package/dist/environment/codex-hook-trust.d.ts +11 -0
- package/dist/environment/codex-hook-trust.js +185 -0
- package/dist/environment/compose-environment.d.ts +1 -0
- package/dist/environment/compose-environment.js +6 -0
- package/dist/environment/compose-ownership.d.ts +21 -0
- package/dist/environment/compose-ownership.js +117 -0
- package/dist/environment/compose-topology.d.ts +125 -0
- package/dist/environment/compose-topology.js +490 -0
- package/dist/environment/contract.d.ts +522 -0
- package/dist/environment/contract.js +794 -0
- package/dist/environment/declaration.d.ts +14 -0
- package/dist/environment/declaration.js +39 -0
- package/dist/environment/destructive-composition.d.ts +29 -0
- package/dist/environment/destructive-composition.js +333 -0
- package/dist/environment/docker-daemon.d.ts +30 -0
- package/dist/environment/docker-daemon.js +78 -0
- package/dist/environment/docker-endpoint.d.ts +10 -0
- package/dist/environment/docker-endpoint.js +19 -0
- package/dist/environment/env-schema-observation.d.ts +46 -0
- package/dist/environment/env-schema-observation.js +241 -0
- package/dist/environment/evidence.d.ts +136 -0
- package/dist/environment/evidence.js +437 -0
- package/dist/environment/executable.d.ts +38 -0
- package/dist/environment/executable.js +190 -0
- package/dist/environment/generated-application/authorities.d.ts +5 -0
- package/dist/environment/generated-application/authorities.js +61 -0
- package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
- package/dist/environment/generated-application/bootstrap-skill.js +328 -0
- package/dist/environment/generated-application/check.d.ts +13 -0
- package/dist/environment/generated-application/check.js +191 -0
- package/dist/environment/generated-application/custom-surface.d.ts +26 -0
- package/dist/environment/generated-application/custom-surface.js +289 -0
- package/dist/environment/generated-application/prepare.d.ts +29 -0
- package/dist/environment/generated-application/prepare.js +278 -0
- package/dist/environment/generated-application/publication.d.ts +33 -0
- package/dist/environment/generated-application/publication.js +547 -0
- package/dist/environment/generated-application/shared.d.ts +492 -0
- package/dist/environment/generated-application/shared.js +354 -0
- package/dist/environment/generated-application/surface-observation.d.ts +4 -0
- package/dist/environment/generated-application/surface-observation.js +69 -0
- package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
- package/dist/environment/generated-application/surface-outputs.js +400 -0
- package/dist/environment/generated-application/surfaces.d.ts +3 -0
- package/dist/environment/generated-application/surfaces.js +704 -0
- package/dist/environment/generated-application/sync.d.ts +6 -0
- package/dist/environment/generated-application/sync.js +124 -0
- package/dist/environment/git-observation.d.ts +202 -0
- package/dist/environment/git-observation.js +553 -0
- package/dist/environment/health-composition.d.ts +12 -0
- package/dist/environment/health-composition.js +645 -0
- package/dist/environment/host-observation.d.ts +56 -0
- package/dist/environment/host-observation.js +52 -0
- package/dist/environment/identity.d.ts +48 -0
- package/dist/environment/identity.js +85 -0
- package/dist/environment/init-application.d.ts +333 -0
- package/dist/environment/init-application.js +726 -0
- package/dist/environment/install-policy-observation.d.ts +71 -0
- package/dist/environment/install-policy-observation.js +284 -0
- package/dist/environment/install-policy.d.ts +48 -0
- package/dist/environment/install-policy.js +96 -0
- package/dist/environment/instance.d.ts +33 -0
- package/dist/environment/instance.js +122 -0
- package/dist/environment/instruction-pointer.d.ts +19 -0
- package/dist/environment/instruction-pointer.js +144 -0
- package/dist/environment/lifecycle-composition.d.ts +31 -0
- package/dist/environment/lifecycle-composition.js +742 -0
- package/dist/environment/lifecycle-stage.d.ts +120 -0
- package/dist/environment/lifecycle-stage.js +408 -0
- package/dist/environment/lifecycle.d.ts +75 -0
- package/dist/environment/lifecycle.js +354 -0
- package/dist/environment/logs.d.ts +132 -0
- package/dist/environment/logs.js +519 -0
- package/dist/environment/map-limit.d.ts +2 -0
- package/dist/environment/map-limit.js +13 -0
- package/dist/environment/mcp-observation.d.ts +9 -0
- package/dist/environment/mcp-observation.js +46 -0
- package/dist/environment/observations.d.ts +46 -0
- package/dist/environment/observations.js +346 -0
- package/dist/environment/operator-application.d.ts +79 -0
- package/dist/environment/operator-application.js +197 -0
- package/dist/environment/ports.d.ts +182 -0
- package/dist/environment/ports.js +1205 -0
- package/dist/environment/posture-observation.d.ts +68 -0
- package/dist/environment/posture-observation.js +253 -0
- package/dist/environment/presence.d.ts +4 -0
- package/dist/environment/presence.js +26 -0
- package/dist/environment/read-composition.d.ts +32 -0
- package/dist/environment/read-composition.js +397 -0
- package/dist/environment/readiness-composition.d.ts +57 -0
- package/dist/environment/readiness-composition.js +151 -0
- package/dist/environment/reclaim.d.ts +370 -0
- package/dist/environment/reclaim.js +1940 -0
- package/dist/environment/repository-identity.d.ts +13 -0
- package/dist/environment/repository-identity.js +108 -0
- package/dist/environment/runtime-measurement-record.d.ts +38 -0
- package/dist/environment/runtime-measurement-record.js +111 -0
- package/dist/environment/runtime-measurement.d.ts +27 -0
- package/dist/environment/runtime-measurement.js +224 -0
- package/dist/environment/runtime-probe-residue.d.ts +43 -0
- package/dist/environment/runtime-probe-residue.js +148 -0
- package/dist/environment/runtime-probe.d.ts +72 -0
- package/dist/environment/runtime-probe.js +725 -0
- package/dist/environment/runtime.d.ts +551 -0
- package/dist/environment/runtime.js +2405 -0
- package/dist/environment/seed.d.ts +16 -0
- package/dist/environment/seed.js +43 -0
- package/dist/environment/selftest-application.d.ts +86 -0
- package/dist/environment/selftest-application.js +713 -0
- package/dist/environment/sensitive.d.ts +3 -0
- package/dist/environment/sensitive.js +48 -0
- package/dist/environment/served-checkout-grants.d.ts +53 -0
- package/dist/environment/served-checkout-grants.js +182 -0
- package/dist/environment/setup-observation.d.ts +62 -0
- package/dist/environment/setup-observation.js +1473 -0
- package/dist/environment/setup.d.ts +43 -0
- package/dist/environment/setup.js +176 -0
- package/dist/environment/sibling-checkouts.d.ts +119 -0
- package/dist/environment/sibling-checkouts.js +254 -0
- package/dist/environment/sibling-instructions.d.ts +33 -0
- package/dist/environment/sibling-instructions.js +224 -0
- package/dist/environment/sibling-observation.d.ts +27 -0
- package/dist/environment/sibling-observation.js +45 -0
- package/dist/environment/sibling-pull.d.ts +23 -0
- package/dist/environment/sibling-pull.js +95 -0
- package/dist/environment/sibling-registration.d.ts +45 -0
- package/dist/environment/sibling-registration.js +538 -0
- package/dist/environment/stack-inputs.d.ts +18 -0
- package/dist/environment/stack-inputs.js +210 -0
- package/dist/environment/stack-inventory-prune.d.ts +31 -0
- package/dist/environment/stack-inventory-prune.js +129 -0
- package/dist/environment/stack-inventory-report.d.ts +44 -0
- package/dist/environment/stack-inventory-report.js +78 -0
- package/dist/environment/stack-inventory.d.ts +94 -0
- package/dist/environment/stack-inventory.js +418 -0
- package/dist/environment/state.d.ts +410 -0
- package/dist/environment/state.js +2153 -0
- package/dist/environment/templates.d.ts +140 -0
- package/dist/environment/templates.js +685 -0
- package/dist/environment/tool-registration.d.ts +9 -0
- package/dist/environment/tool-registration.js +92 -0
- package/dist/environment/upgrade-application.d.ts +19 -0
- package/dist/environment/upgrade-application.js +175 -0
- package/dist/environment-exec/execute.d.ts +105 -0
- package/dist/environment-exec/execute.js +1179 -0
- package/dist/environment-exec/libexec-program.d.ts +6 -0
- package/dist/environment-exec/libexec-program.js +22 -0
- package/dist/environment-exec/verified-digest.d.ts +4 -0
- package/dist/environment-exec/verified-digest.js +16 -0
- package/dist/exact-keys.d.ts +7 -0
- package/dist/exact-keys.js +15 -0
- package/dist/fix-catalogue.d.ts +32 -0
- package/dist/fix-catalogue.js +60 -0
- package/dist/freshness.d.ts +29 -0
- package/dist/freshness.js +75 -0
- package/dist/generated-environment/adopt.d.ts +16 -0
- package/dist/generated-environment/adopt.js +271 -0
- package/dist/generated-environment/command.d.ts +47 -0
- package/dist/generated-environment/command.js +75 -0
- package/dist/generated-environment/transaction.d.ts +186 -0
- package/dist/generated-environment/transaction.js +1770 -0
- package/dist/grading/evaluate.d.ts +71 -0
- package/dist/grading/evaluate.js +403 -0
- package/dist/grading/grade.d.ts +33 -0
- package/dist/grading/grade.js +57 -0
- package/dist/guards/answer-confirmation.d.ts +41 -0
- package/dist/guards/answer-confirmation.js +109 -0
- package/dist/guards/evaluator.d.ts +130 -0
- package/dist/guards/evaluator.js +1258 -0
- package/dist/guards/harness-adapter.d.ts +17 -0
- package/dist/guards/harness-adapter.js +57 -0
- package/dist/guards/host.d.ts +8 -0
- package/dist/guards/host.js +10 -0
- package/dist/guards/invocation-parser.d.ts +66 -0
- package/dist/guards/invocation-parser.js +595 -0
- package/dist/guards/local-identity.d.ts +44 -0
- package/dist/guards/local-identity.js +129 -0
- package/dist/guards/policy-change.d.ts +43 -0
- package/dist/guards/policy-change.js +159 -0
- package/dist/guards/policy-pin.d.ts +13 -0
- package/dist/guards/policy-pin.js +177 -0
- package/dist/guards/protected-locations.d.ts +62 -0
- package/dist/guards/protected-locations.js +461 -0
- package/dist/guards/read-only.d.ts +37 -0
- package/dist/guards/read-only.js +315 -0
- package/dist/init/command.d.ts +41 -0
- package/dist/init/command.js +330 -0
- package/dist/init/derive.d.ts +53 -0
- package/dist/init/derive.js +819 -0
- package/dist/init/draft.d.ts +140 -0
- package/dist/init/draft.js +1228 -0
- package/dist/init/render.d.ts +47 -0
- package/dist/init/render.js +104 -0
- package/dist/init/scaffold.d.ts +53 -0
- package/dist/init/scaffold.js +121 -0
- package/dist/invocation.d.ts +13 -0
- package/dist/invocation.js +20 -0
- package/dist/package-metadata.d.ts +9 -0
- package/dist/package-metadata.js +19 -0
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.js +88 -0
- package/dist/references/named.d.ts +24 -0
- package/dist/references/named.js +27 -0
- package/dist/refusal.d.ts +15 -0
- package/dist/refusal.js +7 -0
- package/dist/registry-derivation.d.ts +31 -0
- package/dist/registry-derivation.js +32 -0
- package/dist/registry-resolve/command.d.ts +47 -0
- package/dist/registry-resolve/command.js +226 -0
- package/dist/registry-resolve/registry.d.ts +68 -0
- package/dist/registry-resolve/registry.js +292 -0
- package/dist/registry-resolve/render-shell.d.ts +18 -0
- package/dist/registry-resolve/render-shell.js +36 -0
- package/dist/repair.d.ts +29 -0
- package/dist/repair.js +8 -0
- package/dist/repository-path.d.ts +9 -0
- package/dist/repository-path.js +16 -0
- package/dist/schema-json.d.ts +1 -0
- package/dist/schema-json.js +177 -0
- package/dist/schema.d.ts +1289 -0
- package/dist/schema.js +985 -0
- package/dist/setup/command.d.ts +4 -0
- package/dist/setup/command.js +4 -0
- package/dist/sha256.d.ts +1 -0
- package/dist/sha256.js +4 -0
- package/dist/surfaces/adoption.d.ts +41 -0
- package/dist/surfaces/adoption.js +217 -0
- package/dist/surfaces/consumer-instructions.d.ts +20 -0
- package/dist/surfaces/consumer-instructions.js +43 -0
- package/dist/surfaces/contract.d.ts +42 -0
- package/dist/surfaces/contract.js +169 -0
- package/dist/surfaces/core-declarations.d.ts +24 -0
- package/dist/surfaces/core-declarations.js +79 -0
- package/dist/surfaces/development-markers.d.ts +1 -0
- package/dist/surfaces/development-markers.js +18 -0
- package/dist/surfaces/generator-adapter.d.ts +71 -0
- package/dist/surfaces/generator-adapter.js +809 -0
- package/dist/surfaces/harness-registry.d.ts +260 -0
- package/dist/surfaces/harness-registry.js +146 -0
- package/dist/surfaces/mcp.d.ts +145 -0
- package/dist/surfaces/mcp.js +349 -0
- package/dist/surfaces/merge.d.ts +30 -0
- package/dist/surfaces/merge.js +105 -0
- package/dist/surfaces/ownership.d.ts +190 -0
- package/dist/surfaces/ownership.js +795 -0
- package/dist/surfaces/projection.d.ts +136 -0
- package/dist/surfaces/projection.js +716 -0
- package/dist/surfaces/render.d.ts +79 -0
- package/dist/surfaces/render.js +636 -0
- package/dist/surfaces/restrictions.d.ts +130 -0
- package/dist/surfaces/restrictions.js +447 -0
- package/dist/surfaces/selftest.d.ts +162 -0
- package/dist/surfaces/selftest.js +393 -0
- package/dist/surfaces/skill-contract.d.ts +85 -0
- package/dist/surfaces/skill-contract.js +449 -0
- package/dist/surfaces/sync.d.ts +57 -0
- package/dist/surfaces/sync.js +164 -0
- package/dist/team-metadata.d.ts +41 -0
- package/dist/team-metadata.js +513 -0
- package/dist/testing/gates.d.ts +91 -0
- package/dist/testing/gates.js +182 -0
- package/dist/testing/hooks.d.ts +59 -0
- package/dist/testing/hooks.js +139 -0
- package/dist/testing/test-protection.d.ts +34 -0
- package/dist/testing/test-protection.js +137 -0
- package/dist/testing/verdict.d.ts +29 -0
- package/dist/testing/verdict.js +62 -0
- package/dist/testing/weakening.d.ts +15 -0
- package/dist/testing/weakening.js +30 -0
- package/dist/work-orders/application-closure.d.ts +7 -0
- package/dist/work-orders/application-closure.js +76 -0
- package/dist/work-orders/application-context.d.ts +162 -0
- package/dist/work-orders/application-context.js +137 -0
- package/dist/work-orders/application-decisions.d.ts +27 -0
- package/dist/work-orders/application-decisions.js +121 -0
- package/dist/work-orders/application-grading.d.ts +11 -0
- package/dist/work-orders/application-grading.js +212 -0
- package/dist/work-orders/application.d.ts +6 -0
- package/dist/work-orders/application.js +223 -0
- package/dist/work-orders/composition.d.ts +101 -0
- package/dist/work-orders/composition.js +1202 -0
- package/dist/work-orders/contract.d.ts +77 -0
- package/dist/work-orders/contract.js +140 -0
- package/dist/work-orders/decisions.d.ts +23 -0
- package/dist/work-orders/decisions.js +55 -0
- package/dist/work-orders/store.d.ts +207 -0
- package/dist/work-orders/store.js +291 -0
- package/docs/README.md +68 -0
- package/docs/architecture.md +136 -0
- package/docs/capability-matrix.md +58 -0
- package/docs/cli-reference.md +807 -0
- package/docs/command-list.md +62 -0
- package/docs/compose-patterns.md +99 -0
- package/docs/concepts.md +173 -0
- package/docs/configuration-essentials.md +177 -0
- package/docs/configuration-reference.md +636 -0
- package/docs/docs-check.md +76 -0
- package/docs/environment.md +948 -0
- package/docs/extending.md +43 -0
- package/docs/faq.md +113 -0
- package/docs/getting-started.md +692 -0
- package/docs/harness-surfaces.md +500 -0
- package/docs/joining-a-team.md +76 -0
- package/docs/release-policy.md +49 -0
- package/docs/safety-and-autonomy.md +463 -0
- package/docs/troubleshooting.md +382 -0
- package/docs/tutorial.md +171 -0
- package/docs/work-and-browser.md +420 -0
- package/libexec/browser-operation.cjs +270 -0
- package/libexec/fence-marker.cjs +101 -0
- package/libexec/fence-marker.d.cts +24 -0
- package/libexec/fenced-group-runner.cjs +77 -0
- package/libexec/fenced-supervisor.cjs +137 -0
- package/libexec/generated-filesystem.cjs +731 -0
- package/libexec/install-filesystem.cjs +225 -0
- package/libexec/rulesync-generator.NOTICE.md +1112 -0
- package/libexec/rulesync-generator.cjs +743 -0
- package/libexec/surface-generator-worker.cjs +266 -0
- package/libexec/surface-output-reader.cjs +99 -0
- package/libexec/surface-scratch-cleanup.cjs +14 -0
- package/libexec/validate-harness-evidence.d.mts +183 -0
- package/libexec/validate-harness-evidence.mjs +1312 -0
- package/package.json +74 -4
- package/surfaces/README.md +33 -0
- package/surfaces/agents/evaluator.agent.md +76 -0
- package/surfaces/guards/bash-guard.sh +48 -0
- package/surfaces/guards/claude.adapter.json +25 -0
- package/surfaces/guards/codex.adapter.json +24 -0
- package/surfaces/guards/opencode.adapter.json +25 -0
- package/surfaces/references/browser.md +63 -0
- package/surfaces/references/test-data-and-personas.md +84 -0
- package/surfaces/references/testing-tiers.md +11 -0
- package/surfaces/skills/cockpit-browser.skill.md +59 -0
- package/surfaces/skills/cockpit-explain.skill.md +32 -0
- package/surfaces/skills/cockpit-fix.skill.md +37 -0
- package/surfaces/skills/cockpit-setup.skill.md +39 -0
- package/surfaces/skills/cockpit-work.skill.md +34 -0
- package/surfaces/skills/collection.json +5 -0
- package/surfaces/skills/procedures/explain.md +66 -0
- package/surfaces/skills/procedures/fix.md +95 -0
- package/surfaces/skills/procedures/setup.md +452 -0
- package/surfaces/skills/procedures/work.md +134 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type CockpitConfig as CockpitConfigValue, type Provenance } from './schema.js';
|
|
2
|
+
export interface RegistryMcpSource {
|
|
3
|
+
readonly slug: string;
|
|
4
|
+
readonly siblingDir: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly provenance: Provenance;
|
|
7
|
+
}
|
|
8
|
+
export interface RegistrySecretPath {
|
|
9
|
+
readonly slug: string;
|
|
10
|
+
readonly siblingDir: string;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly kind: 'instance';
|
|
13
|
+
}
|
|
14
|
+
type DeepReadonly<T> = T extends (...args: never[]) => unknown ? T : T extends readonly (infer Item)[] ? readonly DeepReadonly<Item>[] : T extends object ? {
|
|
15
|
+
readonly [Key in keyof T]: DeepReadonly<T[Key]>;
|
|
16
|
+
} : T;
|
|
17
|
+
export interface DerivedRegistry {
|
|
18
|
+
readonly config: DeepReadonly<CockpitConfigValue>;
|
|
19
|
+
readonly mcpSources: readonly RegistryMcpSource[];
|
|
20
|
+
readonly secretPaths: readonly RegistrySecretPath[];
|
|
21
|
+
}
|
|
22
|
+
export type RegistryDerivationResult = Readonly<{
|
|
23
|
+
kind: 'complete';
|
|
24
|
+
result: DerivedRegistry;
|
|
25
|
+
}> | Readonly<{
|
|
26
|
+
kind: 'refusal';
|
|
27
|
+
code: 'REGISTRY_INPUT_INVALID';
|
|
28
|
+
message: string;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function deriveRegistry(input: unknown): RegistryDerivationResult;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CockpitConfig, } from './schema.js';
|
|
2
|
+
function refusal(code, message) {
|
|
3
|
+
return { kind: 'refusal', code, message };
|
|
4
|
+
}
|
|
5
|
+
function zodMessage(prefix, issues) {
|
|
6
|
+
const issue = issues[0];
|
|
7
|
+
if (!issue)
|
|
8
|
+
return prefix;
|
|
9
|
+
const path = issue.path.length === 0 ? 'configuration' : issue.path.map(String).join('.');
|
|
10
|
+
return `${prefix} at ${path}: ${issue.message}`;
|
|
11
|
+
}
|
|
12
|
+
export function deriveRegistry(input) {
|
|
13
|
+
const parsed = CockpitConfig.safeParse(input);
|
|
14
|
+
if (!parsed.success) {
|
|
15
|
+
return refusal('REGISTRY_INPUT_INVALID', zodMessage('registry derivation input is not a canonical cockpit configuration', parsed.error.issues));
|
|
16
|
+
}
|
|
17
|
+
// The derives facts leave the configuration as the MCP sources below.
|
|
18
|
+
const config = { ...parsed.data, sibling: parsed.data.sibling.map(({ derives: _derives, ...sibling }) => sibling) };
|
|
19
|
+
const mcpSources = parsed.data.sibling.flatMap((sibling) => (sibling.derives?.mcp_sources ?? []).map((source) => ({
|
|
20
|
+
slug: sibling.slug,
|
|
21
|
+
siblingDir: sibling.dir,
|
|
22
|
+
path: source.path,
|
|
23
|
+
provenance: source.provenance,
|
|
24
|
+
})));
|
|
25
|
+
const secretPaths = parsed.data.sibling.flatMap((sibling) => (sibling.environment_files ?? []).map((file) => ({
|
|
26
|
+
slug: sibling.slug,
|
|
27
|
+
siblingDir: sibling.dir,
|
|
28
|
+
path: file.instance,
|
|
29
|
+
kind: 'instance',
|
|
30
|
+
})));
|
|
31
|
+
return { kind: 'complete', result: { config, mcpSources, secretPaths } };
|
|
32
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Diagnostic } from '../diagnostics.js';
|
|
2
|
+
declare const ADOPTION_LAYERS: readonly ['registry', 'environment', 'surfaces', 'guards', 'grading'];
|
|
3
|
+
type AdoptionLayer = typeof ADOPTION_LAYERS[number];
|
|
4
|
+
type AdoptionState = 'migrated' | 'documented-only';
|
|
5
|
+
interface OutcomeBase {
|
|
6
|
+
artifact: string | null;
|
|
7
|
+
destination: null;
|
|
8
|
+
diagnostics: Diagnostic[];
|
|
9
|
+
result: {
|
|
10
|
+
registry: RegistryResolutionResult;
|
|
11
|
+
} | null;
|
|
12
|
+
status: number;
|
|
13
|
+
}
|
|
14
|
+
interface RegistryResolutionResult {
|
|
15
|
+
format: string;
|
|
16
|
+
cockpitSourceRevision: string;
|
|
17
|
+
registrySha256: string;
|
|
18
|
+
dialect: 'lane' | 'tier';
|
|
19
|
+
siblingCount: number;
|
|
20
|
+
adoption: {
|
|
21
|
+
layer: AdoptionLayer;
|
|
22
|
+
state: AdoptionState;
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
export interface RegistryResolveCommandInput {
|
|
26
|
+
registry: string;
|
|
27
|
+
siblingsRoot: string;
|
|
28
|
+
adoption: string;
|
|
29
|
+
cockpitSourceRevision?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface CompleteRegistryResolveOutcome extends OutcomeBase {
|
|
32
|
+
kind: 'complete';
|
|
33
|
+
artifact: string;
|
|
34
|
+
result: {
|
|
35
|
+
registry: RegistryResolutionResult;
|
|
36
|
+
};
|
|
37
|
+
status: 0;
|
|
38
|
+
}
|
|
39
|
+
export interface RefusedRegistryResolveOutcome extends OutcomeBase {
|
|
40
|
+
kind: 'refusal';
|
|
41
|
+
artifact: null;
|
|
42
|
+
result: null;
|
|
43
|
+
status: 2;
|
|
44
|
+
}
|
|
45
|
+
export type RegistryResolveOutcome = CompleteRegistryResolveOutcome | RefusedRegistryResolveOutcome;
|
|
46
|
+
export declare function registryResolveCommand(input: RegistryResolveCommandInput): Promise<RegistryResolveOutcome>;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { isAbsolute, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { readBoundedInput, STRUCTURED_INPUT_BYTE_LIMIT } from '../config/load.js';
|
|
6
|
+
import { parseRegistry } from './registry.js';
|
|
7
|
+
import { renderResolvedRegistryShell } from './render-shell.js';
|
|
8
|
+
import { refusalOutcome as refusal } from '../refusal.js';
|
|
9
|
+
const FORMAT_VERSION = '1';
|
|
10
|
+
// The release workflow stamps the exact commit; every source build, including a tarball packed
|
|
11
|
+
// from a checkout, carries this value instead, as the package manifest in the repository does.
|
|
12
|
+
const UNSTAMPED_REVISION = 'development';
|
|
13
|
+
const ADOPTION_LAYERS = ['registry', 'environment', 'surfaces', 'guards', 'grading'];
|
|
14
|
+
const packageManifest = fileURLToPath(new URL('../../package.json', import.meta.url));
|
|
15
|
+
async function sourceRevision(injected) {
|
|
16
|
+
if (injected !== undefined)
|
|
17
|
+
return injected;
|
|
18
|
+
try {
|
|
19
|
+
const manifest = JSON.parse(await readFile(packageManifest, 'utf8'));
|
|
20
|
+
return typeof manifest.cockpitSourceRevision === 'string' ? manifest.cockpitSourceRevision : {};
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
// The resolver's import set is pinned, so the errno code or error class is read here rather than from the shared helper.
|
|
24
|
+
return { cause: error instanceof Error ? error.code ?? error.name : 'unknown error' };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function readInput(path, kind) {
|
|
28
|
+
try {
|
|
29
|
+
const read = await readBoundedInput(resolve(path));
|
|
30
|
+
return read.kind === 'complete' ? read.bytes : refusal(kind === 'registry' ? 'REGISTRY_TOO_LARGE' : 'ADOPTION_TOO_LARGE', `the ${kind} file exceeds the ${STRUCTURED_INPUT_BYTE_LIMIT}-byte input limit`, resolve(path));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const ioCode = error.code;
|
|
34
|
+
return refusal(ioCode === 'ENOENT'
|
|
35
|
+
? kind === 'registry' ? 'REGISTRY_NOT_FOUND' : 'ADOPTION_NOT_FOUND'
|
|
36
|
+
: kind === 'registry' ? 'REGISTRY_UNREADABLE' : 'ADOPTION_UNREADABLE', ioCode === 'ENOENT'
|
|
37
|
+
? `the ${kind} file does not exist`
|
|
38
|
+
: `the ${kind} file could not be read (${ioCode ?? 'unknown I/O error'})`, resolve(path));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function decodeInput(bytes) {
|
|
42
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
43
|
+
}
|
|
44
|
+
function encodingRefusal(kind) {
|
|
45
|
+
return refusal(kind === 'registry' ? 'REGISTRY_ENCODING_INVALID' : 'ADOPTION_ENCODING_INVALID', `the ${kind} file is not valid UTF-8`);
|
|
46
|
+
}
|
|
47
|
+
const ADOPTION_FIX = 'write exactly five lines in this order: registry=, environment=, surfaces=, guards=, grading=, each set to migrated or documented-only, with migrated layers first';
|
|
48
|
+
function parseAdoption(source) {
|
|
49
|
+
if (source.trim() === '') {
|
|
50
|
+
return { refusal: refusal('ADOPTION_EMPTY', 'the adoption record is empty', undefined, ADOPTION_FIX) };
|
|
51
|
+
}
|
|
52
|
+
const lines = source.endsWith('\n') ? source.slice(0, -1).split('\n') : source.split('\n');
|
|
53
|
+
if (lines.length !== ADOPTION_LAYERS.length) {
|
|
54
|
+
return { refusal: refusal('ADOPTION_ORDER_INVALID', 'the adoption record must contain all five layers exactly once in order', undefined, ADOPTION_FIX) };
|
|
55
|
+
}
|
|
56
|
+
const adoption = [];
|
|
57
|
+
for (const [index, line] of lines.entries()) {
|
|
58
|
+
const match = /^([a-z]+)=(migrated|documented-only)$/.exec(line);
|
|
59
|
+
if (!match) {
|
|
60
|
+
const state = /^[a-z]+=(.*)$/.exec(line)?.[1];
|
|
61
|
+
return {
|
|
62
|
+
refusal: refusal(state !== undefined && state !== 'migrated' && state !== 'documented-only'
|
|
63
|
+
? 'ADOPTION_STATE_INVALID'
|
|
64
|
+
: 'ADOPTION_RECORD_INVALID', 'each adoption row must be a fixed layer=migrated or layer=documented-only assignment', `adoption line ${index + 1}`, ADOPTION_FIX),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const expected = ADOPTION_LAYERS[index];
|
|
68
|
+
if (match[1] !== expected) {
|
|
69
|
+
return {
|
|
70
|
+
refusal: refusal('ADOPTION_ORDER_INVALID', 'the adoption layers must appear exactly once in registry, environment, surfaces, guards, grading order', `adoption line ${index + 1}`, ADOPTION_FIX),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
adoption.push({ layer: expected, state: match[2] });
|
|
74
|
+
}
|
|
75
|
+
const firstDocumented = adoption.findIndex(({ state }) => state === 'documented-only');
|
|
76
|
+
const migratedAfterGap = firstDocumented !== -1 && adoption.slice(firstDocumented).some(({ state }) => state === 'migrated');
|
|
77
|
+
if (adoption[0].state !== 'migrated' || migratedAfterGap) {
|
|
78
|
+
return {
|
|
79
|
+
refusal: refusal('ADOPTION_ORDER_INVALID', 'migration must start at registry and remain a contiguous prefix; documented-only layers may follow', undefined, ADOPTION_FIX),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { value: adoption };
|
|
83
|
+
}
|
|
84
|
+
function compatibilityRow(sibling, dialect) {
|
|
85
|
+
if (dialect === 'lane') {
|
|
86
|
+
const lane = sibling.mount.value === 'always' ? 'app' : sibling.mount.value;
|
|
87
|
+
return [sibling.slug, sibling.dir, sibling.remote ?? '', lane, sibling.var, sibling.purpose].join('|');
|
|
88
|
+
}
|
|
89
|
+
const tier = sibling.mount.value === 'always'
|
|
90
|
+
? 'required'
|
|
91
|
+
: sibling.acquire.value === 'none'
|
|
92
|
+
? 'local'
|
|
93
|
+
: sibling.acquire.value;
|
|
94
|
+
return [
|
|
95
|
+
sibling.slug,
|
|
96
|
+
sibling.dir,
|
|
97
|
+
sibling.remote ?? '-',
|
|
98
|
+
sibling.branch ?? '-',
|
|
99
|
+
tier,
|
|
100
|
+
sibling.var,
|
|
101
|
+
sibling.purpose,
|
|
102
|
+
].join('|');
|
|
103
|
+
}
|
|
104
|
+
function resolveRegistry(parsed, context) {
|
|
105
|
+
if (parsed.skipped.length > 0) {
|
|
106
|
+
const first = parsed.skipped[0];
|
|
107
|
+
return refusal(first.code ?? 'REGISTRY_ROW_SKIPPED', first.code === 'REGISTRY_AMBIGUOUS'
|
|
108
|
+
? 'the registry structure is ambiguous'
|
|
109
|
+
: 'the registry contains a row that could not be resolved safely', `registry line ${first.sourceLine}`, 'repair the named source line before resolving repository scope');
|
|
110
|
+
}
|
|
111
|
+
if (!parsed.found || !parsed.dialect || parsed.siblings.length === 0) {
|
|
112
|
+
return refusal(parsed.found ? 'REGISTRY_EMPTY' : 'REGISTRY_NOT_FOUND', parsed.found ? 'the registry contains no usable rows' : 'the file contains no sibling registry', context.registryPath);
|
|
113
|
+
}
|
|
114
|
+
const invalidVariable = parsed.siblings.find((sibling) => !/^[A-Z][A-Z0-9_]*_DIR$/.test(sibling.var));
|
|
115
|
+
if (invalidVariable) {
|
|
116
|
+
return refusal('REGISTRY_VARIABLE_INVALID', 'a sibling variable is outside the safe directory-variable namespace', 'registry field var');
|
|
117
|
+
}
|
|
118
|
+
const escapedDirectory = parsed.siblings.find((sibling) => {
|
|
119
|
+
if (isAbsolute(sibling.dir))
|
|
120
|
+
return true;
|
|
121
|
+
const resolvedDirectory = resolve(context.siblingsRoot, sibling.dir);
|
|
122
|
+
const fromRoot = relative(context.siblingsRoot, resolvedDirectory);
|
|
123
|
+
return fromRoot === '..' || fromRoot.startsWith(`..${sep}`) || isAbsolute(fromRoot);
|
|
124
|
+
});
|
|
125
|
+
if (escapedDirectory) {
|
|
126
|
+
return refusal('REGISTRY_DIR_OUTSIDE_SIBLINGS_ROOT', 'a sibling directory resolves outside the declared sibling root', 'registry field dir');
|
|
127
|
+
}
|
|
128
|
+
const resolvedDirectories = parsed.siblings.map((sibling) => resolve(context.siblingsRoot, sibling.dir));
|
|
129
|
+
if (new Set(resolvedDirectories).size !== resolvedDirectories.length) {
|
|
130
|
+
return refusal('REGISTRY_DIR_DUPLICATE', 'multiple sibling rows resolve to the same directory', 'registry field dir');
|
|
131
|
+
}
|
|
132
|
+
const stamp = context.cockpitSourceRevision;
|
|
133
|
+
if (stamp !== UNSTAMPED_REVISION && !/^[a-f0-9]{40}$/.test(stamp)) {
|
|
134
|
+
return {
|
|
135
|
+
kind: 'refusal',
|
|
136
|
+
artifact: null,
|
|
137
|
+
destination: null,
|
|
138
|
+
diagnostics: [{
|
|
139
|
+
severity: 'error',
|
|
140
|
+
code: 'COCKPIT_REVISION_INVALID',
|
|
141
|
+
message: `the installed package records cockpitSourceRevision ${JSON.stringify(stamp.slice(0, 64))}, which is neither a 40-hex commit nor "development"`,
|
|
142
|
+
target: 'cockpitSourceRevision',
|
|
143
|
+
fix: 'reinstall @b00dea/cockpit from the registry or from a tarball packed from an unmodified checkout, then retry',
|
|
144
|
+
}],
|
|
145
|
+
result: null,
|
|
146
|
+
status: 2,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const diagnostics = stamp === UNSTAMPED_REVISION ? [{
|
|
150
|
+
severity: 'warning',
|
|
151
|
+
code: 'COCKPIT_REVISION_UNSTAMPED',
|
|
152
|
+
message: 'this cockpit was built from source and records no release commit, so COCKPIT_SOURCE_REVISION is "development"',
|
|
153
|
+
target: 'cockpitSourceRevision',
|
|
154
|
+
fix: 'install a released @b00dea/cockpit when the resolved data must name the exact cockpit source commit',
|
|
155
|
+
}] : [];
|
|
156
|
+
const variables = parsed.siblings.map((sibling, index) => ({
|
|
157
|
+
name: sibling.var,
|
|
158
|
+
defaultPath: resolvedDirectories[index],
|
|
159
|
+
}));
|
|
160
|
+
const result = {
|
|
161
|
+
format: FORMAT_VERSION,
|
|
162
|
+
cockpitSourceRevision: context.cockpitSourceRevision,
|
|
163
|
+
registrySha256: context.registrySha256,
|
|
164
|
+
dialect: parsed.dialect,
|
|
165
|
+
siblingCount: parsed.siblings.length,
|
|
166
|
+
adoption: context.adoption,
|
|
167
|
+
};
|
|
168
|
+
try {
|
|
169
|
+
const artifact = renderResolvedRegistryShell({
|
|
170
|
+
formatVersion: FORMAT_VERSION,
|
|
171
|
+
cockpitSourceRevision: context.cockpitSourceRevision,
|
|
172
|
+
registrySha256: context.registrySha256,
|
|
173
|
+
dialect: parsed.dialect,
|
|
174
|
+
siblingsRoot: context.siblingsRoot,
|
|
175
|
+
rows: parsed.siblings.map((sibling) => compatibilityRow(sibling, parsed.dialect)),
|
|
176
|
+
paths: parsed.siblings.map((sibling, index) => [variables[index].defaultPath, sibling.remote ?? '-', sibling.branch ?? '-'].join('|')),
|
|
177
|
+
variables,
|
|
178
|
+
adoption: context.adoption,
|
|
179
|
+
});
|
|
180
|
+
return { kind: 'complete', artifact, destination: null, diagnostics, result: { registry: result }, status: 0 };
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
const code = error instanceof Error && /^([A-Z0-9_]+):/.exec(error.message)?.[1];
|
|
184
|
+
return refusal(code || 'REGISTRY_ARTIFACT_UNSAFE', 'validated registry data could not be represented as a data-only shell artifact');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export async function registryResolveCommand(input) {
|
|
188
|
+
const registryRead = await readInput(input.registry, 'registry');
|
|
189
|
+
if (!Buffer.isBuffer(registryRead))
|
|
190
|
+
return registryRead;
|
|
191
|
+
let registrySource;
|
|
192
|
+
try {
|
|
193
|
+
registrySource = decodeInput(registryRead);
|
|
194
|
+
}
|
|
195
|
+
catch { // Fatal decoding throws only for invalid UTF-8, which the refusal names; the registry may hold secrets.
|
|
196
|
+
return encodingRefusal('registry');
|
|
197
|
+
}
|
|
198
|
+
if (registryRead.length === 0 || registrySource.trim() === '') {
|
|
199
|
+
return refusal('REGISTRY_EMPTY', 'the registry file is empty', resolve(input.registry));
|
|
200
|
+
}
|
|
201
|
+
const adoptionRead = await readInput(input.adoption, 'adoption');
|
|
202
|
+
if (!Buffer.isBuffer(adoptionRead))
|
|
203
|
+
return adoptionRead;
|
|
204
|
+
let adoptionSource;
|
|
205
|
+
try {
|
|
206
|
+
adoptionSource = decodeInput(adoptionRead);
|
|
207
|
+
}
|
|
208
|
+
catch { // Fatal decoding throws only for invalid UTF-8, which the refusal names.
|
|
209
|
+
return encodingRefusal('adoption');
|
|
210
|
+
}
|
|
211
|
+
const adoptionResult = parseAdoption(adoptionSource);
|
|
212
|
+
if ('refusal' in adoptionResult)
|
|
213
|
+
return adoptionResult.refusal;
|
|
214
|
+
const revision = await sourceRevision(input.cockpitSourceRevision);
|
|
215
|
+
if (typeof revision !== 'string') {
|
|
216
|
+
return refusal('COCKPIT_REVISION_INVALID', `the installed package manifest could not be read or records no cockpitSourceRevision${revision.cause ? `: ${revision.cause}` : ''}`, packageManifest, 'reinstall @b00dea/cockpit, then retry');
|
|
217
|
+
}
|
|
218
|
+
const registrySha256 = createHash('sha256').update(registryRead).digest('hex');
|
|
219
|
+
return resolveRegistry(parseRegistry(registrySource), {
|
|
220
|
+
adoption: adoptionResult.value,
|
|
221
|
+
cockpitSourceRevision: revision,
|
|
222
|
+
registryPath: resolve(input.registry),
|
|
223
|
+
registrySha256,
|
|
224
|
+
siblingsRoot: resolve(input.siblingsRoot),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type Acquire, type Mount } from '../schema.js';
|
|
2
|
+
export type Provenance = 'read' | 'inferred';
|
|
3
|
+
export interface Field<T> {
|
|
4
|
+
value: T;
|
|
5
|
+
from: Provenance;
|
|
6
|
+
/** Why, when inferred. Printed next to the value; empty when read directly. */
|
|
7
|
+
because?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DocumentedSibling {
|
|
10
|
+
slug: string;
|
|
11
|
+
dir: string;
|
|
12
|
+
remote?: string;
|
|
13
|
+
branch?: string;
|
|
14
|
+
mount: Field<Mount>;
|
|
15
|
+
acquire: Field<Acquire>;
|
|
16
|
+
var: string;
|
|
17
|
+
purpose: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RegistryReadResult {
|
|
20
|
+
/** Whether a sibling array declaration was present, including a declared empty array. */
|
|
21
|
+
found: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Which dialect the usable rows were written in, or `null` when no dialect was established.
|
|
24
|
+
*
|
|
25
|
+
* Never defaulted. An earlier version returned `'lane'` for a file with no registry in
|
|
26
|
+
* it, which meant a caller could not tell "this file has no registry" from "this
|
|
27
|
+
* registry is empty" from "I did not recognise the opening line" — and a draft would
|
|
28
|
+
* report success over a config with no siblings. The field a reader trusts most is the
|
|
29
|
+
* last one that may be invented.
|
|
30
|
+
*/
|
|
31
|
+
dialect: 'lane' | 'tier' | null;
|
|
32
|
+
siblings: DocumentedSibling[];
|
|
33
|
+
/** Rows the parser saw but could not use, identified without exposing their contents. */
|
|
34
|
+
skipped: {
|
|
35
|
+
sourceLine: number;
|
|
36
|
+
reason: string;
|
|
37
|
+
code?: 'REGISTRY_AMBIGUOUS';
|
|
38
|
+
}[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse a `*_SIBLINGS=( "a|b|c" ... )` block out of an `env/lib/instance.sh`.
|
|
42
|
+
*
|
|
43
|
+
* The dialect is decided by field count, the one signal that is unambiguous. The lane
|
|
44
|
+
* dialect writes six fields (`slug|dir|remote|lane|var|purpose`); the tier dialect writes
|
|
45
|
+
* seven, adding `branch` and replacing the fourth-position `lane` with a fifth-position
|
|
46
|
+
* `tier`. A row of any other width is recorded as skipped rather than bent into shape.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseRegistry(source: string): RegistryReadResult;
|
|
49
|
+
/** A field the schema requires that no source registry can supply. A human fills it once. */
|
|
50
|
+
export interface Gap {
|
|
51
|
+
slug: string;
|
|
52
|
+
field: string;
|
|
53
|
+
why: string;
|
|
54
|
+
/** True when the schema refuses the config until this is answered. */
|
|
55
|
+
blocking: boolean;
|
|
56
|
+
/** Action specific to the source of the gap, when the generic fix would mislead. */
|
|
57
|
+
fix?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Fields a registry draft cannot answer from any existing registry.
|
|
61
|
+
*
|
|
62
|
+
* This is deliberately not solved by writing a plausible value. A host lane's reason — a
|
|
63
|
+
* simulator that cannot be containerised, a renderer that lives in a vendor's cloud — is a
|
|
64
|
+
* constraint someone discovered, and a generated guess at it is worse than a blank, because
|
|
65
|
+
* the next reader treats it as established. So a registry draft is a config that is
|
|
66
|
+
* incomplete *and says which parts*, and the operator answers once.
|
|
67
|
+
*/
|
|
68
|
+
export declare function gaps(siblings: DocumentedSibling[]): Gap[];
|