@contentful/experience-design-system-cli 2.35.1-dev-build-fa950e44.0 → 2.35.1-dev-build-b8da2525.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/bin/cli.js +1 -1
- package/dist/package.json +1 -1
- package/legacy/bin/cli.js +19 -23
- package/legacy/dist/src/analyze/composition/interchange-schema.d.ts +7 -1
- package/legacy/dist/src/analyze/composition/resolve-mapping.d.ts +11 -34
- package/legacy/dist/src/analyze/composition/source-call-site-evidence.d.ts +30 -0
- package/legacy/dist/src/import/tui/ai-flag.d.ts +0 -1
- package/legacy/dist/src/import/tui/steps/ScopeGateStep.d.ts +0 -1
- package/legacy/dist/src/index.js +17077 -17048
- package/legacy/dist/src/lib/prop-bucket-debug.d.ts +3 -0
- package/legacy/dist/src/session/core/components/strip-extraction-provenance.d.ts +2 -0
- package/legacy/package.json +1 -1
- package/legacy/skills/select-components.md +43 -8
- package/package.json +2 -2
- package/legacy/dist/src/analyze/composition/candidate-files.d.ts +0 -34
- package/legacy/dist/src/analyze/composition/composition-cache-key.d.ts +0 -18
- package/legacy/dist/src/analyze/composition/parse-map-edges.d.ts +0 -16
- package/legacy/dist/src/analyze/composition/prompt-loader.d.ts +0 -3
- package/legacy/dist/src/analyze/composition/resolve-mapping-cli.d.ts +0 -10
- package/legacy/prompts/composition-edges.md +0 -11
package/bin/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
await import(
|
|
2
|
+
await import('../dist/index.js');
|
package/dist/package.json
CHANGED
package/legacy/bin/cli.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// Suppress the SQLite ExperimentalWarning before any modules load.
|
|
3
3
|
// Must use dynamic import so this handler registers before sqlite is imported.
|
|
4
|
-
process.removeAllListeners(
|
|
5
|
-
process.on(
|
|
6
|
-
if (w.name ===
|
|
4
|
+
process.removeAllListeners('warning');
|
|
5
|
+
process.on('warning', (w) => {
|
|
6
|
+
if (w.name === 'ExperimentalWarning' && w.message.includes('SQLite')) return;
|
|
7
7
|
process.stderr.write(`${w.name}: ${w.message}\n`);
|
|
8
8
|
});
|
|
9
9
|
|
|
10
10
|
// Auto-rebuild when running from source (dev mode only).
|
|
11
11
|
// Skipped when src/ doesn't exist (e.g. npm-installed users).
|
|
12
|
-
import { existsSync, statSync, readdirSync } from
|
|
13
|
-
import { execFileSync } from
|
|
14
|
-
import { fileURLToPath } from
|
|
15
|
-
import { dirname, resolve, join } from
|
|
12
|
+
import { existsSync, statSync, readdirSync } from 'node:fs';
|
|
13
|
+
import { execFileSync } from 'node:child_process';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { dirname, resolve, join } from 'node:path';
|
|
16
16
|
|
|
17
17
|
function newestMtime(dir, depth = 0) {
|
|
18
18
|
if (depth > 10) return 0;
|
|
@@ -22,7 +22,7 @@ function newestMtime(dir, depth = 0) {
|
|
|
22
22
|
const full = join(dir, entry.name);
|
|
23
23
|
if (entry.isDirectory()) {
|
|
24
24
|
max = Math.max(max, newestMtime(full, depth + 1));
|
|
25
|
-
} else if (entry.name.endsWith(
|
|
25
|
+
} else if (entry.name.endsWith('.ts') || entry.name.endsWith('.tsx')) {
|
|
26
26
|
max = Math.max(max, statSync(full).mtimeMs);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -30,29 +30,25 @@ function newestMtime(dir, depth = 0) {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
33
|
-
const pkgRoot = resolve(__dirname,
|
|
34
|
-
const srcDir = join(pkgRoot,
|
|
35
|
-
const distEntry = join(pkgRoot,
|
|
33
|
+
const pkgRoot = resolve(__dirname, '..');
|
|
34
|
+
const srcDir = join(pkgRoot, 'src');
|
|
35
|
+
const distEntry = join(pkgRoot, 'dist', 'src', 'index.js');
|
|
36
36
|
|
|
37
|
-
if (
|
|
38
|
-
existsSync(srcDir) &&
|
|
39
|
-
existsSync(distEntry) &&
|
|
40
|
-
process.env.NODE_ENV !== "test"
|
|
41
|
-
) {
|
|
37
|
+
if (existsSync(srcDir) && existsSync(distEntry) && process.env.NODE_ENV !== 'test') {
|
|
42
38
|
const distMtime = statSync(distEntry).mtimeMs;
|
|
43
39
|
if (newestMtime(srcDir) > distMtime) {
|
|
44
|
-
process.stderr.write(
|
|
45
|
-
const tsc = join(pkgRoot,
|
|
40
|
+
process.stderr.write('⚙ Source changed — rebuilding...\n');
|
|
41
|
+
const tsc = join(pkgRoot, 'node_modules', '.bin', 'tsc');
|
|
46
42
|
try {
|
|
47
|
-
execFileSync(tsc, [
|
|
48
|
-
stdio: [
|
|
43
|
+
execFileSync(tsc, ['-p', join(pkgRoot, 'tsconfig.build.json')], {
|
|
44
|
+
stdio: ['ignore', 'ignore', 'inherit'],
|
|
49
45
|
cwd: pkgRoot,
|
|
50
46
|
});
|
|
51
|
-
process.stderr.write(
|
|
47
|
+
process.stderr.write('✓ Build complete\n');
|
|
52
48
|
} catch {
|
|
53
|
-
process.stderr.write(
|
|
49
|
+
process.stderr.write('✗ Build failed — running with existing dist\n');
|
|
54
50
|
}
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
53
|
|
|
58
|
-
await import(
|
|
54
|
+
await import('../dist/src/index.js');
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* parent→child relationship, carrying optional `slot` (T7), `confidence`,
|
|
6
6
|
* and `provenance`. It is easier to merge and dedupe across sources (T2).
|
|
7
7
|
*/
|
|
8
|
-
export type EdgeProvenance = 'typed-slot' | 'structural' | 'manifest' | 'doc' | `adapter:${string}
|
|
8
|
+
export type EdgeProvenance = 'typed-slot' | 'structural' | 'call-site' | 'manifest' | 'doc' | `adapter:${string}`;
|
|
9
9
|
export type CompositionEdge = {
|
|
10
10
|
parent: string;
|
|
11
11
|
child: string;
|
|
@@ -13,5 +13,11 @@ export type CompositionEdge = {
|
|
|
13
13
|
slot?: string;
|
|
14
14
|
/** 1–5 scale, same as select/reject agent tools. */
|
|
15
15
|
confidence?: number;
|
|
16
|
+
citation?: CompositionCitation;
|
|
16
17
|
provenance: EdgeProvenance;
|
|
17
18
|
};
|
|
19
|
+
export type CompositionCitation = {
|
|
20
|
+
sourcePath: string;
|
|
21
|
+
startLine: number;
|
|
22
|
+
endLine: number;
|
|
23
|
+
};
|
|
@@ -1,59 +1,36 @@
|
|
|
1
1
|
import type { RawComponentDefinition } from '../../types.js';
|
|
2
2
|
import type { CompositionEdge } from './interchange-schema.js';
|
|
3
3
|
import { type EdgeConflict } from './merge-edges.js';
|
|
4
|
+
import type { SourceCallSiteEvidence, SourceCallSiteRejection } from './source-call-site-evidence.js';
|
|
4
5
|
export type ResolveMappingResult = {
|
|
5
6
|
components: RawComponentDefinition[];
|
|
6
7
|
edges: CompositionEdge[];
|
|
7
8
|
conflicts: EdgeConflict[];
|
|
8
9
|
warnings: string[];
|
|
10
|
+
sourceCallSiteEvidence: SourceCallSiteEvidence[];
|
|
11
|
+
sourceCallSiteRejections: SourceCallSiteRejection[];
|
|
9
12
|
};
|
|
10
13
|
/**
|
|
11
14
|
* Orchestrate composition-edge acquisition and enrichment.
|
|
12
15
|
*
|
|
13
|
-
* Sources by rank: typed-slot / "code slots" (
|
|
14
|
-
* (3) > manifest (4) > doc (5) > adapter-resolved
|
|
15
|
-
*
|
|
16
|
+
* Sources by rank: typed-slot / "code slots" (1) > structural usage evidence
|
|
17
|
+
* (2) > cited source call sites (3) > manifest (4) > doc (5) > adapter-resolved
|
|
18
|
+
* / extraEdges (6). Manifest/doc edges are computed deterministically outside
|
|
16
19
|
* this function (see manifest-doc-evidence.ts) and joined via `extraEdges`.
|
|
17
20
|
* ALL sources — including the code slots already on the incoming components —
|
|
18
21
|
* are fed into one ranked merge and unioned; non-conflicting edges from every
|
|
19
22
|
* source survive, and on a conflict (same parent+child, different slot) the
|
|
20
|
-
* higher-rank source wins and the loser is recorded.
|
|
21
|
-
*
|
|
22
|
-
* didn't cover (routing/cost optimization) — `forceAgent` bypasses that
|
|
23
|
-
* suppression but never changes rank.
|
|
24
|
-
*
|
|
25
|
-
* `runAgentFn` is injected (returns the agent's raw stdout) so this is
|
|
26
|
-
* testable without spawning a subprocess.
|
|
23
|
+
* higher-rank source wins and the loser is recorded. No agent contributes
|
|
24
|
+
* edges: every edge is backed by code, a manifest or documentation.
|
|
27
25
|
*/
|
|
28
26
|
export declare function resolveMapping(input: {
|
|
29
27
|
components: RawComponentDefinition[];
|
|
30
|
-
forceAgent?: boolean;
|
|
31
|
-
files: Array<{
|
|
32
|
-
path: string;
|
|
33
|
-
content: string;
|
|
34
|
-
}>;
|
|
35
|
-
runAgentFn: (opts: {
|
|
36
|
-
prompt: string;
|
|
37
|
-
files: Array<{
|
|
38
|
-
path: string;
|
|
39
|
-
content: string;
|
|
40
|
-
}>;
|
|
41
|
-
}) => Promise<string>;
|
|
42
|
-
buildPrompt?: (files: Array<{
|
|
43
|
-
path: string;
|
|
44
|
-
content: string;
|
|
45
|
-
}>, componentNames: string[]) => string;
|
|
46
|
-
/**
|
|
47
|
-
* Custom instruction preamble (from `--prompt composition=...`). Replaces the
|
|
48
|
-
* default guidance line ONLY; the machine-readable output contract + the
|
|
49
|
-
* component-name allowlist + candidate files are always appended so the
|
|
50
|
-
* JSONL parser keeps working regardless of the override.
|
|
51
|
-
*/
|
|
52
|
-
promptOverride?: string;
|
|
53
28
|
/**
|
|
54
29
|
* Pre-resolved edges from an external source (e.g. manifest or documentation)
|
|
55
30
|
* path). They join the ranked merge at their own provenance rank alongside
|
|
56
31
|
* code slots and other automatic mapping sources.
|
|
57
32
|
*/
|
|
58
33
|
extraEdges?: CompositionEdge[];
|
|
59
|
-
|
|
34
|
+
sourceCallSiteEvidence?: SourceCallSiteEvidence[];
|
|
35
|
+
sourceCallSiteRejections?: SourceCallSiteRejection[];
|
|
36
|
+
}): ResolveMappingResult;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RawComponentDefinition } from '../../types.js';
|
|
2
|
+
export type SourceCallSiteEvidence = {
|
|
3
|
+
parent: string;
|
|
4
|
+
child: string;
|
|
5
|
+
slot?: string;
|
|
6
|
+
sourcePath: string;
|
|
7
|
+
startLine: number;
|
|
8
|
+
endLine: number;
|
|
9
|
+
excerpt: string;
|
|
10
|
+
kind: 'jsx-render';
|
|
11
|
+
};
|
|
12
|
+
export type SourceCallSiteRejection = {
|
|
13
|
+
parent: string;
|
|
14
|
+
candidate: string;
|
|
15
|
+
sourcePath: string;
|
|
16
|
+
startLine?: number;
|
|
17
|
+
endLine?: number;
|
|
18
|
+
excerpt?: string;
|
|
19
|
+
reason: 'unknown-component' | 'unbound-component' | 'text-only-child' | 'no-call-site';
|
|
20
|
+
};
|
|
21
|
+
export type SourceCallSiteEvidenceResult = {
|
|
22
|
+
accepted: SourceCallSiteEvidence[];
|
|
23
|
+
rejected: SourceCallSiteRejection[];
|
|
24
|
+
};
|
|
25
|
+
type SourceFileInput = {
|
|
26
|
+
path: string;
|
|
27
|
+
content: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function collectSourceCallSiteEvidence(files: readonly SourceFileInput[], components: readonly RawComponentDefinition[]): SourceCallSiteEvidenceResult;
|
|
30
|
+
export {};
|