@calibrate-ds/cli 0.1.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/__tests__/component-slug.test.d.ts +2 -0
- package/dist/__tests__/component-slug.test.d.ts.map +1 -0
- package/dist/__tests__/component-slug.test.js +54 -0
- package/dist/__tests__/component-slug.test.js.map +1 -0
- package/dist/__tests__/lock-changes.test.d.ts +2 -0
- package/dist/__tests__/lock-changes.test.d.ts.map +1 -0
- package/dist/__tests__/lock-changes.test.js +81 -0
- package/dist/__tests__/lock-changes.test.js.map +1 -0
- package/dist/__tests__/permissions.test.d.ts +2 -0
- package/dist/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/__tests__/permissions.test.js +67 -0
- package/dist/__tests__/permissions.test.js.map +1 -0
- package/dist/__tests__/stamp-in-lock.test.d.ts +2 -0
- package/dist/__tests__/stamp-in-lock.test.d.ts.map +1 -0
- package/dist/__tests__/stamp-in-lock.test.js +102 -0
- package/dist/__tests__/stamp-in-lock.test.js.map +1 -0
- package/dist/__tests__/status-logic.test.d.ts +2 -0
- package/dist/__tests__/status-logic.test.d.ts.map +1 -0
- package/dist/__tests__/status-logic.test.js +74 -0
- package/dist/__tests__/status-logic.test.js.map +1 -0
- package/dist/__tests__/team-roster.test.d.ts +2 -0
- package/dist/__tests__/team-roster.test.d.ts.map +1 -0
- package/dist/__tests__/team-roster.test.js +97 -0
- package/dist/__tests__/team-roster.test.js.map +1 -0
- package/dist/ai/claude-provider.d.ts +13 -0
- package/dist/ai/claude-provider.d.ts.map +1 -0
- package/dist/ai/claude-provider.js +335 -0
- package/dist/ai/claude-provider.js.map +1 -0
- package/dist/ai/enhance-doc.d.ts +24 -0
- package/dist/ai/enhance-doc.d.ts.map +1 -0
- package/dist/ai/enhance-doc.js +272 -0
- package/dist/ai/enhance-doc.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +13 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +345 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/prompt-utils.d.ts +23 -0
- package/dist/ai/prompt-utils.d.ts.map +1 -0
- package/dist/ai/prompt-utils.js +67 -0
- package/dist/ai/prompt-utils.js.map +1 -0
- package/dist/commands/ai.d.ts +8 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +576 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/apply.d.ts +4 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +98 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/assign.d.ts +5 -0
- package/dist/commands/assign.d.ts.map +1 -0
- package/dist/commands/assign.js +180 -0
- package/dist/commands/assign.js.map +1 -0
- package/dist/commands/ci.d.ts +4 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +84 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/context.d.ts +19 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +297 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/diff.d.ts +2 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +119 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +348 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/document-system.d.ts +5 -0
- package/dist/commands/document-system.d.ts.map +1 -0
- package/dist/commands/document-system.js +84 -0
- package/dist/commands/document-system.js.map +1 -0
- package/dist/commands/document.d.ts +6 -0
- package/dist/commands/document.d.ts.map +1 -0
- package/dist/commands/document.js +276 -0
- package/dist/commands/document.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +74 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/generate-components.d.ts +4 -0
- package/dist/commands/generate-components.d.ts.map +1 -0
- package/dist/commands/generate-components.js +62 -0
- package/dist/commands/generate-components.js.map +1 -0
- package/dist/commands/generate-composites.d.ts +2 -0
- package/dist/commands/generate-composites.d.ts.map +1 -0
- package/dist/commands/generate-composites.js +31 -0
- package/dist/commands/generate-composites.js.map +1 -0
- package/dist/commands/generate-tokens.d.ts +2 -0
- package/dist/commands/generate-tokens.d.ts.map +1 -0
- package/dist/commands/generate-tokens.js +48 -0
- package/dist/commands/generate-tokens.js.map +1 -0
- package/dist/commands/help-topics.d.ts +2 -0
- package/dist/commands/help-topics.d.ts.map +1 -0
- package/dist/commands/help-topics.js +324 -0
- package/dist/commands/help-topics.js.map +1 -0
- package/dist/commands/implement.d.ts +5 -0
- package/dist/commands/implement.d.ts.map +1 -0
- package/dist/commands/implement.js +595 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/import-tokens.d.ts +2 -0
- package/dist/commands/import-tokens.d.ts.map +1 -0
- package/dist/commands/import-tokens.js +42 -0
- package/dist/commands/import-tokens.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +410 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect-component.d.ts +2 -0
- package/dist/commands/inspect-component.d.ts.map +1 -0
- package/dist/commands/inspect-component.js +146 -0
- package/dist/commands/inspect-component.js.map +1 -0
- package/dist/commands/log.d.ts +4 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +109 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/onboarding.d.ts +9 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +63 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/plan.d.ts +3 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +108 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/prompt.d.ts +5 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +77 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/prune.d.ts +2 -0
- package/dist/commands/prune.d.ts.map +1 -0
- package/dist/commands/prune.js +95 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +76 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/scaffold.d.ts +2 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +47 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +91 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/stamp.d.ts +11 -0
- package/dist/commands/stamp.d.ts.map +1 -0
- package/dist/commands/stamp.js +147 -0
- package/dist/commands/stamp.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +219 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/team.d.ts +7 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +173 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +303 -0
- package/dist/index.js.map +1 -0
- package/dist/onboarding/content.d.ts +39 -0
- package/dist/onboarding/content.d.ts.map +1 -0
- package/dist/onboarding/content.js +82 -0
- package/dist/onboarding/content.js.map +1 -0
- package/dist/utils/component-slug.d.ts +10 -0
- package/dist/utils/component-slug.d.ts.map +1 -0
- package/dist/utils/component-slug.js +13 -0
- package/dist/utils/component-slug.js.map +1 -0
- package/dist/utils/framework-registry.d.ts +41 -0
- package/dist/utils/framework-registry.d.ts.map +1 -0
- package/dist/utils/framework-registry.js +82 -0
- package/dist/utils/framework-registry.js.map +1 -0
- package/dist/utils/gitignore.d.ts +4 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +67 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/lock-changes.d.ts +14 -0
- package/dist/utils/lock-changes.d.ts.map +1 -0
- package/dist/utils/lock-changes.js +26 -0
- package/dist/utils/lock-changes.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/permissions.d.ts +17 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +37 -0
- package/dist/utils/permissions.js.map +1 -0
- package/dist/utils/status-logic.d.ts +16 -0
- package/dist/utils/status-logic.d.ts.map +1 -0
- package/dist/utils/status-logic.js +32 -0
- package/dist/utils/status-logic.js.map +1 -0
- package/dist/utils/storybook-setup.d.ts +5 -0
- package/dist/utils/storybook-setup.d.ts.map +1 -0
- package/dist/utils/storybook-setup.js +104 -0
- package/dist/utils/storybook-setup.js.map +1 -0
- package/dist/utils/team-roster.d.ts +35 -0
- package/dist/utils/team-roster.d.ts.map +1 -0
- package/dist/utils/team-roster.js +99 -0
- package/dist/utils/team-roster.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { loadConfig, loadLatestSnapshot, resolveComponent } from "@calibrate-ds/core";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
export async function inspectComponentCommand(name) {
|
|
4
|
+
try {
|
|
5
|
+
const config = await loadConfig();
|
|
6
|
+
const snapshot = await loadLatestSnapshot(config);
|
|
7
|
+
if (!snapshot || !snapshot.components) {
|
|
8
|
+
logger.warn("No snapshot found. Please run 'ptb scan' first.");
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const resolution = resolveComponent(name, snapshot.components, config);
|
|
12
|
+
const component = resolution.exactMatch;
|
|
13
|
+
if (!component) {
|
|
14
|
+
logger.error(`Component '${name}' not found.`);
|
|
15
|
+
if (resolution.suggestions && resolution.suggestions.length > 0) {
|
|
16
|
+
logger.info("Did you mean:");
|
|
17
|
+
resolution.suggestions.forEach((s) => logger.dim(` - ${s}`));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
logger.info("Available components:");
|
|
21
|
+
const availableNames = snapshot.components.map((c) => c.name).sort();
|
|
22
|
+
availableNames.forEach((n) => logger.dim(` - ${n}`));
|
|
23
|
+
}
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Output formatting
|
|
27
|
+
console.log(`\nComponent: ${component.name}\n`);
|
|
28
|
+
console.log(`Type: ${component.type || component.kind || "canonical"}\n`);
|
|
29
|
+
if (component.properties && component.properties.length > 0) {
|
|
30
|
+
console.log("Variants:");
|
|
31
|
+
for (const prop of component.properties) {
|
|
32
|
+
console.log(`${prop.name}:`);
|
|
33
|
+
if (prop.options) {
|
|
34
|
+
for (const opt of prop.options) {
|
|
35
|
+
console.log(` - ${opt}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (prop.type === "boolean") {
|
|
39
|
+
console.log(` - true\n - false`);
|
|
40
|
+
}
|
|
41
|
+
console.log();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (component.variants && component.variants.length > 0) {
|
|
45
|
+
console.log("Variants:");
|
|
46
|
+
for (const v of component.variants) {
|
|
47
|
+
console.log(`${v.name}:`);
|
|
48
|
+
if (v.options) {
|
|
49
|
+
for (const opt of v.options) {
|
|
50
|
+
console.log(` - ${opt}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
console.log();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (component.styleMetadata) {
|
|
57
|
+
const slots = Object.keys(component.styleMetadata);
|
|
58
|
+
if (slots.length > 0) {
|
|
59
|
+
console.log("Slots:");
|
|
60
|
+
for (const slot of slots) {
|
|
61
|
+
console.log(`- ${slot}`);
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (component.layout) {
|
|
67
|
+
console.log("Layout:");
|
|
68
|
+
console.log(`direction: ${component.layout.direction}`);
|
|
69
|
+
if (component.layout.gap) {
|
|
70
|
+
console.log(`gap: ${component.layout.gap.rawValue}${component.layout.gap.mode === "auto" ? " (auto)" : ""}`);
|
|
71
|
+
}
|
|
72
|
+
if (component.layout.padding) {
|
|
73
|
+
const p = component.layout.padding;
|
|
74
|
+
console.log(`padding: ${p.top.rawValue}px ${p.right.rawValue}px ${p.bottom.rawValue}px ${p.left.rawValue}px`);
|
|
75
|
+
}
|
|
76
|
+
if (component.layout.mainAlignment)
|
|
77
|
+
console.log(`mainAlignment: ${component.layout.mainAlignment}`);
|
|
78
|
+
if (component.layout.crossAlignment)
|
|
79
|
+
console.log(`crossAlignment: ${component.layout.crossAlignment}`);
|
|
80
|
+
console.log();
|
|
81
|
+
}
|
|
82
|
+
// Nested Instances
|
|
83
|
+
if (component.layoutTree) {
|
|
84
|
+
// Find all componentId references recursively
|
|
85
|
+
const nestedIds = new Set();
|
|
86
|
+
const traverse = (node) => {
|
|
87
|
+
if (node.componentId)
|
|
88
|
+
nestedIds.add(node.componentId);
|
|
89
|
+
if (node.children) {
|
|
90
|
+
for (const child of node.children)
|
|
91
|
+
traverse(child);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
traverse(component.layoutTree);
|
|
95
|
+
if (nestedIds.size > 0) {
|
|
96
|
+
console.log("Nested Instances:");
|
|
97
|
+
for (const id of nestedIds) {
|
|
98
|
+
const nestedComp = snapshot.components.find((c) => c.id === id);
|
|
99
|
+
if (nestedComp) {
|
|
100
|
+
console.log(`- ${nestedComp.name}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (component.composite && component.composite.children) {
|
|
107
|
+
const nestedSet = new Set();
|
|
108
|
+
for (const child of component.composite.children) {
|
|
109
|
+
if ('componentId' in child) {
|
|
110
|
+
const refId = child.componentId;
|
|
111
|
+
const nestedComp = snapshot.components.find((c) => c.id === refId);
|
|
112
|
+
if (nestedComp)
|
|
113
|
+
nestedSet.add(nestedComp.name);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (nestedSet.size > 0) {
|
|
117
|
+
console.log("Nested Instances:");
|
|
118
|
+
for (const name of nestedSet) {
|
|
119
|
+
console.log(`- ${name}`);
|
|
120
|
+
}
|
|
121
|
+
console.log();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Tokens Used
|
|
125
|
+
if (component.styleMetadata) {
|
|
126
|
+
const tokensUsed = new Set();
|
|
127
|
+
for (const val of Object.values(component.styleMetadata)) {
|
|
128
|
+
if (typeof val === "string" && val.startsWith("{") && val.endsWith("}")) {
|
|
129
|
+
tokensUsed.add(val.slice(1, -1));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (tokensUsed.size > 0) {
|
|
133
|
+
console.log("Tokens Used:");
|
|
134
|
+
for (const t of tokensUsed) {
|
|
135
|
+
console.log(`- ${t}`);
|
|
136
|
+
}
|
|
137
|
+
console.log();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
logger.error(error.message || String(error));
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=inspect-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect-component.js","sourceRoot":"","sources":["../../src/commands/inspect-component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAQA,wBAAsB,UAAU,CAAC,OAAO,GAAE;IAAE,CAAC,CAAC,EAAE,MAAM,CAAA;CAAO,iBA2G5D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { loadConfig, resolveDSPaths } from "@calibrate-ds/core";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { detectLockChanges } from "../utils/lock-changes.js";
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import { execSync } from "node:child_process";
|
|
7
|
+
export async function logCommand(options = {}) {
|
|
8
|
+
try {
|
|
9
|
+
const config = await loadConfig();
|
|
10
|
+
const { workspaceRoot } = resolveDSPaths(config);
|
|
11
|
+
const lockPath = path.join(workspaceRoot, "ptb.lock");
|
|
12
|
+
// Verify ptb.lock exists
|
|
13
|
+
try {
|
|
14
|
+
await fs.access(lockPath);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
logger.error("ptb.lock not found. Run 'ptb scan' first.");
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const limit = options.n ?? 30;
|
|
21
|
+
// Get git log for ptb.lock — each commit as JSON-friendly format
|
|
22
|
+
let gitOut;
|
|
23
|
+
try {
|
|
24
|
+
gitOut = execSync(`git log --follow --format="%H|%ai|%an|%ae|%s" -n ${limit * 5} -- "${lockPath}"`, { encoding: "utf-8", maxBuffer: 10 * 1024 * 1024, cwd: workspaceRoot });
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
logger.warn("Not a git repository or ptb.lock has no commits yet.");
|
|
28
|
+
logger.dim(" Commit ptb.lock after your first stamp to start tracking history.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const commitLines = gitOut.trim().split("\n").filter(Boolean);
|
|
32
|
+
if (commitLines.length === 0) {
|
|
33
|
+
logger.info("No ptb.lock history yet. Commit it after your first stamp.");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// For each commit, get the ptb.lock content at that point and diff vs previous
|
|
37
|
+
const rows = [];
|
|
38
|
+
for (const line of commitLines) {
|
|
39
|
+
if (rows.length >= limit)
|
|
40
|
+
break;
|
|
41
|
+
const [hash, date, author, , subject] = line.split("|");
|
|
42
|
+
if (!hash)
|
|
43
|
+
continue;
|
|
44
|
+
// Get ptb.lock content at this commit
|
|
45
|
+
let content;
|
|
46
|
+
try {
|
|
47
|
+
content = execSync(`git show ${hash}:ptb.lock 2>/dev/null`, {
|
|
48
|
+
encoding: "utf-8", cwd: workspaceRoot, maxBuffer: 5 * 1024 * 1024
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
let lockAtCommit;
|
|
55
|
+
try {
|
|
56
|
+
lockAtCommit = JSON.parse(content);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Get previous commit's ptb.lock for comparison
|
|
62
|
+
let prevContent;
|
|
63
|
+
let prevLock = { schemaVersion: "1.0.0", components: {} };
|
|
64
|
+
try {
|
|
65
|
+
prevContent = execSync(`git show ${hash}^:ptb.lock 2>/dev/null`, {
|
|
66
|
+
encoding: "utf-8", cwd: workspaceRoot, maxBuffer: 5 * 1024 * 1024
|
|
67
|
+
});
|
|
68
|
+
prevLock = JSON.parse(prevContent);
|
|
69
|
+
}
|
|
70
|
+
catch { /* first commit or file not in parent */ }
|
|
71
|
+
const dayStr = date.slice(0, 10);
|
|
72
|
+
for (const change of detectLockChanges(lockAtCommit, prevLock)) {
|
|
73
|
+
if (rows.length >= limit)
|
|
74
|
+
break;
|
|
75
|
+
const who = change.event === "stamped" ? (change.stampedBy ?? author) : author;
|
|
76
|
+
rows.push({ date: dayStr, author: who, event: change.event, component: change.displayName });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (rows.length === 0) {
|
|
80
|
+
// Fallback: show current lock state
|
|
81
|
+
logger.info("PTB Component History\n");
|
|
82
|
+
logger.dim(" No detailed history available. Showing current stamp state:\n");
|
|
83
|
+
const lock = JSON.parse(await fs.readFile(lockPath, "utf-8"));
|
|
84
|
+
for (const entry of Object.values(lock.components)) {
|
|
85
|
+
if (entry.stampedAt) {
|
|
86
|
+
const who = entry.stampedBy ?? "unknown";
|
|
87
|
+
const date = entry.stampedAt.slice(0, 10);
|
|
88
|
+
const msg = entry.stampedMessage ? ` "${entry.stampedMessage}"` : "";
|
|
89
|
+
console.log(` ${date} ${who.slice(0, 28).padEnd(28)} \x1b[32mstamped\x1b[0m ${entry.displayName}${msg}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
logger.info("PTB Component History\n");
|
|
95
|
+
for (const row of rows) {
|
|
96
|
+
const eventColor = row.event === "stamped" ? "\x1b[32m" :
|
|
97
|
+
row.event === "design changed" ? "\x1b[34m" :
|
|
98
|
+
row.event === "component added" ? "\x1b[32m" :
|
|
99
|
+
row.event === "component removed" ? "\x1b[31m" : "\x1b[90m";
|
|
100
|
+
console.log(` ${row.date} ${row.author.slice(0, 22).padEnd(22)} ` +
|
|
101
|
+
`${eventColor}${row.event.padEnd(16)}\x1b[0m ${row.component}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger.error(error.message || String(error));
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/commands/onboarding.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,YAAY,kBAoCjC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,iBAyB7C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { LEARN_CONTENT, FLOW_DIRECT, FLOW_PLUGIN, TROUBLESHOOTING } from "../onboarding/content.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handler for 'ptb learn'
|
|
5
|
+
*/
|
|
6
|
+
export async function learnCommand() {
|
|
7
|
+
console.log(`\n\x1b[1m\x1b[36m=== ${LEARN_CONTENT.intro.title} ===\x1b[0m`);
|
|
8
|
+
console.log(`\n${LEARN_CONTENT.intro.description}`);
|
|
9
|
+
console.log(`\n\x1b[1m\x1b[35m--- Prerequisites ---\x1b[0m`);
|
|
10
|
+
LEARN_CONTENT.prerequisites.forEach((p) => {
|
|
11
|
+
console.log(`\x1b[1m• ${p.item}:\x1b[0m ${p.detail}`);
|
|
12
|
+
});
|
|
13
|
+
console.log(`\n\x1b[1m\x1b[35m--- PTB Workflow Overview ---\x1b[0m`);
|
|
14
|
+
LEARN_CONTENT.workflowOverview.forEach((step, i) => {
|
|
15
|
+
console.log(`${i + 1}. ${step}`);
|
|
16
|
+
});
|
|
17
|
+
console.log(`\n\x1b[1m\x1b[35m--- Plugin Export Workflow (Figma Pro) ---\x1b[0m`);
|
|
18
|
+
LEARN_CONTENT.pluginWorkflow.forEach((step, i) => {
|
|
19
|
+
console.log(`${i + 1}. ${step}`);
|
|
20
|
+
});
|
|
21
|
+
console.log(`\n\x1b[1m\x1b[35m--- Direct Fetch Workflow (Organization / Enterprise) ---\x1b[0m`);
|
|
22
|
+
LEARN_CONTENT.directWorkflow.forEach((step, i) => {
|
|
23
|
+
console.log(`${i + 1}. ${step}`);
|
|
24
|
+
});
|
|
25
|
+
console.log(`\n\x1b[1m\x1b[35m--- Token Import ---\x1b[0m`);
|
|
26
|
+
console.log(LEARN_CONTENT.tokenImport.description);
|
|
27
|
+
console.log(`Plugin path: \x1b[1m${LEARN_CONTENT.tokenImport.pluginPath}\x1b[0m`);
|
|
28
|
+
console.log(`Manual command: \x1b[1m${LEARN_CONTENT.tokenImport.manualCommand}\x1b[0m`);
|
|
29
|
+
console.log(`\n\x1b[1m\x1b[33m--- Troubleshooting ---\x1b[0m`);
|
|
30
|
+
TROUBLESHOOTING.forEach((item) => {
|
|
31
|
+
console.log(`\x1b[1m[Issue]\x1b[0m ${item.issue}`);
|
|
32
|
+
console.log(`\x1b[32m[Fix]\x1b[0m ${item.fix}\n`);
|
|
33
|
+
});
|
|
34
|
+
console.log(`\x1b[2mRun 'ptb --help' for a full list of commands.\x1b[0m\n`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Handler for 'ptb flow <type>'
|
|
38
|
+
*/
|
|
39
|
+
export async function flowCommand(type) {
|
|
40
|
+
let activeFlow = null;
|
|
41
|
+
let label = "";
|
|
42
|
+
if (type === "direct") {
|
|
43
|
+
activeFlow = FLOW_DIRECT;
|
|
44
|
+
label = "Direct Fetch Workflow (Organization / Enterprise)";
|
|
45
|
+
}
|
|
46
|
+
else if (type === "plugin") {
|
|
47
|
+
activeFlow = FLOW_PLUGIN;
|
|
48
|
+
label = "Plugin Export Workflow (Figma Pro — Calibrate plugin)";
|
|
49
|
+
}
|
|
50
|
+
if (!activeFlow) {
|
|
51
|
+
logger.error(`Unknown flow type: '${type}'. Use 'direct' or 'plugin'.`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
console.log(`\x1b[1m\x1b[36m=== PTB Checklist: ${label} ===\x1b[0m\n`);
|
|
55
|
+
if (activeFlow.before) {
|
|
56
|
+
console.log(`\x1b[33m${activeFlow.before}\x1b[0m\n`);
|
|
57
|
+
}
|
|
58
|
+
activeFlow.steps.forEach((s) => {
|
|
59
|
+
console.log(`[\x1b[32m${s.step}\x1b[0m] ${s.action}`);
|
|
60
|
+
});
|
|
61
|
+
console.log(`\n\x1b[2mRun 'ptb learn' for detailed concepts.\x1b[0m\n`);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/commands/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAWA,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,iBAqDtD;AAED,wBAAsB,WAAW,kBAmEhC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { loadConfig, loadLatestSnapshot, loadPreviousSnapshot, computeDesignDiff, resolveAffectedFiles, resolveComponent, planImplementation } from "@calibrate-ds/core";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
export async function planImplementCommand(name) {
|
|
4
|
+
try {
|
|
5
|
+
const config = await loadConfig();
|
|
6
|
+
const snapshot = await loadLatestSnapshot(config);
|
|
7
|
+
if (!snapshot || !snapshot.components) {
|
|
8
|
+
logger.warn("No snapshot found. Please run 'ptb scan' first.");
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const resolution = resolveComponent(name, snapshot.components, config);
|
|
12
|
+
const component = resolution.exactMatch;
|
|
13
|
+
if (!component) {
|
|
14
|
+
logger.error(`Component '${name}' not found.`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
logger.info(`Planning implementation for: \x1b[36m${component.name}\x1b[0m\n`);
|
|
18
|
+
const plan = await planImplementation(component.id, snapshot, config);
|
|
19
|
+
console.log(`\x1b[1mImplementation Order\x1b[0m`);
|
|
20
|
+
console.log(`\x1b[2mOrdered from dependencies up to target component\x1b[0m\n`);
|
|
21
|
+
for (let i = 0; i < plan.order.length; i++) {
|
|
22
|
+
const entry = plan.order[i];
|
|
23
|
+
const isTarget = entry.id === component.id;
|
|
24
|
+
const prefix = isTarget ? "\x1b[32m→\x1b[0m" : ` ${i + 1}.`;
|
|
25
|
+
let statusLabel = "";
|
|
26
|
+
if (entry.status === "ready")
|
|
27
|
+
statusLabel = " \x1b[32m(Ready)\x1b[0m";
|
|
28
|
+
else if (entry.status === "missing")
|
|
29
|
+
statusLabel = " \x1b[31m(Missing)\x1b[0m";
|
|
30
|
+
else if (entry.status === "external")
|
|
31
|
+
statusLabel = " \x1b[33m(External)\x1b[0m";
|
|
32
|
+
const namePart = isTarget ? `\x1b[1m${entry.name}\x1b[0m` : entry.name;
|
|
33
|
+
console.log(`${prefix} ${namePart}${statusLabel}`);
|
|
34
|
+
}
|
|
35
|
+
if (plan.missingDependencies.length > 0) {
|
|
36
|
+
console.log(`\n\x1b[31m[!] Missing dependencies detected:\x1b[0m`);
|
|
37
|
+
for (const dep of plan.missingDependencies) {
|
|
38
|
+
console.log(`- ${dep}`);
|
|
39
|
+
}
|
|
40
|
+
console.log(`\n\x1b[2mRecommendation: Implement missing components in the order shown above.\x1b[0m`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log(`\n\x1b[32m✔ All dependencies are ready. Ready for implementation!\x1b[0m`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
logger.error(error.message || String(error));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export async function planCommand() {
|
|
52
|
+
try {
|
|
53
|
+
logger.info("Loading ptb.config.json...");
|
|
54
|
+
const config = await loadConfig();
|
|
55
|
+
logger.info("Loading latest snapshot...");
|
|
56
|
+
const currentModel = await loadLatestSnapshot(config);
|
|
57
|
+
if (!currentModel) {
|
|
58
|
+
logger.warn("No current snapshot found. Please run 'ptb scan' first to establish a baseline.");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
logger.info("Loading previous snapshot from history...");
|
|
62
|
+
const previousData = await loadPreviousSnapshot(config);
|
|
63
|
+
if (!previousData) {
|
|
64
|
+
logger.warn("No previous snapshot found. Run 'ptb scan' at least twice to compare changes.");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
logger.info("\nComputing impact plan...\n");
|
|
68
|
+
const summary = computeDesignDiff(previousData.model, currentModel);
|
|
69
|
+
const plan = resolveAffectedFiles(summary, config);
|
|
70
|
+
if (plan.components.size === 0 && plan.sharedFiles.length === 0) {
|
|
71
|
+
console.log("No affected files. No design changes detected.");
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
console.log(`\x1b[1mPatch plan\x1b[0m\n`);
|
|
75
|
+
if (plan.components.size > 0) {
|
|
76
|
+
console.log(`\x1b[1mComponents affected:\x1b[0m`);
|
|
77
|
+
for (const [componentName, files] of plan.components.entries()) {
|
|
78
|
+
console.log(`- ${componentName}`);
|
|
79
|
+
console.log(` Files:`);
|
|
80
|
+
for (const file of files) {
|
|
81
|
+
console.log(` - ${file}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
console.log("");
|
|
85
|
+
}
|
|
86
|
+
if (plan.sharedFiles.length > 0) {
|
|
87
|
+
console.log(`\x1b[1mShared token files potentially affected:\x1b[0m`);
|
|
88
|
+
for (const file of plan.sharedFiles) {
|
|
89
|
+
console.log(`- ${file}`);
|
|
90
|
+
}
|
|
91
|
+
console.log("");
|
|
92
|
+
}
|
|
93
|
+
if (plan.staleComponents && plan.staleComponents.size > 0) {
|
|
94
|
+
console.log(`\x1b[1mStale generated artifacts that can be pruned:\x1b[0m`);
|
|
95
|
+
for (const [componentName, staleData] of plan.staleComponents.entries()) {
|
|
96
|
+
console.log(`- ${componentName}`);
|
|
97
|
+
console.log(` Folder: ${staleData.folder}`);
|
|
98
|
+
}
|
|
99
|
+
console.log("");
|
|
100
|
+
console.log("");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
logger.error(error.message || String(error));
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAMA,wBAAsB,sBAAsB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBAgFxD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { loadConfig, loadLatestSnapshot, resolveComponent, loadManifest, getComponentContext, generateComponentPrompt, resolveDSPaths } from "@calibrate-ds/core";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
export async function promptComponentCommand(name, options = {}) {
|
|
6
|
+
try {
|
|
7
|
+
const config = await loadConfig();
|
|
8
|
+
const snapshot = await loadLatestSnapshot(config);
|
|
9
|
+
if (!snapshot || !snapshot.components) {
|
|
10
|
+
logger.warn("No snapshot found. Please run 'ptb scan' first.");
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
// Dot/wildcard: generate prompts for all components and write to .ptb/prompts/
|
|
14
|
+
if (name === "." || name === "*") {
|
|
15
|
+
const { metadataDir } = resolveDSPaths(config);
|
|
16
|
+
const promptsDir = path.join(metadataDir, "prompts");
|
|
17
|
+
await fs.mkdir(promptsDir, { recursive: true });
|
|
18
|
+
const framework = options.framework || null;
|
|
19
|
+
const manifest = await loadManifest(config);
|
|
20
|
+
const components = snapshot.components;
|
|
21
|
+
let written = 0;
|
|
22
|
+
let failed = 0;
|
|
23
|
+
logger.info(`Generating prompts for ${components.length} components...`);
|
|
24
|
+
for (const component of components) {
|
|
25
|
+
const context = await getComponentContext(component.id, snapshot, config, manifest);
|
|
26
|
+
if (!context) {
|
|
27
|
+
failed++;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const promptPackage = generateComponentPrompt(context, framework);
|
|
31
|
+
const slug = component.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
32
|
+
const outPath = path.join(promptsDir, `${slug}.md`);
|
|
33
|
+
await fs.writeFile(outPath, promptPackage.promptText, "utf-8");
|
|
34
|
+
logger.dim(` ✔ ${component.name} → ${path.relative(process.cwd(), outPath)}`);
|
|
35
|
+
written++;
|
|
36
|
+
}
|
|
37
|
+
logger.success(`${written} prompt(s) written to ${path.relative(process.cwd(), promptsDir)}`);
|
|
38
|
+
if (failed > 0)
|
|
39
|
+
logger.warn(`${failed} component(s) skipped (context unavailable)`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const resolution = resolveComponent(name, snapshot.components, config);
|
|
43
|
+
const component = resolution.exactMatch;
|
|
44
|
+
if (!component) {
|
|
45
|
+
logger.error(`Component '${name}' not found.`);
|
|
46
|
+
if (resolution.suggestions && resolution.suggestions.length > 0) {
|
|
47
|
+
logger.info("Did you mean:");
|
|
48
|
+
resolution.suggestions.forEach((s) => logger.dim(` - ${s}`));
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const manifest = await loadManifest(config);
|
|
53
|
+
const context = await getComponentContext(component.id, snapshot, config, manifest);
|
|
54
|
+
if (!context) {
|
|
55
|
+
logger.error(`Failed to construct context for '${name}'.`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const framework = options.framework || null;
|
|
59
|
+
const promptPackage = generateComponentPrompt(context, framework);
|
|
60
|
+
if (options.format === "json") {
|
|
61
|
+
console.log(JSON.stringify(promptPackage, null, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Default: Human-Readable Output
|
|
65
|
+
console.log(`\n\x1b[1mPTB AI Build Prompt:\x1b[0m \x1b[36m${component.name}\x1b[0m`);
|
|
66
|
+
console.log(`\x1b[2mFramework Target: ${framework || "General"}\x1b[0m`);
|
|
67
|
+
console.log("\x1b[2m--------------------------------------------------\x1b[0m\n");
|
|
68
|
+
console.log(promptPackage.promptText);
|
|
69
|
+
console.log("\n\x1b[2m--------------------------------------------------\x1b[0m");
|
|
70
|
+
console.log("\x1b[1mTip:\x1b[0m Copy this prompt into your AI IDE to implement this component.");
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.error(error.message || String(error));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../src/commands/prune.ts"],"names":[],"mappings":"AAYA,wBAAsB,YAAY,kBAqGjC"}
|