wingfoil 0.2.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/LICENSE +21 -0
- package/README.md +334 -0
- package/dist/cli/error.d.ts +11 -0
- package/dist/cli/error.d.ts.map +1 -0
- package/dist/cli/error.js +27 -0
- package/dist/cli/error.js.map +1 -0
- package/dist/cli/exit.d.ts +19 -0
- package/dist/cli/exit.d.ts.map +1 -0
- package/dist/cli/exit.js +14 -0
- package/dist/cli/exit.js.map +1 -0
- package/dist/cli/index.d.ts +28 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +36 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-command.d.ts +34 -0
- package/dist/cli/init-command.d.ts.map +1 -0
- package/dist/cli/init-command.js +100 -0
- package/dist/cli/init-command.js.map +1 -0
- package/dist/cli/mcp-command.d.ts +24 -0
- package/dist/cli/mcp-command.d.ts.map +1 -0
- package/dist/cli/mcp-command.js +42 -0
- package/dist/cli/mcp-command.js.map +1 -0
- package/dist/cli/output.d.ts +13 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +28 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/program.d.ts +12 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +279 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/registrar.d.ts +69 -0
- package/dist/cli/registrar.d.ts.map +1 -0
- package/dist/cli/registrar.js +82 -0
- package/dist/cli/registrar.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +45 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/approval-authority.d.ts +83 -0
- package/dist/core/approval-authority.d.ts.map +1 -0
- package/dist/core/approval-authority.js +112 -0
- package/dist/core/approval-authority.js.map +1 -0
- package/dist/core/builtin-asset.d.ts +71 -0
- package/dist/core/builtin-asset.d.ts.map +1 -0
- package/dist/core/builtin-asset.js +137 -0
- package/dist/core/builtin-asset.js.map +1 -0
- package/dist/core/builtin-integrity.d.ts +32 -0
- package/dist/core/builtin-integrity.d.ts.map +1 -0
- package/dist/core/builtin-integrity.js +148 -0
- package/dist/core/builtin-integrity.js.map +1 -0
- package/dist/core/confinement.d.ts +57 -0
- package/dist/core/confinement.d.ts.map +1 -0
- package/dist/core/confinement.js +108 -0
- package/dist/core/confinement.js.map +1 -0
- package/dist/core/context.d.ts +187 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +192 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/directive-assign.d.ts +131 -0
- package/dist/core/directive-assign.d.ts.map +1 -0
- package/dist/core/directive-assign.js +352 -0
- package/dist/core/directive-assign.js.map +1 -0
- package/dist/core/directives-list.d.ts +80 -0
- package/dist/core/directives-list.d.ts.map +1 -0
- package/dist/core/directives-list.js +148 -0
- package/dist/core/directives-list.js.map +1 -0
- package/dist/core/exit-code.d.ts +85 -0
- package/dist/core/exit-code.d.ts.map +1 -0
- package/dist/core/exit-code.js +163 -0
- package/dist/core/exit-code.js.map +1 -0
- package/dist/core/git-identity.d.ts +32 -0
- package/dist/core/git-identity.d.ts.map +1 -0
- package/dist/core/git-identity.js +72 -0
- package/dist/core/git-identity.js.map +1 -0
- package/dist/core/index.d.ts +388 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +1331 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/init.d.ts +78 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +167 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/loaders.d.ts +174 -0
- package/dist/core/loaders.d.ts.map +1 -0
- package/dist/core/loaders.js +364 -0
- package/dist/core/loaders.js.map +1 -0
- package/dist/core/memory-add-type.d.ts +43 -0
- package/dist/core/memory-add-type.d.ts.map +1 -0
- package/dist/core/memory-add-type.js +151 -0
- package/dist/core/memory-add-type.js.map +1 -0
- package/dist/core/memory-transition.d.ts +111 -0
- package/dist/core/memory-transition.d.ts.map +1 -0
- package/dist/core/memory-transition.js +269 -0
- package/dist/core/memory-transition.js.map +1 -0
- package/dist/core/registry.d.ts +189 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +66 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/relevance.d.ts +86 -0
- package/dist/core/relevance.d.ts.map +1 -0
- package/dist/core/relevance.js +258 -0
- package/dist/core/relevance.js.map +1 -0
- package/dist/core/require-reason.d.ts +27 -0
- package/dist/core/require-reason.d.ts.map +1 -0
- package/dist/core/require-reason.js +95 -0
- package/dist/core/require-reason.js.map +1 -0
- package/dist/core/types.d.ts +45 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +22 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/usage-error.d.ts +20 -0
- package/dist/core/usage-error.d.ts.map +1 -0
- package/dist/core/usage-error.js +29 -0
- package/dist/core/usage-error.js.map +1 -0
- package/dist/core/write-guard.d.ts +99 -0
- package/dist/core/write-guard.d.ts.map +1 -0
- package/dist/core/write-guard.js +247 -0
- package/dist/core/write-guard.js.map +1 -0
- package/dist/directives/create.d.ts +47 -0
- package/dist/directives/create.d.ts.map +1 -0
- package/dist/directives/create.js +82 -0
- package/dist/directives/create.js.map +1 -0
- package/dist/directives/index.d.ts +20 -0
- package/dist/directives/index.d.ts.map +1 -0
- package/dist/directives/index.js +32 -0
- package/dist/directives/index.js.map +1 -0
- package/dist/directives/roles-edit.d.ts +53 -0
- package/dist/directives/roles-edit.d.ts.map +1 -0
- package/dist/directives/roles-edit.js +286 -0
- package/dist/directives/roles-edit.js.map +1 -0
- package/dist/directives/schema.d.ts +65 -0
- package/dist/directives/schema.d.ts.map +1 -0
- package/dist/directives/schema.js +68 -0
- package/dist/directives/schema.js.map +1 -0
- package/dist/dna/edit.d.ts +61 -0
- package/dist/dna/edit.d.ts.map +1 -0
- package/dist/dna/edit.js +429 -0
- package/dist/dna/edit.js.map +1 -0
- package/dist/dna/index.d.ts +24 -0
- package/dist/dna/index.d.ts.map +1 -0
- package/dist/dna/index.js +59 -0
- package/dist/dna/index.js.map +1 -0
- package/dist/dna/mutate.d.ts +74 -0
- package/dist/dna/mutate.d.ts.map +1 -0
- package/dist/dna/mutate.js +318 -0
- package/dist/dna/mutate.js.map +1 -0
- package/dist/dna/path.d.ts +175 -0
- package/dist/dna/path.d.ts.map +1 -0
- package/dist/dna/path.js +289 -0
- package/dist/dna/path.js.map +1 -0
- package/dist/dna/roles.d.ts +57 -0
- package/dist/dna/roles.d.ts.map +1 -0
- package/dist/dna/roles.js +50 -0
- package/dist/dna/roles.js.map +1 -0
- package/dist/dna/schema.d.ts +172 -0
- package/dist/dna/schema.d.ts.map +1 -0
- package/dist/dna/schema.js +182 -0
- package/dist/dna/schema.js.map +1 -0
- package/dist/dna/set.d.ts +145 -0
- package/dist/dna/set.d.ts.map +1 -0
- package/dist/dna/set.js +428 -0
- package/dist/dna/set.js.map +1 -0
- package/dist/mcp/dna-resource.d.ts +16 -0
- package/dist/mcp/dna-resource.d.ts.map +1 -0
- package/dist/mcp/dna-resource.js +56 -0
- package/dist/mcp/dna-resource.js.map +1 -0
- package/dist/mcp/index.d.ts +49 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +60 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/memory-resource.d.ts +17 -0
- package/dist/mcp/memory-resource.d.ts.map +1 -0
- package/dist/mcp/memory-resource.js +133 -0
- package/dist/mcp/memory-resource.js.map +1 -0
- package/dist/mcp/prompt.d.ts +48 -0
- package/dist/mcp/prompt.d.ts.map +1 -0
- package/dist/mcp/prompt.js +176 -0
- package/dist/mcp/prompt.js.map +1 -0
- package/dist/mcp/read-only.d.ts +42 -0
- package/dist/mcp/read-only.d.ts.map +1 -0
- package/dist/mcp/read-only.js +93 -0
- package/dist/mcp/read-only.js.map +1 -0
- package/dist/mcp/registrar.d.ts +54 -0
- package/dist/mcp/registrar.d.ts.map +1 -0
- package/dist/mcp/registrar.js +72 -0
- package/dist/mcp/registrar.js.map +1 -0
- package/dist/mcp/server.d.ts +58 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +64 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/workflow-resource.d.ts +17 -0
- package/dist/mcp/workflow-resource.d.ts.map +1 -0
- package/dist/mcp/workflow-resource.js +63 -0
- package/dist/mcp/workflow-resource.js.map +1 -0
- package/dist/memory/add.d.ts +50 -0
- package/dist/memory/add.d.ts.map +1 -0
- package/dist/memory/add.js +131 -0
- package/dist/memory/add.js.map +1 -0
- package/dist/memory/audit.d.ts +177 -0
- package/dist/memory/audit.d.ts.map +1 -0
- package/dist/memory/audit.js +287 -0
- package/dist/memory/audit.js.map +1 -0
- package/dist/memory/commit-message.d.ts +146 -0
- package/dist/memory/commit-message.d.ts.map +1 -0
- package/dist/memory/commit-message.js +203 -0
- package/dist/memory/commit-message.js.map +1 -0
- package/dist/memory/entry.d.ts +56 -0
- package/dist/memory/entry.d.ts.map +1 -0
- package/dist/memory/entry.js +28 -0
- package/dist/memory/entry.js.map +1 -0
- package/dist/memory/frontmatter-edit.d.ts +68 -0
- package/dist/memory/frontmatter-edit.d.ts.map +1 -0
- package/dist/memory/frontmatter-edit.js +333 -0
- package/dist/memory/frontmatter-edit.js.map +1 -0
- package/dist/memory/git-log.d.ts +32 -0
- package/dist/memory/git-log.d.ts.map +1 -0
- package/dist/memory/git-log.js +100 -0
- package/dist/memory/git-log.js.map +1 -0
- package/dist/memory/history.d.ts +142 -0
- package/dist/memory/history.d.ts.map +1 -0
- package/dist/memory/history.js +250 -0
- package/dist/memory/history.js.map +1 -0
- package/dist/memory/index.d.ts +58 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +107 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/query.d.ts +150 -0
- package/dist/memory/query.d.ts.map +1 -0
- package/dist/memory/query.js +307 -0
- package/dist/memory/query.js.map +1 -0
- package/dist/memory/reject.d.ts +11 -0
- package/dist/memory/reject.d.ts.map +1 -0
- package/dist/memory/reject.js +32 -0
- package/dist/memory/reject.js.map +1 -0
- package/dist/memory/schema.d.ts +104 -0
- package/dist/memory/schema.d.ts.map +1 -0
- package/dist/memory/schema.js +161 -0
- package/dist/memory/schema.js.map +1 -0
- package/dist/memory/state-machine.d.ts +166 -0
- package/dist/memory/state-machine.d.ts.map +1 -0
- package/dist/memory/state-machine.js +431 -0
- package/dist/memory/state-machine.js.map +1 -0
- package/dist/memory/submit.d.ts +11 -0
- package/dist/memory/submit.d.ts.map +1 -0
- package/dist/memory/submit.js +44 -0
- package/dist/memory/submit.js.map +1 -0
- package/dist/storage/builtin-directives.d.ts +54 -0
- package/dist/storage/builtin-directives.d.ts.map +1 -0
- package/dist/storage/builtin-directives.js +152 -0
- package/dist/storage/builtin-directives.js.map +1 -0
- package/dist/storage/commit.d.ts +92 -0
- package/dist/storage/commit.d.ts.map +1 -0
- package/dist/storage/commit.js +201 -0
- package/dist/storage/commit.js.map +1 -0
- package/dist/storage/confinement.d.ts +93 -0
- package/dist/storage/confinement.d.ts.map +1 -0
- package/dist/storage/confinement.js +164 -0
- package/dist/storage/confinement.js.map +1 -0
- package/dist/storage/document.d.ts +27 -0
- package/dist/storage/document.d.ts.map +1 -0
- package/dist/storage/document.js +52 -0
- package/dist/storage/document.js.map +1 -0
- package/dist/storage/errors.d.ts +36 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +46 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/frontmatter.d.ts +27 -0
- package/dist/storage/frontmatter.d.ts.map +1 -0
- package/dist/storage/frontmatter.js +37 -0
- package/dist/storage/frontmatter.js.map +1 -0
- package/dist/storage/git-root.d.ts +17 -0
- package/dist/storage/git-root.d.ts.map +1 -0
- package/dist/storage/git-root.js +49 -0
- package/dist/storage/git-root.js.map +1 -0
- package/dist/storage/index.d.ts +29 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +66 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/init-state.d.ts +9 -0
- package/dist/storage/init-state.d.ts.map +1 -0
- package/dist/storage/init-state.js +24 -0
- package/dist/storage/init-state.js.map +1 -0
- package/dist/storage/layout.d.ts +51 -0
- package/dist/storage/layout.d.ts.map +1 -0
- package/dist/storage/layout.js +88 -0
- package/dist/storage/layout.js.map +1 -0
- package/dist/storage/memory-path.d.ts +72 -0
- package/dist/storage/memory-path.d.ts.map +1 -0
- package/dist/storage/memory-path.js +127 -0
- package/dist/storage/memory-path.js.map +1 -0
- package/dist/storage/snapshot.d.ts +16 -0
- package/dist/storage/snapshot.d.ts.map +1 -0
- package/dist/storage/snapshot.js +72 -0
- package/dist/storage/snapshot.js.map +1 -0
- package/dist/storage/templates.d.ts +88 -0
- package/dist/storage/templates.d.ts.map +1 -0
- package/dist/storage/templates.js +422 -0
- package/dist/storage/templates.js.map +1 -0
- package/dist/validation/error-mapper.d.ts +16 -0
- package/dist/validation/error-mapper.d.ts.map +1 -0
- package/dist/validation/error-mapper.js +18 -0
- package/dist/validation/error-mapper.js.map +1 -0
- package/dist/validation/errors.d.ts +69 -0
- package/dist/validation/errors.d.ts.map +1 -0
- package/dist/validation/errors.js +69 -0
- package/dist/validation/errors.js.map +1 -0
- package/dist/validation/id.d.ts +16 -0
- package/dist/validation/id.d.ts.map +1 -0
- package/dist/validation/id.js +177 -0
- package/dist/validation/id.js.map +1 -0
- package/dist/validation/index.d.ts +18 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +37 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/secret-scan.d.ts +129 -0
- package/dist/validation/secret-scan.d.ts.map +1 -0
- package/dist/validation/secret-scan.js +367 -0
- package/dist/validation/secret-scan.js.map +1 -0
- package/dist/validation/two-pass.d.ts +24 -0
- package/dist/validation/two-pass.d.ts.map +1 -0
- package/dist/validation/two-pass.js +24 -0
- package/dist/validation/two-pass.js.map +1 -0
- package/dist/validation/warning.d.ts +31 -0
- package/dist/validation/warning.d.ts.map +1 -0
- package/dist/validation/warning.js +81 -0
- package/dist/validation/warning.js.map +1 -0
- package/dist/validation/yaml.d.ts +9 -0
- package/dist/validation/yaml.d.ts.map +1 -0
- package/dist/validation/yaml.js +30 -0
- package/dist/validation/yaml.js.map +1 -0
- package/dist/workflow/index.d.ts +10 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +16 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/schema.d.ts +89 -0
- package/dist/workflow/schema.d.ts.map +1 -0
- package/dist/workflow/schema.js +73 -0
- package/dist/workflow/schema.js.map +1 -0
- package/package.json +78 -0
package/dist/dna/set.js
ADDED
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DNA_KEY_ALIASES = void 0;
|
|
4
|
+
exports.splitDnaPath = splitDnaPath;
|
|
5
|
+
exports.quoteDnaSegment = quoteDnaSegment;
|
|
6
|
+
exports.isValidKeyPath = isValidKeyPath;
|
|
7
|
+
exports.inlineCommentIndex = inlineCommentIndex;
|
|
8
|
+
exports.valueOf = valueOf;
|
|
9
|
+
exports.setDnaValueInText = setDnaValueInText;
|
|
10
|
+
/**
|
|
11
|
+
* Pure DNA key-path helpers for `wingfoil dna set` (P2.1, task-025-implement-dna-set). The `dna`
|
|
12
|
+
* pillar owns the semantics of a dotted key path into its own structure; `src/core`'s `dnaSet`
|
|
13
|
+
* operation composes these with the git-identity pre-flight, schema re-validation, write, and commit
|
|
14
|
+
* (which are cross-pillar / storage concerns and therefore live in `src/core`, not here). Nothing in
|
|
15
|
+
* this file imports `src/core` — the pillar stays a leaf under core (spec-006-core-domain-api §1).
|
|
16
|
+
*
|
|
17
|
+
* task-063 adds {@link setDnaValueInText}, the minimal **comment-preserving** in-place edit that
|
|
18
|
+
* replaces the whole-file `js-yaml` `dump()` round-trip as `dna set`'s primary write path
|
|
19
|
+
* (bug-004-dna-set-strips-yaml-comments). Only `js-yaml` is imported — no comment-preserving YAML
|
|
20
|
+
* library is added, per `dl-010-minimal-dependencies`.
|
|
21
|
+
*/
|
|
22
|
+
const js_yaml_1 = require("js-yaml");
|
|
23
|
+
/**
|
|
24
|
+
* The first-segment alias `dna show` resolves: `tech_stack` -> `stacks`, the BDD-compatibility alias
|
|
25
|
+
* spec-002-dna-yaml-schema's Consequences describe (the schema renamed the BDD's `tech_stack` wording
|
|
26
|
+
* to `stacks`), so `dna show tech_stack` still reads the `stacks` subtree.
|
|
27
|
+
*
|
|
28
|
+
* **READ side only, since task-093** (`bug-084-dna-key-alias-writes-unschemad-keys`). It used to be
|
|
29
|
+
* applied on the write path too, and there it was a trap: `stacks` replaced a fixed-key `tech_stack`
|
|
30
|
+
* OBJECT, which is a change of shape rather than of name, so rewriting only the first segment
|
|
31
|
+
* produced a path that resolves nowhere — `dna set tech_stack.cli.framework Commander` wrote
|
|
32
|
+
* `stacks.cli.framework`, a key no schema declares, through `Stacks`'s `.passthrough()`, at exit 0.
|
|
33
|
+
* spec-002 says plainly that "any consumer that read `tech_stack.<key>` must now scan" the lists, and
|
|
34
|
+
* a first-segment alias cannot honour that sentence. The write path therefore does not alias at all;
|
|
35
|
+
* an old-shape path is refused as the unknown key it is (`src/dna/path.ts`, exit 1).
|
|
36
|
+
*/
|
|
37
|
+
exports.DNA_KEY_ALIASES = { tech_stack: 'stacks' };
|
|
38
|
+
/** The delimiter that opens and closes a quoted path segment (`dl-083`). */
|
|
39
|
+
const QUOTE = '"';
|
|
40
|
+
/**
|
|
41
|
+
* Parse a dotted DNA key path into its segments — the ONE place a path is split, shared by
|
|
42
|
+
* {@link isValidKeyPath}, {@link setDnaValueInText}'s text resolver and `resolveDnaPath`
|
|
43
|
+
* (`./path.ts`). It replaced three copies of `keyPath.split('.')`, which is why the quoting rule
|
|
44
|
+
* below has one definition rather than three chances to disagree.
|
|
45
|
+
*
|
|
46
|
+
* **The grammar** (`dl-083-dotted-entry-names-in-paths`, ratified; it exists because
|
|
47
|
+
* `dl-081-dna-mutation-surface-shape` made an entry's `name` the key it is addressed by, and
|
|
48
|
+
* `stacks.technologies` really does carry entries named `Node.js` and `Commander.js`):
|
|
49
|
+
*
|
|
50
|
+
* - a segment that **begins** with `"` is quoted and ends at the **next** `"`. The quotes are
|
|
51
|
+
* delimiters and are not part of the name; between them `.` is an ordinary character, and so is
|
|
52
|
+
* everything else;
|
|
53
|
+
* - the closing `"` must be followed by `.` or by the end of the path;
|
|
54
|
+
* - a segment that does not begin with `"` ends at the next `.`;
|
|
55
|
+
* - quoting is optional where it is unnecessary: `team."members".roberto` and `team.members.roberto`
|
|
56
|
+
* are the same path.
|
|
57
|
+
*
|
|
58
|
+
* **The rule narrows what a path may mean, and for one class of path that is a breaking change.**
|
|
59
|
+
* Before it, `"` was an ordinary character inside a segment; under it every `"` is a delimiter. Two
|
|
60
|
+
* measured consequences, neither hypothetical: `isValidKeyPath('modules.co"re')` was `true` and is
|
|
61
|
+
* now `false`; and where a collection carries an entry named `"a"` beside one named `a` — the schema
|
|
62
|
+
* permits both, `uniquelyNamed` included — `stacks.technologies."a".category` resolved to the
|
|
63
|
+
* quote-named entry before and resolves to the **other** entry now, silently rather than by refusing.
|
|
64
|
+
* `dl-083` accepts the narrowing deliberately (a name containing `"` becomes unaddressable, with no
|
|
65
|
+
* escape sequence), but accepting it is not the same as nothing having changed.
|
|
66
|
+
*
|
|
67
|
+
* At a shell prompt the two quoting layers overlap and are easy to confuse:
|
|
68
|
+
* `wingfoil dna update 'stacks.technologies."Node.js".version' --value 22.14+` has the **shell's**
|
|
69
|
+
* single quotes outside and **WingFoil's** double quotes inside. This function sees only the inner
|
|
70
|
+
* form.
|
|
71
|
+
*
|
|
72
|
+
* **Three refusals, and the distinctions between them are load-bearing:**
|
|
73
|
+
*
|
|
74
|
+
* - an **empty** segment, quoted (`team.""`) or not (`..language`) — `invalid key path: '<path>'`,
|
|
75
|
+
* the message `P2.1-dna-set.feature` scenario 3 pins, unchanged;
|
|
76
|
+
* - an **unterminated** quote — a segment that opens with `"` and never closes. Refused as
|
|
77
|
+
* unterminated rather than taken as a name that happens to begin with a quote, so
|
|
78
|
+
* `dna update 'stacks."Node.js'` reports the typo instead of hunting for an entry named `"Node`;
|
|
79
|
+
* - a `"` **no delimiter can account for**: inside an unquoted segment (`modules.co"re`), or in the
|
|
80
|
+
* remainder of a quoted one (`stacks."say "hi""`). A quoted segment may not contain `"` and there
|
|
81
|
+
* is **no escape sequence** — `dl-083` accepted that cost deliberately rather than overlooking it —
|
|
82
|
+
* so the name being reached for has no spelling at all. The refusal says the **name** is
|
|
83
|
+
* unaddressable, not that the path is malformed, because the path is the only spelling an
|
|
84
|
+
* impossible request has. A quoted segment that merely fails to span its segment (`"Node.js"x`)
|
|
85
|
+
* carries no such `"` and is malformed instead: that is what keeps the unaddressable message true
|
|
86
|
+
* every time it is printed.
|
|
87
|
+
*
|
|
88
|
+
* All three are usage errors (exit 2, `spec-005-cli-command-contract` §1) — properties of how the
|
|
89
|
+
* argument is spelled, decided before anything is read. This is a pure function with no side effects,
|
|
90
|
+
* so the caller owns turning a refusal into that exit code.
|
|
91
|
+
*/
|
|
92
|
+
function splitDnaPath(keyPath) {
|
|
93
|
+
const malformed = { ok: false, message: `invalid key path: '${keyPath}'` };
|
|
94
|
+
const segments = [];
|
|
95
|
+
let index = 0;
|
|
96
|
+
for (;;) {
|
|
97
|
+
let segment;
|
|
98
|
+
/** Index of the `.` that ended this segment, or `-1` when the segment ran to the end of the path. */
|
|
99
|
+
let dot;
|
|
100
|
+
if (keyPath[index] === QUOTE) {
|
|
101
|
+
const close = keyPath.indexOf(QUOTE, index + 1);
|
|
102
|
+
if (close < 0) {
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
message: `invalid key path: '${keyPath}': unterminated quote — a segment that opens with ${QUOTE} must close with ${QUOTE}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
dot = keyPath.indexOf('.', close + 1);
|
|
109
|
+
const trailer = dot < 0 ? keyPath.slice(close + 1) : keyPath.slice(close + 1, dot);
|
|
110
|
+
if (trailer.length > 0)
|
|
111
|
+
return trailer.includes(QUOTE) ? unaddressable(keyPath) : malformed;
|
|
112
|
+
segment = keyPath.slice(index + 1, close);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
dot = keyPath.indexOf('.', index);
|
|
116
|
+
segment = dot < 0 ? keyPath.slice(index) : keyPath.slice(index, dot);
|
|
117
|
+
if (segment.includes(QUOTE))
|
|
118
|
+
return unaddressable(keyPath);
|
|
119
|
+
}
|
|
120
|
+
if (segment.length === 0)
|
|
121
|
+
return malformed;
|
|
122
|
+
segments.push(segment);
|
|
123
|
+
// A `.` always opens another segment — `team.` owes one, and it is the empty one refused above.
|
|
124
|
+
if (dot < 0)
|
|
125
|
+
return { ok: true, segments };
|
|
126
|
+
index = dot + 1;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** The refusal for a `"` that cannot be a delimiter: the NAME has no spelling, not the path. */
|
|
130
|
+
function unaddressable(keyPath) {
|
|
131
|
+
return {
|
|
132
|
+
ok: false,
|
|
133
|
+
message: `unaddressable entry name in key path '${keyPath}': a segment may not contain ${QUOTE} and there is ` +
|
|
134
|
+
`no escape sequence, so an entry whose name contains ${QUOTE} cannot be addressed`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The path spelling of one segment: quoted when its name contains a `.`, bare otherwise. Used wherever
|
|
139
|
+
* a refusal echoes part of a path, so the reported prefix can be pasted back into a command — without
|
|
140
|
+
* it `stacks.technologies.Node.js` would be reported for the entry named `Node.js`, and that re-splits
|
|
141
|
+
* into four segments and names a different node.
|
|
142
|
+
*
|
|
143
|
+
* **It is the inverse of {@link splitDnaPath} on the segments `splitDnaPath` produces — not on every
|
|
144
|
+
* string**, and the difference is worth stating precisely rather than calling it "the inverse".
|
|
145
|
+
* Brute-forced over the alphabet `{a, ., "}` up to five characters (363 names): 62 round-trip
|
|
146
|
+
* unchanged, 294 produce a path `splitDnaPath` refuses, and **7 produce a path that parses back to a
|
|
147
|
+
* different name** — `"a"` contains no `.`, so it is returned bare and re-parses as `a`; `a"."a`
|
|
148
|
+
* becomes `"a"."a"`, which is two segments.
|
|
149
|
+
*
|
|
150
|
+
* All 7 have a `"` in the name, and that is why the gap is unreachable at the one call site
|
|
151
|
+
* (`prefixOf`, `./path.ts`), structurally rather than by luck: `prefixOf` is fed
|
|
152
|
+
* `DnaPathTarget.segments`, which comes from `splitDnaPath`, and a segment it returns can never
|
|
153
|
+
* contain a `"` — a bare segment containing one is refused as unaddressable, and a quoted segment
|
|
154
|
+
* ends at the *first* `"`. Measured over the same 363: **0** parse to a segment containing a quote.
|
|
155
|
+
* So the hardening a general inverse would need is unreachable code, and is deliberately not written;
|
|
156
|
+
* what is written instead is this note and the `"`-free precondition it rests on.
|
|
157
|
+
*/
|
|
158
|
+
function quoteDnaSegment(name) {
|
|
159
|
+
return name.includes('.') ? `${QUOTE}${name}${QUOTE}` : name;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Whether `keyPath` is a well-formed dotted path — {@link splitDnaPath} reduced to a boolean, so the
|
|
163
|
+
* predicate and the parser cannot disagree about what "well-formed" means. A malformed path (the
|
|
164
|
+
* BDD's `..language`, an empty segment, an unterminated or unaccountable quote) is a usage error
|
|
165
|
+
* (exit 2, spec-005-cli-command-contract §1) the caller rejects before any write; a caller that
|
|
166
|
+
* reports a message uses `splitDnaPath` directly, because only it knows *which* of the three it was.
|
|
167
|
+
*/
|
|
168
|
+
function isValidKeyPath(keyPath) {
|
|
169
|
+
return splitDnaPath(keyPath).ok;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* A block-mapping key line: leading spaces, a plain scalar key, `:`, then end-of-line or a space.
|
|
173
|
+
* Deliberately narrow — quoted, complex or flow keys simply do not match, which can only make the
|
|
174
|
+
* scanner *miss* a key (falling back to the whole-file dump), never mis-target one.
|
|
175
|
+
*/
|
|
176
|
+
const KEY_LINE = /^( *)([A-Za-z0-9_][A-Za-z0-9_.+-]*):(?=$| )(.*)$/;
|
|
177
|
+
/** Leading-space count of a line (its block-mapping indentation level). */
|
|
178
|
+
function indentOf(line) {
|
|
179
|
+
return line.length - line.trimStart().length;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Index within `rest` of the `#` that starts an inline comment, or `-1`. Quote-aware, so a `#`
|
|
183
|
+
* inside a `'single'`- or `"double"`-quoted scalar is not mistaken for a comment; per the YAML spec
|
|
184
|
+
* a comment must also be preceded by whitespace (or start the field).
|
|
185
|
+
*
|
|
186
|
+
* Exported for `./edit.ts`, the sequence-aware editor added by task-093: both write paths must agree
|
|
187
|
+
* on where a line's value ends and its comment begins, and two copies of this scanner would be two
|
|
188
|
+
* chances to disagree.
|
|
189
|
+
*/
|
|
190
|
+
function inlineCommentIndex(rest) {
|
|
191
|
+
let quote;
|
|
192
|
+
for (let i = 0; i < rest.length; i += 1) {
|
|
193
|
+
const char = rest[i];
|
|
194
|
+
if (quote !== undefined) {
|
|
195
|
+
if (char === quote) {
|
|
196
|
+
if (quote === "'" && rest[i + 1] === "'")
|
|
197
|
+
i += 1;
|
|
198
|
+
else
|
|
199
|
+
quote = undefined;
|
|
200
|
+
}
|
|
201
|
+
else if (quote === '"' && char === '\\')
|
|
202
|
+
i += 1;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (char === "'" || char === '"')
|
|
206
|
+
quote = char;
|
|
207
|
+
else if (char === '#' && (i === 0 || rest[i - 1] === ' ' || rest[i - 1] === '\t'))
|
|
208
|
+
return i;
|
|
209
|
+
}
|
|
210
|
+
return -1;
|
|
211
|
+
}
|
|
212
|
+
/** The value part of a key line's `rest`, with any inline comment and surrounding spaces removed. */
|
|
213
|
+
function valueOf(rest) {
|
|
214
|
+
const commentIndex = inlineCommentIndex(rest);
|
|
215
|
+
return (commentIndex < 0 ? rest : rest.slice(0, commentIndex)).trim();
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Whether the value on line `line` continues past it — a nested block, a same-indent sequence, or a
|
|
219
|
+
* multi-line scalar. Such a line cannot be rewritten on its own without orphaning what follows, so
|
|
220
|
+
* the editor refuses (the caller falls back to the whole-file dump).
|
|
221
|
+
*/
|
|
222
|
+
function hasContinuation(lines, line, indent) {
|
|
223
|
+
for (let i = line + 1; i < lines.length; i += 1) {
|
|
224
|
+
const candidate = lines[i];
|
|
225
|
+
if (candidate.trim() === '')
|
|
226
|
+
continue;
|
|
227
|
+
const candidateIndent = indentOf(candidate);
|
|
228
|
+
if (candidateIndent > indent)
|
|
229
|
+
return true;
|
|
230
|
+
return candidateIndent === indent && candidate.trimStart().startsWith('-');
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Walk the document's block mappings top-down, tracking the current key path by indentation, and
|
|
236
|
+
* report where `segments` lands. Sequence branches are skipped wholesale (a dotted DNA key path only
|
|
237
|
+
* ever names mapping keys), as is block-scalar content, so neither can produce a false match.
|
|
238
|
+
*/
|
|
239
|
+
function resolveKeyPath(lines, segments) {
|
|
240
|
+
const stack = [];
|
|
241
|
+
/** While set, every line indented at least this far is skipped (sequence / block-scalar content). */
|
|
242
|
+
let skipFrom;
|
|
243
|
+
let parent;
|
|
244
|
+
let depth = 0;
|
|
245
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
246
|
+
const line = lines[i];
|
|
247
|
+
if (line.trim() === '')
|
|
248
|
+
continue; // blank lines belong to whatever region is open; never close one
|
|
249
|
+
const indent = indentOf(line);
|
|
250
|
+
if (skipFrom !== undefined) {
|
|
251
|
+
if (indent >= skipFrom)
|
|
252
|
+
continue;
|
|
253
|
+
skipFrom = undefined;
|
|
254
|
+
}
|
|
255
|
+
const content = line.trimStart();
|
|
256
|
+
if (content.startsWith('#'))
|
|
257
|
+
continue;
|
|
258
|
+
if (content.startsWith('-')) {
|
|
259
|
+
skipFrom = indent; // a sequence item: skip this whole branch, items and their children alike
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const match = KEY_LINE.exec(line);
|
|
263
|
+
if (match === null)
|
|
264
|
+
continue;
|
|
265
|
+
const key = match[2];
|
|
266
|
+
const rest = match[3];
|
|
267
|
+
while (stack.length > 0 && stack[stack.length - 1].indent >= indent)
|
|
268
|
+
stack.pop();
|
|
269
|
+
const path = [...stack.map((frame) => frame.key), key];
|
|
270
|
+
if (path.length <= segments.length && path.every((name, index) => name === segments[index])) {
|
|
271
|
+
if (path.length === segments.length) {
|
|
272
|
+
return { leaf: { line: i, indent, key, rest }, depth: segments.length };
|
|
273
|
+
}
|
|
274
|
+
parent = { line: i, indent, key, rest };
|
|
275
|
+
depth = path.length;
|
|
276
|
+
}
|
|
277
|
+
stack.push({ key, indent });
|
|
278
|
+
const value = valueOf(rest);
|
|
279
|
+
if (value.startsWith('|') || value.startsWith('>'))
|
|
280
|
+
skipFrom = indent + 1; // block scalar content
|
|
281
|
+
}
|
|
282
|
+
return { parent, depth };
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Rewrite `leaf`'s value to `scalar`, keeping its indentation, its key, and any inline comment —
|
|
286
|
+
* realigned to the column it already occupied whenever the new value still leaves room for it, so a
|
|
287
|
+
* hand-aligned annotation block stays aligned. Returns `undefined` when the value spills past this
|
|
288
|
+
* one line (block scalar, nested block, hanging sequence): no single-line edit exists then.
|
|
289
|
+
*/
|
|
290
|
+
function replaceLeafValue(lines, leaf, scalar) {
|
|
291
|
+
const value = valueOf(leaf.rest);
|
|
292
|
+
if (value.startsWith('|') || value.startsWith('>'))
|
|
293
|
+
return undefined;
|
|
294
|
+
if (hasContinuation(lines, leaf.line, leaf.indent))
|
|
295
|
+
return undefined;
|
|
296
|
+
const head = `${' '.repeat(leaf.indent)}${leaf.key}: ${scalar}`;
|
|
297
|
+
const commentIndex = inlineCommentIndex(leaf.rest);
|
|
298
|
+
if (commentIndex < 0) {
|
|
299
|
+
lines[leaf.line] = head;
|
|
300
|
+
return lines;
|
|
301
|
+
}
|
|
302
|
+
const column = leaf.indent + leaf.key.length + 1 + commentIndex;
|
|
303
|
+
const gap = column > head.length ? ' '.repeat(column - head.length) : ' ';
|
|
304
|
+
lines[leaf.line] = head + gap + leaf.rest.slice(commentIndex);
|
|
305
|
+
return lines;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Append `remaining` (the still-missing tail of the key path) to the end of `parent`'s block — or to
|
|
309
|
+
* the end of the document when `parent` is absent, i.e. the whole path is new. The new key lands
|
|
310
|
+
* after the block's last content line and *before* any trailing comment lines, so a comment that
|
|
311
|
+
* introduces the next section keeps introducing it. Returns `undefined` when the parent cannot hold
|
|
312
|
+
* a mapping key (it already holds an inline scalar, or its block is a sequence).
|
|
313
|
+
*/
|
|
314
|
+
function insertKeyPath(lines, parent, remaining, scalar) {
|
|
315
|
+
if (parent !== undefined && valueOf(parent.rest) !== '')
|
|
316
|
+
return undefined;
|
|
317
|
+
const containerLine = parent?.line ?? -1;
|
|
318
|
+
const containerIndent = parent?.indent ?? -1;
|
|
319
|
+
let blockEnd = containerLine;
|
|
320
|
+
let childIndent;
|
|
321
|
+
for (let i = containerLine + 1; i < lines.length; i += 1) {
|
|
322
|
+
const line = lines[i];
|
|
323
|
+
if (line.trim() === '')
|
|
324
|
+
continue;
|
|
325
|
+
const indent = indentOf(line);
|
|
326
|
+
if (indent <= containerIndent)
|
|
327
|
+
break;
|
|
328
|
+
if (line.trimStart().startsWith('#'))
|
|
329
|
+
continue;
|
|
330
|
+
if (childIndent === undefined) {
|
|
331
|
+
if (line.trimStart().startsWith('-'))
|
|
332
|
+
return undefined; // the block is a sequence, not a mapping
|
|
333
|
+
childIndent = indent;
|
|
334
|
+
}
|
|
335
|
+
blockEnd = i;
|
|
336
|
+
}
|
|
337
|
+
const baseIndent = childIndent ?? (parent === undefined ? 0 : parent.indent + 2);
|
|
338
|
+
const inserted = remaining.map((segment, index) => {
|
|
339
|
+
const indent = ' '.repeat(baseIndent + index * 2);
|
|
340
|
+
return index === remaining.length - 1 ? `${indent}${segment}: ${scalar}` : `${indent}${segment}:`;
|
|
341
|
+
});
|
|
342
|
+
lines.splice(blockEnd + 1, 0, ...inserted);
|
|
343
|
+
return lines;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Render `value` as the YAML scalar token `js-yaml`'s own `dump()` would emit for it, so an in-place
|
|
347
|
+
* edit writes byte-identical bytes to a whole-file re-serialization at that position. This is what
|
|
348
|
+
* keeps `dna set`'s scalar-coercion contract intact: `dump('2')` is `'2'`, which reads back as the
|
|
349
|
+
* STRING `'2'` (and so still fails `version`'s `z.number()`), whereas a bare `2` would read back as
|
|
350
|
+
* a number. `undefined` when the scalar is itself multi-line (e.g. a `|-` block) — not inlinable.
|
|
351
|
+
*/
|
|
352
|
+
function renderScalar(value) {
|
|
353
|
+
const scalar = (0, js_yaml_1.dump)(value, { lineWidth: -1 }).replace(/\n$/, '');
|
|
354
|
+
return scalar.includes('\n') ? undefined : scalar;
|
|
355
|
+
}
|
|
356
|
+
/** Whether `text` parses and the (already alias-resolved) `segments` read back as exactly `scalar`. */
|
|
357
|
+
function readsBackAs(text, segments, scalar) {
|
|
358
|
+
let node;
|
|
359
|
+
let expected;
|
|
360
|
+
try {
|
|
361
|
+
node = (0, js_yaml_1.load)(text);
|
|
362
|
+
expected = (0, js_yaml_1.load)(scalar);
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
for (const segment of segments) {
|
|
368
|
+
if (typeof node !== 'object' || node === null || Array.isArray(node))
|
|
369
|
+
return false;
|
|
370
|
+
if (!Object.prototype.hasOwnProperty.call(node, segment))
|
|
371
|
+
return false;
|
|
372
|
+
node = node[segment];
|
|
373
|
+
}
|
|
374
|
+
return node === expected;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Set the (alias-resolved) dotted `keyPath` to `value` inside the RAW TEXT of a `dna.yaml`, editing
|
|
378
|
+
* as few bytes as possible: one line rewritten, or one line inserted. Everything else — every
|
|
379
|
+
* comment, including the inline `[SPEC]`/`[AUTHORING]` field-provenance annotations, and every blank
|
|
380
|
+
* line, quote style and alignment — is returned byte-for-byte unchanged.
|
|
381
|
+
*
|
|
382
|
+
* This is `dna set`'s primary write path (bug-004): re-serializing the parsed object through
|
|
383
|
+
* `dump()` is correct but discards every comment token, which silently voids the field-provenance
|
|
384
|
+
* convention — a `[SPEC]` field may only be removed or renamed after changing the specification it
|
|
385
|
+
* cites, and that cannot be audited once the annotations are gone. A textual edit also needs no
|
|
386
|
+
* comment-preserving YAML library, keeping `dl-010-minimal-dependencies` intact.
|
|
387
|
+
*
|
|
388
|
+
* Returns `undefined` — deliberately, not as an error — whenever a provably-minimal edit does not
|
|
389
|
+
* exist, leaving the caller to fall back to the whole-file `dump()`:
|
|
390
|
+
* - `text` is not a single, valid YAML document;
|
|
391
|
+
* - the key path is malformed (the caller has already raised the exit-2 usage error for it);
|
|
392
|
+
* - the value's own YAML form is multi-line;
|
|
393
|
+
* - the target, or an ancestor of it, is a block/multi-line scalar, opens a nested block, or holds
|
|
394
|
+
* an inline scalar the path would have to descend through;
|
|
395
|
+
* - the parent block is a sequence rather than a mapping;
|
|
396
|
+
* - the edited text does not read back with the target key holding exactly the intended scalar.
|
|
397
|
+
*
|
|
398
|
+
* The result is a pure function of `(text, keyPath, value)` — no wall-clock, randomness or unordered
|
|
399
|
+
* iteration anywhere on the path (REQ-SYS-07).
|
|
400
|
+
*/
|
|
401
|
+
function setDnaValueInText(text, keyPath, value) {
|
|
402
|
+
// task-093/bug-084: the write path does NOT apply `DNA_KEY_ALIASES` — see that constant's own note.
|
|
403
|
+
// task-099: one parser for every path, so a quoted segment means the same here as at the resolver,
|
|
404
|
+
// and a malformed path is the single `ok: false` this function turns into its `undefined` fallback.
|
|
405
|
+
const split = splitDnaPath(keyPath);
|
|
406
|
+
if (!split.ok)
|
|
407
|
+
return undefined;
|
|
408
|
+
const segments = split.segments;
|
|
409
|
+
try {
|
|
410
|
+
(0, js_yaml_1.load)(text); // a single, parseable document: never "repair" input the caller could not read
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return undefined;
|
|
414
|
+
}
|
|
415
|
+
const scalar = renderScalar(value);
|
|
416
|
+
if (scalar === undefined)
|
|
417
|
+
return undefined;
|
|
418
|
+
const lines = text.split('\n');
|
|
419
|
+
const resolved = resolveKeyPath(lines, segments);
|
|
420
|
+
const edited = resolved.leaf !== undefined
|
|
421
|
+
? replaceLeafValue(lines.slice(), resolved.leaf, scalar)
|
|
422
|
+
: insertKeyPath(lines.slice(), resolved.parent, segments.slice(resolved.depth), scalar);
|
|
423
|
+
if (edited === undefined)
|
|
424
|
+
return undefined;
|
|
425
|
+
const result = edited.join('\n');
|
|
426
|
+
return readsBackAs(result, segments, scalar) ? result : undefined;
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/dna/set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/** Options for {@link registerDnaResources}. */
|
|
3
|
+
export interface RegisterDnaResourcesOptions {
|
|
4
|
+
/** Resolves the project root each DNA Resource read is served from (an ambient concern, not a request parameter). */
|
|
5
|
+
readonly resolveRoot: () => string;
|
|
6
|
+
}
|
|
7
|
+
/** spec-004 §2.1 — the whole `dna.yaml` document. */
|
|
8
|
+
export declare const DNA_WHOLE_URI = "wingfoil://dna";
|
|
9
|
+
/** spec-004 §2.1 — one top-level `dna.yaml` section (`team`, `paths`, `modules`, `stacks`, ...). */
|
|
10
|
+
export declare const DNA_SECTION_URI_TEMPLATE = "wingfoil://dna/{section}";
|
|
11
|
+
/**
|
|
12
|
+
* Register both DNA Resources on `server`. Reads `.wingfoil/dna.yaml` fresh on every request (no
|
|
13
|
+
* server-lifetime cache), matching every other Resource this task registers.
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerDnaResources(server: McpServer, options: RegisterDnaResourcesOptions): void;
|
|
16
|
+
//# sourceMappingURL=dna-resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dna-resource.d.ts","sourceRoot":"","sources":["../../src/mcp/dna-resource.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,qHAAqH;IACrH,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACpC;AAED,qDAAqD;AACrD,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAC9C,oGAAoG;AACpG,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CA+BlG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DNA_SECTION_URI_TEMPLATE = exports.DNA_WHOLE_URI = void 0;
|
|
4
|
+
exports.registerDnaResources = registerDnaResources;
|
|
5
|
+
/**
|
|
6
|
+
* `wingfoil://dna` (whole file) and `wingfoil://dna/{section}` (one top-level key) Resources —
|
|
7
|
+
* task-011-mcp-resources-read-only, REQ-INT-01, spec-004-mcp-surface-contract §2.1. Distinct from
|
|
8
|
+
* `registerCoreModules`'s existing, mechanically-derived `wingfoil://dna/show` Resource
|
|
9
|
+
* (task-006-dual-interface-shared-core): that URI is `registerCoreModules`'s generic
|
|
10
|
+
* `wingfoil://{module}/{verb}` transform of the `dnaShow` `CoreOperation` and is left untouched here —
|
|
11
|
+
* this module adds the spec-004 §2.1-conformant addressing alongside it (both can and do coexist on
|
|
12
|
+
* the same server; they are different URIs, never registered twice for one address).
|
|
13
|
+
*
|
|
14
|
+
* `{section}` is any top-level key of the parsed `dna.yaml` document (`version`, `project`, `modules`,
|
|
15
|
+
* `stacks`, `team`, `paths`) — spec-002-dna-yaml-schema's own top-level shape, not a hand-maintained
|
|
16
|
+
* allowlist here, so a future DNA schema field is addressable the moment it exists in `dna.yaml`
|
|
17
|
+
* without a change to this module.
|
|
18
|
+
*
|
|
19
|
+
* Registered directly via `McpServer.registerResource`, not through `registerCoreModules`'s
|
|
20
|
+
* `CoreModule[]` registry — no `dnaSection`/`dnaShowFull` `CoreOperation` exists yet; same
|
|
21
|
+
* spec-006-core-domain-api §4 parity deviation `memory-resource.ts` documents for its own two
|
|
22
|
+
* Resources, for the same reason (task-030-implement-mcp-resources' scope, not this task's).
|
|
23
|
+
*/
|
|
24
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
25
|
+
const core_1 = require("../core");
|
|
26
|
+
const read_only_1 = require("./read-only");
|
|
27
|
+
/** spec-004 §2.1 — the whole `dna.yaml` document. */
|
|
28
|
+
exports.DNA_WHOLE_URI = 'wingfoil://dna';
|
|
29
|
+
/** spec-004 §2.1 — one top-level `dna.yaml` section (`team`, `paths`, `modules`, `stacks`, ...). */
|
|
30
|
+
exports.DNA_SECTION_URI_TEMPLATE = 'wingfoil://dna/{section}';
|
|
31
|
+
/**
|
|
32
|
+
* Register both DNA Resources on `server`. Reads `.wingfoil/dna.yaml` fresh on every request (no
|
|
33
|
+
* server-lifetime cache), matching every other Resource this task registers.
|
|
34
|
+
*/
|
|
35
|
+
function registerDnaResources(server, options) {
|
|
36
|
+
server.registerResource('dna.read', exports.DNA_WHOLE_URI, { description: 'the whole dna.yaml document (read-only)' }, async (uri, extra) => {
|
|
37
|
+
(0, read_only_1.refuseIfWriteIntent)(extra._meta);
|
|
38
|
+
const root = options.resolveRoot();
|
|
39
|
+
const dna = (0, core_1.loadDnaYaml)(root);
|
|
40
|
+
return (0, read_only_1.jsonResourceResult)(uri, dna);
|
|
41
|
+
});
|
|
42
|
+
const sectionTemplate = new mcp_js_1.ResourceTemplate(exports.DNA_SECTION_URI_TEMPLATE, { list: undefined });
|
|
43
|
+
server.registerResource('dna.section', sectionTemplate, { description: 'one top-level dna.yaml section (read-only)' }, async (uri, variables, extra) => {
|
|
44
|
+
(0, read_only_1.refuseIfWriteIntent)(extra._meta);
|
|
45
|
+
const root = options.resolveRoot();
|
|
46
|
+
const dna = (0, core_1.loadDnaYaml)(root);
|
|
47
|
+
// `variables.section` is typed `string | string[]` (see `memory-resource.ts`'s identical note
|
|
48
|
+
// on `{type}`/`{id}`) — this template's `{section}` has no explode modifier, so it is always a
|
|
49
|
+
// single string in practice.
|
|
50
|
+
const section = variables.section;
|
|
51
|
+
if (!(section in dna))
|
|
52
|
+
throw (0, read_only_1.resourceNotFoundError)(`dna/${section}`);
|
|
53
|
+
return (0, read_only_1.jsonResourceResult)(uri, dna[section]);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=dna-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dna-resource.js","sourceRoot":"","sources":["../../src/mcp/dna-resource.ts"],"names":[],"mappings":";;;AAyCA,oDA+BC;AAxED;;;;;;;;;;;;;;;;;;GAkBG;AACH,oEAA2E;AAG3E,kCAAsC;AAEtC,2CAA6F;AAQ7F,qDAAqD;AACxC,QAAA,aAAa,GAAG,gBAAgB,CAAC;AAC9C,oGAAoG;AACvF,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AAEnE;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,MAAiB,EAAE,OAAoC;IAC1F,MAAM,CAAC,gBAAgB,CACrB,UAAU,EACV,qBAAa,EACb,EAAE,WAAW,EAAE,yCAAyC,EAAE,EAC1D,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,IAAA,+BAAmB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAA,8BAAkB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,yBAAgB,CAAC,gCAAwB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,eAAe,EACf,EAAE,WAAW,EAAE,4CAA4C,EAAE,EAC7D,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAA,+BAAmB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAA,kBAAW,EAAC,IAAI,CAA4B,CAAC;QACzD,8FAA8F;QAC9F,+FAA+F;QAC/F,6BAA6B;QAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAiB,CAAC;QAC5C,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC;YAAE,MAAM,IAAA,iCAAqB,EAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAErE,OAAO,IAAA,8BAAkB,EAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcp-server` module — agent interface (MCP over stdio, Anthropic SDK); Resources, Prompts, Tools.
|
|
3
|
+
* Path is `src/mcp` per `dna.yaml`'s module entry (`name: mcp-server`, `path: src/mcp`).
|
|
4
|
+
*
|
|
5
|
+
* task-006-dual-interface-shared-core adds the thin adapter (spec-006 §2, spec-004): `registerCoreModules`
|
|
6
|
+
* derives every MCP Tool (mutating) and Resource (read-only) from the same `CoreModule[]` registry
|
|
7
|
+
* `src/cli` builds its commands from (`src/core/index.ts`'s `CORE_MODULES`), with no business logic
|
|
8
|
+
* of its own.
|
|
9
|
+
*
|
|
10
|
+
* task-011-mcp-resources-read-only adds the spec-004-mcp-surface-contract §2-conformant Resources
|
|
11
|
+
* channel (REQ-INT-01 / REQ-SEC-05): `registerMemoryResources` (`wingfoil://memory/{type}`,
|
|
12
|
+
* `wingfoil://memory/{type}/{id}` — REPLACING task-009-mcp-resource-fetch-latency's placeholder
|
|
13
|
+
* `wingfoil://memory/{id}` adapter), `registerDnaResources` (`wingfoil://dna`, `wingfoil://dna/{section}`),
|
|
14
|
+
* `registerWorkflowResources` (`wingfoil://workflows`, `wingfoil://workflows/{name}`), and
|
|
15
|
+
* `registerWriteRefusalHandler` (the structural `resources/write` refusal, spec-004 §2.3).
|
|
16
|
+
* `registerReadOnlyResources` wires all four together — the one call a future production entry point
|
|
17
|
+
* (`task-030-implement-mcp-resources`'s `StdioServerTransport`/`wingfoil mcp` command, out of this
|
|
18
|
+
* task's scope) needs alongside `registerCoreModules`. See `./read-only.ts` for the shared
|
|
19
|
+
* write-refusal/not-found conventions every one of these Resources follows.
|
|
20
|
+
*/
|
|
21
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
22
|
+
/** This module's `dna.yaml` name (`mcp-server`) — the stable identifier surfaces and tests key it by. */
|
|
23
|
+
export declare const MODULE_NAME: "mcp-server";
|
|
24
|
+
export { registerCoreModules, deriveMcpToolName, deriveMcpResourceUri } from './registrar';
|
|
25
|
+
export type { RegisterCoreModulesOptions } from './registrar';
|
|
26
|
+
export { registerMemoryResources, MEMORY_COLLECTION_URI_TEMPLATE, MEMORY_DOCUMENT_URI_TEMPLATE, } from './memory-resource';
|
|
27
|
+
export type { RegisterMemoryResourcesOptions } from './memory-resource';
|
|
28
|
+
export { registerDnaResources, DNA_WHOLE_URI, DNA_SECTION_URI_TEMPLATE } from './dna-resource';
|
|
29
|
+
export type { RegisterDnaResourcesOptions } from './dna-resource';
|
|
30
|
+
export { registerWorkflowResources, WORKFLOWS_COLLECTION_URI, WORKFLOW_DOCUMENT_URI_TEMPLATE, } from './workflow-resource';
|
|
31
|
+
export type { RegisterWorkflowResourcesOptions } from './workflow-resource';
|
|
32
|
+
export { registerWriteRefusalHandler, refuseIfWriteIntent, resourceNotFoundError, WRITE_REFUSAL_MESSAGE, WRITE_INTENT_META_KEY, } from './read-only';
|
|
33
|
+
export { registerRolePrompts, roleSessionPromptName } from './prompt';
|
|
34
|
+
export type { RegisterRolePromptsOptions } from './prompt';
|
|
35
|
+
/** Options for {@link registerReadOnlyResources}. */
|
|
36
|
+
export interface RegisterReadOnlyResourcesOptions {
|
|
37
|
+
/** Resolves the project root each Resource read is served from (an ambient concern, not a request parameter). */
|
|
38
|
+
readonly resolveRoot: () => string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Wire the full spec-004 §2 read-only Resources channel onto `server` in one call: the Memory, DNA,
|
|
42
|
+
* and Workflow Resources plus the structural `resources/write` refusal. Deliberately does not touch
|
|
43
|
+
* `registerCoreModules`/`CORE_MODULES` — a caller building a real server still calls that separately
|
|
44
|
+
* for the (today, zero) Tools/legacy-shaped Resources it derives from `src/core`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function registerReadOnlyResources(server: McpServer, options: RegisterReadOnlyResourcesOptions): void;
|
|
47
|
+
export { createMcpServer, startMcpServer } from './server';
|
|
48
|
+
export type { McpServerOptions } from './server';
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,yGAAyG;AACzG,eAAO,MAAM,WAAW,EAAG,YAAqB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,YAAY,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtE,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAO3D,qDAAqD;AACrD,MAAM,WAAW,gCAAgC;IAC/C,iHAAiH;IACjH,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gCAAgC,GAAG,IAAI,CAK5G;AAMD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|