wingfoil 0.2.1 → 0.3.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 +88 -42
- package/dist/agent/discovery.d.ts +72 -0
- package/dist/agent/discovery.d.ts.map +1 -0
- package/dist/agent/discovery.js +210 -0
- package/dist/agent/discovery.js.map +1 -0
- package/dist/agent/execute.d.ts +206 -0
- package/dist/agent/execute.d.ts.map +1 -0
- package/dist/agent/execute.js +581 -0
- package/dist/agent/execute.js.map +1 -0
- package/dist/agent/index.d.ts +23 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +85 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/launch.d.ts +133 -0
- package/dist/agent/launch.d.ts.map +1 -0
- package/dist/agent/launch.js +380 -0
- package/dist/agent/launch.js.map +1 -0
- package/dist/agent/manifest.d.ts +30 -0
- package/dist/agent/manifest.d.ts.map +1 -0
- package/dist/agent/manifest.js +93 -0
- package/dist/agent/manifest.js.map +1 -0
- package/dist/agent/placeholders.d.ts +49 -0
- package/dist/agent/placeholders.d.ts.map +1 -0
- package/dist/agent/placeholders.js +177 -0
- package/dist/agent/placeholders.js.map +1 -0
- package/dist/agent/run-log.d.ts +254 -0
- package/dist/agent/run-log.d.ts.map +1 -0
- package/dist/agent/run-log.js +612 -0
- package/dist/agent/run-log.js.map +1 -0
- package/dist/agent/schema.d.ts +100 -0
- package/dist/agent/schema.d.ts.map +1 -0
- package/dist/agent/schema.js +89 -0
- package/dist/agent/schema.js.map +1 -0
- package/dist/agent/step.d.ts +41 -0
- package/dist/agent/step.d.ts.map +1 -0
- package/dist/agent/step.js +95 -0
- package/dist/agent/step.js.map +1 -0
- package/dist/build-info.json +4 -0
- package/dist/cli/error.d.ts +11 -2
- package/dist/cli/error.d.ts.map +1 -1
- package/dist/cli/error.js +27 -6
- package/dist/cli/error.js.map +1 -1
- package/dist/cli/exit.d.ts +33 -3
- package/dist/cli/exit.d.ts.map +1 -1
- package/dist/cli/exit.js +54 -3
- package/dist/cli/exit.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-command.d.ts.map +1 -1
- package/dist/cli/init-command.js +6 -3
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/mcp-command.d.ts +13 -4
- package/dist/cli/mcp-command.d.ts.map +1 -1
- package/dist/cli/mcp-command.js +25 -8
- package/dist/cli/mcp-command.js.map +1 -1
- package/dist/cli/output.d.ts +12 -4
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +15 -4
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/program.d.ts +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +270 -60
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/registrar.d.ts +16 -7
- package/dist/cli/registrar.d.ts.map +1 -1
- package/dist/cli/registrar.js +71 -6
- package/dist/cli/registrar.js.map +1 -1
- package/dist/cli/suggest.d.ts +20 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +49 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli/warning.d.ts +26 -0
- package/dist/cli/warning.d.ts.map +1 -0
- package/dist/cli/warning.js +66 -0
- package/dist/cli/warning.js.map +1 -0
- package/dist/cli.js +11 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-execute.d.ts +44 -0
- package/dist/core/agent-execute.d.ts.map +1 -0
- package/dist/core/agent-execute.js +71 -0
- package/dist/core/agent-execute.js.map +1 -0
- package/dist/core/agent-list.d.ts +95 -0
- package/dist/core/agent-list.d.ts.map +1 -0
- package/dist/core/agent-list.js +207 -0
- package/dist/core/agent-list.js.map +1 -0
- package/dist/core/agent-show.d.ts +44 -0
- package/dist/core/agent-show.d.ts.map +1 -0
- package/dist/core/agent-show.js +188 -0
- package/dist/core/agent-show.js.map +1 -0
- package/dist/core/approval-authority.d.ts +17 -14
- package/dist/core/approval-authority.d.ts.map +1 -1
- package/dist/core/approval-authority.js +9 -9
- package/dist/core/approval-authority.js.map +1 -1
- package/dist/core/builtin-asset.d.ts +18 -15
- package/dist/core/builtin-asset.d.ts.map +1 -1
- package/dist/core/builtin-asset.js +17 -14
- package/dist/core/builtin-asset.js.map +1 -1
- package/dist/core/builtin-integrity.d.ts +12 -2
- package/dist/core/builtin-integrity.d.ts.map +1 -1
- package/dist/core/builtin-integrity.js +85 -9
- package/dist/core/builtin-integrity.js.map +1 -1
- package/dist/core/confinement.d.ts +3 -1
- package/dist/core/confinement.d.ts.map +1 -1
- package/dist/core/confinement.js +7 -4
- package/dist/core/confinement.js.map +1 -1
- package/dist/core/context.d.ts +150 -98
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +602 -66
- package/dist/core/context.js.map +1 -1
- package/dist/core/directive-assign.d.ts +33 -7
- package/dist/core/directive-assign.d.ts.map +1 -1
- package/dist/core/directive-assign.js +67 -27
- package/dist/core/directive-assign.js.map +1 -1
- package/dist/core/directive-scope.d.ts +36 -0
- package/dist/core/directive-scope.d.ts.map +1 -0
- package/dist/core/directive-scope.js +34 -0
- package/dist/core/directive-scope.js.map +1 -0
- package/dist/core/directives-list.d.ts +13 -3
- package/dist/core/directives-list.d.ts.map +1 -1
- package/dist/core/directives-list.js +18 -6
- package/dist/core/directives-list.js.map +1 -1
- package/dist/core/dry-run.d.ts +33 -0
- package/dist/core/dry-run.d.ts.map +1 -0
- package/dist/core/dry-run.js +45 -0
- package/dist/core/dry-run.js.map +1 -0
- package/dist/core/element-ref.d.ts +23 -0
- package/dist/core/element-ref.d.ts.map +1 -0
- package/dist/core/element-ref.js +24 -0
- package/dist/core/element-ref.js.map +1 -0
- package/dist/core/error-details.d.ts +20 -0
- package/dist/core/error-details.d.ts.map +1 -0
- package/dist/core/error-details.js +65 -0
- package/dist/core/error-details.js.map +1 -0
- package/dist/core/exit-code.js +6 -6
- package/dist/core/git-identity.d.ts +46 -11
- package/dist/core/git-identity.d.ts.map +1 -1
- package/dist/core/git-identity.js +140 -27
- package/dist/core/git-identity.js.map +1 -1
- package/dist/core/index.d.ts +189 -14
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1241 -238
- package/dist/core/index.js.map +1 -1
- package/dist/core/init.d.ts +50 -8
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +139 -27
- package/dist/core/init.js.map +1 -1
- package/dist/core/loaders.d.ts +170 -14
- package/dist/core/loaders.d.ts.map +1 -1
- package/dist/core/loaders.js +570 -89
- package/dist/core/loaders.js.map +1 -1
- package/dist/core/memory-add-link.d.ts +28 -0
- package/dist/core/memory-add-link.d.ts.map +1 -0
- package/dist/core/memory-add-link.js +67 -0
- package/dist/core/memory-add-link.js.map +1 -0
- package/dist/core/memory-add-type.d.ts +25 -1
- package/dist/core/memory-add-type.d.ts.map +1 -1
- package/dist/core/memory-add-type.js +59 -1
- package/dist/core/memory-add-type.js.map +1 -1
- package/dist/core/memory-amend.d.ts +80 -0
- package/dist/core/memory-amend.d.ts.map +1 -0
- package/dist/core/memory-amend.js +160 -0
- package/dist/core/memory-amend.js.map +1 -0
- package/dist/core/memory-supersede.d.ts +28 -0
- package/dist/core/memory-supersede.d.ts.map +1 -0
- package/dist/core/memory-supersede.js +79 -0
- package/dist/core/memory-supersede.js.map +1 -0
- package/dist/core/memory-transition.d.ts +190 -30
- package/dist/core/memory-transition.d.ts.map +1 -1
- package/dist/core/memory-transition.js +480 -59
- package/dist/core/memory-transition.js.map +1 -1
- package/dist/core/registry.d.ts +147 -23
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +50 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/relevance.d.ts +74 -12
- package/dist/core/relevance.d.ts.map +1 -1
- package/dist/core/relevance.js +45 -27
- package/dist/core/relevance.js.map +1 -1
- package/dist/core/require-reason.d.ts.map +1 -1
- package/dist/core/require-reason.js +6 -5
- package/dist/core/require-reason.js.map +1 -1
- package/dist/core/required-fields.d.ts +28 -0
- package/dist/core/required-fields.d.ts.map +1 -0
- package/dist/core/required-fields.js +60 -0
- package/dist/core/required-fields.js.map +1 -0
- package/dist/core/revision.d.ts +82 -0
- package/dist/core/revision.d.ts.map +1 -0
- package/dist/core/revision.js +144 -0
- package/dist/core/revision.js.map +1 -0
- package/dist/core/types.d.ts +28 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +12 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/workflow-core-checks.d.ts +34 -0
- package/dist/core/workflow-core-checks.d.ts.map +1 -0
- package/dist/core/workflow-core-checks.js +403 -0
- package/dist/core/workflow-core-checks.js.map +1 -0
- package/dist/core/workflow-create-remove.d.ts +65 -0
- package/dist/core/workflow-create-remove.d.ts.map +1 -0
- package/dist/core/workflow-create-remove.js +277 -0
- package/dist/core/workflow-create-remove.js.map +1 -0
- package/dist/core/workflow-deduction.d.ts +48 -0
- package/dist/core/workflow-deduction.d.ts.map +1 -0
- package/dist/core/workflow-deduction.js +523 -0
- package/dist/core/workflow-deduction.js.map +1 -0
- package/dist/core/workflow-diagnostics.d.ts +83 -0
- package/dist/core/workflow-diagnostics.d.ts.map +1 -0
- package/dist/core/workflow-diagnostics.js +375 -0
- package/dist/core/workflow-diagnostics.js.map +1 -0
- package/dist/core/workflow-exit-state.d.ts +125 -0
- package/dist/core/workflow-exit-state.d.ts.map +1 -0
- package/dist/core/workflow-exit-state.js +243 -0
- package/dist/core/workflow-exit-state.js.map +1 -0
- package/dist/core/workflow-finalize.d.ts +37 -0
- package/dist/core/workflow-finalize.d.ts.map +1 -0
- package/dist/core/workflow-finalize.js +153 -0
- package/dist/core/workflow-finalize.js.map +1 -0
- package/dist/core/workflow-list-show.d.ts +176 -0
- package/dist/core/workflow-list-show.d.ts.map +1 -0
- package/dist/core/workflow-list-show.js +268 -0
- package/dist/core/workflow-list-show.js.map +1 -0
- package/dist/core/workflow-next.d.ts +268 -0
- package/dist/core/workflow-next.d.ts.map +1 -0
- package/dist/core/workflow-next.js +503 -0
- package/dist/core/workflow-next.js.map +1 -0
- package/dist/core/workflow-registry.d.ts +52 -0
- package/dist/core/workflow-registry.d.ts.map +1 -0
- package/dist/core/workflow-registry.js +158 -0
- package/dist/core/workflow-registry.js.map +1 -0
- package/dist/core/workflow-start-end.d.ts +71 -0
- package/dist/core/workflow-start-end.d.ts.map +1 -0
- package/dist/core/workflow-start-end.js +298 -0
- package/dist/core/workflow-start-end.js.map +1 -0
- package/dist/core/workflow-status.d.ts +83 -0
- package/dist/core/workflow-status.d.ts.map +1 -0
- package/dist/core/workflow-status.js +125 -0
- package/dist/core/workflow-status.js.map +1 -0
- package/dist/core/write-guard.d.ts +51 -8
- package/dist/core/write-guard.d.ts.map +1 -1
- package/dist/core/write-guard.js +139 -9
- package/dist/core/write-guard.js.map +1 -1
- package/dist/directives/index.d.ts +3 -2
- package/dist/directives/index.d.ts.map +1 -1
- package/dist/directives/index.js +5 -3
- package/dist/directives/index.js.map +1 -1
- package/dist/directives/schema.d.ts +35 -30
- package/dist/directives/schema.d.ts.map +1 -1
- package/dist/directives/schema.js +36 -30
- package/dist/directives/schema.js.map +1 -1
- package/dist/directives/version.d.ts +28 -0
- package/dist/directives/version.d.ts.map +1 -0
- package/dist/directives/version.js +51 -0
- package/dist/directives/version.js.map +1 -0
- package/dist/dna/edit.d.ts +7 -6
- package/dist/dna/edit.d.ts.map +1 -1
- package/dist/dna/edit.js +96 -41
- package/dist/dna/edit.js.map +1 -1
- package/dist/dna/mutate.js +18 -3
- package/dist/dna/mutate.js.map +1 -1
- package/dist/dna/path.d.ts +2 -2
- package/dist/dna/roles.d.ts +1 -1
- package/dist/dna/schema.d.ts +61 -3
- package/dist/dna/schema.d.ts.map +1 -1
- package/dist/dna/schema.js +121 -6
- package/dist/dna/schema.js.map +1 -1
- package/dist/mcp/dna-resource.d.ts.map +1 -1
- package/dist/mcp/dna-resource.js +4 -4
- package/dist/mcp/dna-resource.js.map +1 -1
- package/dist/mcp/index.d.ts +9 -5
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +13 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/memory-resource.d.ts.map +1 -1
- package/dist/mcp/memory-resource.js +30 -19
- package/dist/mcp/memory-resource.js.map +1 -1
- package/dist/mcp/prompt.d.ts +61 -24
- package/dist/mcp/prompt.d.ts.map +1 -1
- package/dist/mcp/prompt.js +176 -47
- package/dist/mcp/prompt.js.map +1 -1
- package/dist/mcp/read-only.d.ts +39 -0
- package/dist/mcp/read-only.d.ts.map +1 -1
- package/dist/mcp/read-only.js +61 -0
- package/dist/mcp/read-only.js.map +1 -1
- package/dist/mcp/registrar.d.ts +10 -0
- package/dist/mcp/registrar.d.ts.map +1 -1
- package/dist/mcp/registrar.js +48 -12
- package/dist/mcp/registrar.js.map +1 -1
- package/dist/mcp/server.d.ts +21 -14
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +41 -15
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session-resource.d.ts +13 -0
- package/dist/mcp/session-resource.d.ts.map +1 -0
- package/dist/mcp/session-resource.js +65 -0
- package/dist/mcp/session-resource.js.map +1 -0
- package/dist/mcp/workflow-resource.d.ts +18 -0
- package/dist/mcp/workflow-resource.d.ts.map +1 -1
- package/dist/mcp/workflow-resource.js +37 -8
- package/dist/mcp/workflow-resource.js.map +1 -1
- package/dist/memory/add.d.ts +160 -17
- package/dist/memory/add.d.ts.map +1 -1
- package/dist/memory/add.js +361 -51
- package/dist/memory/add.js.map +1 -1
- package/dist/memory/audit.d.ts +165 -32
- package/dist/memory/audit.d.ts.map +1 -1
- package/dist/memory/audit.js +267 -97
- package/dist/memory/audit.js.map +1 -1
- package/dist/memory/commit-message.d.ts +60 -38
- package/dist/memory/commit-message.d.ts.map +1 -1
- package/dist/memory/commit-message.js +167 -21
- package/dist/memory/commit-message.js.map +1 -1
- package/dist/memory/entry.d.ts.map +1 -1
- package/dist/memory/entry.js +1 -2
- package/dist/memory/entry.js.map +1 -1
- package/dist/memory/frontmatter-edit.d.ts +16 -4
- package/dist/memory/frontmatter-edit.d.ts.map +1 -1
- package/dist/memory/frontmatter-edit.js +13 -1
- package/dist/memory/frontmatter-edit.js.map +1 -1
- package/dist/memory/git-log.d.ts +18 -6
- package/dist/memory/git-log.d.ts.map +1 -1
- package/dist/memory/git-log.js +40 -13
- package/dist/memory/git-log.js.map +1 -1
- package/dist/memory/history.d.ts +74 -13
- package/dist/memory/history.d.ts.map +1 -1
- package/dist/memory/history.js +129 -45
- package/dist/memory/history.js.map +1 -1
- package/dist/memory/index.d.ts +13 -11
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +38 -3
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/query.d.ts +161 -19
- package/dist/memory/query.d.ts.map +1 -1
- package/dist/memory/query.js +435 -55
- package/dist/memory/query.js.map +1 -1
- package/dist/memory/schema.d.ts +52 -3
- package/dist/memory/schema.d.ts.map +1 -1
- package/dist/memory/schema.js +132 -8
- package/dist/memory/schema.js.map +1 -1
- package/dist/memory/state-machine.d.ts +65 -10
- package/dist/memory/state-machine.d.ts.map +1 -1
- package/dist/memory/state-machine.js +136 -48
- package/dist/memory/state-machine.js.map +1 -1
- package/dist/memory/submit.d.ts +52 -3
- package/dist/memory/submit.d.ts.map +1 -1
- package/dist/memory/submit.js +118 -11
- package/dist/memory/submit.js.map +1 -1
- package/dist/storage/build-stamp.d.ts +18 -0
- package/dist/storage/build-stamp.d.ts.map +1 -0
- package/dist/storage/build-stamp.js +68 -0
- package/dist/storage/build-stamp.js.map +1 -0
- package/dist/storage/builtin-adapters.d.ts +32 -0
- package/dist/storage/builtin-adapters.d.ts.map +1 -0
- package/dist/storage/builtin-adapters.js +100 -0
- package/dist/storage/builtin-adapters.js.map +1 -0
- package/dist/storage/builtin-directives.d.ts +0 -29
- package/dist/storage/builtin-directives.d.ts.map +1 -1
- package/dist/storage/builtin-directives.js +9 -4
- package/dist/storage/builtin-directives.js.map +1 -1
- package/dist/storage/commit.d.ts +310 -3
- package/dist/storage/commit.d.ts.map +1 -1
- package/dist/storage/commit.js +807 -33
- package/dist/storage/commit.js.map +1 -1
- package/dist/storage/document.d.ts +6 -0
- package/dist/storage/document.d.ts.map +1 -1
- package/dist/storage/document.js +10 -1
- package/dist/storage/document.js.map +1 -1
- package/dist/storage/dry-run.d.ts +65 -0
- package/dist/storage/dry-run.d.ts.map +1 -0
- package/dist/storage/dry-run.js +150 -0
- package/dist/storage/dry-run.js.map +1 -0
- package/dist/storage/errors.d.ts +26 -0
- package/dist/storage/errors.d.ts.map +1 -1
- package/dist/storage/errors.js +27 -1
- package/dist/storage/errors.js.map +1 -1
- package/dist/storage/frontmatter.d.ts +1 -1
- package/dist/storage/frontmatter.js +1 -1
- package/dist/storage/git-read.d.ts +64 -0
- package/dist/storage/git-read.d.ts.map +1 -0
- package/dist/storage/git-read.js +107 -0
- package/dist/storage/git-read.js.map +1 -0
- package/dist/storage/index.d.ts +13 -5
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +39 -2
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/layout.d.ts +2 -2
- package/dist/storage/layout.d.ts.map +1 -1
- package/dist/storage/layout.js +2 -7
- package/dist/storage/layout.js.map +1 -1
- package/dist/storage/memory-path.d.ts +18 -5
- package/dist/storage/memory-path.d.ts.map +1 -1
- package/dist/storage/memory-path.js +41 -5
- package/dist/storage/memory-path.js.map +1 -1
- package/dist/storage/snapshot.js +1 -1
- package/dist/storage/templates.d.ts +33 -6
- package/dist/storage/templates.d.ts.map +1 -1
- package/dist/storage/templates.js +182 -17
- package/dist/storage/templates.js.map +1 -1
- package/dist/validation/config-version.d.ts +19 -0
- package/dist/validation/config-version.d.ts.map +1 -0
- package/dist/validation/config-version.js +53 -0
- package/dist/validation/config-version.js.map +1 -0
- package/dist/validation/diagnostic.d.ts +40 -0
- package/dist/validation/diagnostic.d.ts.map +1 -0
- package/dist/validation/diagnostic.js +41 -0
- package/dist/validation/diagnostic.js.map +1 -0
- package/dist/validation/format.d.ts +74 -0
- package/dist/validation/format.d.ts.map +1 -0
- package/dist/validation/format.js +104 -0
- package/dist/validation/format.js.map +1 -0
- package/dist/validation/id.d.ts +40 -0
- package/dist/validation/id.d.ts.map +1 -1
- package/dist/validation/id.js +99 -12
- package/dist/validation/id.js.map +1 -1
- package/dist/validation/identity.d.ts +40 -0
- package/dist/validation/identity.d.ts.map +1 -0
- package/dist/validation/identity.js +78 -0
- package/dist/validation/identity.js.map +1 -0
- package/dist/validation/index.d.ts +9 -3
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +33 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/secret-scan.d.ts +10 -7
- package/dist/validation/secret-scan.d.ts.map +1 -1
- package/dist/validation/secret-scan.js +39 -16
- package/dist/validation/secret-scan.js.map +1 -1
- package/dist/validation/warning.d.ts +30 -16
- package/dist/validation/warning.d.ts.map +1 -1
- package/dist/validation/warning.js +74 -7
- package/dist/validation/warning.js.map +1 -1
- package/dist/workflow/bindings.d.ts +152 -0
- package/dist/workflow/bindings.d.ts.map +1 -0
- package/dist/workflow/bindings.js +249 -0
- package/dist/workflow/bindings.js.map +1 -0
- package/dist/workflow/create.d.ts +13 -0
- package/dist/workflow/create.d.ts.map +1 -0
- package/dist/workflow/create.js +41 -0
- package/dist/workflow/create.js.map +1 -0
- package/dist/workflow/deduce.d.ts +400 -0
- package/dist/workflow/deduce.d.ts.map +1 -0
- package/dist/workflow/deduce.js +1109 -0
- package/dist/workflow/deduce.js.map +1 -0
- package/dist/workflow/manifest-edit.d.ts +19 -0
- package/dist/workflow/manifest-edit.d.ts.map +1 -0
- package/dist/workflow/manifest-edit.js +124 -0
- package/dist/workflow/manifest-edit.js.map +1 -0
- package/dist/workflow/schema.d.ts +158 -19
- package/dist/workflow/schema.d.ts.map +1 -1
- package/dist/workflow/schema.js +190 -16
- package/dist/workflow/schema.js.map +1 -1
- package/package.json +37 -13
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `format:` key (`dl-149`, task-251): which format a WingFoil file is written in — distinct from
|
|
3
|
+
* `version:`, its content revision (`dl-047`). Every file kind has its own counter, declared once
|
|
4
|
+
* below; an absent key reads as format `1`; a kind's format is bumped **only** on a
|
|
5
|
+
* backward-incompatible change of that kind (an additive, optional field does not bump it).
|
|
6
|
+
*
|
|
7
|
+
* The constants sit in `src/validation` because both sides need them: each pillar's schema and loader,
|
|
8
|
+
* and the `wingfoil init` scaffold in `src/storage`, which imports no pillar module.
|
|
9
|
+
*
|
|
10
|
+
* A reader of a file kind does two things with its constant:
|
|
11
|
+
* - its Zod schema declares `format: formatField(<KIND>_FORMAT)` — an optional positive integer, so a
|
|
12
|
+
* non-integer or non-positive value is a structural error on the `format` field (spec-009 §1);
|
|
13
|
+
* - its loader calls {@link refuseNewerFormat} (or {@link newerFormatIssue}) **before** the structural
|
|
14
|
+
* pass, so a file written by a newer WingFoil is refused for its format alone, with an actionable
|
|
15
|
+
* message, rather than for whatever of its content today's schema misreads.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { ValidationError, type ValidationIssue } from './errors';
|
|
19
|
+
/** `.wingfoil/dna.yaml` (`spec-002`). */
|
|
20
|
+
export declare const DNA_YAML_FORMAT: 1;
|
|
21
|
+
/** `.wingfoil/memory.yaml` (`spec-001`). */
|
|
22
|
+
export declare const MEMORY_YAML_FORMAT: 1;
|
|
23
|
+
/** A Memory template's frontmatter, `.wingfoil/memory/templates/*.md` (`spec-001` `template.file`). */
|
|
24
|
+
export declare const MEMORY_TEMPLATE_FORMAT: 1;
|
|
25
|
+
/** `.wingfoil/roles.yaml` (`spec-013`). */
|
|
26
|
+
export declare const ROLES_YAML_FORMAT: 1;
|
|
27
|
+
/** A directive's frontmatter, `.wingfoil/directives/**\/*.md` (`spec-013`). */
|
|
28
|
+
export declare const DIRECTIVE_FORMAT: 1;
|
|
29
|
+
/** `.wingfoil/workflows.yaml`, the Layer-1 manifest (`spec-003`). */
|
|
30
|
+
export declare const WORKFLOWS_YAML_FORMAT: 1;
|
|
31
|
+
/** A workflow file the manifest includes, Layer 2 (`spec-003`). */
|
|
32
|
+
export declare const WORKFLOW_FORMAT: 1;
|
|
33
|
+
/** `.wingfoil/workflows/bindings.yaml`, the Layer-3 token bindings (`spec-003`; `dl-153` (A), task-199). */
|
|
34
|
+
export declare const BINDINGS_YAML_FORMAT: 1;
|
|
35
|
+
/**
|
|
36
|
+
* An agent adapter manifest (`spec-016` §2.2 `format`, task-177) — the first kind that carried the key.
|
|
37
|
+
* Unlike the others it is required and read as a literal (`src/agent/schema.ts`); like the others, a
|
|
38
|
+
* newer one is refused by {@link refuseNewerFormat} before the structural pass (`parseAdapterManifest`,
|
|
39
|
+
* task-200, `bug-242`).
|
|
40
|
+
*/
|
|
41
|
+
export declare const ADAPTER_MANIFEST_FORMAT: 1;
|
|
42
|
+
/** `spec-009` §3's field-level code for a file written in a format this build does not read. */
|
|
43
|
+
export declare const E_INVALID_FORMAT = "E_INVALID_FORMAT";
|
|
44
|
+
/** The refusal of a newer format: the file's format, the highest this build reads, and what to do. */
|
|
45
|
+
export declare function newerFormatMessage(format: unknown, highest: number): string;
|
|
46
|
+
/**
|
|
47
|
+
* The `format:` field of a kind whose highest readable format is `highest`: optional (absent = 1),
|
|
48
|
+
* a positive integer, and at most `highest`. The bound carries {@link newerFormatMessage}; it is the
|
|
49
|
+
* backstop for the parses that run without a loader (`dna set`'s post-edit check, `directive
|
|
50
|
+
* assign`'s `roles.yaml` edit, the built-in template check), where it surfaces as an `E_VALIDATION`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function formatField(highest: number): z.ZodOptional<z.ZodNumber>;
|
|
53
|
+
/**
|
|
54
|
+
* The loader pre-check's issue: `E_INVALID_FORMAT` on `format` when `data` is an object whose
|
|
55
|
+
* `format` is a positive integer above `highest`, else `null`. Any other `format` value — absent, or
|
|
56
|
+
* one the schema refuses (`1.5`, `0`, `"2"`) — is left to the structural pass, which names the field.
|
|
57
|
+
*
|
|
58
|
+
* "An older format this build no longer reads" (`dl-149` Loader) belongs here too, as a lower bound per
|
|
59
|
+
* kind with a message naming the last release that read the format. No kind has one yet — every format
|
|
60
|
+
* is still `1` — so it is not written; a migration command is a separate proposal (`dl-149` Action 3).
|
|
61
|
+
*/
|
|
62
|
+
export declare function newerFormatIssue(data: unknown, highest: number, file: string): ValidationIssue | null;
|
|
63
|
+
/**
|
|
64
|
+
* Throw {@link newerFormatIssue}'s issue, if any, as a `ValidationError` at exit `1` — `spec-005` §1's
|
|
65
|
+
* code for a validation failure: the file was understood, and the rule said no (`spec-009` §3).
|
|
66
|
+
*/
|
|
67
|
+
export declare function refuseNewerFormat(data: unknown, highest: number, file: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* Whether `error` is a newer-format refusal ({@link refuseNewerFormat}'s `ValidationError` carrying
|
|
70
|
+
* {@link E_INVALID_FORMAT}) — what a reader that turns the refusal into its own message checks before
|
|
71
|
+
* it does, so that no other failure is labelled as a newer format (task-257 review F2).
|
|
72
|
+
*/
|
|
73
|
+
export declare function isNewerFormatError(error: unknown): error is ValidationError;
|
|
74
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/validation/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmB,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAElF,yCAAyC;AACzC,eAAO,MAAM,eAAe,EAAG,CAAU,CAAC;AAC1C,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,EAAG,CAAU,CAAC;AAC7C,uGAAuG;AACvG,eAAO,MAAM,sBAAsB,EAAG,CAAU,CAAC;AACjD,2CAA2C;AAC3C,eAAO,MAAM,iBAAiB,EAAG,CAAU,CAAC;AAC5C,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAC3C,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,EAAG,CAAU,CAAC;AAChD,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAG,CAAU,CAAC;AAC1C,4GAA4G;AAC5G,eAAO,MAAM,oBAAoB,EAAG,CAAU,CAAC;AAC/C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAG,CAAU,CAAC;AAElD,gGAAgG;AAChG,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,8BAO1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAKrG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGpF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE3E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.E_INVALID_FORMAT = exports.ADAPTER_MANIFEST_FORMAT = exports.BINDINGS_YAML_FORMAT = exports.WORKFLOW_FORMAT = exports.WORKFLOWS_YAML_FORMAT = exports.DIRECTIVE_FORMAT = exports.ROLES_YAML_FORMAT = exports.MEMORY_TEMPLATE_FORMAT = exports.MEMORY_YAML_FORMAT = exports.DNA_YAML_FORMAT = void 0;
|
|
4
|
+
exports.newerFormatMessage = newerFormatMessage;
|
|
5
|
+
exports.formatField = formatField;
|
|
6
|
+
exports.newerFormatIssue = newerFormatIssue;
|
|
7
|
+
exports.refuseNewerFormat = refuseNewerFormat;
|
|
8
|
+
exports.isNewerFormatError = isNewerFormatError;
|
|
9
|
+
/**
|
|
10
|
+
* The `format:` key (`dl-149`, task-251): which format a WingFoil file is written in — distinct from
|
|
11
|
+
* `version:`, its content revision (`dl-047`). Every file kind has its own counter, declared once
|
|
12
|
+
* below; an absent key reads as format `1`; a kind's format is bumped **only** on a
|
|
13
|
+
* backward-incompatible change of that kind (an additive, optional field does not bump it).
|
|
14
|
+
*
|
|
15
|
+
* The constants sit in `src/validation` because both sides need them: each pillar's schema and loader,
|
|
16
|
+
* and the `wingfoil init` scaffold in `src/storage`, which imports no pillar module.
|
|
17
|
+
*
|
|
18
|
+
* A reader of a file kind does two things with its constant:
|
|
19
|
+
* - its Zod schema declares `format: formatField(<KIND>_FORMAT)` — an optional positive integer, so a
|
|
20
|
+
* non-integer or non-positive value is a structural error on the `format` field (spec-009 §1);
|
|
21
|
+
* - its loader calls {@link refuseNewerFormat} (or {@link newerFormatIssue}) **before** the structural
|
|
22
|
+
* pass, so a file written by a newer WingFoil is refused for its format alone, with an actionable
|
|
23
|
+
* message, rather than for whatever of its content today's schema misreads.
|
|
24
|
+
*/
|
|
25
|
+
const zod_1 = require("zod");
|
|
26
|
+
const errors_1 = require("./errors");
|
|
27
|
+
/** `.wingfoil/dna.yaml` (`spec-002`). */
|
|
28
|
+
exports.DNA_YAML_FORMAT = 1;
|
|
29
|
+
/** `.wingfoil/memory.yaml` (`spec-001`). */
|
|
30
|
+
exports.MEMORY_YAML_FORMAT = 1;
|
|
31
|
+
/** A Memory template's frontmatter, `.wingfoil/memory/templates/*.md` (`spec-001` `template.file`). */
|
|
32
|
+
exports.MEMORY_TEMPLATE_FORMAT = 1;
|
|
33
|
+
/** `.wingfoil/roles.yaml` (`spec-013`). */
|
|
34
|
+
exports.ROLES_YAML_FORMAT = 1;
|
|
35
|
+
/** A directive's frontmatter, `.wingfoil/directives/**\/*.md` (`spec-013`). */
|
|
36
|
+
exports.DIRECTIVE_FORMAT = 1;
|
|
37
|
+
/** `.wingfoil/workflows.yaml`, the Layer-1 manifest (`spec-003`). */
|
|
38
|
+
exports.WORKFLOWS_YAML_FORMAT = 1;
|
|
39
|
+
/** A workflow file the manifest includes, Layer 2 (`spec-003`). */
|
|
40
|
+
exports.WORKFLOW_FORMAT = 1;
|
|
41
|
+
/** `.wingfoil/workflows/bindings.yaml`, the Layer-3 token bindings (`spec-003`; `dl-153` (A), task-199). */
|
|
42
|
+
exports.BINDINGS_YAML_FORMAT = 1;
|
|
43
|
+
/**
|
|
44
|
+
* An agent adapter manifest (`spec-016` §2.2 `format`, task-177) — the first kind that carried the key.
|
|
45
|
+
* Unlike the others it is required and read as a literal (`src/agent/schema.ts`); like the others, a
|
|
46
|
+
* newer one is refused by {@link refuseNewerFormat} before the structural pass (`parseAdapterManifest`,
|
|
47
|
+
* task-200, `bug-242`).
|
|
48
|
+
*/
|
|
49
|
+
exports.ADAPTER_MANIFEST_FORMAT = 1;
|
|
50
|
+
/** `spec-009` §3's field-level code for a file written in a format this build does not read. */
|
|
51
|
+
exports.E_INVALID_FORMAT = 'E_INVALID_FORMAT';
|
|
52
|
+
/** The refusal of a newer format: the file's format, the highest this build reads, and what to do. */
|
|
53
|
+
function newerFormatMessage(format, highest) {
|
|
54
|
+
return `this file is written in format ${String(format)}; this WingFoil reads up to format ${highest}: upgrade WingFoil`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The `format:` field of a kind whose highest readable format is `highest`: optional (absent = 1),
|
|
58
|
+
* a positive integer, and at most `highest`. The bound carries {@link newerFormatMessage}; it is the
|
|
59
|
+
* backstop for the parses that run without a loader (`dna set`'s post-edit check, `directive
|
|
60
|
+
* assign`'s `roles.yaml` edit, the built-in template check), where it surfaces as an `E_VALIDATION`.
|
|
61
|
+
*/
|
|
62
|
+
function formatField(highest) {
|
|
63
|
+
return zod_1.z
|
|
64
|
+
.number()
|
|
65
|
+
.int()
|
|
66
|
+
.positive()
|
|
67
|
+
.max(highest, { error: (issue) => newerFormatMessage(issue.input, highest) })
|
|
68
|
+
.optional();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The loader pre-check's issue: `E_INVALID_FORMAT` on `format` when `data` is an object whose
|
|
72
|
+
* `format` is a positive integer above `highest`, else `null`. Any other `format` value — absent, or
|
|
73
|
+
* one the schema refuses (`1.5`, `0`, `"2"`) — is left to the structural pass, which names the field.
|
|
74
|
+
*
|
|
75
|
+
* "An older format this build no longer reads" (`dl-149` Loader) belongs here too, as a lower bound per
|
|
76
|
+
* kind with a message naming the last release that read the format. No kind has one yet — every format
|
|
77
|
+
* is still `1` — so it is not written; a migration command is a separate proposal (`dl-149` Action 3).
|
|
78
|
+
*/
|
|
79
|
+
function newerFormatIssue(data, highest, file) {
|
|
80
|
+
if (typeof data !== 'object' || data === null || Array.isArray(data))
|
|
81
|
+
return null;
|
|
82
|
+
const format = data.format;
|
|
83
|
+
if (typeof format !== 'number' || !Number.isInteger(format) || format <= highest)
|
|
84
|
+
return null;
|
|
85
|
+
return { code: exports.E_INVALID_FORMAT, path: 'format', file, message: newerFormatMessage(format, highest) };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Throw {@link newerFormatIssue}'s issue, if any, as a `ValidationError` at exit `1` — `spec-005` §1's
|
|
89
|
+
* code for a validation failure: the file was understood, and the rule said no (`spec-009` §3).
|
|
90
|
+
*/
|
|
91
|
+
function refuseNewerFormat(data, highest, file) {
|
|
92
|
+
const issue = newerFormatIssue(data, highest, file);
|
|
93
|
+
if (issue !== null)
|
|
94
|
+
throw new errors_1.ValidationError([issue], errors_1.EXIT_VALIDATION);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Whether `error` is a newer-format refusal ({@link refuseNewerFormat}'s `ValidationError` carrying
|
|
98
|
+
* {@link E_INVALID_FORMAT}) — what a reader that turns the refusal into its own message checks before
|
|
99
|
+
* it does, so that no other failure is labelled as a newer format (task-257 review F2).
|
|
100
|
+
*/
|
|
101
|
+
function isNewerFormatError(error) {
|
|
102
|
+
return error instanceof errors_1.ValidationError && error.issues.some((issue) => issue.code === exports.E_INVALID_FORMAT);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/validation/format.ts"],"names":[],"mappings":";;;AAgDA,gDAEC;AAQD,kCAOC;AAWD,4CAKC;AAMD,8CAGC;AAOD,gDAEC;AAnGD;;;;;;;;;;;;;;;GAeG;AACH,6BAAwB;AAExB,qCAAkF;AAElF,yCAAyC;AAC5B,QAAA,eAAe,GAAG,CAAU,CAAC;AAC1C,4CAA4C;AAC/B,QAAA,kBAAkB,GAAG,CAAU,CAAC;AAC7C,uGAAuG;AAC1F,QAAA,sBAAsB,GAAG,CAAU,CAAC;AACjD,2CAA2C;AAC9B,QAAA,iBAAiB,GAAG,CAAU,CAAC;AAC5C,+EAA+E;AAClE,QAAA,gBAAgB,GAAG,CAAU,CAAC;AAC3C,qEAAqE;AACxD,QAAA,qBAAqB,GAAG,CAAU,CAAC;AAChD,mEAAmE;AACtD,QAAA,eAAe,GAAG,CAAU,CAAC;AAC1C,4GAA4G;AAC/F,QAAA,oBAAoB,GAAG,CAAU,CAAC;AAC/C;;;;;GAKG;AACU,QAAA,uBAAuB,GAAG,CAAU,CAAC;AAElD,gGAAgG;AACnF,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AAEnD,sGAAsG;AACtG,SAAgB,kBAAkB,CAAC,MAAe,EAAE,OAAe;IACjE,OAAO,kCAAkC,MAAM,CAAC,MAAM,CAAC,sCAAsC,OAAO,oBAAoB,CAAC;AAC3H,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,OAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;SAC5E,QAAQ,EAAE,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,gBAAgB,CAAC,IAAa,EAAE,OAAe,EAAE,IAAY;IAC3E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClF,MAAM,MAAM,GAAI,IAA6B,CAAC,MAAM,CAAC;IACrD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9F,OAAO,EAAE,IAAI,EAAE,wBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AACxG,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,IAAa,EAAE,OAAe,EAAE,IAAY;IAC5E,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,IAAI;QAAE,MAAM,IAAI,wBAAe,CAAC,CAAC,KAAK,CAAC,EAAE,wBAAe,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,YAAY,wBAAe,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,wBAAgB,CAAC,CAAC;AAC3G,CAAC"}
|
package/dist/validation/id.d.ts
CHANGED
|
@@ -1,10 +1,50 @@
|
|
|
1
1
|
/** The shared ID character class (spec-009 §1): lowercase alphanumerics, `-`, and `.`. */
|
|
2
2
|
export declare const ID_CHAR_CLASS = "a-z0-9-.";
|
|
3
|
+
/**
|
|
4
|
+
* Whether `token` (a `{…}` name without its braces) is a `{n}`-family counter token: `n`, `nn`,
|
|
5
|
+
* `nnn`, … or `n:N` (task-163, `bug-176`). Every such token takes the one counter value given as `n`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isNumericToken(token: string): boolean;
|
|
3
8
|
/**
|
|
4
9
|
* Build the RegExp an ID produced from `pattern` must match: literals are matched verbatim, numeric
|
|
5
10
|
* tokens as `[0-9]+`, and every other token as a hyphen-separated `[a-z0-9.]` slug.
|
|
6
11
|
*/
|
|
7
12
|
export declare function patternToRegExp(pattern: string): RegExp;
|
|
13
|
+
/**
|
|
14
|
+
* The unanchored RegExp source behind {@link patternToRegExp}, for embedding an id inside a longer
|
|
15
|
+
* match (`memory add`'s counter matches a whole repository path, task-128). With `captureNumeric`,
|
|
16
|
+
* each `{n}`-family token is a capturing group `([0-9]+)` and nothing else captures, so group 1 is
|
|
17
|
+
* the first numeric token's value.
|
|
18
|
+
*/
|
|
19
|
+
export declare function patternToSource(pattern: string, options?: {
|
|
20
|
+
readonly captureNumeric?: boolean;
|
|
21
|
+
}): string;
|
|
22
|
+
/**
|
|
23
|
+
* Whether `value` is a legal ID piece — non-empty and wholly inside the shared ID character class
|
|
24
|
+
* `[a-z0-9-.]` (spec-009 §1). The same test {@link generateId} applies to every rendered token value,
|
|
25
|
+
* exported so a caller that materializes a token itself (`memory add`'s field tokens,
|
|
26
|
+
* task-110) refuses exactly what `generateId` would.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isIdPiece(value: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* The `{token}` names of an `id_pattern` (or a `path` pattern — same brace syntax), in order of
|
|
31
|
+
* appearance, duplicates kept. `{n}` family tokens are returned as written (`n`, `nnn`).
|
|
32
|
+
*/
|
|
33
|
+
export declare function patternTokens(pattern: string): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Validate an `id_pattern` on its own, without rendering it — the check a pattern declared somewhere
|
|
36
|
+
* other than `memory.yaml` gets, e.g. a workflow `memory.add` action's per-action override
|
|
37
|
+
* (`spec-001` "Per-action override", `dl-107` S3 (a), task-110). Returns one message per problem, in
|
|
38
|
+
* pattern order; an empty array means the pattern is well-formed:
|
|
39
|
+
*
|
|
40
|
+
* - an empty pattern;
|
|
41
|
+
* - literal characters outside `[a-z0-9-.]` — the same rule and wording as {@link generateId}'s
|
|
42
|
+
* Pass A;
|
|
43
|
+
* - a token that is neither a `{n}`-family token nor a field name `[a-z][a-z0-9_-]*`. A **dotted**
|
|
44
|
+
* token (`{release.version}`) is named as such: it would read a field of an element in the
|
|
45
|
+
* workflow's `element:` chain, which is `dl-090`'s resolution and undefined until that lands.
|
|
46
|
+
*/
|
|
47
|
+
export declare function idPatternIssues(pattern: string): string[];
|
|
8
48
|
/**
|
|
9
49
|
* Generate a concrete ID from `pattern` and `values`.
|
|
10
50
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/validation/id.ts"],"names":[],"mappings":"AAoBA,0FAA0F;AAC1F,eAAO,MAAM,aAAa,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/validation/id.ts"],"names":[],"mappings":"AAoBA,0FAA0F;AAC1F,eAAO,MAAM,aAAa,aAAa,CAAC;AA4CxC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAOD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAY5G;AAkBD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBzD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CA4D3F"}
|
package/dist/validation/id.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ID_CHAR_CLASS = void 0;
|
|
4
|
+
exports.isNumericToken = isNumericToken;
|
|
4
5
|
exports.patternToRegExp = patternToRegExp;
|
|
6
|
+
exports.patternToSource = patternToSource;
|
|
7
|
+
exports.isIdPiece = isIdPiece;
|
|
8
|
+
exports.patternTokens = patternTokens;
|
|
9
|
+
exports.idPatternIssues = idPatternIssues;
|
|
5
10
|
exports.generateId = generateId;
|
|
6
11
|
/**
|
|
7
12
|
* ID-generation engine (task-002-validation-id-engine, acceptance criteria 5).
|
|
8
13
|
*
|
|
9
14
|
* Generates a concrete Memory-element ID from a type's `id_pattern` (declared in
|
|
10
|
-
*
|
|
15
|
+
* `.wingfoil/memory.yaml`, e.g. `task-{n}-{slug}`) plus values for its `{placeholder}`
|
|
11
16
|
* tokens. It enforces the shared ID character class `[a-z0-9-.]` that spec-009-validation-strategy
|
|
12
17
|
* §1 frames as a Pass-2 rule owned by "the shared ID constants":
|
|
13
18
|
*
|
|
@@ -28,8 +33,11 @@ exports.ID_CHAR_CLASS = 'a-z0-9-.';
|
|
|
28
33
|
const ID_PIECE_RE = /^[a-z0-9.-]+$/;
|
|
29
34
|
/** A literal pattern segment: every character must be a member of the ID character class. */
|
|
30
35
|
const LITERAL_RE = /^[a-z0-9.-]+$/;
|
|
31
|
-
/**
|
|
32
|
-
|
|
36
|
+
/**
|
|
37
|
+
* A numeric token: one written purely as `n` (`{n}`, `{nn}`, `{nnn}`), or `{n:N}` with a width
|
|
38
|
+
* `N >= 1` (`spec-001`'s placeholder table; task-163, `bug-176`).
|
|
39
|
+
*/
|
|
40
|
+
const NUMERIC_TOKEN_RE = /^(?:n+|n:[1-9][0-9]*)$/;
|
|
33
41
|
/** Minimum zero-pad width for numeric tokens (observed convention: task-001, adr-005, spec-009). */
|
|
34
42
|
const DEFAULT_PAD_WIDTH = 3;
|
|
35
43
|
const TOKEN_RE = /\{([^{}]+)\}/g;
|
|
@@ -51,6 +59,10 @@ function parsePattern(pattern) {
|
|
|
51
59
|
}
|
|
52
60
|
return segments;
|
|
53
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Whether `token` (a `{…}` name without its braces) is a `{n}`-family counter token: `n`, `nn`,
|
|
64
|
+
* `nnn`, … or `n:N` (task-163, `bug-176`). Every such token takes the one counter value given as `n`.
|
|
65
|
+
*/
|
|
54
66
|
function isNumericToken(token) {
|
|
55
67
|
return NUMERIC_TOKEN_RE.test(token);
|
|
56
68
|
}
|
|
@@ -63,18 +75,28 @@ function escapeLiteral(literal) {
|
|
|
63
75
|
* tokens as `[0-9]+`, and every other token as a hyphen-separated `[a-z0-9.]` slug.
|
|
64
76
|
*/
|
|
65
77
|
function patternToRegExp(pattern) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
78
|
+
return new RegExp(`^${patternToSource(pattern)}$`);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The unanchored RegExp source behind {@link patternToRegExp}, for embedding an id inside a longer
|
|
82
|
+
* match (`memory add`'s counter matches a whole repository path, task-128). With `captureNumeric`,
|
|
83
|
+
* each `{n}`-family token is a capturing group `([0-9]+)` and nothing else captures, so group 1 is
|
|
84
|
+
* the first numeric token's value.
|
|
85
|
+
*/
|
|
86
|
+
function patternToSource(pattern, options = {}) {
|
|
87
|
+
let source = '';
|
|
88
|
+
for (const segment of parsePattern(pattern)) {
|
|
69
89
|
if (segment.kind === 'literal') {
|
|
70
90
|
source += escapeLiteral(segment.value);
|
|
71
91
|
}
|
|
92
|
+
else if (isNumericToken(segment.value)) {
|
|
93
|
+
source += options.captureNumeric === true ? '([0-9]+)' : '[0-9]+';
|
|
94
|
+
}
|
|
72
95
|
else {
|
|
73
|
-
source +=
|
|
96
|
+
source += '[a-z0-9.]+(?:-[a-z0-9.]+)*';
|
|
74
97
|
}
|
|
75
98
|
}
|
|
76
|
-
source
|
|
77
|
-
return new RegExp(source);
|
|
99
|
+
return source;
|
|
78
100
|
}
|
|
79
101
|
/** Collect, in order of first appearance, the characters of `literal` outside the ID class. */
|
|
80
102
|
function offendingChars(literal) {
|
|
@@ -88,6 +110,66 @@ function offendingChars(literal) {
|
|
|
88
110
|
}
|
|
89
111
|
return out;
|
|
90
112
|
}
|
|
113
|
+
/** A non-numeric token name: a frontmatter field or context name (`version`, `release-line`, `tmpl_version`). */
|
|
114
|
+
const FIELD_TOKEN_RE = /^[a-z][a-z0-9_-]*$/;
|
|
115
|
+
/**
|
|
116
|
+
* Whether `value` is a legal ID piece — non-empty and wholly inside the shared ID character class
|
|
117
|
+
* `[a-z0-9-.]` (spec-009 §1). The same test {@link generateId} applies to every rendered token value,
|
|
118
|
+
* exported so a caller that materializes a token itself (`memory add`'s field tokens,
|
|
119
|
+
* task-110) refuses exactly what `generateId` would.
|
|
120
|
+
*/
|
|
121
|
+
function isIdPiece(value) {
|
|
122
|
+
return ID_PIECE_RE.test(value);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The `{token}` names of an `id_pattern` (or a `path` pattern — same brace syntax), in order of
|
|
126
|
+
* appearance, duplicates kept. `{n}` family tokens are returned as written (`n`, `nnn`).
|
|
127
|
+
*/
|
|
128
|
+
function patternTokens(pattern) {
|
|
129
|
+
return parsePattern(pattern)
|
|
130
|
+
.filter((segment) => segment.kind === 'token')
|
|
131
|
+
.map((segment) => segment.value);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Validate an `id_pattern` on its own, without rendering it — the check a pattern declared somewhere
|
|
135
|
+
* other than `memory.yaml` gets, e.g. a workflow `memory.add` action's per-action override
|
|
136
|
+
* (`spec-001` "Per-action override", `dl-107` S3 (a), task-110). Returns one message per problem, in
|
|
137
|
+
* pattern order; an empty array means the pattern is well-formed:
|
|
138
|
+
*
|
|
139
|
+
* - an empty pattern;
|
|
140
|
+
* - literal characters outside `[a-z0-9-.]` — the same rule and wording as {@link generateId}'s
|
|
141
|
+
* Pass A;
|
|
142
|
+
* - a token that is neither a `{n}`-family token nor a field name `[a-z][a-z0-9_-]*`. A **dotted**
|
|
143
|
+
* token (`{release.version}`) is named as such: it would read a field of an element in the
|
|
144
|
+
* workflow's `element:` chain, which is `dl-090`'s resolution and undefined until that lands.
|
|
145
|
+
*/
|
|
146
|
+
function idPatternIssues(pattern) {
|
|
147
|
+
if (pattern.length === 0)
|
|
148
|
+
return ['pattern is empty'];
|
|
149
|
+
const issues = [];
|
|
150
|
+
const segments = parsePattern(pattern);
|
|
151
|
+
const badChars = [];
|
|
152
|
+
for (const segment of segments) {
|
|
153
|
+
if (segment.kind !== 'literal')
|
|
154
|
+
continue;
|
|
155
|
+
for (const ch of offendingChars(segment.value))
|
|
156
|
+
if (!badChars.includes(ch))
|
|
157
|
+
badChars.push(ch);
|
|
158
|
+
}
|
|
159
|
+
if (badChars.length > 0) {
|
|
160
|
+
issues.push(`pattern contains character(s) outside [${exports.ID_CHAR_CLASS}]: ${badChars.join(', ')}`);
|
|
161
|
+
}
|
|
162
|
+
for (const segment of segments) {
|
|
163
|
+
if (segment.kind !== 'token')
|
|
164
|
+
continue;
|
|
165
|
+
const token = segment.value;
|
|
166
|
+
if (isNumericToken(token) || FIELD_TOKEN_RE.test(token))
|
|
167
|
+
continue;
|
|
168
|
+
const dotted = token.includes('.') && token.split('.').every((part) => FIELD_TOKEN_RE.test(part));
|
|
169
|
+
issues.push(dotted ? `dotted token {${token}} is not defined until dl-090` : `malformed token {${token}}`);
|
|
170
|
+
}
|
|
171
|
+
return issues;
|
|
172
|
+
}
|
|
91
173
|
/**
|
|
92
174
|
* Generate a concrete ID from `pattern` and `values`.
|
|
93
175
|
*
|
|
@@ -124,7 +206,8 @@ function generateId(pattern, values) {
|
|
|
124
206
|
continue;
|
|
125
207
|
}
|
|
126
208
|
const token = segment.value;
|
|
127
|
-
|
|
209
|
+
// Every `{n}`-family token renders the one counter value, given as `n` (task-163, `bug-176`).
|
|
210
|
+
const value = values[token] ?? (isNumericToken(token) ? values.n : undefined);
|
|
128
211
|
if (value === undefined) {
|
|
129
212
|
issues.push(invalidId(pattern, `missing value for token {${token}}`));
|
|
130
213
|
continue;
|
|
@@ -157,7 +240,11 @@ function generateId(pattern, values) {
|
|
|
157
240
|
function invalidId(pattern, message) {
|
|
158
241
|
return { code: 'E_INVALID_ID', path: 'id', file: pattern, message };
|
|
159
242
|
}
|
|
160
|
-
/**
|
|
243
|
+
/**
|
|
244
|
+
* Render a numeric token zero-padded to its minimum width: `N` for `{n:N}`, otherwise the token's
|
|
245
|
+
* width with a floor of 3 (`{n}` → `002`). Never truncates. `null` if the value is not a
|
|
246
|
+
* non-negative integer.
|
|
247
|
+
*/
|
|
161
248
|
function renderNumeric(token, value) {
|
|
162
249
|
let n;
|
|
163
250
|
if (typeof value === 'number') {
|
|
@@ -171,7 +258,7 @@ function renderNumeric(token, value) {
|
|
|
171
258
|
}
|
|
172
259
|
if (!Number.isInteger(n) || n < 0)
|
|
173
260
|
return null;
|
|
174
|
-
const width = Math.max(DEFAULT_PAD_WIDTH, token.length);
|
|
261
|
+
const width = token.startsWith('n:') ? Number(token.slice(2)) : Math.max(DEFAULT_PAD_WIDTH, token.length);
|
|
175
262
|
return String(n).padStart(width, '0');
|
|
176
263
|
}
|
|
177
264
|
//# sourceMappingURL=id.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/validation/id.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/validation/id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The attributable-identity rule (task-260, `bug-261`) — one definition of "a `name`/`email` pair a
|
|
3
|
+
* deliberately-configured identity carries", shared by the two places that judge an identity:
|
|
4
|
+
*
|
|
5
|
+
* - the attribution audit, `isValidAttribution` (`src/memory/audit.ts`, REQ-SEC-02, task-132, `bug-153`),
|
|
6
|
+
* which reads the author of a commit that already exists; and
|
|
7
|
+
* - the `team.agents` entry schema, `AgentEntry` (`src/dna/schema.ts`, `spec-002`), whose `name` and
|
|
8
|
+
* `email` `git-conventions` §7 writes into every `Co-Authored-By:` trailer an agent's commits carry.
|
|
9
|
+
*
|
|
10
|
+
* The audit's verdict is its base check (`isConfiguredIdentity`, non-empty name and email after trimming)
|
|
11
|
+
* followed by {@link isAttributableIdentity}, and nothing else; `AgentEntry` refuses a blank name and every
|
|
12
|
+
* email {@link attributionEmailIssue} reports, and its own address shape admits no whitespace. So an agent
|
|
13
|
+
* identity `dna.yaml` accepts is one the audit accepts too — the schema may be stricter (angle brackets,
|
|
14
|
+
* bare GitHub noreply logins), never looser — and a later refinement of this rule (`bug-193`: the RFC 2606
|
|
15
|
+
* second-level domains) reaches both. It lives in `src/validation` because both modules already depend on
|
|
16
|
+
* it and on nothing of each other's.
|
|
17
|
+
*
|
|
18
|
+
* Pure predicates — no filesystem or git access.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Whether `email`'s domain is, or ends in, an RFC 2606 reserved top-level domain (case-insensitive).
|
|
22
|
+
* Only the top-level label counts — `test.example.com` is an ordinary domain.
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasReservedDomain(email: string): boolean;
|
|
25
|
+
/** Whether `name` is empty or holds only whitespace — a name no identity is recognisable by. */
|
|
26
|
+
export declare function isBlankIdentityName(name: string): boolean;
|
|
27
|
+
/** Why the audit would reject an email: see {@link attributionEmailIssue}. */
|
|
28
|
+
export type AttributionEmailIssue = 'guessed-domain' | 'malformed' | 'reserved-domain';
|
|
29
|
+
/**
|
|
30
|
+
* Why `email` is not an attributable address, checked in this order: git's guessed-domain marker
|
|
31
|
+
* (`.(none)`), an address outside {@link ATTRIBUTION_EMAIL_RE}, an RFC 2606 reserved top-level domain
|
|
32
|
+
* ({@link hasReservedDomain}). `null` when none applies.
|
|
33
|
+
*/
|
|
34
|
+
export declare function attributionEmailIssue(email: string): AttributionEmailIssue | null;
|
|
35
|
+
/**
|
|
36
|
+
* Whether `name`/`email` is an attributable identity: a name that is not blank ({@link isBlankIdentityName})
|
|
37
|
+
* and an email in which {@link attributionEmailIssue} finds nothing.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isAttributableIdentity(name: string, email: string): boolean;
|
|
40
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/validation/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAsBH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,8EAA8E;AAC9E,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAEvF;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAKjF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE3E"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The attributable-identity rule (task-260, `bug-261`) — one definition of "a `name`/`email` pair a
|
|
4
|
+
* deliberately-configured identity carries", shared by the two places that judge an identity:
|
|
5
|
+
*
|
|
6
|
+
* - the attribution audit, `isValidAttribution` (`src/memory/audit.ts`, REQ-SEC-02, task-132, `bug-153`),
|
|
7
|
+
* which reads the author of a commit that already exists; and
|
|
8
|
+
* - the `team.agents` entry schema, `AgentEntry` (`src/dna/schema.ts`, `spec-002`), whose `name` and
|
|
9
|
+
* `email` `git-conventions` §7 writes into every `Co-Authored-By:` trailer an agent's commits carry.
|
|
10
|
+
*
|
|
11
|
+
* The audit's verdict is its base check (`isConfiguredIdentity`, non-empty name and email after trimming)
|
|
12
|
+
* followed by {@link isAttributableIdentity}, and nothing else; `AgentEntry` refuses a blank name and every
|
|
13
|
+
* email {@link attributionEmailIssue} reports, and its own address shape admits no whitespace. So an agent
|
|
14
|
+
* identity `dna.yaml` accepts is one the audit accepts too — the schema may be stricter (angle brackets,
|
|
15
|
+
* bare GitHub noreply logins), never looser — and a later refinement of this rule (`bug-193`: the RFC 2606
|
|
16
|
+
* second-level domains) reaches both. It lives in `src/validation` because both modules already depend on
|
|
17
|
+
* it and on nothing of each other's.
|
|
18
|
+
*
|
|
19
|
+
* Pure predicates — no filesystem or git access.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.hasReservedDomain = hasReservedDomain;
|
|
23
|
+
exports.isBlankIdentityName = isBlankIdentityName;
|
|
24
|
+
exports.attributionEmailIssue = attributionEmailIssue;
|
|
25
|
+
exports.isAttributableIdentity = isAttributableIdentity;
|
|
26
|
+
/**
|
|
27
|
+
* The address shape the audit accepts: one `@`, a dotted domain, no whitespace, and no parenthesis in the
|
|
28
|
+
* top-level label.
|
|
29
|
+
*/
|
|
30
|
+
const ATTRIBUTION_EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@()]+$/;
|
|
31
|
+
/**
|
|
32
|
+
* The literal marker git itself appends to an author email when it falls back to a guessed identity
|
|
33
|
+
* (user@hostname) and cannot determine a real domain — e.g. "root@buildhost.(none)". An identity carrying
|
|
34
|
+
* it is not a deliberately-configured one.
|
|
35
|
+
*/
|
|
36
|
+
const GIT_GUESSED_DOMAIN_MARKER = '.(none)';
|
|
37
|
+
/**
|
|
38
|
+
* RFC 2606 §2 reserves these four top-level domains for testing, documentation, invalid addresses and
|
|
39
|
+
* loopback. No mailbox exists under them, so an identity on one is a placeholder — the same class of
|
|
40
|
+
* "not a deliberately-configured identity" as git's guessed-domain marker (task-132, `bug-153`).
|
|
41
|
+
*/
|
|
42
|
+
const RFC2606_RESERVED_TLDS = ['invalid', 'example', 'test', 'localhost'];
|
|
43
|
+
/**
|
|
44
|
+
* Whether `email`'s domain is, or ends in, an RFC 2606 reserved top-level domain (case-insensitive).
|
|
45
|
+
* Only the top-level label counts — `test.example.com` is an ordinary domain.
|
|
46
|
+
*/
|
|
47
|
+
function hasReservedDomain(email) {
|
|
48
|
+
// A trailing dot is the fully-qualified spelling of the same domain (`foo.test.` is `foo.test`).
|
|
49
|
+
const domain = email.slice(email.lastIndexOf('@') + 1).toLowerCase().replace(/\.+$/, '');
|
|
50
|
+
const tld = domain.slice(domain.lastIndexOf('.') + 1);
|
|
51
|
+
return RFC2606_RESERVED_TLDS.includes(tld);
|
|
52
|
+
}
|
|
53
|
+
/** Whether `name` is empty or holds only whitespace — a name no identity is recognisable by. */
|
|
54
|
+
function isBlankIdentityName(name) {
|
|
55
|
+
return name.trim().length === 0;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Why `email` is not an attributable address, checked in this order: git's guessed-domain marker
|
|
59
|
+
* (`.(none)`), an address outside {@link ATTRIBUTION_EMAIL_RE}, an RFC 2606 reserved top-level domain
|
|
60
|
+
* ({@link hasReservedDomain}). `null` when none applies.
|
|
61
|
+
*/
|
|
62
|
+
function attributionEmailIssue(email) {
|
|
63
|
+
if (email.includes(GIT_GUESSED_DOMAIN_MARKER))
|
|
64
|
+
return 'guessed-domain';
|
|
65
|
+
if (!ATTRIBUTION_EMAIL_RE.test(email))
|
|
66
|
+
return 'malformed';
|
|
67
|
+
if (hasReservedDomain(email))
|
|
68
|
+
return 'reserved-domain';
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Whether `name`/`email` is an attributable identity: a name that is not blank ({@link isBlankIdentityName})
|
|
73
|
+
* and an email in which {@link attributionEmailIssue} finds nothing.
|
|
74
|
+
*/
|
|
75
|
+
function isAttributableIdentity(name, email) {
|
|
76
|
+
return !isBlankIdentityName(name) && attributionEmailIssue(email) === null;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/validation/identity.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;AA0BH,8CAKC;AAGD,kDAEC;AAUD,sDAKC;AAMD,wDAEC;AAzDD;;;GAGG;AACH,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAE5C;;;;GAIG;AACH,MAAM,qBAAqB,GAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAE7F;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,iGAAiG;IACjG,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,gGAAgG;AAChG,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;AAClC,CAAC;AAKD;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,KAAa;IACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACvE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAC1D,IAAI,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,IAAY,EAAE,KAAa;IAChE,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAC7E,CAAC"}
|
|
@@ -6,13 +6,19 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { E_VALIDATION, E_YAML_PARSE_ERROR, EXIT_INTEGRITY, EXIT_VALIDATION, ValidationError, } from './errors';
|
|
8
8
|
export type { ValidationIssue } from './errors';
|
|
9
|
+
export { DiagnosticsError, formatDiagnostic } from './diagnostic';
|
|
10
|
+
export type { Diagnostic, DiagnosticSeverity } from './diagnostic';
|
|
9
11
|
export { toValidationError } from './error-mapper';
|
|
10
|
-
export { emitUnknownFieldWarning } from './warning';
|
|
11
|
-
export type { HasShape } from './warning';
|
|
12
|
+
export { emitUnknownFieldWarning, reportWarning, withWarningSink } from './warning';
|
|
13
|
+
export type { HasShape, WarningSink } from './warning';
|
|
12
14
|
export { runValidation } from './two-pass';
|
|
13
15
|
export type { RunValidationOptions, SemanticCheck } from './two-pass';
|
|
14
|
-
export { generateId, patternToRegExp, ID_CHAR_CLASS } from './id';
|
|
16
|
+
export { generateId, idPatternIssues, isIdPiece, isNumericToken, patternTokens, patternToRegExp, patternToSource, ID_CHAR_CLASS } from './id';
|
|
15
17
|
export { parseYaml } from './yaml';
|
|
18
|
+
export { isVersionIncrease } from './config-version';
|
|
19
|
+
export { attributionEmailIssue, hasReservedDomain, isAttributableIdentity, isBlankIdentityName } from './identity';
|
|
20
|
+
export type { AttributionEmailIssue } from './identity';
|
|
21
|
+
export { ADAPTER_MANIFEST_FORMAT, DIRECTIVE_FORMAT, DNA_YAML_FORMAT, E_INVALID_FORMAT, MEMORY_TEMPLATE_FORMAT, MEMORY_YAML_FORMAT, ROLES_YAML_FORMAT, WORKFLOW_FORMAT, WORKFLOWS_YAML_FORMAT, formatField, isNewerFormatError, newerFormatIssue, newerFormatMessage, refuseNewerFormat, } from './format';
|
|
16
22
|
export { SECRET_PATTERNS, SCAN_SURFACE_ROOTS, DEFAULT_IGNORE_FILE, scanText, scanProjectSurface, isBinaryContent, loadIgnoreGlobs, matchesIgnoreGlob, } from './secret-scan';
|
|
17
23
|
export type { SecretSeverity, SecretPattern, ExemptReason, SecretFinding, ExemptFinding, ScanResult, ScanTextOptions, ScanProjectOptions, } from './secret-scan';
|
|
18
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACpF,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC9I,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnH,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,eAAe,EACf,kBAAkB,GACnB,MAAM,eAAe,CAAC"}
|