@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,95 @@
1
+ import { loadConfig, loadLatestSnapshot, loadManifest, saveManifest, getGenerator, resolveDSPaths, } from "@calibrate-ds/core";
2
+ import { logger } from "../utils/logger.js";
3
+ import * as fs from "node:fs/promises";
4
+ import * as path from "node:path";
5
+ export async function pruneCommand() {
6
+ try {
7
+ logger.info("Loading ptb.config.json...");
8
+ const config = await loadConfig();
9
+ logger.info("Loading latest snapshot...");
10
+ const currentModel = await loadLatestSnapshot(config);
11
+ if (!currentModel) {
12
+ logger.warn("No current snapshot found. Please run 'ptb scan' first to establish a baseline.");
13
+ return;
14
+ }
15
+ logger.info("Reading manifest...");
16
+ const manifest = await loadManifest(config);
17
+ if (Object.keys(manifest.components).length === 0) {
18
+ logger.info("Manifest is empty. Nothing to prune.");
19
+ return;
20
+ }
21
+ // Identify stale components (present in manifest but missing from current Figma model)
22
+ const staleEntries = [];
23
+ for (const [id, data] of Object.entries(manifest.components)) {
24
+ const stillExists = currentModel.components.some(c => c.id === id);
25
+ if (!stillExists) {
26
+ staleEntries.push({ id, data });
27
+ }
28
+ }
29
+ if (staleEntries.length === 0) {
30
+ logger.info("No stale artifacts to prune.");
31
+ return;
32
+ }
33
+ console.log(`\nFound ${staleEntries.length} stale component${staleEntries.length > 1 ? "s" : ""}:`);
34
+ for (const entry of staleEntries) {
35
+ console.log(` - ${entry.data.name}`);
36
+ }
37
+ console.log("");
38
+ const generator = getGenerator(config.framework.name || "react");
39
+ const result = await generator.pruneComponents(config, staleEntries);
40
+ if (result.deleted.length > 0) {
41
+ console.log(`\x1b[1mDeleted:\x1b[0m`);
42
+ for (const name of result.deleted) {
43
+ console.log(` - ${name}`);
44
+ }
45
+ console.log("");
46
+ // Update manifest for deleted components
47
+ for (const entry of staleEntries) {
48
+ if (result.deleted.includes(entry.data.name)) {
49
+ delete manifest.components[entry.id];
50
+ }
51
+ }
52
+ await saveManifest(config, manifest);
53
+ // Also remove stale entries from ptb.lock so they don't linger in status
54
+ const { workspaceRoot } = resolveDSPaths(config);
55
+ const lockPath = path.join(workspaceRoot, "ptb.lock");
56
+ try {
57
+ const lock = JSON.parse(await fs.readFile(lockPath, "utf-8"));
58
+ let lockChanged = false;
59
+ for (const entry of staleEntries) {
60
+ if (!result.deleted.includes(entry.data.name))
61
+ continue;
62
+ const slug = entry.data.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
63
+ if (lock.components?.[slug]) {
64
+ delete lock.components[slug];
65
+ lockChanged = true;
66
+ }
67
+ }
68
+ if (lockChanged) {
69
+ await fs.writeFile(lockPath, JSON.stringify(lock, null, 2) + "\n", "utf-8");
70
+ logger.dim(" ptb.lock updated — stale entries removed.");
71
+ }
72
+ }
73
+ catch { /* no ptb.lock yet — nothing to clean */ }
74
+ }
75
+ if (result.skipped.length > 0) {
76
+ console.log(`\x1b[1mSkipped:\x1b[0m`);
77
+ for (const info of result.skipped) {
78
+ console.log(` - ${info}`);
79
+ }
80
+ console.log("");
81
+ }
82
+ if (result.errors.length > 0) {
83
+ logger.error("Pruning errors encountered:");
84
+ for (const err of result.errors) {
85
+ console.log(` - ${err}`);
86
+ }
87
+ }
88
+ logger.success("Prune complete.");
89
+ }
90
+ catch (error) {
91
+ logger.error(error.message || String(error));
92
+ process.exit(1);
93
+ }
94
+ }
95
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/commands/prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function removeCommand(): Promise<void>;
2
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAuBA,wBAAsB,aAAa,kBA+DlC"}
@@ -0,0 +1,76 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import * as readline from "node:readline";
4
+ import { loadConfig, resolveDSPaths } from "@calibrate-ds/core";
5
+ import { logger } from "../utils/logger.js";
6
+ import { removePtbGitignoreEntries } from "../utils/gitignore.js";
7
+ import { readRoster, getCurrentUserRole } from "../utils/team-roster.js";
8
+ function ask(question) {
9
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
10
+ return new Promise(resolve => rl.question(question, ans => { rl.close(); resolve(ans.trim()); }));
11
+ }
12
+ async function removeIfExists(filePath, label) {
13
+ try {
14
+ await fs.rm(filePath, { recursive: true, force: true });
15
+ logger.dim(` Removed: ${label}`);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ export async function removeCommand() {
23
+ const cwd = process.cwd();
24
+ const configPath = path.join(cwd, "ptb.config.json");
25
+ const configExists = await fs.access(configPath).then(() => true).catch(() => false);
26
+ if (!configExists) {
27
+ logger.warn("No ptb.config.json found. PTB does not appear to be initialized here.");
28
+ return;
29
+ }
30
+ // Only leads can remove PTB from the project
31
+ const config = await loadConfig().catch(() => null);
32
+ if (config) {
33
+ const { workspaceRoot } = resolveDSPaths(config);
34
+ const roster = await readRoster(workspaceRoot);
35
+ const myRole = getCurrentUserRole(roster);
36
+ if (myRole !== "lead") {
37
+ logger.error("Only leads can remove PTB from a project.");
38
+ logger.dim(" Ask a lead to run: ptb remove");
39
+ process.exit(1);
40
+ }
41
+ }
42
+ console.log("\n \x1b[33mThis will remove all PTB configuration and metadata from this project:\x1b[0m");
43
+ console.log(" \x1b[2m• ptb.config.json\x1b[0m");
44
+ console.log(" \x1b[2m• ptb.lock\x1b[0m");
45
+ console.log(" \x1b[2m• ptb-team.json\x1b[0m");
46
+ console.log(" \x1b[2m• .ptb/ folder\x1b[0m");
47
+ console.log(" \x1b[2m• .github/workflows/ptb.yml\x1b[0m");
48
+ console.log(" \x1b[2m• PTB entries in .gitignore\x1b[0m");
49
+ console.log("\n \x1b[2mYour component files, tokens, and stories are NOT touched — those are yours.\x1b[0m");
50
+ console.log(" \x1b[2mTo set PTB up again, run: ptb init\x1b[0m\n");
51
+ if (!process.stdout.isTTY) {
52
+ logger.error("Non-interactive environment — aborting. Run this command in a terminal.");
53
+ process.exit(1);
54
+ }
55
+ const answer = await ask(" \x1b[1mRemove PTB from this project? (y/N)\x1b[0m ");
56
+ if (answer.toLowerCase() !== "y") {
57
+ logger.info("Cancelled.");
58
+ return;
59
+ }
60
+ console.log();
61
+ await removeIfExists(configPath, "ptb.config.json");
62
+ await removeIfExists(path.join(cwd, "ptb.lock"), "ptb.lock");
63
+ await removeIfExists(path.join(cwd, "ptb-team.json"), "ptb-team.json");
64
+ await removeIfExists(path.join(cwd, ".ptb"), ".ptb/");
65
+ const workflowPath = path.join(cwd, ".github", "workflows", "ptb.yml");
66
+ const workflowExists = await fs.access(workflowPath).then(() => true).catch(() => false);
67
+ if (workflowExists) {
68
+ await removeIfExists(workflowPath, ".github/workflows/ptb.yml");
69
+ }
70
+ await removePtbGitignoreEntries(cwd).catch(() => { });
71
+ console.log();
72
+ logger.success("PTB removed.");
73
+ logger.dim(" Run 'ptb init' to start over.");
74
+ console.log();
75
+ }
76
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function scaffoldCommand(): Promise<void>;
2
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAaA,wBAAsB,eAAe,kBAmDpC"}
@@ -0,0 +1,47 @@
1
+ import { loadConfig, scanFigmaFile, buildDesignSystemModel, buildComponentRegistry, buildFileMappings, buildScaffoldPlan, resolveTokenSource, getGenerator } from "@ptb/core";
2
+ import { getFigmaFile } from "@ptb/figma-client";
3
+ import { logger } from "../utils/logger.js";
4
+ export async function scaffoldCommand() {
5
+ try {
6
+ logger.info("Loading config...");
7
+ const config = await loadConfig();
8
+ const token = process.env[config.designTool.accessTokenEnv];
9
+ if (!token) {
10
+ throw new Error(`Missing Figma access token. Please set ${config.designTool.accessTokenEnv}.`);
11
+ }
12
+ logger.info("Fetching and scanning Figma file...");
13
+ const figmaFile = await getFigmaFile({
14
+ fileKey: config.designTool.fileKey,
15
+ token
16
+ });
17
+ const rawScanResult = scanFigmaFile(config.designTool.fileKey, figmaFile);
18
+ logger.info("Resolving token source...");
19
+ const tokenResolution = await resolveTokenSource(config, token);
20
+ logger.info("Building Models and Registry...");
21
+ const model = buildDesignSystemModel(rawScanResult, tokenResolution.tokens);
22
+ const registry = buildComponentRegistry(model);
23
+ logger.info("Planning scaffold...");
24
+ const mappings = buildFileMappings(model, config);
25
+ const plan = buildScaffoldPlan(model, config, mappings);
26
+ logger.info("Writing output safely to disk...");
27
+ const generator = getGenerator(config.framework.name || "react");
28
+ const report = await generator.writeScaffold({
29
+ config,
30
+ model,
31
+ registry: registry,
32
+ graph: registry.graph,
33
+ mappings,
34
+ plan
35
+ });
36
+ logger.success("Scaffold generated successfully!");
37
+ logger.dim(`- Metadata written: ${report.writtenMetadataFiles.length} files`);
38
+ logger.dim(`- Directories created: ${report.createdDirectories.length}`);
39
+ logger.dim(`- Files created (new): ${report.createdFiles.length}`);
40
+ logger.dim(`- Files skipped (existing): ${report.skippedFiles.length}`);
41
+ }
42
+ catch (error) {
43
+ logger.error(error.message || String(error));
44
+ process.exit(1);
45
+ }
46
+ }
47
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,eAAe;IACjC,IAAI,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAElC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC;QACnG,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC;YACjC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO;YAClC,KAAK;SACR,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE1E,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEhE,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,sBAAsB,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC;YACzC,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,QAAQ;YACR,IAAI;SACP,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,oBAAoB,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC9E,MAAM,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function scanCommand(): Promise<void>;
2
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAYA,wBAAsB,WAAW,kBA2FhC"}
@@ -0,0 +1,91 @@
1
+ import { loadConfig, resolveTokenSource, exportAllComponentContexts, loadManifest, resolveDSPaths, enrichIconsWithSvg, getDesignToolAdapter, saveSnapshot } from "@calibrate-ds/core";
2
+ import * as fs from "node:fs/promises";
3
+ import * as path from "node:path";
4
+ import * as readline from "node:readline";
5
+ import { logger } from "../utils/logger.js";
6
+ function ask(question) {
7
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
8
+ return new Promise(resolve => rl.question(question, ans => { rl.close(); resolve(ans.trim()); }));
9
+ }
10
+ export async function scanCommand() {
11
+ try {
12
+ logger.info("Loading ptb.config.json...");
13
+ const config = await loadConfig();
14
+ const { provider, fileKey, accessTokenEnv } = config.designTool;
15
+ // Warn if there are unimplemented/stale components — scanning will overwrite the diff
16
+ if (process.stdout.isTTY) {
17
+ const { workspaceRoot } = resolveDSPaths(config);
18
+ const lockPath = path.join(workspaceRoot, "ptb.lock");
19
+ try {
20
+ const lock = JSON.parse(await fs.readFile(lockPath, "utf-8"));
21
+ const pending = Object.values(lock.components).filter(e => !e.stampedHash || e.stampedHash !== e.designHash);
22
+ if (pending.length > 0) {
23
+ logger.warn(`You have ${pending.length} component(s) with unimplemented design changes.`);
24
+ logger.dim(" Scanning now will overwrite the current diff baseline.");
25
+ const answer = await ask(" Continue scanning? (Y/n) ");
26
+ if (answer.toLowerCase() === "n") {
27
+ logger.info("Scan cancelled. Run 'ptb diff' to review pending changes.");
28
+ return;
29
+ }
30
+ }
31
+ }
32
+ catch { /* no ptb.lock yet — first scan, proceed */ }
33
+ }
34
+ const accessToken = process.env[accessTokenEnv];
35
+ if (!accessToken) {
36
+ throw new Error(`Missing design tool access token. Please set ${accessTokenEnv} in your environment.`);
37
+ }
38
+ if (fileKey === "YOUR_FIGMA_FILE_KEY" || !fileKey) {
39
+ throw new Error("Please update your ptb.config.json with a valid design tool fileKey.");
40
+ }
41
+ const adapter = getDesignToolAdapter(provider);
42
+ logger.info(`Fetching ${provider} file ${fileKey}...`);
43
+ logger.info("Scanning design document...");
44
+ const model = await adapter.scanDesignFile({ fileKey, accessToken });
45
+ logger.info("Resolving token source...");
46
+ const tokenResolution = await resolveTokenSource(config, accessToken);
47
+ switch (tokenResolution.source) {
48
+ case "rest":
49
+ logger.info("Using REST variables for tokens.");
50
+ break;
51
+ case "imported":
52
+ logger.info("Using imported token export from .ptb/imported-tokens.json.");
53
+ break;
54
+ case "none":
55
+ logger.warn("No token source available; continuing without tokens.");
56
+ break;
57
+ }
58
+ // Merge resolved tokens into the model
59
+ if (tokenResolution.tokens.length > 0) {
60
+ model.tokens = tokenResolution.tokens;
61
+ }
62
+ logger.info("Exporting icon SVGs...");
63
+ await enrichIconsWithSvg(model, fileKey, accessToken, adapter);
64
+ const iconCount = model.components.filter(c => c.iconKind).length;
65
+ if (iconCount > 0)
66
+ logger.dim(`- Icons enriched: ${iconCount}`);
67
+ logger.info("Saving snapshot history...");
68
+ await saveSnapshot(model, config);
69
+ logger.info("Exporting component context files...");
70
+ const manifest = await loadManifest(config).catch(() => undefined);
71
+ await exportAllComponentContexts(model, config, manifest);
72
+ logger.success("Scan complete.");
73
+ // Post-scan runtime validation
74
+ const { tokensDir } = resolveDSPaths(config);
75
+ const tokensCssPath = path.join(config.project.rootDir || process.cwd(), tokensDir, "tokens.css");
76
+ try {
77
+ await fs.access(tokensCssPath);
78
+ }
79
+ catch {
80
+ logger.warn("Token variables detected but no runtime CSS tokens found. Run `ptb generate-tokens`.");
81
+ }
82
+ logger.dim(`- Components found: ${model.components.length}`);
83
+ logger.dim(`- Token collections found: ${model.tokens.length}`);
84
+ logger.dim(`- Model saved to ${config.output.metadataDir}/latest.json`);
85
+ }
86
+ catch (error) {
87
+ logger.error(error.message || String(error));
88
+ process.exit(1);
89
+ }
90
+ }
91
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { PTBConfig } from "@calibrate-ds/shared-types";
2
+ /**
3
+ * Low-level: stamps a single component slug in ptb.lock without any logging.
4
+ * Returns true if the component was found and stamped, false otherwise.
5
+ */
6
+ export declare function stampInLock(config: PTBConfig, nameOrSlug: string, message?: string): Promise<boolean>;
7
+ /** Stamps one or more components in ptb.lock with the current designHash. */
8
+ export declare function stampComponentCommand(name: string, options?: {
9
+ m?: string;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=stamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamp.d.ts","sourceRoot":"","sources":["../../src/commands/stamp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA6C5D;;;GAGG;AACH,wBAAsB,WAAW,CAC7B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CA6BlB;AAED,6EAA6E;AAC7E,wBAAsB,qBAAqB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,CAAC,CAAC,EAAE,MAAM,CAAA;CAAO,iBA8E/B"}
@@ -0,0 +1,147 @@
1
+ import { loadConfig, resolveDSPaths } from "@calibrate-ds/core";
2
+ import { logger } from "../utils/logger.js";
3
+ import { readRoster, getCurrentUserRole, getGitUser, toHandle } from "../utils/team-roster.js";
4
+ import { findComponentSlug } from "../utils/component-slug.js";
5
+ import { canStampComponent } from "../utils/permissions.js";
6
+ import * as fs from "node:fs/promises";
7
+ import * as path from "node:path";
8
+ import { execSync } from "node:child_process";
9
+ function getGitIdentity() {
10
+ try {
11
+ const name = execSync("git config user.name", { encoding: "utf-8" }).trim();
12
+ const email = execSync("git config user.email", { encoding: "utf-8" }).trim();
13
+ return name && email ? `${name} <${email}>` : (name || email || undefined);
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ /** Returns the filename of the most recent history snapshot, or undefined if none exists. */
20
+ async function latestHistoryFile(config) {
21
+ const { metadataDir } = resolveDSPaths(config);
22
+ const historyDir = path.join(metadataDir, "history");
23
+ try {
24
+ const files = (await fs.readdir(historyDir)).filter(f => f.endsWith(".json")).sort();
25
+ return files.length > 0 ? files[files.length - 1] : undefined;
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ }
31
+ async function readLock(lockPath) {
32
+ try {
33
+ return JSON.parse(await fs.readFile(lockPath, "utf-8"));
34
+ }
35
+ catch {
36
+ throw new Error("ptb.lock not found. Run 'ptb scan' or 'ptb export context' first.");
37
+ }
38
+ }
39
+ async function writeLock(lockPath, lock) {
40
+ const tmp = `${lockPath}.tmp.${process.pid}`;
41
+ await fs.writeFile(tmp, JSON.stringify(lock, null, 2) + "\n", "utf-8");
42
+ await fs.rename(tmp, lockPath); // atomic on POSIX — prevents partial-write corruption
43
+ }
44
+ /**
45
+ * Low-level: stamps a single component slug in ptb.lock without any logging.
46
+ * Returns true if the component was found and stamped, false otherwise.
47
+ */
48
+ export async function stampInLock(config, nameOrSlug, message) {
49
+ const { workspaceRoot } = resolveDSPaths(config);
50
+ const lockPath = path.join(workspaceRoot, "ptb.lock");
51
+ let lock;
52
+ try {
53
+ lock = JSON.parse(await fs.readFile(lockPath, "utf-8"));
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ const slug = nameOrSlug.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
59
+ const key = Object.keys(lock.components).find(k => k === slug || lock.components[k].displayName.toLowerCase() === nameOrSlug.toLowerCase());
60
+ if (!key)
61
+ return false;
62
+ const entry = lock.components[key];
63
+ const snapshotFile = await latestHistoryFile(config);
64
+ const stampedBy = getGitIdentity();
65
+ lock.components[key] = {
66
+ ...entry,
67
+ stampedHash: entry.designHash,
68
+ stampedAt: new Date().toISOString(),
69
+ ...(stampedBy ? { stampedBy } : {}),
70
+ ...(message ? { stampedMessage: message } : {}),
71
+ ...(snapshotFile ? { stampedSnapshotFile: snapshotFile } : {}),
72
+ };
73
+ await writeLock(lockPath, lock);
74
+ return true;
75
+ }
76
+ /** Stamps one or more components in ptb.lock with the current designHash. */
77
+ export async function stampComponentCommand(name, options = {}) {
78
+ try {
79
+ const config = await loadConfig();
80
+ const { workspaceRoot } = resolveDSPaths(config);
81
+ const lockPath = path.join(workspaceRoot, "ptb.lock");
82
+ const lock = await readLock(lockPath);
83
+ const all = Object.keys(lock.components);
84
+ if (all.length === 0) {
85
+ logger.warn("ptb.lock has no components. Run 'ptb scan' first.");
86
+ return;
87
+ }
88
+ const isAll = name === "." || name === "*";
89
+ // Resolve targets
90
+ const targets = [];
91
+ if (isAll) {
92
+ targets.push(...all);
93
+ }
94
+ else {
95
+ const match = findComponentSlug(name, lock.components);
96
+ if (!match) {
97
+ logger.error(`Component '${name}' not found in ptb.lock.`);
98
+ logger.info("Available components:");
99
+ for (const k of all)
100
+ logger.dim(` - ${lock.components[k].displayName} (${k})`);
101
+ process.exit(1);
102
+ }
103
+ targets.push(match);
104
+ }
105
+ const now = new Date().toISOString();
106
+ const snapshotFile = await latestHistoryFile(config);
107
+ const stampedBy = getGitIdentity();
108
+ // Role check setup
109
+ const roster = await readRoster(workspaceRoot);
110
+ const myRole = getCurrentUserRole(roster);
111
+ const gitUser = getGitUser();
112
+ const me = gitUser ? roster.members[gitUser.email] : undefined;
113
+ const myHandle = me ? `@${me.handle}` : gitUser ? `@${toHandle(gitUser.name)}` : undefined;
114
+ let stamped = 0;
115
+ let skipped = 0;
116
+ for (const slug of targets) {
117
+ const entry = lock.components[slug];
118
+ // Only the assignee or a lead can stamp an assigned component
119
+ if (!canStampComponent(myRole, entry.assignedTo, myHandle)) {
120
+ logger.warn(` ${entry.displayName} is assigned to ${entry.assignedTo} — only they or a lead can stamp it.`);
121
+ skipped++;
122
+ continue;
123
+ }
124
+ lock.components[slug] = {
125
+ ...entry,
126
+ stampedHash: entry.designHash,
127
+ stampedAt: now,
128
+ ...(stampedBy ? { stampedBy } : {}),
129
+ ...(options.m ? { stampedMessage: options.m } : {}),
130
+ ...(snapshotFile ? { stampedSnapshotFile: snapshotFile } : {}),
131
+ };
132
+ stamped++;
133
+ logger.success(` Stamped: ${entry.displayName}`);
134
+ }
135
+ await writeLock(lockPath, lock);
136
+ const parts = [
137
+ stamped > 0 ? `${stamped} stamped` : "",
138
+ skipped > 0 ? `${skipped} skipped` : "",
139
+ ].filter(Boolean).join(", ");
140
+ logger.info(`\n${parts}. Run 'ptb status' to verify.`);
141
+ }
142
+ catch (error) {
143
+ logger.error(error.message || String(error));
144
+ process.exit(1);
145
+ }
146
+ }
147
+ //# sourceMappingURL=stamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamp.js","sourceRoot":"","sources":["../../src/commands/stamp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function statusCommand(options?: {
2
+ failOnStale?: boolean;
3
+ json?: boolean;
4
+ mine?: boolean;
5
+ team?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAkCA,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,iBAqN1H"}