@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.
Files changed (201) hide show
  1. package/dist/__tests__/component-slug.test.d.ts +2 -0
  2. package/dist/__tests__/component-slug.test.d.ts.map +1 -0
  3. package/dist/__tests__/component-slug.test.js +54 -0
  4. package/dist/__tests__/component-slug.test.js.map +1 -0
  5. package/dist/__tests__/lock-changes.test.d.ts +2 -0
  6. package/dist/__tests__/lock-changes.test.d.ts.map +1 -0
  7. package/dist/__tests__/lock-changes.test.js +81 -0
  8. package/dist/__tests__/lock-changes.test.js.map +1 -0
  9. package/dist/__tests__/permissions.test.d.ts +2 -0
  10. package/dist/__tests__/permissions.test.d.ts.map +1 -0
  11. package/dist/__tests__/permissions.test.js +67 -0
  12. package/dist/__tests__/permissions.test.js.map +1 -0
  13. package/dist/__tests__/stamp-in-lock.test.d.ts +2 -0
  14. package/dist/__tests__/stamp-in-lock.test.d.ts.map +1 -0
  15. package/dist/__tests__/stamp-in-lock.test.js +102 -0
  16. package/dist/__tests__/stamp-in-lock.test.js.map +1 -0
  17. package/dist/__tests__/status-logic.test.d.ts +2 -0
  18. package/dist/__tests__/status-logic.test.d.ts.map +1 -0
  19. package/dist/__tests__/status-logic.test.js +74 -0
  20. package/dist/__tests__/status-logic.test.js.map +1 -0
  21. package/dist/__tests__/team-roster.test.d.ts +2 -0
  22. package/dist/__tests__/team-roster.test.d.ts.map +1 -0
  23. package/dist/__tests__/team-roster.test.js +97 -0
  24. package/dist/__tests__/team-roster.test.js.map +1 -0
  25. package/dist/ai/claude-provider.d.ts +13 -0
  26. package/dist/ai/claude-provider.d.ts.map +1 -0
  27. package/dist/ai/claude-provider.js +335 -0
  28. package/dist/ai/claude-provider.js.map +1 -0
  29. package/dist/ai/enhance-doc.d.ts +24 -0
  30. package/dist/ai/enhance-doc.d.ts.map +1 -0
  31. package/dist/ai/enhance-doc.js +272 -0
  32. package/dist/ai/enhance-doc.js.map +1 -0
  33. package/dist/ai/openai-provider.d.ts +13 -0
  34. package/dist/ai/openai-provider.d.ts.map +1 -0
  35. package/dist/ai/openai-provider.js +345 -0
  36. package/dist/ai/openai-provider.js.map +1 -0
  37. package/dist/ai/prompt-utils.d.ts +23 -0
  38. package/dist/ai/prompt-utils.d.ts.map +1 -0
  39. package/dist/ai/prompt-utils.js +67 -0
  40. package/dist/ai/prompt-utils.js.map +1 -0
  41. package/dist/commands/ai.d.ts +8 -0
  42. package/dist/commands/ai.d.ts.map +1 -0
  43. package/dist/commands/ai.js +576 -0
  44. package/dist/commands/ai.js.map +1 -0
  45. package/dist/commands/apply.d.ts +4 -0
  46. package/dist/commands/apply.d.ts.map +1 -0
  47. package/dist/commands/apply.js +98 -0
  48. package/dist/commands/apply.js.map +1 -0
  49. package/dist/commands/assign.d.ts +5 -0
  50. package/dist/commands/assign.d.ts.map +1 -0
  51. package/dist/commands/assign.js +180 -0
  52. package/dist/commands/assign.js.map +1 -0
  53. package/dist/commands/ci.d.ts +4 -0
  54. package/dist/commands/ci.d.ts.map +1 -0
  55. package/dist/commands/ci.js +84 -0
  56. package/dist/commands/ci.js.map +1 -0
  57. package/dist/commands/context.d.ts +19 -0
  58. package/dist/commands/context.d.ts.map +1 -0
  59. package/dist/commands/context.js +297 -0
  60. package/dist/commands/context.js.map +1 -0
  61. package/dist/commands/diff.d.ts +2 -0
  62. package/dist/commands/diff.d.ts.map +1 -0
  63. package/dist/commands/diff.js +119 -0
  64. package/dist/commands/diff.js.map +1 -0
  65. package/dist/commands/doctor.d.ts +5 -0
  66. package/dist/commands/doctor.d.ts.map +1 -0
  67. package/dist/commands/doctor.js +348 -0
  68. package/dist/commands/doctor.js.map +1 -0
  69. package/dist/commands/document-system.d.ts +5 -0
  70. package/dist/commands/document-system.d.ts.map +1 -0
  71. package/dist/commands/document-system.js +84 -0
  72. package/dist/commands/document-system.js.map +1 -0
  73. package/dist/commands/document.d.ts +6 -0
  74. package/dist/commands/document.d.ts.map +1 -0
  75. package/dist/commands/document.js +276 -0
  76. package/dist/commands/document.js.map +1 -0
  77. package/dist/commands/export.d.ts +11 -0
  78. package/dist/commands/export.d.ts.map +1 -0
  79. package/dist/commands/export.js +74 -0
  80. package/dist/commands/export.js.map +1 -0
  81. package/dist/commands/generate-components.d.ts +4 -0
  82. package/dist/commands/generate-components.d.ts.map +1 -0
  83. package/dist/commands/generate-components.js +62 -0
  84. package/dist/commands/generate-components.js.map +1 -0
  85. package/dist/commands/generate-composites.d.ts +2 -0
  86. package/dist/commands/generate-composites.d.ts.map +1 -0
  87. package/dist/commands/generate-composites.js +31 -0
  88. package/dist/commands/generate-composites.js.map +1 -0
  89. package/dist/commands/generate-tokens.d.ts +2 -0
  90. package/dist/commands/generate-tokens.d.ts.map +1 -0
  91. package/dist/commands/generate-tokens.js +48 -0
  92. package/dist/commands/generate-tokens.js.map +1 -0
  93. package/dist/commands/help-topics.d.ts +2 -0
  94. package/dist/commands/help-topics.d.ts.map +1 -0
  95. package/dist/commands/help-topics.js +324 -0
  96. package/dist/commands/help-topics.js.map +1 -0
  97. package/dist/commands/implement.d.ts +5 -0
  98. package/dist/commands/implement.d.ts.map +1 -0
  99. package/dist/commands/implement.js +595 -0
  100. package/dist/commands/implement.js.map +1 -0
  101. package/dist/commands/import-tokens.d.ts +2 -0
  102. package/dist/commands/import-tokens.d.ts.map +1 -0
  103. package/dist/commands/import-tokens.js +42 -0
  104. package/dist/commands/import-tokens.js.map +1 -0
  105. package/dist/commands/init.d.ts +6 -0
  106. package/dist/commands/init.d.ts.map +1 -0
  107. package/dist/commands/init.js +410 -0
  108. package/dist/commands/init.js.map +1 -0
  109. package/dist/commands/inspect-component.d.ts +2 -0
  110. package/dist/commands/inspect-component.d.ts.map +1 -0
  111. package/dist/commands/inspect-component.js +146 -0
  112. package/dist/commands/inspect-component.js.map +1 -0
  113. package/dist/commands/log.d.ts +4 -0
  114. package/dist/commands/log.d.ts.map +1 -0
  115. package/dist/commands/log.js +109 -0
  116. package/dist/commands/log.js.map +1 -0
  117. package/dist/commands/onboarding.d.ts +9 -0
  118. package/dist/commands/onboarding.d.ts.map +1 -0
  119. package/dist/commands/onboarding.js +63 -0
  120. package/dist/commands/onboarding.js.map +1 -0
  121. package/dist/commands/plan.d.ts +3 -0
  122. package/dist/commands/plan.d.ts.map +1 -0
  123. package/dist/commands/plan.js +108 -0
  124. package/dist/commands/plan.js.map +1 -0
  125. package/dist/commands/prompt.d.ts +5 -0
  126. package/dist/commands/prompt.d.ts.map +1 -0
  127. package/dist/commands/prompt.js +77 -0
  128. package/dist/commands/prompt.js.map +1 -0
  129. package/dist/commands/prune.d.ts +2 -0
  130. package/dist/commands/prune.d.ts.map +1 -0
  131. package/dist/commands/prune.js +95 -0
  132. package/dist/commands/prune.js.map +1 -0
  133. package/dist/commands/remove.d.ts +2 -0
  134. package/dist/commands/remove.d.ts.map +1 -0
  135. package/dist/commands/remove.js +76 -0
  136. package/dist/commands/remove.js.map +1 -0
  137. package/dist/commands/scaffold.d.ts +2 -0
  138. package/dist/commands/scaffold.d.ts.map +1 -0
  139. package/dist/commands/scaffold.js +47 -0
  140. package/dist/commands/scaffold.js.map +1 -0
  141. package/dist/commands/scan.d.ts +2 -0
  142. package/dist/commands/scan.d.ts.map +1 -0
  143. package/dist/commands/scan.js +91 -0
  144. package/dist/commands/scan.js.map +1 -0
  145. package/dist/commands/stamp.d.ts +11 -0
  146. package/dist/commands/stamp.d.ts.map +1 -0
  147. package/dist/commands/stamp.js +147 -0
  148. package/dist/commands/stamp.js.map +1 -0
  149. package/dist/commands/status.d.ts +7 -0
  150. package/dist/commands/status.d.ts.map +1 -0
  151. package/dist/commands/status.js +219 -0
  152. package/dist/commands/status.js.map +1 -0
  153. package/dist/commands/team.d.ts +7 -0
  154. package/dist/commands/team.d.ts.map +1 -0
  155. package/dist/commands/team.js +173 -0
  156. package/dist/commands/team.js.map +1 -0
  157. package/dist/index.d.ts +3 -0
  158. package/dist/index.d.ts.map +1 -0
  159. package/dist/index.js +303 -0
  160. package/dist/index.js.map +1 -0
  161. package/dist/onboarding/content.d.ts +39 -0
  162. package/dist/onboarding/content.d.ts.map +1 -0
  163. package/dist/onboarding/content.js +82 -0
  164. package/dist/onboarding/content.js.map +1 -0
  165. package/dist/utils/component-slug.d.ts +10 -0
  166. package/dist/utils/component-slug.d.ts.map +1 -0
  167. package/dist/utils/component-slug.js +13 -0
  168. package/dist/utils/component-slug.js.map +1 -0
  169. package/dist/utils/framework-registry.d.ts +41 -0
  170. package/dist/utils/framework-registry.d.ts.map +1 -0
  171. package/dist/utils/framework-registry.js +82 -0
  172. package/dist/utils/framework-registry.js.map +1 -0
  173. package/dist/utils/gitignore.d.ts +4 -0
  174. package/dist/utils/gitignore.d.ts.map +1 -0
  175. package/dist/utils/gitignore.js +67 -0
  176. package/dist/utils/gitignore.js.map +1 -0
  177. package/dist/utils/lock-changes.d.ts +14 -0
  178. package/dist/utils/lock-changes.d.ts.map +1 -0
  179. package/dist/utils/lock-changes.js +26 -0
  180. package/dist/utils/lock-changes.js.map +1 -0
  181. package/dist/utils/logger.d.ts +9 -0
  182. package/dist/utils/logger.d.ts.map +1 -0
  183. package/dist/utils/logger.js +32 -0
  184. package/dist/utils/logger.js.map +1 -0
  185. package/dist/utils/permissions.d.ts +17 -0
  186. package/dist/utils/permissions.d.ts.map +1 -0
  187. package/dist/utils/permissions.js +37 -0
  188. package/dist/utils/permissions.js.map +1 -0
  189. package/dist/utils/status-logic.d.ts +16 -0
  190. package/dist/utils/status-logic.d.ts.map +1 -0
  191. package/dist/utils/status-logic.js +32 -0
  192. package/dist/utils/status-logic.js.map +1 -0
  193. package/dist/utils/storybook-setup.d.ts +5 -0
  194. package/dist/utils/storybook-setup.d.ts.map +1 -0
  195. package/dist/utils/storybook-setup.js +104 -0
  196. package/dist/utils/storybook-setup.js.map +1 -0
  197. package/dist/utils/team-roster.d.ts +35 -0
  198. package/dist/utils/team-roster.d.ts.map +1 -0
  199. package/dist/utils/team-roster.js +99 -0
  200. package/dist/utils/team-roster.js.map +1 -0
  201. 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,4 @@
1
+ export declare function logCommand(options?: {
2
+ n?: number;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=log.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * Handler for 'ptb learn'
3
+ */
4
+ export declare function learnCommand(): Promise<void>;
5
+ /**
6
+ * Handler for 'ptb flow <type>'
7
+ */
8
+ export declare function flowCommand(type: string): Promise<void>;
9
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -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,3 @@
1
+ export declare function planImplementCommand(name: string): Promise<void>;
2
+ export declare function planCommand(): Promise<void>;
3
+ //# sourceMappingURL=plan.d.ts.map
@@ -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,5 @@
1
+ export declare function promptComponentCommand(name: string, options?: {
2
+ framework?: string;
3
+ format?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=prompt.d.ts.map
@@ -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,2 @@
1
+ export declare function pruneCommand(): Promise<void>;
2
+ //# sourceMappingURL=prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../src/commands/prune.ts"],"names":[],"mappings":"AAYA,wBAAsB,YAAY,kBAqGjC"}