@decantr/cli 2.9.0 → 2.9.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/README.md +1 -0
- package/dist/bin.js +3 -3
- package/dist/{chunk-N7A3WUZ2.js → chunk-6UDJDQPT.js} +63 -15
- package/dist/{chunk-T5INVSOP.js → chunk-FKM4OQDF.js} +20 -6
- package/dist/{chunk-V3XAQWKD.js → chunk-RXF7ZYGK.js} +22 -8
- package/dist/index.js +3 -3
- package/dist/{studio-B2Y4TKZ5.js → studio-EDQMI6JE.js} +1 -1
- package/dist/{upgrade-U2BTWJJJ.js → upgrade-VON7Y3LG.js} +1 -1
- package/dist/{workspace-H5QQJCCI.js → workspace-JA2RZI6V.js} +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -21,6 +21,7 @@ Use `decantr setup` when you are unsure which path applies. It detects whether t
|
|
|
21
21
|
Use `decantr new` for a greenfield workspace in a fresh directory. With a blueprint/archetype it uses the runnable adapter and Decantr CSS; without registry content it creates a contract-only workspace unless you explicitly pass `--adoption=decantr-css`.
|
|
22
22
|
Use `decantr adopt` when you already have an app and want Decantr governance without adopting a blueprint. Brownfield attach is proposal-driven: Decantr inventories the app, writes an observed essence proposal, and only applies it when you explicitly accept or merge it.
|
|
23
23
|
Use `decantr doctor` when the next step is unclear, `decantr task` before asking an LLM to modify a route, `decantr verify` after the edit, and `decantr ci` in required automation. Use `decantr codify --from-audit` when you want project-owned UI patterns and local rules such as button/card/shell/theme standards to appear in future task context and verification.
|
|
24
|
+
In monorepos, app-scoped commands accept `--project <app-path>`. Hosted pack hydration also follows the essence path: `decantr registry compile-packs apps/web/decantr.essence.json --write-context` writes into `apps/web/.decantr/context`.
|
|
24
25
|
Use `decantr init`, `decantr analyze`, `decantr check`, and `decantr health` as advanced primitives when you need direct control over one step.
|
|
25
26
|
|
|
26
27
|
Current starter adapter availability:
|
package/dist/bin.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./chunk-
|
|
3
|
-
import "./chunk-
|
|
4
|
-
import "./chunk-
|
|
2
|
+
import "./chunk-6UDJDQPT.js";
|
|
3
|
+
import "./chunk-RXF7ZYGK.js";
|
|
4
|
+
import "./chunk-FKM4OQDF.js";
|
|
5
5
|
import "./chunk-TMOCTDYY.js";
|
|
6
6
|
import "./chunk-34TZXWIF.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
scaffoldProject,
|
|
15
15
|
syncRegistry,
|
|
16
16
|
writeExecutionPackBundleArtifacts
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-RXF7ZYGK.js";
|
|
18
18
|
import {
|
|
19
19
|
createWorkspaceHealthReport,
|
|
20
20
|
formatWorkspaceHealthMarkdown,
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
listWorkspaceProjects,
|
|
24
24
|
resolveWorkspaceInfo,
|
|
25
25
|
shouldFailWorkspaceHealth
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-FKM4OQDF.js";
|
|
27
27
|
import {
|
|
28
28
|
createProjectHealthReport,
|
|
29
29
|
formatProjectHealthMarkdown,
|
|
@@ -4194,6 +4194,7 @@ import { existsSync as existsSync16, readdirSync as readdirSync6, readFileSync a
|
|
|
4194
4194
|
import { dirname as dirname3, join as join18, relative as relative4 } from "path";
|
|
4195
4195
|
import { fileURLToPath } from "url";
|
|
4196
4196
|
import { isV4 as isV44 } from "@decantr/essence-spec";
|
|
4197
|
+
import { collectMissingPackManifestFiles } from "@decantr/verifier";
|
|
4197
4198
|
var BOLD3 = "\x1B[1m";
|
|
4198
4199
|
var DIM4 = "\x1B[2m";
|
|
4199
4200
|
var GREEN4 = "\x1B[32m";
|
|
@@ -4339,6 +4340,19 @@ function buildDoctorReport(root, args) {
|
|
|
4339
4340
|
const ciFiles = findCiFiles(workspaceRoot);
|
|
4340
4341
|
const workflowMode = projectJson?.initialized?.workflowMode ?? null;
|
|
4341
4342
|
const adoptionMode = projectJson?.initialized?.adoptionMode ?? null;
|
|
4343
|
+
const missingPackReferences = workspaceMode ? projects.flatMap(
|
|
4344
|
+
(project) => collectMissingPackManifestFiles(join18(workspaceRoot, project.path)).map(
|
|
4345
|
+
(missing) => `${project.path}/${missing.relativePath}`
|
|
4346
|
+
)
|
|
4347
|
+
) : collectMissingPackManifestFiles(appRoot).map((missing) => missing.relativePath);
|
|
4348
|
+
const workspaceProjectsMissingManifest = workspaceMode ? projects.map((project) => project.path).filter((projectPath2) => {
|
|
4349
|
+
const projectContextDir = join18(workspaceRoot, projectPath2, ".decantr", "context");
|
|
4350
|
+
return !existsSync16(join18(projectContextDir, "pack-manifest.json"));
|
|
4351
|
+
}) : [];
|
|
4352
|
+
const workspaceProjectsMissingReviewPack = workspaceMode ? projects.map((project) => project.path).filter((projectPath2) => {
|
|
4353
|
+
const projectContextDir = join18(workspaceRoot, projectPath2, ".decantr", "context");
|
|
4354
|
+
return !existsSync16(join18(projectContextDir, "review-pack.json"));
|
|
4355
|
+
}) : [];
|
|
4342
4356
|
const issues = [];
|
|
4343
4357
|
if (!essenceVersion && !workspaceMode && !workspaceInfo.requiresProjectSelection) {
|
|
4344
4358
|
issues.push({
|
|
@@ -4384,7 +4398,23 @@ function buildDoctorReport(root, args) {
|
|
|
4384
4398
|
category: "generated-artifact",
|
|
4385
4399
|
severity: "warn",
|
|
4386
4400
|
message: "Generated context packs are missing or incomplete.",
|
|
4387
|
-
nextCommand: projectPath ? `decantr
|
|
4401
|
+
nextCommand: projectPath ? `decantr registry compile-packs ${projectPath}/decantr.essence.json --write-context` : "decantr registry compile-packs decantr.essence.json --write-context"
|
|
4402
|
+
});
|
|
4403
|
+
}
|
|
4404
|
+
if (essenceVersion === "4.0.0" && missingPackReferences.length > 0) {
|
|
4405
|
+
issues.push({
|
|
4406
|
+
category: "generated-artifact",
|
|
4407
|
+
severity: "warn",
|
|
4408
|
+
message: `Generated pack manifest references ${missingPackReferences.length} missing file(s).`,
|
|
4409
|
+
nextCommand: projectPath ? `decantr registry compile-packs ${projectPath}/decantr.essence.json --write-context` : "decantr registry compile-packs decantr.essence.json --write-context"
|
|
4410
|
+
});
|
|
4411
|
+
}
|
|
4412
|
+
if (workspaceMode && (workspaceProjectsMissingManifest.length > 0 || workspaceProjectsMissingReviewPack.length > 0 || missingPackReferences.length > 0)) {
|
|
4413
|
+
issues.push({
|
|
4414
|
+
category: "generated-artifact",
|
|
4415
|
+
severity: "warn",
|
|
4416
|
+
message: "One or more attached workspace projects have missing or incomplete generated context packs.",
|
|
4417
|
+
nextCommand: "decantr registry compile-packs <app-path>/decantr.essence.json --write-context"
|
|
4388
4418
|
});
|
|
4389
4419
|
}
|
|
4390
4420
|
if (workflowMode === "brownfield-attach" && !existsSync16(localPatternsPath(appRoot))) {
|
|
@@ -4439,9 +4469,12 @@ function buildDoctorReport(root, args) {
|
|
|
4439
4469
|
appCandidates: candidates
|
|
4440
4470
|
},
|
|
4441
4471
|
generatedArtifacts: {
|
|
4442
|
-
contextDirPresent:
|
|
4443
|
-
|
|
4444
|
-
|
|
4472
|
+
contextDirPresent: workspaceMode ? projects.some(
|
|
4473
|
+
(project) => existsSync16(join18(workspaceRoot, project.path, ".decantr", "context"))
|
|
4474
|
+
) : existsSync16(contextDir),
|
|
4475
|
+
packManifestPresent: workspaceMode ? projects.length > 0 && workspaceProjectsMissingManifest.length === 0 : packManifestPresent,
|
|
4476
|
+
reviewPackPresent: workspaceMode ? projects.length > 0 && workspaceProjectsMissingReviewPack.length === 0 : reviewPackPresent,
|
|
4477
|
+
missingReferencedFiles: missingPackReferences.slice(0, 25)
|
|
4445
4478
|
},
|
|
4446
4479
|
localLaw: {
|
|
4447
4480
|
patternsPresent: existsSync16(localPatternsPath(appRoot)),
|
|
@@ -4481,6 +4514,7 @@ function formatDoctorText(report) {
|
|
|
4481
4514
|
` Context directory: ${report.generatedArtifacts.contextDirPresent ? "present" : "missing"}`,
|
|
4482
4515
|
` Pack manifest: ${report.generatedArtifacts.packManifestPresent ? "present" : "missing"}`,
|
|
4483
4516
|
` Review pack: ${report.generatedArtifacts.reviewPackPresent ? "present" : "missing"}`,
|
|
4517
|
+
` Manifest references: ${report.generatedArtifacts.missingReferencedFiles.length === 0 ? "complete" : `${report.generatedArtifacts.missingReferencedFiles.length} missing`}`,
|
|
4484
4518
|
` Artifact guide: ${report.project.artifactReadmePresent ? "present" : "missing"}`,
|
|
4485
4519
|
"",
|
|
4486
4520
|
`${BOLD3}Local Law:${RESET4}`,
|
|
@@ -5829,6 +5863,7 @@ async function cmdPublish(type, name, projectRoot = process.cwd()) {
|
|
|
5829
5863
|
import { createHash } from "crypto";
|
|
5830
5864
|
import { existsSync as existsSync23, readdirSync as readdirSync7, readFileSync as readFileSync17, statSync as statSync6 } from "fs";
|
|
5831
5865
|
import { join as join25 } from "path";
|
|
5866
|
+
import { collectMissingPackManifestFiles as collectMissingPackManifestFiles2 } from "@decantr/verifier";
|
|
5832
5867
|
import { isV4 as isV46 } from "@decantr/essence-spec";
|
|
5833
5868
|
var GREEN9 = "\x1B[32m";
|
|
5834
5869
|
var RED8 = "\x1B[31m";
|
|
@@ -5891,6 +5926,16 @@ function checkRefreshFreshness(projectRoot) {
|
|
|
5891
5926
|
if (!existsSync23(join25(contextDir, "scaffold.md"))) {
|
|
5892
5927
|
reasons.push(".decantr/context/scaffold.md is missing.");
|
|
5893
5928
|
}
|
|
5929
|
+
if (!existsSync23(join25(contextDir, "pack-manifest.json"))) {
|
|
5930
|
+
reasons.push(".decantr/context/pack-manifest.json is missing.");
|
|
5931
|
+
} else {
|
|
5932
|
+
const missingPackFiles = collectMissingPackManifestFiles2(projectRoot);
|
|
5933
|
+
if (missingPackFiles.length > 0) {
|
|
5934
|
+
reasons.push(
|
|
5935
|
+
`pack-manifest.json references missing files: ${missingPackFiles.slice(0, 5).map((missing) => missing.relativePath).join(", ")}${missingPackFiles.length > 5 ? "..." : ""}`
|
|
5936
|
+
);
|
|
5937
|
+
}
|
|
5938
|
+
}
|
|
5894
5939
|
const newestInput = newestInputMtime(projectRoot);
|
|
5895
5940
|
const staleFiles = generated.filter((path) => fileMtimeMs(path) > 0 && fileMtimeMs(path) < newestInput).map((path) => path.replace(`${projectRoot}/`, ""));
|
|
5896
5941
|
if (staleFiles.length > 0) {
|
|
@@ -7906,9 +7951,9 @@ async function printHostedExecutionPackBundle(essencePath, namespace, jsonOutput
|
|
|
7906
7951
|
}
|
|
7907
7952
|
const essence = JSON.parse(readFileSync22(resolvedPath, "utf-8"));
|
|
7908
7953
|
const bundle = await client.compileExecutionPacks(essence, namespace ? { namespace } : void 0);
|
|
7954
|
+
const contextDir = join31(dirname5(resolvedPath), ".decantr", "context");
|
|
7909
7955
|
let writtenContextPaths = [];
|
|
7910
7956
|
if (writeContext) {
|
|
7911
|
-
const contextDir = join31(process.cwd(), ".decantr", "context");
|
|
7912
7957
|
mkdirSync16(contextDir, { recursive: true });
|
|
7913
7958
|
const written = writeExecutionPackBundleArtifacts(
|
|
7914
7959
|
contextDir,
|
|
@@ -7934,7 +7979,7 @@ async function printHostedExecutionPackBundle(essencePath, namespace, jsonOutput
|
|
|
7934
7979
|
console.log(` Sections: ${typedBundle.sections.length}`);
|
|
7935
7980
|
console.log(` Mutations: ${typedBundle.mutations.length}`);
|
|
7936
7981
|
if (writeContext) {
|
|
7937
|
-
console.log(` Context bundle: ${
|
|
7982
|
+
console.log(` Context bundle: ${contextDir}`);
|
|
7938
7983
|
console.log(` Files written: ${writtenContextPaths.length}`);
|
|
7939
7984
|
}
|
|
7940
7985
|
console.log("");
|
|
@@ -7982,7 +8027,7 @@ async function printHostedSelectedExecutionPack(packType, id, essencePath, names
|
|
|
7982
8027
|
);
|
|
7983
8028
|
let writtenContextDir = null;
|
|
7984
8029
|
if (writeContext) {
|
|
7985
|
-
const contextDir = join31(
|
|
8030
|
+
const contextDir = join31(dirname5(resolvedPath), ".decantr", "context");
|
|
7986
8031
|
mkdirSync16(contextDir, { recursive: true });
|
|
7987
8032
|
writeFileSync19(
|
|
7988
8033
|
join31(contextDir, "pack-manifest.json"),
|
|
@@ -8028,7 +8073,7 @@ async function printHostedExecutionPackManifest(essencePath, namespace, jsonOutp
|
|
|
8028
8073
|
);
|
|
8029
8074
|
let writtenContextDir = null;
|
|
8030
8075
|
if (writeContext) {
|
|
8031
|
-
const contextDir = join31(
|
|
8076
|
+
const contextDir = join31(dirname5(resolvedPath), ".decantr", "context");
|
|
8032
8077
|
mkdirSync16(contextDir, { recursive: true });
|
|
8033
8078
|
writeFileSync19(join31(contextDir, "pack-manifest.json"), JSON.stringify(manifest, null, 2) + "\n");
|
|
8034
8079
|
writtenContextDir = contextDir;
|
|
@@ -9936,7 +9981,7 @@ async function cmdVerifyWorkflow(args) {
|
|
|
9936
9981
|
return;
|
|
9937
9982
|
}
|
|
9938
9983
|
if (workspaceMode) {
|
|
9939
|
-
const { cmdWorkspace } = await import("./workspace-
|
|
9984
|
+
const { cmdWorkspace } = await import("./workspace-JA2RZI6V.js");
|
|
9940
9985
|
await cmdWorkspace(process.cwd(), ["workspace", "health", ...withoutWorkflowOnlyFlags(args)]);
|
|
9941
9986
|
return;
|
|
9942
9987
|
}
|
|
@@ -10921,7 +10966,7 @@ async function main() {
|
|
|
10921
10966
|
break;
|
|
10922
10967
|
}
|
|
10923
10968
|
case "upgrade": {
|
|
10924
|
-
const { cmdUpgrade } = await import("./upgrade-
|
|
10969
|
+
const { cmdUpgrade } = await import("./upgrade-VON7Y3LG.js");
|
|
10925
10970
|
const applyFlag = args.includes("--apply");
|
|
10926
10971
|
await cmdUpgrade(process.cwd(), { apply: applyFlag });
|
|
10927
10972
|
break;
|
|
@@ -10934,9 +10979,12 @@ async function main() {
|
|
|
10934
10979
|
);
|
|
10935
10980
|
}
|
|
10936
10981
|
const { cmdHeal } = await import("./heal-2BDT7TR5.js");
|
|
10982
|
+
const { flags } = parseLooseArgs(args);
|
|
10983
|
+
const workspaceInfo = resolveWorkflowProject(flags, "check");
|
|
10984
|
+
if (!workspaceInfo) break;
|
|
10937
10985
|
const telemetryFlag = args.includes("--telemetry");
|
|
10938
10986
|
const brownfieldFlag = args.includes("--brownfield");
|
|
10939
|
-
await cmdHeal(
|
|
10987
|
+
await cmdHeal(workspaceInfo.appRoot, { telemetry: telemetryFlag, brownfield: brownfieldFlag });
|
|
10940
10988
|
break;
|
|
10941
10989
|
}
|
|
10942
10990
|
case "health": {
|
|
@@ -10973,7 +11021,7 @@ async function main() {
|
|
|
10973
11021
|
cmdStudioHelp();
|
|
10974
11022
|
break;
|
|
10975
11023
|
}
|
|
10976
|
-
const { cmdStudio, parseStudioArgs } = await import("./studio-
|
|
11024
|
+
const { cmdStudio, parseStudioArgs } = await import("./studio-EDQMI6JE.js");
|
|
10977
11025
|
await cmdStudio(process.cwd(), parseStudioArgs(args));
|
|
10978
11026
|
} catch (e) {
|
|
10979
11027
|
console.error(error3(e.message));
|
|
@@ -10987,7 +11035,7 @@ async function main() {
|
|
|
10987
11035
|
cmdWorkspaceHelp();
|
|
10988
11036
|
break;
|
|
10989
11037
|
}
|
|
10990
|
-
const { cmdWorkspace } = await import("./workspace-
|
|
11038
|
+
const { cmdWorkspace } = await import("./workspace-JA2RZI6V.js");
|
|
10991
11039
|
await cmdWorkspace(process.cwd(), args);
|
|
10992
11040
|
} catch (e) {
|
|
10993
11041
|
console.error(error3(e.message));
|
|
@@ -37,14 +37,25 @@ function findWorkspaceRoot(startDir) {
|
|
|
37
37
|
}
|
|
38
38
|
function looksLikeApp(dir, options = {}) {
|
|
39
39
|
const allowSourceDirs = options.allowSourceDirs ?? true;
|
|
40
|
-
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
40
|
+
const allowPackageDeps = options.allowPackageDeps ?? true;
|
|
43
41
|
const pkg = readPackageJson(dir);
|
|
44
42
|
const deps = { ...pkg?.dependencies, ...pkg?.devDependencies };
|
|
45
|
-
|
|
46
|
-
deps.react || deps.next || deps.vue || deps.svelte || deps["@angular/core"] || deps.astro || deps.nuxt
|
|
43
|
+
const hasFrontendDependency = Boolean(
|
|
44
|
+
deps.react || deps["react-dom"] || deps.next || deps.vue || deps.svelte || deps["@angular/core"] || deps.astro || deps.nuxt
|
|
47
45
|
);
|
|
46
|
+
const hasServerOnlyDependency = Boolean(
|
|
47
|
+
deps.hono || deps.express || deps.fastify || deps.koa || deps["@hapi/hapi"]
|
|
48
|
+
);
|
|
49
|
+
if (existsSync(join(dir, "next.config.js")) || existsSync(join(dir, "next.config.ts")) || existsSync(join(dir, "next.config.mjs")) || existsSync(join(dir, "vite.config.ts")) || existsSync(join(dir, "vite.config.js")) || existsSync(join(dir, "angular.json")) || existsSync(join(dir, "svelte.config.js")) || existsSync(join(dir, "svelte.config.ts")) || existsSync(join(dir, "astro.config.mjs"))) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
if (allowSourceDirs && (existsSync(join(dir, "src")) || existsSync(join(dir, "app")) || existsSync(join(dir, "pages")))) {
|
|
53
|
+
if (hasFrontendDependency) return true;
|
|
54
|
+
if (hasServerOnlyDependency) return false;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
if (!allowPackageDeps) return false;
|
|
58
|
+
return hasFrontendDependency;
|
|
48
59
|
}
|
|
49
60
|
function listWorkspaceApps(workspaceRoot) {
|
|
50
61
|
const candidates = [];
|
|
@@ -54,7 +65,10 @@ function listWorkspaceApps(workspaceRoot) {
|
|
|
54
65
|
for (const entry of readdirSync(baseDir, { withFileTypes: true })) {
|
|
55
66
|
if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
|
|
56
67
|
const candidate = join(baseDir, entry.name);
|
|
57
|
-
if (looksLikeApp(candidate, {
|
|
68
|
+
if (looksLikeApp(candidate, {
|
|
69
|
+
allowSourceDirs: base === "apps",
|
|
70
|
+
allowPackageDeps: base === "apps"
|
|
71
|
+
})) {
|
|
58
72
|
candidates.push(`${base}/${entry.name}`);
|
|
59
73
|
}
|
|
60
74
|
}
|
|
@@ -4989,7 +4989,8 @@ async function refreshDerivedFiles(projectRoot, essence, registry, prefetchedThe
|
|
|
4989
4989
|
themeData,
|
|
4990
4990
|
themeMode: mode,
|
|
4991
4991
|
voiceTone: storedVoice?.tone ? storedVoice.tone.split(".")[0] + "." : void 0,
|
|
4992
|
-
spatialHints: sectionSpatialHints
|
|
4992
|
+
spatialHints: sectionSpatialHints,
|
|
4993
|
+
adoptionMode: effectiveAdoptionMode
|
|
4993
4994
|
});
|
|
4994
4995
|
const sectionContextPath = join2(contextDir, `section-${section.id}.md`);
|
|
4995
4996
|
writeFileSync2(sectionContextPath, contextContent);
|
|
@@ -5345,7 +5346,8 @@ function generateSectionContext(input) {
|
|
|
5345
5346
|
themeHints,
|
|
5346
5347
|
constraints,
|
|
5347
5348
|
shellInfo,
|
|
5348
|
-
spatialHints
|
|
5349
|
+
spatialHints,
|
|
5350
|
+
adoptionMode
|
|
5349
5351
|
} = input;
|
|
5350
5352
|
const lines = [];
|
|
5351
5353
|
lines.push(`# Section: ${section.id}`);
|
|
@@ -5429,9 +5431,15 @@ function generateSectionContext(input) {
|
|
|
5429
5431
|
const decoratorDefs = input.themeData?.decorator_definitions;
|
|
5430
5432
|
const totalDecoratorCount = decoratorDefs && Object.keys(decoratorDefs).length || decorators.length;
|
|
5431
5433
|
if (totalDecoratorCount > 0) {
|
|
5432
|
-
|
|
5433
|
-
|
|
5434
|
-
|
|
5434
|
+
if (adoptionMode === "contract-only") {
|
|
5435
|
+
lines.push(
|
|
5436
|
+
`**Theme intent:** ${totalDecoratorCount} \`${themeName}-*\` decorator reference(s) exist, but this project is contract-only. Translate the intent into the app's current styling system instead of applying Decantr decorator classes directly.`
|
|
5437
|
+
);
|
|
5438
|
+
} else {
|
|
5439
|
+
lines.push(
|
|
5440
|
+
`**Theme decorators:** ${totalDecoratorCount} \`${themeName}-*\` classes \u2014 full Class/Intent/Apply-to table in \`section-${section.id}-pack.md\` (preferred) and DECANTR.md "Decorator Quick Reference". MUST apply.`
|
|
5441
|
+
);
|
|
5442
|
+
}
|
|
5435
5443
|
lines.push("");
|
|
5436
5444
|
}
|
|
5437
5445
|
if (themeHints) {
|
|
@@ -5454,9 +5462,15 @@ function generateSectionContext(input) {
|
|
|
5454
5462
|
}
|
|
5455
5463
|
const themePrefix = themeName.split("-")[0] || themeName;
|
|
5456
5464
|
lines.push("");
|
|
5457
|
-
|
|
5458
|
-
|
|
5459
|
-
|
|
5465
|
+
if (adoptionMode === "contract-only") {
|
|
5466
|
+
lines.push(
|
|
5467
|
+
"Usage: implement this section through the app's existing styling authority (design-system components, Tailwind/Sass/theme tokens, CVA variants, or accepted local rules). Do not add `@decantr/css`, `css(...)`, `d-*` treatments, or Decantr token CSS unless adoption mode changes."
|
|
5468
|
+
);
|
|
5469
|
+
} else {
|
|
5470
|
+
lines.push(
|
|
5471
|
+
`Usage: \`className={css('_flex _col _gap4') + ' d-surface ${themePrefix}-glass'}\` \u2014 atoms via css(), treatments and theme decorators as plain class strings.`
|
|
5472
|
+
);
|
|
5473
|
+
}
|
|
5460
5474
|
lines.push("");
|
|
5461
5475
|
lines.push("---");
|
|
5462
5476
|
lines.push("");
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decantr/cli",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.1",
|
|
4
4
|
"description": "Decantr CLI - scaffold, audit, inspect Project Health, and maintain Decantr projects from the terminal",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"decantr",
|
|
@@ -48,11 +48,11 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"ajv": "^8.20.0",
|
|
51
|
-
"@decantr/core": "2.1.0",
|
|
52
|
-
"@decantr/registry": "2.2.0",
|
|
53
51
|
"@decantr/essence-spec": "2.0.1",
|
|
54
52
|
"@decantr/telemetry": "2.2.1",
|
|
55
|
-
"@decantr/
|
|
53
|
+
"@decantr/registry": "2.2.0",
|
|
54
|
+
"@decantr/core": "2.1.0",
|
|
55
|
+
"@decantr/verifier": "2.3.1"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"build": "tsup",
|