@calibrate-ds/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/component-slug.test.d.ts +2 -0
- package/dist/__tests__/component-slug.test.d.ts.map +1 -0
- package/dist/__tests__/component-slug.test.js +54 -0
- package/dist/__tests__/component-slug.test.js.map +1 -0
- package/dist/__tests__/lock-changes.test.d.ts +2 -0
- package/dist/__tests__/lock-changes.test.d.ts.map +1 -0
- package/dist/__tests__/lock-changes.test.js +81 -0
- package/dist/__tests__/lock-changes.test.js.map +1 -0
- package/dist/__tests__/permissions.test.d.ts +2 -0
- package/dist/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/__tests__/permissions.test.js +67 -0
- package/dist/__tests__/permissions.test.js.map +1 -0
- package/dist/__tests__/stamp-in-lock.test.d.ts +2 -0
- package/dist/__tests__/stamp-in-lock.test.d.ts.map +1 -0
- package/dist/__tests__/stamp-in-lock.test.js +102 -0
- package/dist/__tests__/stamp-in-lock.test.js.map +1 -0
- package/dist/__tests__/status-logic.test.d.ts +2 -0
- package/dist/__tests__/status-logic.test.d.ts.map +1 -0
- package/dist/__tests__/status-logic.test.js +74 -0
- package/dist/__tests__/status-logic.test.js.map +1 -0
- package/dist/__tests__/team-roster.test.d.ts +2 -0
- package/dist/__tests__/team-roster.test.d.ts.map +1 -0
- package/dist/__tests__/team-roster.test.js +97 -0
- package/dist/__tests__/team-roster.test.js.map +1 -0
- package/dist/ai/claude-provider.d.ts +13 -0
- package/dist/ai/claude-provider.d.ts.map +1 -0
- package/dist/ai/claude-provider.js +335 -0
- package/dist/ai/claude-provider.js.map +1 -0
- package/dist/ai/enhance-doc.d.ts +24 -0
- package/dist/ai/enhance-doc.d.ts.map +1 -0
- package/dist/ai/enhance-doc.js +272 -0
- package/dist/ai/enhance-doc.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +13 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +345 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/prompt-utils.d.ts +23 -0
- package/dist/ai/prompt-utils.d.ts.map +1 -0
- package/dist/ai/prompt-utils.js +67 -0
- package/dist/ai/prompt-utils.js.map +1 -0
- package/dist/commands/ai.d.ts +8 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +576 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/apply.d.ts +4 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +98 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/assign.d.ts +5 -0
- package/dist/commands/assign.d.ts.map +1 -0
- package/dist/commands/assign.js +180 -0
- package/dist/commands/assign.js.map +1 -0
- package/dist/commands/ci.d.ts +4 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +84 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/context.d.ts +19 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +297 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/diff.d.ts +2 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +119 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +348 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/document-system.d.ts +5 -0
- package/dist/commands/document-system.d.ts.map +1 -0
- package/dist/commands/document-system.js +84 -0
- package/dist/commands/document-system.js.map +1 -0
- package/dist/commands/document.d.ts +6 -0
- package/dist/commands/document.d.ts.map +1 -0
- package/dist/commands/document.js +276 -0
- package/dist/commands/document.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +74 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/generate-components.d.ts +4 -0
- package/dist/commands/generate-components.d.ts.map +1 -0
- package/dist/commands/generate-components.js +62 -0
- package/dist/commands/generate-components.js.map +1 -0
- package/dist/commands/generate-composites.d.ts +2 -0
- package/dist/commands/generate-composites.d.ts.map +1 -0
- package/dist/commands/generate-composites.js +31 -0
- package/dist/commands/generate-composites.js.map +1 -0
- package/dist/commands/generate-tokens.d.ts +2 -0
- package/dist/commands/generate-tokens.d.ts.map +1 -0
- package/dist/commands/generate-tokens.js +48 -0
- package/dist/commands/generate-tokens.js.map +1 -0
- package/dist/commands/help-topics.d.ts +2 -0
- package/dist/commands/help-topics.d.ts.map +1 -0
- package/dist/commands/help-topics.js +324 -0
- package/dist/commands/help-topics.js.map +1 -0
- package/dist/commands/implement.d.ts +5 -0
- package/dist/commands/implement.d.ts.map +1 -0
- package/dist/commands/implement.js +595 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/import-tokens.d.ts +2 -0
- package/dist/commands/import-tokens.d.ts.map +1 -0
- package/dist/commands/import-tokens.js +42 -0
- package/dist/commands/import-tokens.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +410 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect-component.d.ts +2 -0
- package/dist/commands/inspect-component.d.ts.map +1 -0
- package/dist/commands/inspect-component.js +146 -0
- package/dist/commands/inspect-component.js.map +1 -0
- package/dist/commands/log.d.ts +4 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +109 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/onboarding.d.ts +9 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +63 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/plan.d.ts +3 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +108 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/prompt.d.ts +5 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +77 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/prune.d.ts +2 -0
- package/dist/commands/prune.d.ts.map +1 -0
- package/dist/commands/prune.js +95 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +76 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/scaffold.d.ts +2 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +47 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +91 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/stamp.d.ts +11 -0
- package/dist/commands/stamp.d.ts.map +1 -0
- package/dist/commands/stamp.js +147 -0
- package/dist/commands/stamp.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +219 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/team.d.ts +7 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +173 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +303 -0
- package/dist/index.js.map +1 -0
- package/dist/onboarding/content.d.ts +39 -0
- package/dist/onboarding/content.d.ts.map +1 -0
- package/dist/onboarding/content.js +82 -0
- package/dist/onboarding/content.js.map +1 -0
- package/dist/utils/component-slug.d.ts +10 -0
- package/dist/utils/component-slug.d.ts.map +1 -0
- package/dist/utils/component-slug.js +13 -0
- package/dist/utils/component-slug.js.map +1 -0
- package/dist/utils/framework-registry.d.ts +41 -0
- package/dist/utils/framework-registry.d.ts.map +1 -0
- package/dist/utils/framework-registry.js +82 -0
- package/dist/utils/framework-registry.js.map +1 -0
- package/dist/utils/gitignore.d.ts +4 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +67 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/lock-changes.d.ts +14 -0
- package/dist/utils/lock-changes.d.ts.map +1 -0
- package/dist/utils/lock-changes.js +26 -0
- package/dist/utils/lock-changes.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/permissions.d.ts +17 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +37 -0
- package/dist/utils/permissions.js.map +1 -0
- package/dist/utils/status-logic.d.ts +16 -0
- package/dist/utils/status-logic.d.ts.map +1 -0
- package/dist/utils/status-logic.js +32 -0
- package/dist/utils/status-logic.js.map +1 -0
- package/dist/utils/storybook-setup.d.ts +5 -0
- package/dist/utils/storybook-setup.d.ts.map +1 -0
- package/dist/utils/storybook-setup.js +104 -0
- package/dist/utils/storybook-setup.js.map +1 -0
- package/dist/utils/team-roster.d.ts +35 -0
- package/dist/utils/team-roster.d.ts.map +1 -0
- package/dist/utils/team-roster.js +99 -0
- package/dist/utils/team-roster.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
import { loadConfig, loadLatestSnapshot, resolveComponent, loadManifest, getComponentContext, generateComponentPrompt, generateComponentDoc, resolveAIProvider, resolveDSPaths, formatMetadataHeader, extractImplementationMetadata, updateComponentArtifacts, createNamingStrategy, normalizeIconDisplayName, isIconComponent, } from "@calibrate-ds/core";
|
|
2
|
+
import { enhanceDocWithAI } from "../ai/enhance-doc.js";
|
|
3
|
+
import { stampInLock } from "./stamp.js";
|
|
4
|
+
import { readRoster, getCurrentUserRole, getGitUser, toHandle } from "../utils/team-roster.js";
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
import fs from "node:fs/promises";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
/**
|
|
9
|
+
* Writes a single file, respecting three tiers:
|
|
10
|
+
* 1. No PTB_METADATA → user-written, NEVER overwrite
|
|
11
|
+
* 2. PTB_METADATA + same contextHash → already up to date, skip
|
|
12
|
+
* 3. PTB_METADATA + different hash OR new file → write (design changed or first run)
|
|
13
|
+
* --force bypasses the hash check and always writes tier-3 files.
|
|
14
|
+
*/
|
|
15
|
+
async function writeIfStale(fullPath, content, currentHash, force) {
|
|
16
|
+
const exists = await fs.access(fullPath).then(() => true).catch(() => false);
|
|
17
|
+
if (exists) {
|
|
18
|
+
const existingContent = await fs.readFile(fullPath, "utf8").catch(() => "");
|
|
19
|
+
if (!existingContent.includes("PTB_METADATA")) {
|
|
20
|
+
return "protected";
|
|
21
|
+
}
|
|
22
|
+
if (!force) {
|
|
23
|
+
const meta = await extractImplementationMetadata(fullPath);
|
|
24
|
+
if (meta?.contextHash === currentHash) {
|
|
25
|
+
return "skipped";
|
|
26
|
+
}
|
|
27
|
+
// Hash differs — design changed, fall through to write
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
31
|
+
await fs.writeFile(fullPath, content, "utf8");
|
|
32
|
+
return "written";
|
|
33
|
+
}
|
|
34
|
+
function buildIconFiles(codeName, component, isTs) {
|
|
35
|
+
const dimMatch = component.name.match(/(\d+)x(\d+)/);
|
|
36
|
+
const w = dimMatch?.[1] ?? "24";
|
|
37
|
+
const h = dimMatch?.[2] ?? "24";
|
|
38
|
+
let svgInner;
|
|
39
|
+
let viewBox;
|
|
40
|
+
if (component.iconKind === "vector" && component.iconSvg) {
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(component.iconSvg);
|
|
43
|
+
viewBox = parsed.viewBox;
|
|
44
|
+
svgInner = parsed.innerContent;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
viewBox = `0 0 ${w} ${h}`;
|
|
48
|
+
svgInner = `<rect width="${w}" height="${h}" rx="2" opacity="0.15" />`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// font-symbol or unknown — placeholder
|
|
53
|
+
viewBox = `0 0 ${w} ${h}`;
|
|
54
|
+
svgInner = `{/* TODO: Replace with actual icon paths from your design tool or icon library */}\n <rect width="${w}" height="${h}" rx="2" opacity="0.15" />`;
|
|
55
|
+
}
|
|
56
|
+
const propsType = isTs ? `{ className, style, ...props }: ${codeName}Props` : `{ className, style, ...props }`;
|
|
57
|
+
const tsx = [
|
|
58
|
+
`import * as React from "react";`,
|
|
59
|
+
isTs ? `import type { ${codeName}Props } from "./${codeName}.types.js";` : "",
|
|
60
|
+
`\nexport function ${codeName}(${propsType}) {\n return (\n <svg\n viewBox="${viewBox}"\n fill="currentColor"\n aria-hidden="true"\n className={className}\n style={style}\n {...props}\n >\n ${svgInner}\n </svg>\n );\n}`,
|
|
61
|
+
].filter(Boolean).join("\n");
|
|
62
|
+
const types = isTs
|
|
63
|
+
? `import type * as React from "react";\n\nexport type ${codeName}Props = React.SVGProps<SVGSVGElement>;\n`
|
|
64
|
+
: "";
|
|
65
|
+
const css = `/* ${codeName} — icon component, sized via width/height props or CSS */\n`;
|
|
66
|
+
const index = `export { ${codeName} } from "./${codeName}.js";\n`;
|
|
67
|
+
return [
|
|
68
|
+
{ path: `${codeName}.tsx`, content: tsx },
|
|
69
|
+
...(isTs ? [{ path: `${codeName}.types.ts`, content: types }] : []),
|
|
70
|
+
{ path: `${codeName}.module.css`, content: css },
|
|
71
|
+
{ path: `index.ts`, content: index },
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Converts default exports to named exports so every component uses the same
|
|
76
|
+
* import style: `import { Btn } from '...'` instead of `import Btn from '...'`.
|
|
77
|
+
*
|
|
78
|
+
* Handles the two common patterns the AI generates:
|
|
79
|
+
* 1. export default function/class ComponentName → export function/class ComponentName
|
|
80
|
+
* 2. const ComponentName = ...\nexport default ComponentName → export const ComponentName = ...
|
|
81
|
+
*/
|
|
82
|
+
function normalizeToNamedExport(content, codeName) {
|
|
83
|
+
// Pattern 1: export default function/class ComponentName
|
|
84
|
+
content = content.replace(/^export default (function|class)(\s)/m, "export $1$2");
|
|
85
|
+
// Pattern 2: standalone "export default ComponentName;" at end of file
|
|
86
|
+
const defaultExportRe = new RegExp(`^export default ${codeName};\\s*$`, "m");
|
|
87
|
+
if (defaultExportRe.test(content)) {
|
|
88
|
+
content = content.replace(defaultExportRe, "");
|
|
89
|
+
// Add export to the matching const/let/function declaration
|
|
90
|
+
content = content.replace(new RegExp(`^(const|let|function) (${codeName}\\b)`, "m"), "export $1 $2");
|
|
91
|
+
}
|
|
92
|
+
return content;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Normalizes index.ts barrel files to use named re-exports.
|
|
96
|
+
* Converts `export { default } from './X'` to `export { ComponentName } from './X.js'`.
|
|
97
|
+
*/
|
|
98
|
+
function normalizeIndexExport(content, codeName) {
|
|
99
|
+
// export { default } from './Btn' → export { Btn } from './Btn.js'
|
|
100
|
+
content = content.replace(/export\s*\{\s*default\s*\}\s*from\s*(['"])(\.\/[^'"]+?)(?:\.js|\.ts|\.tsx)?(['"])/g, `export { ${codeName} } from $1$2.js$3`);
|
|
101
|
+
// export { default as Btn } from './Btn' → export { Btn } from './Btn.js'
|
|
102
|
+
content = content.replace(new RegExp(`export\\s*\\{\\s*default as ${codeName}\\s*\\}\\s*from\\s*(['"])(\\.[^'"]+?)(?:\\.js|\\.ts|\\.tsx)?(['"])`, "g"), `export { ${codeName} } from $1$2.js$3`);
|
|
103
|
+
return content;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Injects `import React from 'react'` if the file uses the React namespace
|
|
107
|
+
* (React.FC, React.ReactNode, etc.) but doesn't already import React.
|
|
108
|
+
*/
|
|
109
|
+
function injectReactImport(content) {
|
|
110
|
+
const hasReactNs = /\bReact\.[A-Z]/.test(content);
|
|
111
|
+
if (!hasReactNs)
|
|
112
|
+
return content;
|
|
113
|
+
const hasReactImport = /import\s+(?:React|\*\s+as\s+React|\{[^}]*\bReact\b[^}]*\})\s+from\s+['"]react['"]/.test(content);
|
|
114
|
+
if (hasReactImport)
|
|
115
|
+
return content;
|
|
116
|
+
return `import React from 'react';\n` + content;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Corrects icon import paths that the AI generates with the wrong relative depth.
|
|
120
|
+
* AI often writes `'../chevron-down-16x16/index.js'` instead of `'../../icons/chevron-down-16x16/index.js'`.
|
|
121
|
+
*/
|
|
122
|
+
function fixIconImportPaths(content) {
|
|
123
|
+
return content.replace(/from '(\.\.\/)([\w-]+\/index\.js)'/g, (match, _dotdot, pathTail) => {
|
|
124
|
+
if (match.includes("/icons/"))
|
|
125
|
+
return match; // already correct
|
|
126
|
+
const folderName = pathTail.replace("/index.js", "");
|
|
127
|
+
// Convert kebab folder name to PascalCase for isIconComponent check
|
|
128
|
+
const pascalName = folderName
|
|
129
|
+
.split("-")
|
|
130
|
+
.map((s) => s.charAt(0).toUpperCase() + s.slice(1))
|
|
131
|
+
.join("");
|
|
132
|
+
if (isIconComponent(pascalName) || isIconComponent(folderName)) {
|
|
133
|
+
return `from '../../icons/${pathTail}'`;
|
|
134
|
+
}
|
|
135
|
+
return match;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Extracts icon component names that are passed as props to nested dependency instances
|
|
140
|
+
* via INSTANCE_SWAP overrides (overrideContract.dependency) or resolved prop values.
|
|
141
|
+
* These icons are NOT in context.dependencies or context.slotContract.
|
|
142
|
+
*/
|
|
143
|
+
function collectInstanceIconNames(dependencyInstances) {
|
|
144
|
+
const names = [];
|
|
145
|
+
for (const inst of dependencyInstances) {
|
|
146
|
+
const recipe = inst?.recipe;
|
|
147
|
+
if (!recipe)
|
|
148
|
+
continue;
|
|
149
|
+
// Source A: overrideContract.dependency — { slotName: { componentName: "ChevronDown16x16" } }
|
|
150
|
+
const depOverrides = recipe?.overrideContract?.dependency;
|
|
151
|
+
if (depOverrides && typeof depOverrides === "object") {
|
|
152
|
+
for (const v of Object.values(depOverrides)) {
|
|
153
|
+
const name = v?.componentName;
|
|
154
|
+
if (name && isIconComponent(name))
|
|
155
|
+
names.push(name);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Source B: resolvedProps — { trailingIcon: { kind: "dependency", importName: "ChevronDown16x16" } }
|
|
159
|
+
const resolvedProps = recipe?.resolvedProps;
|
|
160
|
+
if (resolvedProps && typeof resolvedProps === "object") {
|
|
161
|
+
for (const v of Object.values(resolvedProps)) {
|
|
162
|
+
const dep = v;
|
|
163
|
+
if (dep?.kind !== "dependency")
|
|
164
|
+
continue;
|
|
165
|
+
const name = dep.importName || dep.componentName;
|
|
166
|
+
if (name && isIconComponent(name))
|
|
167
|
+
names.push(name);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Source C: invocationContract.slotContract — includes HIDDEN slots (visible: false).
|
|
171
|
+
// This is where icons like ChevronDown16x16 live when they are the design default
|
|
172
|
+
// for a slot but hidden in the base variant.
|
|
173
|
+
const invSlotContract = recipe?.invocationContract?.slotContract;
|
|
174
|
+
if (invSlotContract && typeof invSlotContract === "object") {
|
|
175
|
+
for (const def of Object.values(invSlotContract)) {
|
|
176
|
+
const name = def?.dependency?.componentName;
|
|
177
|
+
if (name && isIconComponent(name))
|
|
178
|
+
names.push(name);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return names;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Builds a map of PascalCase component name → correct relative import path from currentOutputDir.
|
|
186
|
+
* Uses each dependency's categoryPath from the snapshot to reconstruct the real folder location.
|
|
187
|
+
*/
|
|
188
|
+
function buildDepPathMap(context, snapshot, naming, currentOutputDir, componentsDir) {
|
|
189
|
+
const map = new Map();
|
|
190
|
+
for (const dep of context.dependencies) {
|
|
191
|
+
if (isIconComponent(dep.name))
|
|
192
|
+
continue;
|
|
193
|
+
const compName = naming.formatComponentName(dep.name);
|
|
194
|
+
const depComp = snapshot.components.find(c => c.name === dep.name);
|
|
195
|
+
if (!depComp)
|
|
196
|
+
continue;
|
|
197
|
+
const folderName = naming.formatFolderName(dep.name);
|
|
198
|
+
const depDir = depComp.categoryPath
|
|
199
|
+
? path.join(componentsDir, naming.formatFolderName(depComp.categoryPath), folderName)
|
|
200
|
+
: path.join(componentsDir, folderName);
|
|
201
|
+
const rel = path.relative(currentOutputDir, depDir).replace(/\\/g, "/") + "/index.js";
|
|
202
|
+
map.set(compName, rel.startsWith(".") ? rel : "./" + rel);
|
|
203
|
+
}
|
|
204
|
+
return map;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Fixes relative import paths for dependency components the AI generated incorrectly.
|
|
208
|
+
* If a named import symbol is in depPathMap, replaces the path with the correct computed one.
|
|
209
|
+
*/
|
|
210
|
+
function fixDependencyImportPaths(content, depPathMap) {
|
|
211
|
+
if (depPathMap.size === 0)
|
|
212
|
+
return content;
|
|
213
|
+
return content.replace(/import\s*\{([^}]+)\}\s*from\s*'([^']+)'/g, (match, imports, currentPath) => {
|
|
214
|
+
if (!currentPath.startsWith("."))
|
|
215
|
+
return match;
|
|
216
|
+
const symbols = imports.split(",").map((s) => s.trim().split(/\s+as\s+/)[0].trim());
|
|
217
|
+
for (const sym of symbols) {
|
|
218
|
+
if (depPathMap.has(sym)) {
|
|
219
|
+
return match.replace(`'${currentPath}'`, `'${depPathMap.get(sym)}'`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return match;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
function injectMissingImports(content, context, naming, depPathMap = new Map()) {
|
|
226
|
+
const jsxRefs = new Set();
|
|
227
|
+
for (const m of content.matchAll(/<([A-Z][A-Za-z0-9]*)/g))
|
|
228
|
+
jsxRefs.add(m[1]);
|
|
229
|
+
const importedSymbols = new Set();
|
|
230
|
+
for (const m of content.matchAll(/import[^;]*\{([^}]+)\}/g)) {
|
|
231
|
+
for (const s of m[1].split(","))
|
|
232
|
+
importedSymbols.add(s.trim().split(" as ")[0].trim());
|
|
233
|
+
}
|
|
234
|
+
for (const m of content.matchAll(/import\s+([A-Z][A-Za-z0-9]*)\s+from/g)) {
|
|
235
|
+
importedSymbols.add(m[1]);
|
|
236
|
+
}
|
|
237
|
+
// Source 1: direct named dependencies (nested instances in render tree)
|
|
238
|
+
const candidates = [];
|
|
239
|
+
for (const dep of context.dependencies) {
|
|
240
|
+
candidates.push({
|
|
241
|
+
compName: naming.formatComponentName(dep.name),
|
|
242
|
+
folderName: naming.formatFolderName(dep.name),
|
|
243
|
+
isIcon: isIconComponent(dep.name),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
// Source 2: own slot contract (icons/components this component accepts as ReactNode props)
|
|
247
|
+
if (context.slotContract) {
|
|
248
|
+
for (const def of Object.values(context.slotContract)) {
|
|
249
|
+
if (def.dependency?.componentName) {
|
|
250
|
+
const rawName = def.dependency.componentName;
|
|
251
|
+
const normalized = isIconComponent(rawName) ? normalizeIconDisplayName(rawName) : rawName;
|
|
252
|
+
const compName = def.dependency.importName || naming.formatComponentName(normalized);
|
|
253
|
+
const folderName = naming.formatFolderName(normalized);
|
|
254
|
+
candidates.push({ compName, folderName, isIcon: isIconComponent(rawName) });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Source 3: icons passed as prop values to nested dep instances (INSTANCE_SWAP overrides)
|
|
259
|
+
for (const rawName of collectInstanceIconNames(context.dependencyInstances ?? [])) {
|
|
260
|
+
const normalized = normalizeIconDisplayName(rawName);
|
|
261
|
+
candidates.push({
|
|
262
|
+
compName: naming.formatComponentName(normalized),
|
|
263
|
+
folderName: naming.formatFolderName(normalized),
|
|
264
|
+
isIcon: true,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
const toInject = [];
|
|
268
|
+
const seen = new Set();
|
|
269
|
+
for (const { compName, folderName, isIcon } of candidates) {
|
|
270
|
+
if (seen.has(compName))
|
|
271
|
+
continue;
|
|
272
|
+
seen.add(compName);
|
|
273
|
+
if (jsxRefs.has(compName) && !importedSymbols.has(compName)) {
|
|
274
|
+
const importPath = isIcon
|
|
275
|
+
? `../../icons/${folderName}/index.js`
|
|
276
|
+
: (depPathMap.get(compName) ?? `../${folderName}/index.js`);
|
|
277
|
+
toInject.push(`import { ${compName} } from '${importPath}';`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Universal fallback: any icon-shaped JSX ref still missing an import after the
|
|
281
|
+
// context-based pass (e.g. Btn's internal default icons that don't appear in
|
|
282
|
+
// NotificationItem's context but the AI references anyway).
|
|
283
|
+
for (const compName of jsxRefs) {
|
|
284
|
+
if (seen.has(compName) || importedSymbols.has(compName))
|
|
285
|
+
continue;
|
|
286
|
+
if (!isIconComponent(compName))
|
|
287
|
+
continue;
|
|
288
|
+
seen.add(compName);
|
|
289
|
+
const folderName = naming.formatFolderName(normalizeIconDisplayName(compName));
|
|
290
|
+
toInject.push(`import { ${compName} } from '../../icons/${folderName}/index.js';`);
|
|
291
|
+
}
|
|
292
|
+
if (toInject.length === 0)
|
|
293
|
+
return content;
|
|
294
|
+
// Insert after the last existing import line
|
|
295
|
+
const importMatches = [...content.matchAll(/^import .+;$/gm)];
|
|
296
|
+
if (importMatches.length > 0) {
|
|
297
|
+
const last = importMatches[importMatches.length - 1];
|
|
298
|
+
const insertAt = last.index + last[0].length;
|
|
299
|
+
return content.slice(0, insertAt) + "\n" + toInject.join("\n") + content.slice(insertAt);
|
|
300
|
+
}
|
|
301
|
+
return toInject.join("\n") + "\n" + content;
|
|
302
|
+
}
|
|
303
|
+
async function autoGenerateIconDeps(context, snapshot, config, naming, promptPackage) {
|
|
304
|
+
const { componentsDir } = resolveDSPaths(config);
|
|
305
|
+
const isTs = config.framework?.typescript !== false;
|
|
306
|
+
// Collect icon names from all three sources
|
|
307
|
+
const iconNames = new Set();
|
|
308
|
+
// Source 1: own slot contract
|
|
309
|
+
if (context.slotContract) {
|
|
310
|
+
for (const def of Object.values(context.slotContract)) {
|
|
311
|
+
const name = def.dependency?.componentName;
|
|
312
|
+
if (name && isIconComponent(name))
|
|
313
|
+
iconNames.add(name);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Source 2: INSTANCE_SWAP icons passed as props to nested dep instances
|
|
317
|
+
for (const name of collectInstanceIconNames(context.dependencyInstances ?? [])) {
|
|
318
|
+
iconNames.add(name);
|
|
319
|
+
}
|
|
320
|
+
for (const depName of iconNames) {
|
|
321
|
+
const depComp = snapshot.components.find(c => c.name === depName);
|
|
322
|
+
if (!depComp)
|
|
323
|
+
continue;
|
|
324
|
+
const normalizedDepName = normalizeIconDisplayName(depName);
|
|
325
|
+
const depCodeName = naming.formatComponentName(normalizedDepName);
|
|
326
|
+
const depFolderName = naming.formatFolderName(normalizedDepName);
|
|
327
|
+
const depOutputDir = path.join(componentsDir, "icons", depFolderName);
|
|
328
|
+
const indexPath = path.join(depOutputDir, "index.ts");
|
|
329
|
+
const exists = await fs.access(indexPath).then(() => true).catch(() => false);
|
|
330
|
+
if (exists)
|
|
331
|
+
continue;
|
|
332
|
+
logger.dim(`Auto-generating icon dep: ${depCodeName} → icons/${depFolderName}`);
|
|
333
|
+
const files = buildIconFiles(depCodeName, depComp, isTs);
|
|
334
|
+
for (const file of files) {
|
|
335
|
+
const fullPath = path.resolve(depOutputDir, file.path);
|
|
336
|
+
const style = file.path.endsWith(".css") ? "css" : "js";
|
|
337
|
+
const header = formatMetadataHeader(promptPackage.metadata, style);
|
|
338
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
339
|
+
await fs.writeFile(fullPath, header + file.content, "utf8");
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
async function implementSingleComponent(component, options, config, snapshot, myRole, myHandle) {
|
|
344
|
+
// Assignment guard — members can only implement their own assigned components
|
|
345
|
+
const { workspaceRoot } = resolveDSPaths(config);
|
|
346
|
+
const lockPath = path.join(workspaceRoot, "ptb.lock");
|
|
347
|
+
let assignedTo;
|
|
348
|
+
try {
|
|
349
|
+
const lock = JSON.parse(await fs.readFile(lockPath, "utf-8"));
|
|
350
|
+
const slug = component.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
351
|
+
const entry = lock.components?.[slug] ?? Object.values(lock.components ?? {}).find((e) => e.displayName?.toLowerCase() === component.name.toLowerCase());
|
|
352
|
+
assignedTo = entry?.assignedTo;
|
|
353
|
+
}
|
|
354
|
+
catch { /* no lock yet — allow */ }
|
|
355
|
+
if (assignedTo && myRole !== "lead") {
|
|
356
|
+
if (!myHandle || assignedTo !== myHandle) {
|
|
357
|
+
logger.warn(` Skipping ${component.name} — assigned to ${assignedTo}.`);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const manifest = await loadManifest(config);
|
|
362
|
+
const context = await getComponentContext(component.id, snapshot, config, manifest);
|
|
363
|
+
if (!context) {
|
|
364
|
+
logger.error(`Failed to construct context for '${component.name}'.`);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const missingDeps = context.dependencies.filter(d => d.status === "missing");
|
|
368
|
+
if (missingDeps.length > 0) {
|
|
369
|
+
logger.warn(`Missing dependencies: ${missingDeps.map(d => d.name).join(", ")}`);
|
|
370
|
+
logger.info("Implement these first: \x1b[1mptb implement component <name>\x1b[0m");
|
|
371
|
+
}
|
|
372
|
+
const framework = options.framework || config.framework.name || null;
|
|
373
|
+
const naming = createNamingStrategy(config.naming);
|
|
374
|
+
const normalizedName = isIconComponent(component.name)
|
|
375
|
+
? normalizeIconDisplayName(component.name)
|
|
376
|
+
: component.name;
|
|
377
|
+
const codeName = naming.formatComponentName(normalizedName);
|
|
378
|
+
logger.info(`Implementing component: \x1b[36m${component.name}\x1b[0m \x1b[2m(${codeName})\x1b[0m`);
|
|
379
|
+
const promptPackage = generateComponentPrompt(context, framework);
|
|
380
|
+
const currentHash = promptPackage.metadata.contextHash;
|
|
381
|
+
// Icon components with vector SVGs from Figma are generated deterministically — no AI needed
|
|
382
|
+
if (isIconComponent(component.name) && component.iconKind) {
|
|
383
|
+
logger.dim(`Icon component — generating deterministically (${component.iconKind})`);
|
|
384
|
+
const isTs = config.framework?.typescript !== false;
|
|
385
|
+
const result = { files: buildIconFiles(codeName, component, isTs) };
|
|
386
|
+
const { componentsDir, packageRoot } = resolveDSPaths(config);
|
|
387
|
+
const baseOutputDir = context.component.artifacts?.folder
|
|
388
|
+
? path.join(packageRoot, context.component.artifacts.folder)
|
|
389
|
+
: path.join(componentsDir, "icons", naming.formatFolderName(component.name));
|
|
390
|
+
logger.info("Files:");
|
|
391
|
+
let iconWritten = 0;
|
|
392
|
+
for (const file of result.files) {
|
|
393
|
+
const fullPath = path.resolve(baseOutputDir, file.path);
|
|
394
|
+
const style = file.path.endsWith(".css") ? "css" : "js";
|
|
395
|
+
const header = formatMetadataHeader(promptPackage.metadata, style);
|
|
396
|
+
const outcome = await writeIfStale(fullPath, header + file.content, currentHash, options.force ?? false);
|
|
397
|
+
const rel = path.relative(process.cwd(), fullPath);
|
|
398
|
+
if (outcome === "written") {
|
|
399
|
+
logger.success(` ✔ ${rel}`);
|
|
400
|
+
iconWritten++;
|
|
401
|
+
}
|
|
402
|
+
if (outcome === "skipped")
|
|
403
|
+
logger.dim(` – ${rel} (up to date)`);
|
|
404
|
+
if (outcome === "protected")
|
|
405
|
+
logger.warn(` ⚠ ${rel} (user-written — skipped)`);
|
|
406
|
+
}
|
|
407
|
+
const relativeBaseDir = path.relative(packageRoot, baseOutputDir);
|
|
408
|
+
const artifactPaths = result.files.map(f => path.join(relativeBaseDir, f.path));
|
|
409
|
+
await updateComponentArtifacts(config, component.id, component.name, relativeBaseDir, artifactPaths, framework || "generic");
|
|
410
|
+
if (iconWritten > 0 && (!assignedTo || myRole === "lead" || assignedTo === myHandle)) {
|
|
411
|
+
const stamped = await stampInLock(config, component.name, "generated by ptb implement");
|
|
412
|
+
if (stamped)
|
|
413
|
+
logger.dim(" Stamped in ptb.lock.");
|
|
414
|
+
}
|
|
415
|
+
logger.info("Done.");
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
logger.dim(`Framework: ${framework || "General"}`);
|
|
419
|
+
const provider = resolveAIProvider(config);
|
|
420
|
+
const isMock = provider.name === "Mock AI Provider";
|
|
421
|
+
if (isMock) {
|
|
422
|
+
logger.warn(`No AI provider active — generating placeholder files.`);
|
|
423
|
+
logger.dim(`Add an "ai" block to ptb.config.json and set your API key to enable real generation.`);
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
logger.info(`AI provider: \x1b[36m${provider.name}\x1b[0m`);
|
|
427
|
+
}
|
|
428
|
+
// Resolve output directory before calling the AI so post-processing can use it.
|
|
429
|
+
// Uses artifacts.folder from the manifest (re-run) or categoryPath (first run).
|
|
430
|
+
const { componentsDir, packageRoot } = resolveDSPaths(config);
|
|
431
|
+
let baseOutputDir;
|
|
432
|
+
if (context.component.artifacts?.folder) {
|
|
433
|
+
baseOutputDir = path.join(packageRoot, context.component.artifacts.folder);
|
|
434
|
+
}
|
|
435
|
+
else if (component.categoryPath) {
|
|
436
|
+
baseOutputDir = path.join(componentsDir, naming.formatFolderName(component.categoryPath), naming.formatFolderName(normalizedName));
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
baseOutputDir = path.join(componentsDir, naming.formatFolderName(normalizedName));
|
|
440
|
+
}
|
|
441
|
+
// Build a map of dep name → correct relative import path from baseOutputDir.
|
|
442
|
+
// This covers all non-icon dependencies regardless of their folder depth.
|
|
443
|
+
const depPathMap = buildDepPathMap(context, snapshot, naming, baseOutputDir, componentsDir);
|
|
444
|
+
// Pre-generate any icon slot dependencies that don't yet exist on disk
|
|
445
|
+
await autoGenerateIconDeps(context, snapshot, config, naming, promptPackage);
|
|
446
|
+
const result = await provider.implementComponent({ componentName: codeName, framework, promptPackage });
|
|
447
|
+
// Normalize exports and fix import paths on every generated file
|
|
448
|
+
for (const file of result.files) {
|
|
449
|
+
if (/\.(tsx|jsx)$/.test(file.path)) {
|
|
450
|
+
file.content = normalizeToNamedExport(file.content, codeName);
|
|
451
|
+
file.content = fixIconImportPaths(file.content);
|
|
452
|
+
file.content = fixDependencyImportPaths(file.content, depPathMap);
|
|
453
|
+
file.content = injectMissingImports(file.content, context, naming, depPathMap);
|
|
454
|
+
file.content = injectReactImport(file.content);
|
|
455
|
+
}
|
|
456
|
+
if (file.path === "index.ts") {
|
|
457
|
+
file.content = normalizeIndexExport(file.content, codeName);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// Ensure all 4 required files are present; inject stubs for anything the AI omitted
|
|
461
|
+
const ext = framework === "vue" ? "vue" : "tsx";
|
|
462
|
+
const requiredFiles = [
|
|
463
|
+
{ path: `${codeName}.${ext}`, stub: `export function ${codeName}() {\n return null;\n}\n` },
|
|
464
|
+
{ path: `${codeName}.types.ts`, stub: `export type ${codeName}Props = Record<string, never>;\n` },
|
|
465
|
+
{ path: `${codeName}.module.css`, stub: `/* ${codeName} styles */\n` },
|
|
466
|
+
{ path: `index.ts`, stub: `export { ${codeName} } from "./${codeName}.js";\n` },
|
|
467
|
+
];
|
|
468
|
+
for (const req of requiredFiles) {
|
|
469
|
+
if (!result.files.some(f => f.path === req.path)) {
|
|
470
|
+
result.files.push({ path: req.path, content: req.stub });
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
logger.info("Files:");
|
|
474
|
+
let writtenCount = 0;
|
|
475
|
+
for (const file of result.files) {
|
|
476
|
+
const fullPath = path.resolve(baseOutputDir, file.path);
|
|
477
|
+
const style = file.path.endsWith(".css") ? "css" : "js";
|
|
478
|
+
const header = formatMetadataHeader(promptPackage.metadata, style);
|
|
479
|
+
const outcome = await writeIfStale(fullPath, header + file.content, currentHash, options.force ?? false);
|
|
480
|
+
const rel = path.relative(process.cwd(), fullPath);
|
|
481
|
+
if (outcome === "written") {
|
|
482
|
+
logger.success(` ✔ ${rel}`);
|
|
483
|
+
writtenCount++;
|
|
484
|
+
}
|
|
485
|
+
if (outcome === "skipped")
|
|
486
|
+
logger.dim(` – ${rel} (up to date)`);
|
|
487
|
+
if (outcome === "protected")
|
|
488
|
+
logger.warn(` ⚠ ${rel} (user-written — skipped)`);
|
|
489
|
+
}
|
|
490
|
+
// Generate MDX documentation alongside the component files
|
|
491
|
+
logger.dim("Generating docs...");
|
|
492
|
+
const docPackage = generateComponentDoc(context, codeName);
|
|
493
|
+
const enhanced = await enhanceDocWithAI(config, docPackage);
|
|
494
|
+
const mdxPath = path.join(baseOutputDir, `${codeName}.mdx`);
|
|
495
|
+
const mdxHeader = formatMetadataHeader(promptPackage.metadata, "mdx");
|
|
496
|
+
const mdxOutcome = await writeIfStale(mdxPath, mdxHeader + enhanced.filledMdx, currentHash, options.force ?? false);
|
|
497
|
+
const mdxRel = path.relative(process.cwd(), mdxPath);
|
|
498
|
+
if (mdxOutcome === "written")
|
|
499
|
+
logger.success(` ✔ ${mdxRel}`);
|
|
500
|
+
if (mdxOutcome === "skipped")
|
|
501
|
+
logger.dim(` – ${mdxRel} (up to date)`);
|
|
502
|
+
if (mdxOutcome === "protected")
|
|
503
|
+
logger.warn(` ⚠ ${mdxRel} (user-written — skipped)`);
|
|
504
|
+
const relativeBaseDir = path.relative(packageRoot, baseOutputDir);
|
|
505
|
+
const artifactPaths = [
|
|
506
|
+
...result.files.map(f => path.join(relativeBaseDir, f.path)),
|
|
507
|
+
path.join(relativeBaseDir, `${codeName}.mdx`),
|
|
508
|
+
];
|
|
509
|
+
await updateComponentArtifacts(config, component.id, component.name, relativeBaseDir, artifactPaths, framework || "generic");
|
|
510
|
+
if (writtenCount > 0 && (!assignedTo || myRole === "lead" || assignedTo === myHandle)) {
|
|
511
|
+
const stamped = await stampInLock(config, component.name, "generated by ptb implement");
|
|
512
|
+
if (stamped)
|
|
513
|
+
logger.dim(" Stamped in ptb.lock.");
|
|
514
|
+
}
|
|
515
|
+
logger.info("Done.");
|
|
516
|
+
}
|
|
517
|
+
function checkModelQuality(config) {
|
|
518
|
+
const ai = config.ai;
|
|
519
|
+
if (!ai)
|
|
520
|
+
return;
|
|
521
|
+
const providerName = ai.active?.toLowerCase() ?? "";
|
|
522
|
+
const model = ai.providers?.[providerName]?.model ?? "";
|
|
523
|
+
const isLow = (providerName === "claude" && /haiku/i.test(model)) ||
|
|
524
|
+
(providerName === "openai" && /(mini|3\.5)/i.test(model));
|
|
525
|
+
if (!isLow)
|
|
526
|
+
return;
|
|
527
|
+
const better = providerName === "claude" ? "claude-sonnet-4-6" : "gpt-4o";
|
|
528
|
+
logger.warn(` Model: \x1b[1m${model}\x1b[0m\x1b[33m may produce incomplete component code.`);
|
|
529
|
+
logger.warn(` Consider \x1b[1m${better}\x1b[0m\x1b[33m or higher for best results.`);
|
|
530
|
+
}
|
|
531
|
+
export async function implementComponentCommand(name, options = {}) {
|
|
532
|
+
try {
|
|
533
|
+
const config = await loadConfig();
|
|
534
|
+
checkModelQuality(config);
|
|
535
|
+
const { workspaceRoot } = resolveDSPaths(config);
|
|
536
|
+
const roster = await readRoster(workspaceRoot);
|
|
537
|
+
const myRole = getCurrentUserRole(roster);
|
|
538
|
+
const gitUser = getGitUser();
|
|
539
|
+
const me = gitUser ? roster.members[gitUser.email] : undefined;
|
|
540
|
+
const myHandle = me ? `@${me.handle}` : gitUser ? `@${toHandle(gitUser.name)}` : undefined;
|
|
541
|
+
const snapshot = await loadLatestSnapshot(config);
|
|
542
|
+
if (!snapshot?.components) {
|
|
543
|
+
logger.warn("No snapshot found. Please run 'ptb scan' first.");
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
if (name === "." || name === "*") {
|
|
547
|
+
let components = snapshot.components;
|
|
548
|
+
// Members only implement components assigned to them
|
|
549
|
+
if (myRole !== "lead" && myHandle) {
|
|
550
|
+
try {
|
|
551
|
+
const raw = await fs.readFile(path.join(workspaceRoot, "ptb.lock"), "utf-8");
|
|
552
|
+
const lock = JSON.parse(raw);
|
|
553
|
+
components = components.filter(c => {
|
|
554
|
+
const slug = c.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
555
|
+
const entry = lock.components?.[slug];
|
|
556
|
+
return !entry?.assignedTo || entry.assignedTo === myHandle;
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
catch (e) {
|
|
560
|
+
if (e.code !== "ENOENT") {
|
|
561
|
+
logger.warn(`Could not read ptb.lock: ${e.message}`);
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
// No ptb.lock yet — no assignments exist, implement unassigned only
|
|
565
|
+
}
|
|
566
|
+
if (components.length === 0) {
|
|
567
|
+
logger.info("No components assigned to you. Ask a lead to assign some with: ptb assign <name> @you");
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
logger.info(`Implementing ${components.length} component(s) assigned to you...`);
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
logger.info(`Implementing all ${components.length} components...`);
|
|
574
|
+
}
|
|
575
|
+
for (const component of components) {
|
|
576
|
+
logger.info(`\n→ ${component.name}`);
|
|
577
|
+
await implementSingleComponent(component, options, config, snapshot, myRole, myHandle);
|
|
578
|
+
}
|
|
579
|
+
logger.success("Done.");
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
const resolution = resolveComponent(name, snapshot.components, config);
|
|
583
|
+
const component = resolution.exactMatch;
|
|
584
|
+
if (!component) {
|
|
585
|
+
logger.error(`Component '${name}' not found.`);
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
await implementSingleComponent(component, options, config, snapshot, myRole, myHandle);
|
|
589
|
+
}
|
|
590
|
+
catch (error) {
|
|
591
|
+
logger.error(error.message || String(error));
|
|
592
|
+
process.exit(1);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=implement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/commands/implement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-tokens.d.ts","sourceRoot":"","sources":["../../src/commands/import-tokens.ts"],"names":[],"mappings":"AAGA,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,iBA4CzD"}
|