@encore-os/eos-spec 0.12.0 → 0.14.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/dist/commands/audit.js +3 -2
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/build-embeddings.d.ts +1 -1
- package/dist/commands/build-embeddings.js +4 -4
- package/dist/commands/build-embeddings.js.map +1 -1
- package/dist/commands/checkArtifacts.js +3 -2
- package/dist/commands/checkArtifacts.js.map +1 -1
- package/dist/commands/checkPlacement.js +3 -2
- package/dist/commands/checkPlacement.js.map +1 -1
- package/dist/commands/complete.js +3 -2
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/create.d.ts +8 -0
- package/dist/commands/create.js +114 -2
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/deferred.js +3 -2
- package/dist/commands/deferred.js.map +1 -1
- package/dist/commands/freshness.d.ts +1 -1
- package/dist/commands/freshness.js +7 -6
- package/dist/commands/freshness.js.map +1 -1
- package/dist/commands/gen-tests.js +3 -2
- package/dist/commands/gen-tests.js.map +1 -1
- package/dist/commands/index-spec.d.ts +22 -0
- package/dist/commands/index-spec.js +48 -0
- package/dist/commands/index-spec.js.map +1 -0
- package/dist/commands/list.js +3 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/precedent.js +3 -2
- package/dist/commands/precedent.js.map +1 -1
- package/dist/commands/profile.js +3 -2
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/run.js +16 -0
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/tasks.js +9 -4
- package/dist/commands/tasks.js.map +1 -1
- package/dist/commands/validate.js +3 -2
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/verify-acs.d.ts +9 -1
- package/dist/commands/verify-acs.js +99 -34
- package/dist/commands/verify-acs.js.map +1 -1
- package/dist/commands/verifyRollout.js +3 -2
- package/dist/commands/verifyRollout.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +19 -0
- package/dist/lib/config.js +16 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/events.d.ts +5 -0
- package/dist/lib/events.js +20 -0
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/exec.d.ts +6 -1
- package/dist/lib/exec.js +5 -1
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/metrics.js +11 -2
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/output.d.ts +5 -0
- package/dist/lib/output.js +5 -0
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/precedent-search.d.ts +31 -1
- package/dist/lib/precedent-search.js +13 -6
- package/dist/lib/precedent-search.js.map +1 -1
- package/dist/lib/spec-index.d.ts +20 -0
- package/dist/lib/spec-index.js +80 -0
- package/dist/lib/spec-index.js.map +1 -0
- package/dist/lib/version.d.ts +5 -3
- package/dist/lib/version.js +5 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/with-event-log.js +9 -2
- package/dist/lib/with-event-log.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,9 +8,39 @@ export interface PrecedentHit {
|
|
|
8
8
|
score: number;
|
|
9
9
|
matchedFields: string[];
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* One spec-index entry — the shape `eos-spec index` writes to
|
|
13
|
+
* specs/spec-index.json and this ranker scores against (the projection builder's
|
|
14
|
+
* scripts/specs/build-spec-index.mjs established). The frontmatter-derived
|
|
15
|
+
* arrays pass through untyped: this consumer treats every nested shape as
|
|
16
|
+
* untrusted (see the {@link IndexSpec} note) and degrades per-field, so the
|
|
17
|
+
* generator does not narrow them either.
|
|
18
|
+
*/
|
|
19
|
+
export interface SpecIndexEntry {
|
|
20
|
+
id: string;
|
|
21
|
+
core: string;
|
|
22
|
+
title: string;
|
|
23
|
+
status: string | null;
|
|
24
|
+
file: string;
|
|
25
|
+
/** Bounded `## Summary` prose — the domain-vocabulary paraphrase-recall field. */
|
|
26
|
+
summary: string;
|
|
27
|
+
user_stories: unknown[];
|
|
28
|
+
acceptance_criteria: unknown[];
|
|
29
|
+
/** From the frontmatter's `requirements` spelling. */
|
|
30
|
+
functional_requirements: unknown[];
|
|
31
|
+
/** Not modeled in eos-spec frontmatter — always [] from the generator. */
|
|
32
|
+
non_functional_requirements: unknown[];
|
|
33
|
+
/** Not modeled in eos-spec frontmatter — always [] from the generator. */
|
|
34
|
+
success_metrics: unknown[];
|
|
35
|
+
tags: unknown[];
|
|
36
|
+
}
|
|
11
37
|
export declare function __resetIndexCache(): void;
|
|
12
38
|
/** Ranked lexical search over specs/spec-index.json (no markdown re-parse).
|
|
13
|
-
*
|
|
39
|
+
* When the index file is missing, falls back to building the index in memory
|
|
40
|
+
* from the spec corpus via {@link buildSpecIndex} — slower (a full corpus walk
|
|
41
|
+
* per call, uncached) but never stale, and it keeps `precedent --topic`
|
|
42
|
+
* first-class in repos without a generated index on disk. Run `eos-spec index`
|
|
43
|
+
* to materialize the file when search is hot. */
|
|
14
44
|
export declare function searchSpecs(topic: string, opts: {
|
|
15
45
|
core?: string;
|
|
16
46
|
repoRoot: string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { buildSpecIndex } from './spec-index.js';
|
|
3
4
|
const DEFAULT_LIMIT = 15;
|
|
4
5
|
// Score tiers, strongest first: word-boundary phrase > all-tokens > partial
|
|
5
6
|
// (per matched token, title x2). The body's all-tokens tier is cross-field-UNION
|
|
@@ -97,12 +98,12 @@ function loadIndexCached(indexPath) {
|
|
|
97
98
|
return index;
|
|
98
99
|
}
|
|
99
100
|
/** Ranked lexical search over specs/spec-index.json (no markdown re-parse).
|
|
100
|
-
*
|
|
101
|
+
* When the index file is missing, falls back to building the index in memory
|
|
102
|
+
* from the spec corpus via {@link buildSpecIndex} — slower (a full corpus walk
|
|
103
|
+
* per call, uncached) but never stale, and it keeps `precedent --topic`
|
|
104
|
+
* first-class in repos without a generated index on disk. Run `eos-spec index`
|
|
105
|
+
* to materialize the file when search is hot. */
|
|
101
106
|
export function searchSpecs(topic, opts) {
|
|
102
|
-
const indexPath = join(opts.repoRoot, 'specs', 'spec-index.json');
|
|
103
|
-
if (!existsSync(indexPath)) {
|
|
104
|
-
throw new Error(`spec index not found at ${indexPath} — run \`npm run spec:index\` first`);
|
|
105
|
-
}
|
|
106
107
|
const tokens = tokenize(topic);
|
|
107
108
|
if (tokens.length === 0)
|
|
108
109
|
return [];
|
|
@@ -110,7 +111,13 @@ export function searchSpecs(topic, opts) {
|
|
|
110
111
|
const tokenRes = tokenRegexes(tokens);
|
|
111
112
|
const core = opts.core?.toLowerCase();
|
|
112
113
|
const limit = opts.limit ?? DEFAULT_LIMIT;
|
|
113
|
-
const
|
|
114
|
+
const indexPath = join(opts.repoRoot, 'specs', 'spec-index.json');
|
|
115
|
+
// Fallback entries are the same untrusted input the ranker already defends
|
|
116
|
+
// against (SpecIndexEntry's arrays are unknown[] by design), so the cast only
|
|
117
|
+
// re-labels them as such.
|
|
118
|
+
const index = existsSync(indexPath)
|
|
119
|
+
? loadIndexCached(indexPath)
|
|
120
|
+
: { specs: buildSpecIndex(opts.repoRoot) };
|
|
114
121
|
const hits = [];
|
|
115
122
|
for (const spec of asArray(index.specs)) {
|
|
116
123
|
if (!spec)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"precedent-search.js","sourceRoot":"","sources":["../../src/lib/precedent-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"precedent-search.js","sourceRoot":"","sources":["../../src/lib/precedent-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SpecIndexEntry } from './precedent-search.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract the `## Summary` prose from a spec body — the bounded domain-vocabulary
|
|
4
|
+
* field the precedent search weights for paraphrase recall. Returns the section
|
|
5
|
+
* text up to the next `#`/`##` heading, whitespace-collapsed; "" when absent.
|
|
6
|
+
* (Ported from builder's scripts/specs/build-spec-index.mjs.)
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractSummary(specText: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Build the spec-index entries for `repoRoot` from the engine's own corpus walk
|
|
11
|
+
* (the same specs `audit`/`list` see, archive included). Deterministically
|
|
12
|
+
* ordered by file path so a written index diffs cleanly.
|
|
13
|
+
*
|
|
14
|
+
* The projection is builder's build-spec-index.mjs, field for field: frontmatter
|
|
15
|
+
* arrays pass through untyped (the search consumer treats every nested shape as
|
|
16
|
+
* untrusted and degrades per-field), `functional_requirements` maps from the
|
|
17
|
+
* frontmatter's `requirements` spelling, and non-functional requirements /
|
|
18
|
+
* success metrics are not modeled in eos-spec frontmatter, so they index empty.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildSpecIndex(repoRoot: string): SpecIndexEntry[];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in spec-index generator (Phase 2a Task 1). Builds the lexical corpus
|
|
3
|
+
* `searchSpecs` (precedent-search.ts) ranks against — the SAME projection
|
|
4
|
+
* builder's consumer-local scripts/specs/build-spec-index.mjs produces — so a
|
|
5
|
+
* consumer repo needs no generator script of its own: `eos-spec index` writes
|
|
6
|
+
* `specs/spec-index.json`, and lexical search falls back to `buildSpecIndex`
|
|
7
|
+
* in memory when the file is absent (slower, never stale).
|
|
8
|
+
*
|
|
9
|
+
* One entry per primary spec FILE (duplicate-id files each get a row — the
|
|
10
|
+
* collision gate, not the index, adjudicates those), archive included so
|
|
11
|
+
* `precedent --topic` with includeArchived keeps surfacing archived prior art.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
import { relative, sep } from 'node:path';
|
|
15
|
+
import { readFrontmatter } from './frontmatter.js';
|
|
16
|
+
import { listSpecs } from './specs.js';
|
|
17
|
+
/** Runtime guard mirroring the search consumer: anything non-array becomes []. */
|
|
18
|
+
function asArray(value) {
|
|
19
|
+
return Array.isArray(value) ? value : [];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract the `## Summary` prose from a spec body — the bounded domain-vocabulary
|
|
23
|
+
* field the precedent search weights for paraphrase recall. Returns the section
|
|
24
|
+
* text up to the next `#`/`##` heading, whitespace-collapsed; "" when absent.
|
|
25
|
+
* (Ported from builder's scripts/specs/build-spec-index.mjs.)
|
|
26
|
+
*/
|
|
27
|
+
export function extractSummary(specText) {
|
|
28
|
+
const lines = specText.split(/\r?\n/);
|
|
29
|
+
const start = lines.findIndex((l) => /^##\s+Summary\s*$/i.test(l));
|
|
30
|
+
if (start === -1)
|
|
31
|
+
return '';
|
|
32
|
+
const out = [];
|
|
33
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
34
|
+
if (/^#{1,2}\s/.test(lines[i]))
|
|
35
|
+
break; // stop at the next heading
|
|
36
|
+
out.push(lines[i]);
|
|
37
|
+
}
|
|
38
|
+
return out.join(' ').replace(/\s+/g, ' ').trim();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build the spec-index entries for `repoRoot` from the engine's own corpus walk
|
|
42
|
+
* (the same specs `audit`/`list` see, archive included). Deterministically
|
|
43
|
+
* ordered by file path so a written index diffs cleanly.
|
|
44
|
+
*
|
|
45
|
+
* The projection is builder's build-spec-index.mjs, field for field: frontmatter
|
|
46
|
+
* arrays pass through untyped (the search consumer treats every nested shape as
|
|
47
|
+
* untrusted and degrades per-field), `functional_requirements` maps from the
|
|
48
|
+
* frontmatter's `requirements` spelling, and non-functional requirements /
|
|
49
|
+
* success metrics are not modeled in eos-spec frontmatter, so they index empty.
|
|
50
|
+
*/
|
|
51
|
+
export function buildSpecIndex(repoRoot) {
|
|
52
|
+
const entries = [];
|
|
53
|
+
for (const spec of listSpecs(repoRoot, undefined, { includeArchived: true })) {
|
|
54
|
+
let text = '';
|
|
55
|
+
try {
|
|
56
|
+
text = readFileSync(spec.path, 'utf8');
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// unreadable file — index what listSpecs resolved; text-derived fields stay empty
|
|
60
|
+
}
|
|
61
|
+
const fm = readFrontmatter(text);
|
|
62
|
+
entries.push({
|
|
63
|
+
id: spec.id,
|
|
64
|
+
core: spec.core,
|
|
65
|
+
title: spec.title ?? '',
|
|
66
|
+
status: spec.status ?? null,
|
|
67
|
+
file: relative(repoRoot, spec.path).split(sep).join('/'),
|
|
68
|
+
summary: extractSummary(text),
|
|
69
|
+
user_stories: asArray(fm.user_stories),
|
|
70
|
+
acceptance_criteria: asArray(fm.acceptance_criteria),
|
|
71
|
+
functional_requirements: asArray(fm.requirements),
|
|
72
|
+
non_functional_requirements: [],
|
|
73
|
+
success_metrics: [],
|
|
74
|
+
tags: asArray(fm.tags),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
entries.sort((a, b) => a.file.localeCompare(b.file));
|
|
78
|
+
return entries;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=spec-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-index.js","sourceRoot":"","sources":["../../src/lib/spec-index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** The single source of truth for the published engine version. Kept in lockstep
|
|
2
2
|
* with package.json `version` by version.test.ts; consumed by the CLI `.version()`
|
|
3
|
-
* registration (index.ts) and the `profile --json` engine.version field.
|
|
4
|
-
*
|
|
5
|
-
|
|
3
|
+
* registration (index.ts) and the `profile --json` engine.version field. Release
|
|
4
|
+
* Please bumps this in lockstep with package.json via the `x-release-please-version`
|
|
5
|
+
* annotation below (release-please-config.json `extra-files`); for a break-glass
|
|
6
|
+
* manual release, bump it together with package.json by hand. */
|
|
7
|
+
export declare const ENGINE_VERSION = "0.14.0";
|
package/dist/lib/version.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** The single source of truth for the published engine version. Kept in lockstep
|
|
2
2
|
* with package.json `version` by version.test.ts; consumed by the CLI `.version()`
|
|
3
|
-
* registration (index.ts) and the `profile --json` engine.version field.
|
|
4
|
-
*
|
|
5
|
-
|
|
3
|
+
* registration (index.ts) and the `profile --json` engine.version field. Release
|
|
4
|
+
* Please bumps this in lockstep with package.json via the `x-release-please-version`
|
|
5
|
+
* annotation below (release-please-config.json `extra-files`); for a break-glass
|
|
6
|
+
* manual release, bump it together with package.json by hand. */
|
|
7
|
+
export const ENGINE_VERSION = '0.14.0'; // x-release-please-version
|
|
6
8
|
//# sourceMappingURL=version.js.map
|
package/dist/lib/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;;;;kEAKkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,2BAA2B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logEvent, RUN_ID, redactArgs } from './events.js';
|
|
1
|
+
import { logEvent, RUN_ID, redactArgs, takePendingHaltCause } from './events.js';
|
|
2
2
|
import { getGlobalOptions } from './output.js';
|
|
3
3
|
/** Resolve the caller's `--repo-root` global override from the commander command so
|
|
4
4
|
* telemetry lands in the intended repo, not whatever git repo the invoking cwd is in
|
|
@@ -32,6 +32,9 @@ export function withEventLog(commandName, action) {
|
|
|
32
32
|
const cmd = args[args.length - 1];
|
|
33
33
|
const options = (args.length >= 2 ? args[args.length - 2] : {});
|
|
34
34
|
const repoRoot = repoRootFromCmd(cmd);
|
|
35
|
+
// Clear any stale halt cause a prior in-process command left behind (test suites
|
|
36
|
+
// run many commands in one process; `emit` sets the register just before exit).
|
|
37
|
+
takePendingHaltCause();
|
|
35
38
|
const start = Date.now();
|
|
36
39
|
const ts = new Date().toISOString();
|
|
37
40
|
const base = {
|
|
@@ -49,7 +52,11 @@ export function withEventLog(commandName, action) {
|
|
|
49
52
|
if (logged)
|
|
50
53
|
return;
|
|
51
54
|
logged = true;
|
|
52
|
-
|
|
55
|
+
const ok = code === 0;
|
|
56
|
+
// On a non-zero exit, stamp the halt cause emit() stashed (governance gate vs.
|
|
57
|
+
// crash) so `metrics` can tell an expected governance halt from a real failure.
|
|
58
|
+
const haltCause = takePendingHaltCause();
|
|
59
|
+
logEvent({ ...base, ms: Date.now() - start, ok, ...(!ok && haltCause ? { haltCause } : {}) }, { repoRoot });
|
|
53
60
|
};
|
|
54
61
|
process.once('exit', onExit);
|
|
55
62
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-event-log.js","sourceRoot":"","sources":["../../src/lib/with-event-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"with-event-log.js","sourceRoot":"","sources":["../../src/lib/with-event-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C;;;iFAGiF;AACjF,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,GAAc,CAAC,CAAC,QAAQ,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAoC,WAAmB,EAAE,MAAiB;IACpG,8EAA8E;IAC9E,gFAAgF;IAChF,gFAAgF;IAChF,+EAA+E;IAC/E,iFAAiF;IACjF,6BAA6B;IAC7B,OAAO,KAAK,EAAE,GAAG,IAAe,EAAiB,EAAE;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAM,CAAC;QACrE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACtC,iFAAiF;QACjF,gFAAgF;QAChF,oBAAoB,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG;YACX,EAAE;YACF,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC;YACzB,MAAM,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACnE,IAAI,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAClE,CAAC;QAEF,8EAA8E;QAC9E,6EAA6E;QAC7E,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;YACtB,+EAA+E;YAC/E,gFAAgF;YAChF,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;YACzC,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9G,CAAC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,kEAAkE;YAClE,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,CAAC;gBACd,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,CAAC;gBACd,QAAQ,CACN;oBACE,GAAG,IAAI;oBACP,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;oBACtB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,EACD,EAAE,QAAQ,EAAE,CACb,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@encore-os/eos-spec",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Portable, config-driven spec-pipeline engine + quality harness. One canonical engine consumed as a library (with a client-safe /pure subpath) by every Encore-OS repo.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|