@metaobjectsdev/metadata 0.7.0-rc.9 → 0.8.0-rc.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/dist/core/field/field-constants.d.ts +10 -0
- package/dist/core/field/field-constants.d.ts.map +1 -1
- package/dist/core/field/field-constants.js +13 -0
- package/dist/core/field/field-constants.js.map +1 -1
- package/dist/core/field/field-schema.d.ts +6 -0
- package/dist/core/field/field-schema.d.ts.map +1 -1
- package/dist/core/field/field-schema.js +32 -2
- package/dist/core/field/field-schema.js.map +1 -1
- package/dist/core-types.js +2 -2
- package/dist/core-types.js.map +1 -1
- package/dist/parser-core.js +10 -0
- package/dist/parser-core.js.map +1 -1
- package/dist/serializer-json.js +36 -1
- package/dist/serializer-json.js.map +1 -1
- package/dist/shared/meta-data.d.ts +15 -0
- package/dist/shared/meta-data.d.ts.map +1 -1
- package/dist/shared/meta-data.js +33 -0
- package/dist/shared/meta-data.js.map +1 -1
- package/dist/super-resolve.d.ts +4 -3
- package/dist/super-resolve.d.ts.map +1 -1
- package/dist/super-resolve.js +28 -11
- package/dist/super-resolve.js.map +1 -1
- package/dist/template/template-constants.d.ts +7 -0
- package/dist/template/template-constants.d.ts.map +1 -1
- package/dist/template/template-constants.js +13 -0
- package/dist/template/template-constants.js.map +1 -1
- package/dist/template/template-schema.d.ts.map +1 -1
- package/dist/template/template-schema.js +12 -2
- package/dist/template/template-schema.js.map +1 -1
- package/package.json +1 -1
- package/src/core/field/field-constants.ts +18 -0
- package/src/core/field/field-schema.ts +41 -0
- package/src/core-types.ts +2 -2
- package/src/parser-core.ts +11 -0
- package/src/serializer-json.ts +37 -1
- package/src/shared/meta-data.ts +35 -0
- package/src/super-resolve.ts +28 -15
- package/src/template/template-constants.ts +16 -0
- package/src/template/template-schema.ts +16 -1
package/dist/super-resolve.d.ts
CHANGED
|
@@ -26,9 +26,10 @@ export interface DeferredSuperFailure {
|
|
|
26
26
|
* have been parsed with deferSuperResolution: true. Unresolved refs are
|
|
27
27
|
* collected and returned — caller decides whether to throw or warn.
|
|
28
28
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* The referrer's context package (for bare/same-package shorthand refs) comes
|
|
30
|
+
* from the node's own `package`, else the file-default package captured at
|
|
31
|
+
* PARSE time (`fileDefaultPackage`). Both are order- and merge-independent, so
|
|
32
|
+
* resolution does not depend on the post-merge tree shape.
|
|
32
33
|
*
|
|
33
34
|
* Idempotent: nodes that already have superResolved set are skipped.
|
|
34
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"super-resolve.d.ts","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"super-resolve.d.ts","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAyCtD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,QAAQ,GACb,QAAQ,GAAG,SAAS,CAsCtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,MAAM,EAAE,OAAO,aAAa,EAAE,WAAW,CAAC;CAC3C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,EAAE,CAkB5E"}
|
package/dist/super-resolve.js
CHANGED
|
@@ -15,12 +15,29 @@ import { PACKAGE_SEPARATOR, PACKAGE_PARENT } from "./shared/structural.js";
|
|
|
15
15
|
// Tree search helper
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
17
17
|
/**
|
|
18
|
-
* Recursively searches the tree for a node whose
|
|
19
|
-
*
|
|
18
|
+
* Recursively searches the tree for a node whose qualified name matches `fqn`.
|
|
19
|
+
*
|
|
20
|
+
* A node is matched by its own `fqn()` (covers the explicit-package and
|
|
21
|
+
* no-package-at-all cases) OR by its EFFECTIVE qualified key
|
|
22
|
+
* `<fileDefaultPackage>::<name>` (`MetaData.resolutionKey()`) — the
|
|
23
|
+
* file-default package captured at PARSE time. This mirrors Java, where
|
|
24
|
+
* `BaseMetaDataParser` folds the file-default package into the registered name
|
|
25
|
+
* at parse time (so an object `BaseEntity` declared under `package: acme` is
|
|
26
|
+
* registered as `acme::BaseEntity` and a fully-qualified `extends:
|
|
27
|
+
* acme::BaseEntity` resolves) — even though TS keeps object `fqn()` bare for
|
|
28
|
+
* the FR5d referrer-envelope cross-port contract.
|
|
29
|
+
*
|
|
30
|
+
* Because the resolution key is captured at parse time (not derived from the
|
|
31
|
+
* post-merge tree), this is independent of load order AND of whether the base
|
|
32
|
+
* node's file-default package differs from the referrer's — the cross-PACKAGE
|
|
33
|
+
* cross-file case. No package is threaded down the walk anymore.
|
|
20
34
|
*/
|
|
21
35
|
function findInTree(root, fqn) {
|
|
22
36
|
if (root.fqn() === fqn)
|
|
23
37
|
return root;
|
|
38
|
+
if (root.package === undefined && root.name !== "" && root.resolutionKey() === fqn) {
|
|
39
|
+
return root;
|
|
40
|
+
}
|
|
24
41
|
for (const child of root.ownChildren()) {
|
|
25
42
|
const found = findInTree(child, fqn);
|
|
26
43
|
if (found !== undefined)
|
|
@@ -85,20 +102,21 @@ export function resolveSuperRef(ref, contextPackage, root) {
|
|
|
85
102
|
* have been parsed with deferSuperResolution: true. Unresolved refs are
|
|
86
103
|
* collected and returned — caller decides whether to throw or warn.
|
|
87
104
|
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
105
|
+
* The referrer's context package (for bare/same-package shorthand refs) comes
|
|
106
|
+
* from the node's own `package`, else the file-default package captured at
|
|
107
|
+
* PARSE time (`fileDefaultPackage`). Both are order- and merge-independent, so
|
|
108
|
+
* resolution does not depend on the post-merge tree shape.
|
|
91
109
|
*
|
|
92
110
|
* Idempotent: nodes that already have superResolved set are skipped.
|
|
93
111
|
*/
|
|
94
112
|
export function resolveDeferredSupers(root) {
|
|
95
113
|
const failures = [];
|
|
96
|
-
walk(root,
|
|
114
|
+
walk(root, (node) => {
|
|
97
115
|
if (node.superRef === undefined)
|
|
98
116
|
return;
|
|
99
117
|
if (node.superResolved !== undefined)
|
|
100
118
|
return;
|
|
101
|
-
const effectivePkg = node.package ??
|
|
119
|
+
const effectivePkg = node.package ?? node.fileDefaultPackage ?? "";
|
|
102
120
|
const target = resolveSuperRef(node.superRef, effectivePkg, root);
|
|
103
121
|
if (target !== undefined) {
|
|
104
122
|
try {
|
|
@@ -114,11 +132,10 @@ export function resolveDeferredSupers(root) {
|
|
|
114
132
|
});
|
|
115
133
|
return failures;
|
|
116
134
|
}
|
|
117
|
-
function walk(node,
|
|
118
|
-
visit(node
|
|
119
|
-
const nextCtx = node.package ?? ctxPkg;
|
|
135
|
+
function walk(node, visit) {
|
|
136
|
+
visit(node);
|
|
120
137
|
for (const child of node.ownChildren()) {
|
|
121
|
-
walk(child,
|
|
138
|
+
walk(child, visit);
|
|
122
139
|
}
|
|
123
140
|
}
|
|
124
141
|
//# sourceMappingURL=super-resolve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"super-resolve.js","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,wDAAwD;AACxD,uFAAuF;AACvF,2EAA2E;AAC3E,yFAAyF;AACzF,wFAAwF;AACxF,4FAA4F;AAC5F,EAAE;AACF,kEAAkE;AAClE,2EAA2E;AAC3E,8DAA8D;AAG9D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE3E,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E
|
|
1
|
+
{"version":3,"file":"super-resolve.js","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,4 +16,11 @@ export declare const TEMPLATE_ATTR_MODEL = "model";
|
|
|
16
16
|
export declare const TEMPLATE_ATTR_TOOL_NAME = "toolName";
|
|
17
17
|
export declare const TEMPLATE_FORMATS: readonly ["text", "html", "xml", "csv", "json", "markdown", "spreadsheet"];
|
|
18
18
|
export type TemplateFormat = (typeof TEMPLATE_FORMATS)[number];
|
|
19
|
+
export declare const TEMPLATE_ATTR_PROMPT_STYLE = "promptStyle";
|
|
20
|
+
export declare const PROMPT_STYLE_GUIDE = "guide";
|
|
21
|
+
export declare const PROMPT_STYLE_INLINE = "inline";
|
|
22
|
+
export declare const PROMPT_STYLE_EXAMPLE_ONLY = "exampleOnly";
|
|
23
|
+
export declare const PROMPT_STYLE_DEFAULT = "guide";
|
|
24
|
+
export declare const PROMPT_STYLES: readonly ["guide", "inline", "exampleOnly"];
|
|
25
|
+
export type PromptStyle = (typeof PROMPT_STYLES)[number];
|
|
19
26
|
//# sourceMappingURL=template-constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-constants.d.ts","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mDAKpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIjE,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAChD,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAI3C,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAG1D,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAU3C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAIlD,eAAO,MAAM,gBAAgB,4EAQnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"template-constants.d.ts","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mDAKpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIjE,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAChD,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAI3C,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAG1D,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAU3C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAIlD,eAAO,MAAM,gBAAgB,4EAQnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAK/D,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AACxD,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,oBAAoB,UAAqB,CAAC;AAEvD,eAAO,MAAM,aAAa,6CAIhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -59,4 +59,17 @@ export const TEMPLATE_FORMATS = [
|
|
|
59
59
|
"markdown",
|
|
60
60
|
"spreadsheet",
|
|
61
61
|
];
|
|
62
|
+
// FR-010 artifact-1 prompt presentation style (template.output only). Closed enum;
|
|
63
|
+
// guidance is NEVER carried in comments. Default "guide". Set project-wide via an
|
|
64
|
+
// abstract template base + extends, with a render-time override on top.
|
|
65
|
+
export const TEMPLATE_ATTR_PROMPT_STYLE = "promptStyle";
|
|
66
|
+
export const PROMPT_STYLE_GUIDE = "guide";
|
|
67
|
+
export const PROMPT_STYLE_INLINE = "inline";
|
|
68
|
+
export const PROMPT_STYLE_EXAMPLE_ONLY = "exampleOnly";
|
|
69
|
+
export const PROMPT_STYLE_DEFAULT = PROMPT_STYLE_GUIDE;
|
|
70
|
+
export const PROMPT_STYLES = [
|
|
71
|
+
PROMPT_STYLE_GUIDE,
|
|
72
|
+
PROMPT_STYLE_INLINE,
|
|
73
|
+
PROMPT_STYLE_EXAMPLE_ONLY,
|
|
74
|
+
];
|
|
62
75
|
//# sourceMappingURL=template-constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-constants.js","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,EAAE;AACF,8EAA8E;AAC9E,uEAAuE;AACvE,kBAAkB;AAClB,8EAA8E;AAC9E,qDAAqD;AACrD,2EAA2E;AAC3E,qDAAqD;AACrD,6EAA6E;AAC7E,kFAAkF;AAClF,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,uBAAuB;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAGX,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,mFAAmF;AACnF,+EAA+E;AAC/E,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,cAAc,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;AACpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAE3C,4EAA4E;AAC5E,8EAA8E;AAC9E,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,yEAAyE;AACzE,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAElD,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,UAAU;IACV,aAAa;CACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"template-constants.js","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,EAAE;AACF,8EAA8E;AAC9E,uEAAuE;AACvE,kBAAkB;AAClB,8EAA8E;AAC9E,qDAAqD;AACrD,2EAA2E;AAC3E,qDAAqD;AACrD,6EAA6E;AAC7E,kFAAkF;AAClF,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,uBAAuB;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAGX,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,mFAAmF;AACnF,+EAA+E;AAC/E,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,cAAc,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;AACpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAE3C,4EAA4E;AAC5E,8EAA8E;AAC9E,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,yEAAyE;AACzE,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAElD,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,UAAU;IACV,aAAa;CACL,CAAC;AAGX,mFAAmF;AACnF,kFAAkF;AAClF,wEAAwE;AACxE,MAAM,CAAC,MAAM,0BAA0B,GAAG,aAAa,CAAC;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,mBAAmB;IACnB,yBAAyB;CACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-schema.d.ts","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"template-schema.d.ts","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAsJjD,eAAO,MAAM,kBAAkB,2BAK7B,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// `verify` scope (Plan #3), not load-time validation.
|
|
8
8
|
import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT, ATTR_SUBTYPE_STRINGARRAY, } from "../core/attr/attr-constants.js";
|
|
9
9
|
import { SUBTYPE_BASE } from "../shared/base-types.js";
|
|
10
|
-
import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, } from "./template-constants.js";
|
|
10
|
+
import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, } from "./template-constants.js";
|
|
11
11
|
// Generic attrs shared by template.prompt and template.output.
|
|
12
12
|
const genericAttrs = [
|
|
13
13
|
{
|
|
@@ -55,6 +55,16 @@ const genericAttrs = [
|
|
|
55
55
|
description: "Output tags the rendered text must contain (drives the verify output-tag check).",
|
|
56
56
|
},
|
|
57
57
|
];
|
|
58
|
+
// FR-010 artifact-1: output-format prompt presentation style (template.output only).
|
|
59
|
+
// Closed enum, enforced via allowedValues exactly like @format. Default "guide".
|
|
60
|
+
const promptStyleAttr = {
|
|
61
|
+
name: TEMPLATE_ATTR_PROMPT_STYLE,
|
|
62
|
+
valueType: ATTR_SUBTYPE_STRING,
|
|
63
|
+
required: false,
|
|
64
|
+
default: PROMPT_STYLE_DEFAULT,
|
|
65
|
+
allowedValues: [...PROMPT_STYLES],
|
|
66
|
+
description: "FR-010 output-format prompt presentation: 'guide' (prose list + example), 'inline' (inline placeholders / enum choices), or 'exampleOnly' (filled skeleton). Guidance is never emitted as comments.",
|
|
67
|
+
};
|
|
58
68
|
// LLM-overlay attrs (template.prompt only).
|
|
59
69
|
const promptOverlayAttrs = [
|
|
60
70
|
{
|
|
@@ -118,7 +128,7 @@ const toolcallAttrs = [
|
|
|
118
128
|
export const TEMPLATE_ATTRS_MAP = new Map([
|
|
119
129
|
[SUBTYPE_BASE, []],
|
|
120
130
|
[TEMPLATE_SUBTYPE_PROMPT, [...genericAttrs, ...promptOverlayAttrs]],
|
|
121
|
-
[TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs]],
|
|
131
|
+
[TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs, promptStyleAttr]],
|
|
122
132
|
[TEMPLATE_SUBTYPE_TOOLCALL, [...toolcallAttrs]],
|
|
123
133
|
]);
|
|
124
134
|
//# sourceMappingURL=template-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,kFAAkF;AAClF,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,sDAAsD;AAGtD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -117,3 +117,21 @@ export const FIELD_ATTR_VALUES = "values";
|
|
|
117
117
|
* stored string with no name↔value divergence.
|
|
118
118
|
*/
|
|
119
119
|
export const ENUM_MEMBER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
120
|
+
|
|
121
|
+
/** FR-010: map of off-vocabulary token → canonical enum member, feeding the
|
|
122
|
+
* tolerant recover alias-fold. `properties`-shaped; only on field.enum. */
|
|
123
|
+
export const FIELD_ATTR_ENUM_ALIAS = "enumAlias";
|
|
124
|
+
|
|
125
|
+
/** FR-010: map of enum member → human-readable description, shown per-member in
|
|
126
|
+
* the 'guide'-style output-format prompt fragment. `properties`-shaped; only on field.enum. */
|
|
127
|
+
export const FIELD_ATTR_ENUM_DOC = "enumDoc";
|
|
128
|
+
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// FR-010 field-teaching attrs (on any field; drive the output-format prompt)
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
|
|
133
|
+
/** FR-010: an example value for this field, shown in the generated prompt fragment. */
|
|
134
|
+
export const FIELD_ATTR_EXAMPLE = "example";
|
|
135
|
+
|
|
136
|
+
/** FR-010: a short instruction for this field, shown in the generated prompt fragment. */
|
|
137
|
+
export const FIELD_ATTR_INSTRUCTION = "instruction";
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
ATTR_SUBTYPE_INT,
|
|
8
8
|
ATTR_SUBTYPE_BOOLEAN,
|
|
9
9
|
ATTR_SUBTYPE_STRINGARRAY,
|
|
10
|
+
ATTR_SUBTYPE_PROPERTIES,
|
|
10
11
|
} from "../attr/attr-constants.js";
|
|
11
12
|
import { SORT_ORDER_VALUES } from "../query/query-constants.js";
|
|
12
13
|
import {
|
|
@@ -27,6 +28,10 @@ import {
|
|
|
27
28
|
FIELD_ATTR_AUTO_SET,
|
|
28
29
|
AUTO_SET_VALUES,
|
|
29
30
|
FIELD_ATTR_VALUES,
|
|
31
|
+
FIELD_ATTR_ENUM_ALIAS,
|
|
32
|
+
FIELD_ATTR_ENUM_DOC,
|
|
33
|
+
FIELD_ATTR_EXAMPLE,
|
|
34
|
+
FIELD_ATTR_INSTRUCTION,
|
|
30
35
|
} from "./field-constants.js";
|
|
31
36
|
|
|
32
37
|
/** Attrs common to every field subtype (codegen-ts column mapper + Project D filter/sort). */
|
|
@@ -124,6 +129,22 @@ export const commonFieldAttrs: AttrSchema[] = [
|
|
|
124
129
|
description:
|
|
125
130
|
"Auto-set semantics for timestamp-like fields: 'onCreate' stamps on insert, 'onUpdate' stamps on every write.",
|
|
126
131
|
},
|
|
132
|
+
// FR-010 field-teaching attrs (any field): free-text shown in the generated
|
|
133
|
+
// output-format prompt fragment. Never carried in comments.
|
|
134
|
+
{
|
|
135
|
+
name: FIELD_ATTR_EXAMPLE,
|
|
136
|
+
valueType: ATTR_SUBTYPE_STRING,
|
|
137
|
+
required: false,
|
|
138
|
+
description:
|
|
139
|
+
"FR-010: an example value for this field, shown in the generated output-format prompt fragment.",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: FIELD_ATTR_INSTRUCTION,
|
|
143
|
+
valueType: ATTR_SUBTYPE_STRING,
|
|
144
|
+
required: false,
|
|
145
|
+
description:
|
|
146
|
+
"FR-010: a short instruction for this field, shown in the generated output-format prompt fragment.",
|
|
147
|
+
},
|
|
127
148
|
];
|
|
128
149
|
|
|
129
150
|
/** The @currency attr — only on field.currency. */
|
|
@@ -144,3 +165,23 @@ export const enumFieldAttr: AttrSchema = {
|
|
|
144
165
|
description:
|
|
145
166
|
"Member symbols of an enum-subtype field. Declaration order is significant; each is a legal identifier and its own stored string.",
|
|
146
167
|
};
|
|
168
|
+
|
|
169
|
+
/** The @enumAlias attr — only on field.enum. Map of off-vocabulary token → canonical
|
|
170
|
+
* member, feeding the FR-010 tolerant recover alias-fold (runtime aliases win on conflict). */
|
|
171
|
+
export const enumAliasAttr: AttrSchema = {
|
|
172
|
+
name: FIELD_ATTR_ENUM_ALIAS,
|
|
173
|
+
valueType: ATTR_SUBTYPE_PROPERTIES,
|
|
174
|
+
required: false,
|
|
175
|
+
description:
|
|
176
|
+
"Map of alternate/off-vocabulary tokens to canonical enum members; feeds the FR-010 tolerant recover alias-fold.",
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/** The @enumDoc attr — only on field.enum. Map of member → human-readable description,
|
|
180
|
+
* shown per-member in the FR-010 'guide'-style output-format prompt fragment. */
|
|
181
|
+
export const enumDocAttr: AttrSchema = {
|
|
182
|
+
name: FIELD_ATTR_ENUM_DOC,
|
|
183
|
+
valueType: ATTR_SUBTYPE_PROPERTIES,
|
|
184
|
+
required: false,
|
|
185
|
+
description:
|
|
186
|
+
"Map of enum member to a human-readable description; shown per-member in the FR-010 'guide'-style prompt fragment.",
|
|
187
|
+
};
|
package/src/core-types.ts
CHANGED
|
@@ -35,7 +35,7 @@ import { MetaRelationship } from "./core/relationship/meta-relationship.js";
|
|
|
35
35
|
import { MetaLayout } from "./presentation/layout/meta-layout.js";
|
|
36
36
|
import { MetaSource } from "./persistence/source/meta-source.js";
|
|
37
37
|
import { MetaOrigin, MetaPassthroughOrigin, MetaAggregateOrigin, MetaCollectionOrigin } from "./persistence/origin/meta-origin.js";
|
|
38
|
-
import { commonFieldAttrs, currencyFieldAttr, enumFieldAttr } from "./core/field/field-schema.js";
|
|
38
|
+
import { commonFieldAttrs, currencyFieldAttr, enumFieldAttr, enumAliasAttr, enumDocAttr } from "./core/field/field-schema.js";
|
|
39
39
|
import { objectAttrs } from "./core/object/object-schema.js";
|
|
40
40
|
import { relationshipAttrs } from "./core/relationship/relationship-schema.js";
|
|
41
41
|
import { identityFieldsAttr, IDENTITY_ATTRS_MAP } from "./core/identity/identity-schema.js";
|
|
@@ -202,7 +202,7 @@ function registerCoreTypeDefs(registry: TypeRegistry): void {
|
|
|
202
202
|
subType === FIELD_SUBTYPE_CURRENCY
|
|
203
203
|
? [...commonFieldAttrs, { ...currencyFieldAttr }]
|
|
204
204
|
: subType === FIELD_SUBTYPE_ENUM
|
|
205
|
-
? [...commonFieldAttrs, { ...enumFieldAttr }]
|
|
205
|
+
? [...commonFieldAttrs, { ...enumFieldAttr }, { ...enumAliasAttr }, { ...enumDocAttr }]
|
|
206
206
|
: [...commonFieldAttrs];
|
|
207
207
|
registry.register(
|
|
208
208
|
def(TYPE_FIELD, subType, `Field of type ${subType}`, fieldRules, MetaField, fieldAttrs,
|
package/src/parser-core.ts
CHANGED
|
@@ -489,6 +489,17 @@ function parseNodeFresh(
|
|
|
489
489
|
// is the only caller during loading; freeze runs in the loader after).
|
|
490
490
|
populateNodeSource(model);
|
|
491
491
|
|
|
492
|
+
// --- Capture the file-default package at PARSE time (resolution-only) ---
|
|
493
|
+
// `inheritedContextPkg` is the package threaded down from the file's root
|
|
494
|
+
// `metadata.package` (the nearest packaged ancestor). Recording it here —
|
|
495
|
+
// when the declaring file's package is known — lets super-resolution match
|
|
496
|
+
// this node by its effective qualified key regardless of post-merge tree
|
|
497
|
+
// shape or load order. This does NOT touch the node's `package` or `fqn()`
|
|
498
|
+
// (objects stay bare per FR5d). Mirrors Java's parse-time getDefaultPackageName().
|
|
499
|
+
if (inheritedContextPkg !== "") {
|
|
500
|
+
model.setFileDefaultPackage(inheritedContextPkg);
|
|
501
|
+
}
|
|
502
|
+
|
|
492
503
|
// --- Apply reserved keys (package, extends, abstract, isArray) ---
|
|
493
504
|
applyReservedKeys(model, nodeData, strict, source, path, warnings, inheritedContextPkg);
|
|
494
505
|
|
package/src/serializer-json.ts
CHANGED
|
@@ -198,8 +198,10 @@ function sortAttrKeys(value: unknown): unknown {
|
|
|
198
198
|
if (k === RESERVED_KEY_CHILDREN) continue;
|
|
199
199
|
result[k] = sortAttrKeys(obj[k]);
|
|
200
200
|
}
|
|
201
|
+
// @-attr values: an object-typed attr value (e.g. @enumDoc / @filter) gets
|
|
202
|
+
// the value-shape canonical-order treatment; everything else recurses normally.
|
|
201
203
|
for (const k of attrKeys) {
|
|
202
|
-
result[k] =
|
|
204
|
+
result[k] = sortAttrValue(obj[k]);
|
|
203
205
|
}
|
|
204
206
|
if (hasChildren) {
|
|
205
207
|
result[RESERVED_KEY_CHILDREN] = sortAttrKeys(obj[RESERVED_KEY_CHILDREN]);
|
|
@@ -208,3 +210,37 @@ function sortAttrKeys(value: unknown): unknown {
|
|
|
208
210
|
}
|
|
209
211
|
return value;
|
|
210
212
|
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Canonicalize an inline @-attr's value. The two object-typed attr subtypes need
|
|
216
|
+
* different key order in canonical form, and the serializer is schema-free — so
|
|
217
|
+
* distinguish by value shape, which exactly tracks the subtype:
|
|
218
|
+
* • `properties` (e.g. @enumDoc / @enumAlias) is a flat scalar→scalar map → keys
|
|
219
|
+
* sort ordinally (cross-port canonical form; matches the Java reference, whose
|
|
220
|
+
* Properties is unordered and serializes sorted).
|
|
221
|
+
* • `filter` maps a field to an operator object ({eq:…}/{in:[…]}) or carries
|
|
222
|
+
* or/and arrays — at least one value is itself an object/array → declaration
|
|
223
|
+
* order is preserved (significant). The filter desugar runs before serialization,
|
|
224
|
+
* so a filter clause is never a bare scalar.
|
|
225
|
+
* Mirrors the C# AttrObjectToJsonNode value-shape heuristic.
|
|
226
|
+
*/
|
|
227
|
+
function sortAttrValue(value: unknown): unknown {
|
|
228
|
+
if (Array.isArray(value)) {
|
|
229
|
+
return value.map(sortAttrValue);
|
|
230
|
+
}
|
|
231
|
+
if (value !== null && typeof value === "object") {
|
|
232
|
+
const obj = value as Record<string, unknown>;
|
|
233
|
+
const keys = Object.keys(obj);
|
|
234
|
+
const allScalar = keys.every((k) => {
|
|
235
|
+
const v = obj[k];
|
|
236
|
+
return v === null || typeof v !== "object";
|
|
237
|
+
});
|
|
238
|
+
const orderedKeys = allScalar ? [...keys].sort() : keys;
|
|
239
|
+
const result: Record<string, unknown> = {};
|
|
240
|
+
for (const k of orderedKeys) {
|
|
241
|
+
result[k] = sortAttrValue(obj[k]);
|
|
242
|
+
}
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
return value;
|
|
246
|
+
}
|
package/src/shared/meta-data.ts
CHANGED
|
@@ -24,6 +24,16 @@ export abstract class MetaData {
|
|
|
24
24
|
|
|
25
25
|
// Identity / packaging
|
|
26
26
|
package?: string;
|
|
27
|
+
// Resolution-only: the file-default package (the top-level `metadata.package`)
|
|
28
|
+
// of the FILE in which this node was declared, captured at PARSE time. This is
|
|
29
|
+
// NOT folded into fqn() (object fqn() stays BARE for the FR5d cross-port
|
|
30
|
+
// referrer-envelope contract) — it exists solely so super-resolution can match
|
|
31
|
+
// a node by its EFFECTIVE qualified key `<fileDefaultPackage>::<name>` even
|
|
32
|
+
// when the node carries no own `package`. Capturing it at parse time (when the
|
|
33
|
+
// declaring file's package is known) makes resolution independent of load
|
|
34
|
+
// order and post-merge tree shape. Mirrors Java's BaseMetaDataParser, which
|
|
35
|
+
// folds getDefaultPackageName() into the registered name at parse time.
|
|
36
|
+
fileDefaultPackage?: string;
|
|
27
37
|
superRef?: string; // raw super reference string, pre-resolution
|
|
28
38
|
private _superData?: MetaData; // post-resolution pointer; set by setSuperResolved() after parsing
|
|
29
39
|
isAbstract: boolean = false;
|
|
@@ -132,6 +142,31 @@ export abstract class MetaData {
|
|
|
132
142
|
this.package = pkg;
|
|
133
143
|
}
|
|
134
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Loader-internal: record the file-default package captured at parse time.
|
|
147
|
+
* See the `fileDefaultPackage` field doc. Honors the frozen-guard.
|
|
148
|
+
* @internal
|
|
149
|
+
*/
|
|
150
|
+
setFileDefaultPackage(pkg: string): void {
|
|
151
|
+
this._assertNotFrozen();
|
|
152
|
+
this.fileDefaultPackage = pkg;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* The node's EFFECTIVE qualified key for super-resolution matching:
|
|
157
|
+
* `<pkg>::<name>` where pkg is the node's own package if set, else the
|
|
158
|
+
* file-default package captured at parse time. Returns the bare name when
|
|
159
|
+
* neither is available. Used by super-resolution ONLY — distinct from fqn(),
|
|
160
|
+
* which stays bare for objects per the FR5d cross-port contract.
|
|
161
|
+
*/
|
|
162
|
+
resolutionKey(): string {
|
|
163
|
+
const pkg = this.package ?? this.fileDefaultPackage;
|
|
164
|
+
if (pkg !== undefined && pkg !== "") {
|
|
165
|
+
return `${pkg}${PACKAGE_SEPARATOR}${this.name}`;
|
|
166
|
+
}
|
|
167
|
+
return this.name;
|
|
168
|
+
}
|
|
169
|
+
|
|
135
170
|
// ---------------------------------------------------------------------------
|
|
136
171
|
// Super
|
|
137
172
|
// ---------------------------------------------------------------------------
|
package/src/super-resolve.ts
CHANGED
|
@@ -19,11 +19,28 @@ import { PACKAGE_SEPARATOR, PACKAGE_PARENT } from "./shared/structural.js";
|
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
|
-
* Recursively searches the tree for a node whose
|
|
23
|
-
*
|
|
22
|
+
* Recursively searches the tree for a node whose qualified name matches `fqn`.
|
|
23
|
+
*
|
|
24
|
+
* A node is matched by its own `fqn()` (covers the explicit-package and
|
|
25
|
+
* no-package-at-all cases) OR by its EFFECTIVE qualified key
|
|
26
|
+
* `<fileDefaultPackage>::<name>` (`MetaData.resolutionKey()`) — the
|
|
27
|
+
* file-default package captured at PARSE time. This mirrors Java, where
|
|
28
|
+
* `BaseMetaDataParser` folds the file-default package into the registered name
|
|
29
|
+
* at parse time (so an object `BaseEntity` declared under `package: acme` is
|
|
30
|
+
* registered as `acme::BaseEntity` and a fully-qualified `extends:
|
|
31
|
+
* acme::BaseEntity` resolves) — even though TS keeps object `fqn()` bare for
|
|
32
|
+
* the FR5d referrer-envelope cross-port contract.
|
|
33
|
+
*
|
|
34
|
+
* Because the resolution key is captured at parse time (not derived from the
|
|
35
|
+
* post-merge tree), this is independent of load order AND of whether the base
|
|
36
|
+
* node's file-default package differs from the referrer's — the cross-PACKAGE
|
|
37
|
+
* cross-file case. No package is threaded down the walk anymore.
|
|
24
38
|
*/
|
|
25
39
|
function findInTree(root: MetaData, fqn: string): MetaData | undefined {
|
|
26
40
|
if (root.fqn() === fqn) return root;
|
|
41
|
+
if (root.package === undefined && root.name !== "" && root.resolutionKey() === fqn) {
|
|
42
|
+
return root;
|
|
43
|
+
}
|
|
27
44
|
for (const child of root.ownChildren()) {
|
|
28
45
|
const found = findInTree(child, fqn);
|
|
29
46
|
if (found !== undefined) return found;
|
|
@@ -110,18 +127,19 @@ export interface DeferredSuperFailure {
|
|
|
110
127
|
* have been parsed with deferSuperResolution: true. Unresolved refs are
|
|
111
128
|
* collected and returned — caller decides whether to throw or warn.
|
|
112
129
|
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
130
|
+
* The referrer's context package (for bare/same-package shorthand refs) comes
|
|
131
|
+
* from the node's own `package`, else the file-default package captured at
|
|
132
|
+
* PARSE time (`fileDefaultPackage`). Both are order- and merge-independent, so
|
|
133
|
+
* resolution does not depend on the post-merge tree shape.
|
|
116
134
|
*
|
|
117
135
|
* Idempotent: nodes that already have superResolved set are skipped.
|
|
118
136
|
*/
|
|
119
137
|
export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
|
|
120
138
|
const failures: DeferredSuperFailure[] = [];
|
|
121
|
-
walk(root,
|
|
139
|
+
walk(root, (node) => {
|
|
122
140
|
if (node.superRef === undefined) return;
|
|
123
141
|
if (node.superResolved !== undefined) return;
|
|
124
|
-
const effectivePkg = node.package ??
|
|
142
|
+
const effectivePkg = node.package ?? node.fileDefaultPackage ?? "";
|
|
125
143
|
const target = resolveSuperRef(node.superRef, effectivePkg, root);
|
|
126
144
|
if (target !== undefined) {
|
|
127
145
|
try {
|
|
@@ -136,14 +154,9 @@ export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
|
|
|
136
154
|
return failures;
|
|
137
155
|
}
|
|
138
156
|
|
|
139
|
-
function walk(
|
|
140
|
-
node
|
|
141
|
-
ctxPkg: string,
|
|
142
|
-
visit: (n: MetaData, ctx: string) => void,
|
|
143
|
-
): void {
|
|
144
|
-
visit(node, ctxPkg);
|
|
145
|
-
const nextCtx = node.package ?? ctxPkg;
|
|
157
|
+
function walk(node: MetaData, visit: (n: MetaData) => void): void {
|
|
158
|
+
visit(node);
|
|
146
159
|
for (const child of node.ownChildren()) {
|
|
147
|
-
walk(child,
|
|
160
|
+
walk(child, visit);
|
|
148
161
|
}
|
|
149
162
|
}
|
|
@@ -68,3 +68,19 @@ export const TEMPLATE_FORMATS = [
|
|
|
68
68
|
"spreadsheet",
|
|
69
69
|
] as const;
|
|
70
70
|
export type TemplateFormat = (typeof TEMPLATE_FORMATS)[number];
|
|
71
|
+
|
|
72
|
+
// FR-010 artifact-1 prompt presentation style (template.output only). Closed enum;
|
|
73
|
+
// guidance is NEVER carried in comments. Default "guide". Set project-wide via an
|
|
74
|
+
// abstract template base + extends, with a render-time override on top.
|
|
75
|
+
export const TEMPLATE_ATTR_PROMPT_STYLE = "promptStyle";
|
|
76
|
+
export const PROMPT_STYLE_GUIDE = "guide";
|
|
77
|
+
export const PROMPT_STYLE_INLINE = "inline";
|
|
78
|
+
export const PROMPT_STYLE_EXAMPLE_ONLY = "exampleOnly";
|
|
79
|
+
export const PROMPT_STYLE_DEFAULT = PROMPT_STYLE_GUIDE;
|
|
80
|
+
|
|
81
|
+
export const PROMPT_STYLES = [
|
|
82
|
+
PROMPT_STYLE_GUIDE,
|
|
83
|
+
PROMPT_STYLE_INLINE,
|
|
84
|
+
PROMPT_STYLE_EXAMPLE_ONLY,
|
|
85
|
+
] as const;
|
|
86
|
+
export type PromptStyle = (typeof PROMPT_STYLES)[number];
|
|
@@ -29,6 +29,9 @@ import {
|
|
|
29
29
|
TEMPLATE_ATTR_MODEL,
|
|
30
30
|
TEMPLATE_ATTR_TOOL_NAME,
|
|
31
31
|
TEMPLATE_FORMATS,
|
|
32
|
+
TEMPLATE_ATTR_PROMPT_STYLE,
|
|
33
|
+
PROMPT_STYLE_DEFAULT,
|
|
34
|
+
PROMPT_STYLES,
|
|
32
35
|
} from "./template-constants.js";
|
|
33
36
|
|
|
34
37
|
// Generic attrs shared by template.prompt and template.output.
|
|
@@ -79,6 +82,18 @@ const genericAttrs: AttrSchema[] = [
|
|
|
79
82
|
},
|
|
80
83
|
];
|
|
81
84
|
|
|
85
|
+
// FR-010 artifact-1: output-format prompt presentation style (template.output only).
|
|
86
|
+
// Closed enum, enforced via allowedValues exactly like @format. Default "guide".
|
|
87
|
+
const promptStyleAttr: AttrSchema = {
|
|
88
|
+
name: TEMPLATE_ATTR_PROMPT_STYLE,
|
|
89
|
+
valueType: ATTR_SUBTYPE_STRING,
|
|
90
|
+
required: false,
|
|
91
|
+
default: PROMPT_STYLE_DEFAULT,
|
|
92
|
+
allowedValues: [...PROMPT_STYLES],
|
|
93
|
+
description:
|
|
94
|
+
"FR-010 output-format prompt presentation: 'guide' (prose list + example), 'inline' (inline placeholders / enum choices), or 'exampleOnly' (filled skeleton). Guidance is never emitted as comments.",
|
|
95
|
+
};
|
|
96
|
+
|
|
82
97
|
// LLM-overlay attrs (template.prompt only).
|
|
83
98
|
const promptOverlayAttrs: AttrSchema[] = [
|
|
84
99
|
{
|
|
@@ -144,6 +159,6 @@ const toolcallAttrs: AttrSchema[] = [
|
|
|
144
159
|
export const TEMPLATE_ATTRS_MAP = new Map<string, AttrSchema[]>([
|
|
145
160
|
[SUBTYPE_BASE, []],
|
|
146
161
|
[TEMPLATE_SUBTYPE_PROMPT, [...genericAttrs, ...promptOverlayAttrs]],
|
|
147
|
-
[TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs]],
|
|
162
|
+
[TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs, promptStyleAttr]],
|
|
148
163
|
[TEMPLATE_SUBTYPE_TOOLCALL, [...toolcallAttrs]],
|
|
149
164
|
]);
|