@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,67 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ // Standard entries every JS/TS project should ignore
4
+ const STANDARD = [
5
+ "node_modules/",
6
+ "dist/",
7
+ "build/",
8
+ ".env",
9
+ ".env.local",
10
+ ".env.*.local",
11
+ "*.log",
12
+ ".DS_Store",
13
+ "coverage/",
14
+ ];
15
+ // PTB-specific entries — only the heavy/ephemeral parts of .ptb/.
16
+ // .ptb/context/ and .ptb/manifest.json are intentionally NOT ignored so teams
17
+ // can commit them and use ptb without Figma access.
18
+ const PTB_REQUIRED = [
19
+ ".ptb/latest.json",
20
+ ".ptb/history/",
21
+ ".ptb/imported-tokens.json",
22
+ "*.ptb-meta.json",
23
+ ];
24
+ // Storybook build artifacts
25
+ const STORYBOOK = [
26
+ "storybook-static/",
27
+ "*.storybook.log",
28
+ ];
29
+ const ALL_REQUIRED = [...STANDARD, ...PTB_REQUIRED, ...STORYBOOK];
30
+ /** Remove PTB-added entries from .gitignore (used by ptb remove). */
31
+ export async function removePtbGitignoreEntries(cwd) {
32
+ const gitignorePath = path.join(cwd, ".gitignore");
33
+ let existing = "";
34
+ try {
35
+ existing = await fs.readFile(gitignorePath, "utf-8");
36
+ }
37
+ catch {
38
+ return;
39
+ }
40
+ const ptbEntries = new Set([...PTB_REQUIRED, ...STORYBOOK]);
41
+ const lines = existing.split("\n");
42
+ const filtered = lines.filter(l => !ptbEntries.has(l.trim()));
43
+ if (filtered.length === lines.length)
44
+ return;
45
+ await fs.writeFile(gitignorePath, filtered.join("\n"), "utf-8");
46
+ }
47
+ export async function ensureGitignore(cwd) {
48
+ const gitignorePath = path.join(cwd, ".gitignore");
49
+ let existing = "";
50
+ try {
51
+ existing = await fs.readFile(gitignorePath, "utf-8");
52
+ }
53
+ catch { /* ok */ }
54
+ // Migrate legacy blanket ignore if present
55
+ if (existing.split("\n").map(l => l.trim()).includes(".ptb/")) {
56
+ existing = existing.split("\n").filter(l => l.trim() !== ".ptb/").join("\n");
57
+ if (!existing.endsWith("\n"))
58
+ existing += "\n";
59
+ }
60
+ const currentLines = existing.split("\n").map(l => l.trim());
61
+ const toAdd = ALL_REQUIRED.filter(e => !currentLines.includes(e));
62
+ if (toAdd.length === 0)
63
+ return;
64
+ const prefix = existing.length > 0 && !existing.endsWith("\n") ? "\n" : "";
65
+ await fs.writeFile(gitignorePath, existing + prefix + toAdd.join("\n") + "\n", "utf-8");
66
+ }
67
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PTBLock } from "@calibrate-ds/core";
2
+ export type LockChangeEvent = "component added" | "component removed" | "stamped" | "design changed";
3
+ export type LockChange = {
4
+ event: LockChangeEvent;
5
+ displayName: string;
6
+ /** Populated for "stamped" events — who stamped it (from lock entry). */
7
+ stampedBy?: string;
8
+ };
9
+ /**
10
+ * Compare two ptb.lock snapshots and return what changed.
11
+ * Order: additions → stamp updates → design changes → removals.
12
+ */
13
+ export declare function detectLockChanges(current: PTBLock, previous: PTBLock): LockChange[];
14
+ //# sourceMappingURL=lock-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-changes.d.ts","sourceRoot":"","sources":["../../src/utils/lock-changes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,SAAS,GAAG,gBAAgB,CAAC;AAErG,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,UAAU,EAAE,CAqBnF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Compare two ptb.lock snapshots and return what changed.
3
+ * Order: additions → stamp updates → design changes → removals.
4
+ */
5
+ export function detectLockChanges(current, previous) {
6
+ const changes = [];
7
+ for (const [slug, entry] of Object.entries(current.components)) {
8
+ const prev = previous.components[slug];
9
+ if (!prev) {
10
+ changes.push({ event: "component added", displayName: entry.displayName });
11
+ }
12
+ else if (entry.stampedHash !== prev.stampedHash && entry.stampedHash) {
13
+ changes.push({ event: "stamped", displayName: entry.displayName, stampedBy: entry.stampedBy });
14
+ }
15
+ else if (entry.designHash !== prev.designHash) {
16
+ changes.push({ event: "design changed", displayName: entry.displayName });
17
+ }
18
+ }
19
+ for (const [slug, prev] of Object.entries(previous.components)) {
20
+ if (!current.components[slug]) {
21
+ changes.push({ event: "component removed", displayName: prev.displayName });
22
+ }
23
+ }
24
+ return changes;
25
+ }
26
+ //# sourceMappingURL=lock-changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-changes.js","sourceRoot":"","sources":["../../src/utils/lock-changes.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,QAAiB;IACjE,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACnG,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9E,CAAC;IACL,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChF,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function redact(msg: unknown): string;
2
+ export declare const logger: {
3
+ info: (msg: unknown) => void;
4
+ success: (msg: unknown) => void;
5
+ warn: (msg: unknown) => void;
6
+ error: (msg: unknown) => void;
7
+ dim: (msg: unknown) => void;
8
+ };
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAuB3C;AAED,eAAO,MAAM,MAAM;gBACH,OAAO;mBACJ,OAAO;gBACV,OAAO;iBACN,OAAO;eACT,OAAO;CACrB,CAAC"}
@@ -0,0 +1,32 @@
1
+ const REDACTED = "[REDACTED]";
2
+ export function redact(msg) {
3
+ let strMsg;
4
+ if (typeof msg === "string") {
5
+ strMsg = msg;
6
+ }
7
+ else if (msg instanceof Error) {
8
+ strMsg = msg.stack || msg.message;
9
+ }
10
+ else {
11
+ try {
12
+ strMsg = JSON.stringify(msg, null, 2);
13
+ }
14
+ catch {
15
+ strMsg = String(msg);
16
+ }
17
+ }
18
+ // Redact Figma tokens (e.g. figd_..., figa_...)
19
+ strMsg = strMsg.replace(/(?:figd|figa)_[a-zA-Z0-9\-_]+/g, REDACTED);
20
+ // Redact Authorization and X-Figma-Token headers if someone logs a header object explicitly
21
+ strMsg = strMsg.replace(/(["']?authorization["']?\s*:\s*["'][Bb]earer\s+)[^"'\s]+(["']?)/gi, `$1${REDACTED}$2`);
22
+ strMsg = strMsg.replace(/(["']?x-figma-token["']?\s*:\s*["'])[^"'\s]+(["']?)/gi, `$1${REDACTED}$2`);
23
+ return strMsg;
24
+ }
25
+ export const logger = {
26
+ info: (msg) => console.log(`\x1b[34mℹ\x1b[0m ${redact(msg)}`),
27
+ success: (msg) => console.log(`\x1b[32m✔\x1b[0m ${redact(msg)}`),
28
+ warn: (msg) => console.log(`\x1b[33m⚠\x1b[0m ${redact(msg)}`),
29
+ error: (msg) => console.error(`\x1b[31m✖\x1b[0m ${redact(msg)}`),
30
+ dim: (msg) => console.log(`\x1b[90m${redact(msg)}\x1b[0m`),
31
+ };
32
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,UAAU,MAAM,CAAC,GAAY;IAC/B,IAAI,MAAc,CAAC;IAEnB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC;IACjB,CAAC;SAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC;IAEpE,4FAA4F;IAC5F,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,mEAAmE,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC;IAChH,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uDAAuD,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC;IAEpG,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,IAAI,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACtE,OAAO,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACzE,IAAI,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACtE,KAAK,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACzE,GAAG,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;CACtE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { TeamRole } from "./team-roster.js";
2
+ /** Returns true if the role can assign a component to someone other than themselves. */
3
+ export declare function canAssignToOther(myRole: TeamRole): boolean;
4
+ /** Returns true if targetHandle resolves to the same person as myHandle. */
5
+ export declare function isSelfAssign(targetHandle: string, myHandle: string | undefined): boolean;
6
+ /**
7
+ * Returns true if the current user can clear the given assignment.
8
+ * Leads can always clear. Members can only clear their own.
9
+ */
10
+ export declare function canClearAssignment(myRole: TeamRole, assignedTo: string, myHandle: string | undefined): boolean;
11
+ /**
12
+ * Returns true if the current user can stamp this component.
13
+ * Leads can always stamp. Members can stamp unassigned components
14
+ * or components assigned to themselves.
15
+ */
16
+ export declare function canStampComponent(myRole: TeamRole, assignedTo: string | undefined, myHandle: string | undefined): boolean;
17
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/utils/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAE1D;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMxF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAIT;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAKT"}
@@ -0,0 +1,37 @@
1
+ /** Returns true if the role can assign a component to someone other than themselves. */
2
+ export function canAssignToOther(myRole) {
3
+ return myRole === "lead";
4
+ }
5
+ /** Returns true if targetHandle resolves to the same person as myHandle. */
6
+ export function isSelfAssign(targetHandle, myHandle) {
7
+ if (!myHandle)
8
+ return false;
9
+ return (targetHandle.replace(/^@/, "").toLowerCase() ===
10
+ myHandle.replace(/^@/, "").toLowerCase());
11
+ }
12
+ /**
13
+ * Returns true if the current user can clear the given assignment.
14
+ * Leads can always clear. Members can only clear their own.
15
+ */
16
+ export function canClearAssignment(myRole, assignedTo, myHandle) {
17
+ if (myRole === "lead")
18
+ return true;
19
+ if (!myHandle)
20
+ return false;
21
+ return assignedTo === myHandle;
22
+ }
23
+ /**
24
+ * Returns true if the current user can stamp this component.
25
+ * Leads can always stamp. Members can stamp unassigned components
26
+ * or components assigned to themselves.
27
+ */
28
+ export function canStampComponent(myRole, assignedTo, myHandle) {
29
+ if (myRole === "lead")
30
+ return true;
31
+ if (!assignedTo)
32
+ return true;
33
+ if (!myHandle)
34
+ return false;
35
+ return assignedTo === myHandle;
36
+ }
37
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/utils/permissions.ts"],"names":[],"mappings":"AAEA,wFAAwF;AACxF,MAAM,UAAU,gBAAgB,CAAC,MAAgB;IAC7C,OAAO,MAAM,KAAK,MAAM,CAAC;AAC7B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,YAAoB,EAAE,QAA4B;IAC3E,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,CACH,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;QAC5C,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAC3C,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAC9B,MAAgB,EAChB,UAAkB,EAClB,QAA4B;IAE5B,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,UAAU,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC7B,MAAgB,EAChB,UAA8B,EAC9B,QAA4B;IAE5B,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,UAAU,KAAK,QAAQ,CAAC;AACnC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { PTBLock, PTBLockEntry } from "@calibrate-ds/core";
2
+ export type ComponentStatusValue = "ready" | "stale" | "not-implemented";
3
+ /** Derive the implementation status of a single lock entry. */
4
+ export declare function computeComponentStatus(entry: PTBLockEntry): ComponentStatusValue;
5
+ /** Aggregate ready/stale/notImplemented counts across an entire lock. */
6
+ export declare function computeStatusSummary(lock: PTBLock): {
7
+ ready: number;
8
+ stale: number;
9
+ notImplemented: number;
10
+ };
11
+ /**
12
+ * Returns true if the given assignedTo string resolves to the given handle.
13
+ * Strips leading @ before comparing.
14
+ */
15
+ export declare function isAssignedToHandle(assignedTo: string | undefined, handle: string): boolean;
16
+ //# sourceMappingURL=status-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-logic.d.ts","sourceRoot":"","sources":["../../src/utils/status-logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAEzE,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,oBAAoB,CAIhF;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CAC1B,CASA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,GACf,OAAO,CAGT"}
@@ -0,0 +1,32 @@
1
+ /** Derive the implementation status of a single lock entry. */
2
+ export function computeComponentStatus(entry) {
3
+ if (!entry.stampedHash)
4
+ return "not-implemented";
5
+ if (entry.stampedHash === entry.designHash)
6
+ return "ready";
7
+ return "stale";
8
+ }
9
+ /** Aggregate ready/stale/notImplemented counts across an entire lock. */
10
+ export function computeStatusSummary(lock) {
11
+ let ready = 0, stale = 0, notImplemented = 0;
12
+ for (const entry of Object.values(lock.components)) {
13
+ const s = computeComponentStatus(entry);
14
+ if (s === "ready")
15
+ ready++;
16
+ else if (s === "stale")
17
+ stale++;
18
+ else
19
+ notImplemented++;
20
+ }
21
+ return { ready, stale, notImplemented };
22
+ }
23
+ /**
24
+ * Returns true if the given assignedTo string resolves to the given handle.
25
+ * Strips leading @ before comparing.
26
+ */
27
+ export function isAssignedToHandle(assignedTo, handle) {
28
+ if (!assignedTo)
29
+ return false;
30
+ return assignedTo.replace(/^@/, "").toLowerCase() === handle.toLowerCase();
31
+ }
32
+ //# sourceMappingURL=status-logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-logic.js","sourceRoot":"","sources":["../../src/utils/status-logic.ts"],"names":[],"mappings":"AAIA,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB,CAAC,KAAmB;IACtD,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,OAAO,iBAAiB,CAAC;IACjD,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC;IAC3D,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAK9C,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,OAAO;YAAE,KAAK,EAAE,CAAC;aACtB,IAAI,CAAC,KAAK,OAAO;YAAE,KAAK,EAAE,CAAC;;YAC3B,cAAc,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAC9B,UAA8B,EAC9B,MAAc;IAEd,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PTBConfig } from "@calibrate-ds/shared-types";
2
+ export declare function ensureStorybookSetup(config: PTBConfig, options?: {
3
+ force?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=storybook-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storybook-setup.d.ts","sourceRoot":"","sources":["../../src/utils/storybook-setup.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAW5D,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+F1G"}
@@ -0,0 +1,104 @@
1
+ import { resolveDSPaths, setupStorybook, patchStorybookStories, detectPackageManager, checkStorybookReadiness, detectBundler } from "@calibrate-ds/core";
2
+ import { createInterface } from "node:readline/promises";
3
+ import { stdin as input, stdout as output } from "node:process";
4
+ import { spawnSync } from "node:child_process";
5
+ import * as path from "node:path";
6
+ import * as fs from "node:fs/promises";
7
+ import { logger } from "./logger.js";
8
+ import { getFramework, storybookPackageFor } from "./framework-registry.js";
9
+ const C = {
10
+ bold: "\x1b[1m",
11
+ dim: "\x1b[2m",
12
+ cyan: "\x1b[36m",
13
+ green: "\x1b[32m",
14
+ yellow: "\x1b[33m",
15
+ reset: "\x1b[0m",
16
+ };
17
+ export async function ensureStorybookSetup(config, options) {
18
+ const { packageRoot, workspaceRoot, componentsDir } = resolveDSPaths(config);
19
+ const force = options?.force ?? false;
20
+ // Skip entirely if the target package directory has no package.json yet
21
+ // (e.g. user ran ptb init before creating packages/ui)
22
+ const pkgJsonExists = await fs.access(path.join(packageRoot, "package.json")).then(() => true).catch(() => false);
23
+ if (!pkgJsonExists) {
24
+ logger.dim(` Storybook setup skipped — ${path.relative(workspaceRoot, packageRoot) || "."} has no package.json yet. Run 'ptb document component <name>' after setting up the package.`);
25
+ return;
26
+ }
27
+ // Check prerequisites BEFORE touching .storybook/ — creating it before init causes
28
+ // Storybook 10 to ask "force initialization?" and picks the wrong framework.
29
+ const readiness = await checkStorybookReadiness(packageRoot);
30
+ if (readiness.nodeModulesExist && readiness.reactInstalled && readiness.storybookInstalled) {
31
+ // Storybook already installed — safe to write/update our config files now
32
+ const bundler = await detectBundler(packageRoot);
33
+ const fw = getFramework(config.framework.name);
34
+ const frameworkPkg = fw ? (storybookPackageFor(fw, bundler) ?? undefined) : undefined;
35
+ const sbResult = await setupStorybook(packageRoot, componentsDir, force, frameworkPkg);
36
+ if (sbResult.created.length > 0) {
37
+ logger.info(`\n ${C.yellow}Storybook config updated.${C.reset}`);
38
+ for (const f of sbResult.created)
39
+ logger.success(` Written: ${f}`);
40
+ }
41
+ else if (sbResult.skipped.length > 0) {
42
+ logger.dim(` Storybook config preserved (${sbResult.skipped.join(", ")}). Use --force to overwrite.`);
43
+ }
44
+ logger.success(` Storybook installed and configured.`);
45
+ return;
46
+ }
47
+ const pm = await detectPackageManager(packageRoot);
48
+ const relDir = path.relative(workspaceRoot, packageRoot) || ".";
49
+ const cdCmd = relDir !== "." ? `cd ${relDir}` : "";
50
+ const steps = [];
51
+ if (!readiness.nodeModulesExist || !readiness.reactInstalled) {
52
+ steps.push({ label: "Install package dependencies", cmd: `${pm} install` });
53
+ }
54
+ if (!readiness.storybookInstalled) {
55
+ // --no-dev: Storybook 10 launches a dev server after init; --no-dev prevents the hang
56
+ steps.push({ label: "Initialize Storybook", cmd: `npx storybook@latest init --no-dev`, isStorybookInit: true });
57
+ }
58
+ if (steps.length === 0)
59
+ return;
60
+ console.log(`\n ${C.bold}Storybook setup needed${C.reset}${cdCmd ? ` ${C.dim}(inside ${relDir}/)${C.reset}` : ""}:\n`);
61
+ steps.forEach((step, i) => {
62
+ console.log(` ${C.dim}${i + 1}.${C.reset} ${step.label}`);
63
+ console.log(` ${C.cyan}${cdCmd ? `${cdCmd} && ` : ""}${step.cmd}${C.reset}`);
64
+ if (step.isStorybookInit) {
65
+ console.log(` ${C.dim}PTB will update the stories glob in .storybook/main.ts after init.${C.reset}`);
66
+ }
67
+ console.log();
68
+ });
69
+ if (!process.stdout.isTTY)
70
+ return;
71
+ const rl = createInterface({ input, output });
72
+ const answer = await rl.question(` Run these steps now? (Y/n) `).finally(() => rl.close());
73
+ if (answer.trim().toLowerCase() === "n") {
74
+ logger.dim(" Skipped. You can run 'ptb document component <name>' later to trigger setup again.");
75
+ return;
76
+ }
77
+ for (const step of steps) {
78
+ console.log(`\n ${C.dim}▶ ${step.cmd}${C.reset}\n`);
79
+ const result = spawnSync(step.cmd, {
80
+ cwd: packageRoot,
81
+ stdio: "inherit",
82
+ shell: true,
83
+ });
84
+ if (result.status !== 0) {
85
+ logger.warn(` Step failed — fix the error above then re-run 'ptb document component <name>'.`);
86
+ return;
87
+ }
88
+ if (step.isStorybookInit) {
89
+ // Remove Storybook's example stories scaffold — PTB manages its own stories
90
+ const exampleDirs = ["src/stories", "stories"].map(d => path.join(packageRoot, d));
91
+ for (const dir of exampleDirs) {
92
+ await fs.rm(dir, { recursive: true, force: true }).catch(() => { });
93
+ }
94
+ // Patch only the stories glob — don't overwrite Storybook's auto-detected framework/builder
95
+ logger.dim("\n Updating stories glob in .storybook/main.ts...");
96
+ const patched = await patchStorybookStories(packageRoot, componentsDir);
97
+ if (patched) {
98
+ logger.success(" .storybook/main.ts updated with correct stories glob.");
99
+ }
100
+ }
101
+ }
102
+ console.log(`\n ${C.green}✔${C.reset} Storybook is ready. Start it with: ${C.cyan}${cdCmd ? `${cdCmd} && ` : ""}npx storybook dev${C.reset}\n`);
103
+ }
104
+ //# sourceMappingURL=storybook-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storybook-setup.js","sourceRoot":"","sources":["../../src/utils/storybook-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export type TeamRole = "lead" | "member";
2
+ export type TeamMember = {
3
+ name: string;
4
+ email: string;
5
+ handle: string;
6
+ joinedAt: string;
7
+ role: TeamRole;
8
+ };
9
+ export type TeamRoster = {
10
+ members: Record<string, TeamMember>;
11
+ };
12
+ export declare function toHandle(name: string): string;
13
+ export declare function getGitUser(): {
14
+ name: string;
15
+ email: string;
16
+ } | undefined;
17
+ export declare function readRoster(workspaceRoot: string): Promise<TeamRoster>;
18
+ export declare function writeRoster(workspaceRoot: string, roster: TeamRoster): Promise<void>;
19
+ /** Find a member by exact handle, email, or name. */
20
+ export declare function findMember(query: string, roster: TeamRoster): TeamMember | undefined;
21
+ /**
22
+ * Find the closest matching member when exact match fails.
23
+ * Returns the member and distance only if within the threshold (default 2 edits).
24
+ */
25
+ export declare function findClosestMember(query: string, roster: TeamRoster, maxDistance?: number): {
26
+ member: TeamMember;
27
+ distance: number;
28
+ } | undefined;
29
+ /** Get the role of the current git user in the roster.
30
+ * Falls back to "lead" for empty/un-roled rosters (solo/bootstrap).
31
+ * Falls back to "member" for users not in the roster — never returns undefined. */
32
+ export declare function getCurrentUserRole(roster: TeamRoster): TeamRole;
33
+ /** Returns true if a ptb.lock assignedTo string matches this member. */
34
+ export declare function memberMatchesAssignee(member: TeamMember, assignedTo: string): boolean;
35
+ //# sourceMappingURL=team-roster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-roster.d.ts","sourceRoot":"","sources":["../../src/utils/team-roster.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;CAClB,CAAC;AAGF,MAAM,MAAM,UAAU,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,UAAU,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CASxE;AAED,wBAAsB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAe3E;AAED,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1F;AAeD,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAOpF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,WAAW,SAAI,GAChB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CActD;AAED;;oFAEoF;AACpF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAiB/D;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAKrF"}
@@ -0,0 +1,99 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ export function toHandle(name) {
5
+ return name.toLowerCase().trim().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
6
+ }
7
+ export function getGitUser() {
8
+ try {
9
+ const name = execSync("git config user.name", { encoding: "utf-8" }).trim();
10
+ const email = execSync("git config user.email", { encoding: "utf-8" }).trim();
11
+ if (!name || !email)
12
+ return undefined;
13
+ return { name, email };
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ export async function readRoster(workspaceRoot) {
20
+ const rosterPath = path.join(workspaceRoot, "ptb-team.json");
21
+ try {
22
+ const raw = JSON.parse(await fs.readFile(rosterPath, "utf-8"));
23
+ // Migrate legacy array format → object keyed by email.
24
+ // Two people joining on separate branches now touch different keys → clean git merge.
25
+ if (Array.isArray(raw.members)) {
26
+ const obj = {};
27
+ for (const m of raw.members)
28
+ obj[m.email] = m;
29
+ return { members: obj };
30
+ }
31
+ return raw;
32
+ }
33
+ catch {
34
+ return { members: {} };
35
+ }
36
+ }
37
+ export async function writeRoster(workspaceRoot, roster) {
38
+ const rosterPath = path.join(workspaceRoot, "ptb-team.json");
39
+ await fs.writeFile(rosterPath, JSON.stringify(roster, null, 2) + "\n", "utf-8");
40
+ }
41
+ function levenshtein(a, b) {
42
+ const m = a.length, n = b.length;
43
+ const dp = Array.from({ length: m + 1 }, (_, i) => Array.from({ length: n + 1 }, (__, j) => (i === 0 ? j : j === 0 ? i : 0)));
44
+ for (let i = 1; i <= m; i++)
45
+ for (let j = 1; j <= n; j++)
46
+ dp[i][j] = a[i - 1] === b[j - 1]
47
+ ? dp[i - 1][j - 1]
48
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
49
+ return dp[m][n];
50
+ }
51
+ /** Find a member by exact handle, email, or name. */
52
+ export function findMember(query, roster) {
53
+ const q = query.replace(/^@/, "").toLowerCase();
54
+ return Object.values(roster.members).find(m => m.handle === q ||
55
+ m.email.toLowerCase() === q ||
56
+ m.name.toLowerCase() === q);
57
+ }
58
+ /**
59
+ * Find the closest matching member when exact match fails.
60
+ * Returns the member and distance only if within the threshold (default 2 edits).
61
+ */
62
+ export function findClosestMember(query, roster, maxDistance = 2) {
63
+ const q = query.replace(/^@/, "").toLowerCase();
64
+ let best;
65
+ for (const m of Object.values(roster.members)) {
66
+ const d = Math.min(levenshtein(q, m.handle), levenshtein(q, m.name.toLowerCase()), levenshtein(q, m.email.toLowerCase().split("@")[0]));
67
+ if (d <= maxDistance && (!best || d < best.distance)) {
68
+ best = { member: m, distance: d };
69
+ }
70
+ }
71
+ return best;
72
+ }
73
+ /** Get the role of the current git user in the roster.
74
+ * Falls back to "lead" for empty/un-roled rosters (solo/bootstrap).
75
+ * Falls back to "member" for users not in the roster — never returns undefined. */
76
+ export function getCurrentUserRole(roster) {
77
+ const values = Object.values(roster.members);
78
+ // Empty roster or no roles set — treat as lead so solo devs are never locked out
79
+ const anyRoleSet = values.some(m => m.role);
80
+ if (!anyRoleSet || values.length === 0)
81
+ return "lead";
82
+ const user = getGitUser();
83
+ if (!user)
84
+ return "member";
85
+ const member = roster.members[user.email];
86
+ // Member exists but has no role (joined before roles were introduced) — treat as lead
87
+ if (member && !member.role)
88
+ return "lead";
89
+ // Not in the roster → safe default is member, not undefined
90
+ return member?.role ?? "member";
91
+ }
92
+ /** Returns true if a ptb.lock assignedTo string matches this member. */
93
+ export function memberMatchesAssignee(member, assignedTo) {
94
+ const val = assignedTo.replace(/^@/, "").toLowerCase();
95
+ return member.handle === val ||
96
+ member.email.toLowerCase() === val ||
97
+ member.name.toLowerCase() === val;
98
+ }
99
+ //# sourceMappingURL=team-roster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-roster.js","sourceRoot":"","sources":["../../src/utils/team-roster.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@calibrate-ds/cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "ptb": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
20
+ "dependencies": {
21
+ "@anthropic-ai/sdk": "^0.39.0",
22
+ "commander": "^14.0.3",
23
+ "openai": "^6.34.0",
24
+ "zod": "^4.3.6",
25
+ "@calibrate-ds/core": "0.1.0",
26
+ "@calibrate-ds/figma-client": "0.1.0",
27
+ "@calibrate-ds/shared-types": "0.1.0",
28
+ "@calibrate-ds/generator-react": "0.1.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^22.13.5",
32
+ "ts-node": "^10.9.2",
33
+ "typescript": "^5.7.3",
34
+ "vitest": "^2.0.0"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.json",
38
+ "dev": "tsx src/index.ts",
39
+ "clean": "rm -rf dist",
40
+ "start": "node dist/index.js",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest"
43
+ }
44
+ }