workflow-agent-cli 2.22.1 → 2.22.3
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/{chunk-KVM6A42U.js → chunk-3ADL5QDN.js} +84 -9
- package/dist/chunk-3ADL5QDN.js.map +1 -0
- package/dist/{chunk-OMHCXETM.js → chunk-3ARRW423.js} +2 -2
- package/dist/{chunk-WXHRDBAB.js → chunk-G5L77VD5.js} +31 -1
- package/dist/chunk-G5L77VD5.js.map +1 -0
- package/dist/cli/index.js +13 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +5 -1
- package/dist/sync-SOERVZT3.js +7 -0
- package/dist/verify-XGCZKY7S.js +8 -0
- package/package.json +1 -1
- package/dist/chunk-KVM6A42U.js.map +0 -1
- package/dist/chunk-WXHRDBAB.js.map +0 -1
- package/dist/sync-MNHQ6AIQ.js +0 -7
- package/dist/verify-2PDVNYWV.js +0 -8
- /package/dist/{chunk-OMHCXETM.js.map → chunk-3ARRW423.js.map} +0 -0
- /package/dist/{sync-MNHQ6AIQ.js.map → sync-SOERVZT3.js.map} +0 -0
- /package/dist/{verify-2PDVNYWV.js.map → verify-XGCZKY7S.js.map} +0 -0
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
// src/utils/check-runner.ts
|
|
2
2
|
import { execa } from "execa";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
+
import { existsSync, readFileSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
4
6
|
var QUALITY_CHECKS = [
|
|
5
7
|
{
|
|
6
8
|
name: "typecheck",
|
|
7
9
|
displayName: "Type Check",
|
|
8
10
|
command: "pnpm",
|
|
9
11
|
args: ["typecheck"],
|
|
10
|
-
canAutoFix: false
|
|
12
|
+
canAutoFix: false,
|
|
11
13
|
// TypeScript errors need manual/LLM fix
|
|
14
|
+
requiredScript: "typecheck",
|
|
15
|
+
fallbackCommand: ["tsc", "--noEmit"]
|
|
12
16
|
},
|
|
13
17
|
{
|
|
14
18
|
name: "lint",
|
|
@@ -17,7 +21,8 @@ var QUALITY_CHECKS = [
|
|
|
17
21
|
args: ["lint"],
|
|
18
22
|
fixCommand: "pnpm",
|
|
19
23
|
fixArgs: ["lint", "--fix"],
|
|
20
|
-
canAutoFix: true
|
|
24
|
+
canAutoFix: true,
|
|
25
|
+
requiredScript: "lint"
|
|
21
26
|
},
|
|
22
27
|
{
|
|
23
28
|
name: "format",
|
|
@@ -26,25 +31,74 @@ var QUALITY_CHECKS = [
|
|
|
26
31
|
args: ["format", "--check"],
|
|
27
32
|
fixCommand: "pnpm",
|
|
28
33
|
fixArgs: ["format"],
|
|
29
|
-
canAutoFix: true
|
|
34
|
+
canAutoFix: true,
|
|
35
|
+
requiredScript: "format"
|
|
30
36
|
},
|
|
31
37
|
{
|
|
32
38
|
name: "test",
|
|
33
39
|
displayName: "Tests",
|
|
34
40
|
command: "pnpm",
|
|
35
41
|
args: ["test"],
|
|
36
|
-
canAutoFix: false
|
|
42
|
+
canAutoFix: false,
|
|
37
43
|
// Tests need manual/LLM fix
|
|
44
|
+
requiredScript: "test"
|
|
38
45
|
},
|
|
39
46
|
{
|
|
40
47
|
name: "build",
|
|
41
48
|
displayName: "Build",
|
|
42
49
|
command: "pnpm",
|
|
43
50
|
args: ["build"],
|
|
44
|
-
canAutoFix: false
|
|
51
|
+
canAutoFix: false,
|
|
45
52
|
// Build errors need manual/LLM fix
|
|
53
|
+
requiredScript: "build"
|
|
46
54
|
}
|
|
47
55
|
];
|
|
56
|
+
function getAvailableScripts(cwd) {
|
|
57
|
+
const packageJsonPath = join(cwd, "package.json");
|
|
58
|
+
if (!existsSync(packageJsonPath)) {
|
|
59
|
+
return /* @__PURE__ */ new Set();
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
63
|
+
return new Set(Object.keys(packageJson.scripts || {}));
|
|
64
|
+
} catch {
|
|
65
|
+
return /* @__PURE__ */ new Set();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function commandExists(cmd) {
|
|
69
|
+
try {
|
|
70
|
+
await execa("which", [cmd]);
|
|
71
|
+
return true;
|
|
72
|
+
} catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function getApplicableChecks(cwd) {
|
|
77
|
+
const availableScripts = getAvailableScripts(cwd);
|
|
78
|
+
const applicableChecks = [];
|
|
79
|
+
for (const check of QUALITY_CHECKS) {
|
|
80
|
+
if (!check.requiredScript) {
|
|
81
|
+
applicableChecks.push(check);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (availableScripts.has(check.requiredScript)) {
|
|
85
|
+
applicableChecks.push(check);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (check.fallbackCommand && check.fallbackCommand.length > 0) {
|
|
89
|
+
const fallbackCmd = check.fallbackCommand[0];
|
|
90
|
+
if (await commandExists(fallbackCmd)) {
|
|
91
|
+
applicableChecks.push({
|
|
92
|
+
...check,
|
|
93
|
+
command: fallbackCmd,
|
|
94
|
+
args: check.fallbackCommand.slice(1)
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return applicableChecks;
|
|
101
|
+
}
|
|
48
102
|
async function runCheck(check, cwd) {
|
|
49
103
|
const startTime = Date.now();
|
|
50
104
|
try {
|
|
@@ -138,6 +192,25 @@ async function runAllChecks(cwd, options = {}) {
|
|
|
138
192
|
let fixesApplied = 0;
|
|
139
193
|
const appliedFixes = [];
|
|
140
194
|
const pendingFixes = [];
|
|
195
|
+
const applicableChecks = await getApplicableChecks(cwd);
|
|
196
|
+
const skippedChecks = QUALITY_CHECKS.filter(
|
|
197
|
+
(qc) => !applicableChecks.some((ac) => ac.name === qc.name)
|
|
198
|
+
);
|
|
199
|
+
if (skippedChecks.length > 0) {
|
|
200
|
+
log(`
|
|
201
|
+
\u23ED\uFE0F Skipping checks (scripts not found): ${skippedChecks.map((c) => c.displayName).join(", ")}`, "warning");
|
|
202
|
+
}
|
|
203
|
+
if (applicableChecks.length === 0) {
|
|
204
|
+
log(`
|
|
205
|
+
\u26A0\uFE0F No applicable checks found. Add scripts to package.json: typecheck, lint, format, test, build`, "warning");
|
|
206
|
+
return {
|
|
207
|
+
success: true,
|
|
208
|
+
results: [],
|
|
209
|
+
totalAttempts: 0,
|
|
210
|
+
fixesApplied: 0,
|
|
211
|
+
appliedFixes: []
|
|
212
|
+
};
|
|
213
|
+
}
|
|
141
214
|
while (attempt < maxRetries) {
|
|
142
215
|
attempt++;
|
|
143
216
|
log(`
|
|
@@ -148,10 +221,10 @@ ${"\u2501".repeat(50)}`, "info");
|
|
|
148
221
|
const results = [];
|
|
149
222
|
let allPassed = true;
|
|
150
223
|
let fixAppliedThisCycle = false;
|
|
151
|
-
for (let i = 0; i <
|
|
152
|
-
const check =
|
|
224
|
+
for (let i = 0; i < applicableChecks.length; i++) {
|
|
225
|
+
const check = applicableChecks[i];
|
|
153
226
|
const stepNum = i + 1;
|
|
154
|
-
const totalSteps =
|
|
227
|
+
const totalSteps = applicableChecks.length;
|
|
155
228
|
log(`\u{1F4CB} Step ${stepNum}/${totalSteps}: ${check.displayName}...`, "info");
|
|
156
229
|
const result = await runCheck(check, cwd);
|
|
157
230
|
results.push(result);
|
|
@@ -312,10 +385,12 @@ async function stageAllChanges(cwd) {
|
|
|
312
385
|
|
|
313
386
|
export {
|
|
314
387
|
QUALITY_CHECKS,
|
|
388
|
+
getAvailableScripts,
|
|
389
|
+
getApplicableChecks,
|
|
315
390
|
runCheck,
|
|
316
391
|
applyFix,
|
|
317
392
|
runAllChecks,
|
|
318
393
|
hasUncommittedChanges,
|
|
319
394
|
stageAllChanges
|
|
320
395
|
};
|
|
321
|
-
//# sourceMappingURL=chunk-
|
|
396
|
+
//# sourceMappingURL=chunk-3ADL5QDN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/check-runner.ts"],"sourcesContent":["/**\n * Check Runner - Orchestrates quality checks with fix-and-revalidate pattern\n *\n * Pattern: Run check → If fails, fix → Re-run ALL checks from start\n * This ensures fixes don't introduce new issues in earlier checks.\n */\n\nimport { execa, type ExecaError } from \"execa\";\nimport chalk from \"chalk\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\n\nexport interface CheckDefinition {\n name: string;\n displayName: string;\n command: string;\n args: string[];\n fixCommand?: string;\n fixArgs?: string[];\n canAutoFix: boolean;\n /** The npm script name this check depends on (e.g., \"typecheck\", \"lint\") */\n requiredScript?: string;\n /** Fallback command if the script doesn't exist (e.g., [\"tsc\", \"--noEmit\"]) */\n fallbackCommand?: string[];\n}\n\nexport interface CheckResult {\n check: CheckDefinition;\n success: boolean;\n output: string;\n error?: string;\n duration: number;\n}\n\nexport interface AppliedFix {\n checkName: string;\n displayName: string;\n command: string;\n timestamp: Date;\n}\n\nexport interface RunAllChecksResult {\n success: boolean;\n results: CheckResult[];\n totalAttempts: number;\n fixesApplied: number;\n appliedFixes: AppliedFix[];\n pendingFixes?: Array<{ check: CheckDefinition; command: string }>;\n}\n\nexport type ProgressType = \"info\" | \"success\" | \"error\" | \"warning\";\n\nexport interface CheckRunnerOptions {\n maxRetries?: number;\n autoFix?: boolean;\n dryRun?: boolean;\n onProgress?: (message: string, type: ProgressType) => void;\n}\n\n/**\n * Standard quality checks in recommended order\n * Order: typecheck → lint → format → test → build\n * Type errors cascade, so we fix them first\n */\nexport const QUALITY_CHECKS: CheckDefinition[] = [\n {\n name: \"typecheck\",\n displayName: \"Type Check\",\n command: \"pnpm\",\n args: [\"typecheck\"],\n canAutoFix: false, // TypeScript errors need manual/LLM fix\n requiredScript: \"typecheck\",\n fallbackCommand: [\"tsc\", \"--noEmit\"],\n },\n {\n name: \"lint\",\n displayName: \"Lint\",\n command: \"pnpm\",\n args: [\"lint\"],\n fixCommand: \"pnpm\",\n fixArgs: [\"lint\", \"--fix\"],\n canAutoFix: true,\n requiredScript: \"lint\",\n },\n {\n name: \"format\",\n displayName: \"Format\",\n command: \"pnpm\",\n args: [\"format\", \"--check\"],\n fixCommand: \"pnpm\",\n fixArgs: [\"format\"],\n canAutoFix: true,\n requiredScript: \"format\",\n },\n {\n name: \"test\",\n displayName: \"Tests\",\n command: \"pnpm\",\n args: [\"test\"],\n canAutoFix: false, // Tests need manual/LLM fix\n requiredScript: \"test\",\n },\n {\n name: \"build\",\n displayName: \"Build\",\n command: \"pnpm\",\n args: [\"build\"],\n canAutoFix: false, // Build errors need manual/LLM fix\n requiredScript: \"build\",\n },\n];\n\n/**\n * Get available scripts from the target project's package.json\n */\nexport function getAvailableScripts(cwd: string): Set<string> {\n const packageJsonPath = join(cwd, \"package.json\");\n \n if (!existsSync(packageJsonPath)) {\n return new Set();\n }\n \n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n return new Set(Object.keys(packageJson.scripts || {}));\n } catch {\n return new Set();\n }\n}\n\n/**\n * Check if a command exists in PATH\n */\nasync function commandExists(cmd: string): Promise<boolean> {\n try {\n await execa(\"which\", [cmd]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get applicable checks for the target project\n * Filters out checks for scripts that don't exist, uses fallbacks when available\n */\nexport async function getApplicableChecks(cwd: string): Promise<CheckDefinition[]> {\n const availableScripts = getAvailableScripts(cwd);\n const applicableChecks: CheckDefinition[] = [];\n \n for (const check of QUALITY_CHECKS) {\n // If no required script, always include\n if (!check.requiredScript) {\n applicableChecks.push(check);\n continue;\n }\n \n // If the script exists in package.json, use the pnpm command\n if (availableScripts.has(check.requiredScript)) {\n applicableChecks.push(check);\n continue;\n }\n \n // If there's a fallback command and it exists, use that\n if (check.fallbackCommand && check.fallbackCommand.length > 0) {\n const fallbackCmd = check.fallbackCommand[0];\n if (await commandExists(fallbackCmd)) {\n applicableChecks.push({\n ...check,\n command: fallbackCmd,\n args: check.fallbackCommand.slice(1),\n });\n continue;\n }\n }\n \n // Script doesn't exist and no valid fallback - skip this check\n // (will be logged as skipped in runAllChecks)\n }\n \n return applicableChecks;\n}\n\n/**\n * Run a single check\n */\nexport async function runCheck(\n check: CheckDefinition,\n cwd: string,\n): Promise<CheckResult> {\n const startTime = Date.now();\n\n try {\n const result = await execa(check.command, check.args, {\n cwd,\n reject: false,\n all: true,\n });\n\n const duration = Date.now() - startTime;\n\n if (result.exitCode === 0) {\n return {\n check,\n success: true,\n output: result.all || \"\",\n duration,\n };\n } else {\n return {\n check,\n success: false,\n output: result.all || \"\",\n error: result.stderr || result.all || \"Check failed\",\n duration,\n };\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const execaError = error as ExecaError;\n\n return {\n check,\n success: false,\n output: execaError.all?.toString() || execaError.message || \"\",\n error: execaError.message,\n duration,\n };\n }\n}\n\n/**\n * Apply fix for a check that supports auto-fix\n */\nexport async function applyFix(\n check: CheckDefinition,\n cwd: string,\n): Promise<{ success: boolean; output: string }> {\n if (!check.canAutoFix || !check.fixCommand) {\n return { success: false, output: \"Check does not support auto-fix\" };\n }\n\n try {\n const result = await execa(check.fixCommand, check.fixArgs || [], {\n cwd,\n reject: false,\n all: true,\n });\n\n return {\n success: result.exitCode === 0,\n output: result.all || \"\",\n };\n } catch (error) {\n const execaError = error as ExecaError;\n return {\n success: false,\n output: execaError.message,\n };\n }\n}\n\n/**\n * Format a fix command for display\n */\nfunction formatFixCommand(check: CheckDefinition): string {\n if (!check.fixCommand) return \"\";\n return `${check.fixCommand} ${(check.fixArgs || []).join(\" \")}`;\n}\n\n/**\n * Run all quality checks with fix-and-revalidate pattern\n *\n * When a check fails and can be auto-fixed:\n * 1. Apply the fix\n * 2. Re-run ALL checks from the beginning\n * 3. Repeat until all pass or max retries reached\n *\n * @param cwd - Working directory\n * @param options - Configuration options\n */\nexport async function runAllChecks(\n cwd: string,\n options: CheckRunnerOptions = {},\n): Promise<RunAllChecksResult> {\n const {\n maxRetries = 10,\n autoFix = true,\n dryRun = false,\n onProgress,\n } = options;\n\n const log = (message: string, type: ProgressType = \"info\") => {\n if (onProgress) {\n onProgress(message, type);\n } else {\n // Default console output with colors\n switch (type) {\n case \"success\":\n console.log(chalk.green(message));\n break;\n case \"error\":\n console.log(chalk.red(message));\n break;\n case \"warning\":\n console.log(chalk.yellow(message));\n break;\n default:\n console.log(message);\n }\n }\n };\n\n let attempt = 0;\n let fixesApplied = 0;\n const appliedFixes: AppliedFix[] = [];\n const pendingFixes: Array<{ check: CheckDefinition; command: string }> = [];\n\n // Get applicable checks for this project (filters out missing scripts)\n const applicableChecks = await getApplicableChecks(cwd);\n \n // Log skipped checks\n const skippedChecks = QUALITY_CHECKS.filter(\n qc => !applicableChecks.some(ac => ac.name === qc.name)\n );\n if (skippedChecks.length > 0) {\n log(`\\n⏭️ Skipping checks (scripts not found): ${skippedChecks.map(c => c.displayName).join(\", \")}`, \"warning\");\n }\n \n if (applicableChecks.length === 0) {\n log(`\\n⚠️ No applicable checks found. Add scripts to package.json: typecheck, lint, format, test, build`, \"warning\");\n return {\n success: true,\n results: [],\n totalAttempts: 0,\n fixesApplied: 0,\n appliedFixes: [],\n };\n }\n\n while (attempt < maxRetries) {\n attempt++;\n\n log(`\\n${\"━\".repeat(50)}`, \"info\");\n log(`🔄 Validation Cycle ${attempt}/${maxRetries}`, \"info\");\n log(`${\"━\".repeat(50)}\\n`, \"info\");\n\n const results: CheckResult[] = [];\n let allPassed = true;\n let fixAppliedThisCycle = false;\n\n // Run each check in order\n for (let i = 0; i < applicableChecks.length; i++) {\n const check = applicableChecks[i];\n const stepNum = i + 1;\n const totalSteps = applicableChecks.length;\n\n log(`📋 Step ${stepNum}/${totalSteps}: ${check.displayName}...`, \"info\");\n\n const result = await runCheck(check, cwd);\n results.push(result);\n\n if (result.success) {\n log(`✅ ${check.displayName} passed (${result.duration}ms)`, \"success\");\n } else {\n allPassed = false;\n log(`❌ ${check.displayName} failed`, \"error\");\n\n // Try to auto-fix if possible\n if (autoFix && check.canAutoFix && check.fixCommand) {\n if (dryRun) {\n // In dry-run mode, just record what would be fixed\n log(\n `🔧 [DRY-RUN] Would run: ${formatFixCommand(check)}`,\n \"warning\",\n );\n pendingFixes.push({ check, command: formatFixCommand(check) });\n\n // Continue to next check to show all issues\n continue;\n }\n\n log(`🔧 Attempting auto-fix for ${check.displayName}...`, \"warning\");\n\n const fixResult = await applyFix(check, cwd);\n\n if (fixResult.success) {\n log(`✨ Auto-fix applied for ${check.displayName}`, \"success\");\n fixesApplied++;\n appliedFixes.push({\n checkName: check.name,\n displayName: check.displayName,\n command: formatFixCommand(check),\n timestamp: new Date(),\n });\n fixAppliedThisCycle = true;\n\n // IMPORTANT: Re-run ALL checks from the beginning\n log(\n `\\n🔄 Fix applied - restarting all checks to verify...`,\n \"warning\",\n );\n break; // Exit the for loop to restart from the beginning\n } else {\n log(`⚠️ Auto-fix failed for ${check.displayName}`, \"error\");\n log(` Manual intervention required`, \"error\");\n\n // Show error details\n if (result.error) {\n const errorPreview = result.error.slice(0, 500);\n log(`\\n${chalk.dim(errorPreview)}`, \"error\");\n if (result.error.length > 500) {\n log(\n chalk.dim(\n `... (${result.error.length - 500} more characters)`,\n ),\n \"error\",\n );\n }\n }\n\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n } else {\n // Cannot auto-fix this check\n if (check.canAutoFix) {\n log(\n `⚠️ ${check.displayName} can be fixed with: ${formatFixCommand(check)}`,\n \"warning\",\n );\n } else {\n log(`⚠️ ${check.displayName} requires manual fix`, \"error\");\n }\n\n // Show error details\n if (result.error) {\n const errorPreview = result.error.slice(0, 500);\n log(`\\n${chalk.dim(errorPreview)}`, \"error\");\n if (result.error.length > 500) {\n log(\n chalk.dim(`... (${result.error.length - 500} more characters)`),\n \"error\",\n );\n }\n }\n\n if (!dryRun) {\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n }\n }\n }\n\n // Handle dry-run completion\n if (dryRun && pendingFixes.length > 0) {\n log(`\\n${\"━\".repeat(50)}`, \"info\");\n log(`📋 DRY-RUN SUMMARY`, \"info\");\n log(`${\"━\".repeat(50)}`, \"info\");\n log(`\\nThe following fixes would be applied:`, \"warning\");\n for (const fix of pendingFixes) {\n log(` • ${fix.check.displayName}: ${fix.command}`, \"info\");\n }\n log(`\\nRun without --dry-run to apply fixes.`, \"info\");\n\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied: 0,\n appliedFixes: [],\n pendingFixes,\n };\n }\n\n // If all checks passed, we're done!\n if (allPassed) {\n return {\n success: true,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n\n // If no fix was applied this cycle but we still failed, we're stuck\n if (!fixAppliedThisCycle) {\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n\n // Otherwise, continue to next cycle (fix was applied, need to re-verify)\n }\n\n // Max retries exceeded\n log(`\\n❌ Maximum retries (${maxRetries}) exceeded`, \"error\");\n\n return {\n success: false,\n results: [],\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n}\n\n/**\n * Check if there are uncommitted changes in git\n */\nexport async function hasUncommittedChanges(cwd: string): Promise<boolean> {\n try {\n const result = await execa(\"git\", [\"status\", \"--porcelain\"], { cwd });\n return result.stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Stage all changes in git\n */\nexport async function stageAllChanges(cwd: string): Promise<boolean> {\n try {\n await execa(\"git\", [\"add\", \"-A\"], { cwd });\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
hasUncommittedChanges,
|
|
3
3
|
runAllChecks,
|
|
4
4
|
stageAllChanges
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3ADL5QDN.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/commands/verify.ts
|
|
8
8
|
import chalk from "chalk";
|
|
@@ -235,4 +235,4 @@ async function recordSuccessfulFixes(cwd, result) {
|
|
|
235
235
|
export {
|
|
236
236
|
verifyCommand
|
|
237
237
|
};
|
|
238
|
-
//# sourceMappingURL=chunk-
|
|
238
|
+
//# sourceMappingURL=chunk-3ARRW423.js.map
|
|
@@ -201,6 +201,36 @@ async function syncCommand(options) {
|
|
|
201
201
|
const cwd = getWorkspacePath();
|
|
202
202
|
const contributorManager = new ContributorManager(cwd);
|
|
203
203
|
p.intro(chalk.bgBlue(" workflow sync "));
|
|
204
|
+
if (options.enableSync) {
|
|
205
|
+
const enableResult = await contributorManager.enableSync();
|
|
206
|
+
if (enableResult.success) {
|
|
207
|
+
console.log(chalk.green("\n\u2705 Sync enabled!"));
|
|
208
|
+
console.log(chalk.dim(" Your anonymized patterns can now be shared with the community.\n"));
|
|
209
|
+
} else {
|
|
210
|
+
console.log(chalk.red(`
|
|
211
|
+
\u274C Failed to enable sync: ${enableResult.error}
|
|
212
|
+
`));
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
if (!options.push && !options.pull && !options.all && !options.solutions && !options.scopes) {
|
|
216
|
+
p.outro(chalk.green("Sync enabled"));
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (options.disableSync) {
|
|
221
|
+
const disableResult = await contributorManager.disableSync();
|
|
222
|
+
if (disableResult.success) {
|
|
223
|
+
console.log(chalk.green("\n\u2705 Sync disabled!"));
|
|
224
|
+
console.log(chalk.dim(" Your patterns will no longer be shared.\n"));
|
|
225
|
+
} else {
|
|
226
|
+
console.log(chalk.red(`
|
|
227
|
+
\u274C Failed to disable sync: ${disableResult.error}
|
|
228
|
+
`));
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
p.outro(chalk.green("Sync disabled"));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
204
234
|
const config = await contributorManager.getConfig();
|
|
205
235
|
if (!config.success || !config.data?.syncOptIn) {
|
|
206
236
|
console.log(chalk.yellow("\n\u26A0\uFE0F Sync is not enabled.\n"));
|
|
@@ -463,4 +493,4 @@ async function syncCommand(options) {
|
|
|
463
493
|
export {
|
|
464
494
|
syncCommand
|
|
465
495
|
};
|
|
466
|
-
//# sourceMappingURL=chunk-
|
|
496
|
+
//# sourceMappingURL=chunk-G5L77VD5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/sync.ts","../src/sync/registry-client.ts"],"sourcesContent":["/**\n * Unified Sync Command\n *\n * Orchestrates syncing of patterns and solutions with the registry.\n * Combines functionality from learn:sync and solution sync.\n *\n * Usage:\n * workflow sync # Interactive sync (prompts for direction)\n * workflow sync --push # Push local patterns to registry\n * workflow sync --pull # Pull patterns from registry\n * workflow sync --solutions # Include solution patterns\n * workflow sync --learn # Include learning patterns (default)\n * workflow sync --scopes # Sync custom scope packages\n * workflow sync --all # Sync everything\n * workflow sync --dry-run # Preview without syncing\n */\n\nimport * as p from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport {\n PatternStore,\n PatternAnonymizer,\n ContributorManager,\n type FixPattern,\n type Blueprint,\n type SolutionPattern,\n} from \"@hawkinside_out/workflow-improvement-tracker\";\nimport {\n RegistryClient,\n RateLimitedException,\n RegistryError,\n} from \"../../sync/registry-client.js\";\n\nexport interface UnifiedSyncOptions {\n push?: boolean;\n pull?: boolean;\n solutions?: boolean;\n learn?: boolean;\n scopes?: boolean;\n all?: boolean;\n dryRun?: boolean;\n enableSync?: boolean;\n disableSync?: boolean;\n}\n\nfunction getWorkspacePath(): string {\n return process.cwd();\n}\n\n/**\n * Unified sync command that orchestrates all sync operations\n */\nexport async function syncCommand(options: UnifiedSyncOptions): Promise<void> {\n const cwd = getWorkspacePath();\n const contributorManager = new ContributorManager(cwd);\n\n p.intro(chalk.bgBlue(\" workflow sync \"));\n\n // Handle --enable-sync option\n if (options.enableSync) {\n const enableResult = await contributorManager.enableSync();\n if (enableResult.success) {\n console.log(chalk.green(\"\\n✅ Sync enabled!\"));\n console.log(chalk.dim(\" Your anonymized patterns can now be shared with the community.\\n\"));\n } else {\n console.log(chalk.red(`\\n❌ Failed to enable sync: ${enableResult.error}\\n`));\n process.exit(1);\n }\n // If only --enable-sync was passed, exit after enabling\n if (!options.push && !options.pull && !options.all && !options.solutions && !options.scopes) {\n p.outro(chalk.green(\"Sync enabled\"));\n return;\n }\n }\n\n // Handle --disable-sync option\n if (options.disableSync) {\n const disableResult = await contributorManager.disableSync();\n if (disableResult.success) {\n console.log(chalk.green(\"\\n✅ Sync disabled!\"));\n console.log(chalk.dim(\" Your patterns will no longer be shared.\\n\"));\n } else {\n console.log(chalk.red(`\\n❌ Failed to disable sync: ${disableResult.error}\\n`));\n process.exit(1);\n }\n p.outro(chalk.green(\"Sync disabled\"));\n return;\n }\n\n // Check if sync is enabled\n const config = await contributorManager.getConfig();\n if (!config.success || !config.data?.syncOptIn) {\n console.log(chalk.yellow(\"\\n⚠️ Sync is not enabled.\\n\"));\n console.log(chalk.dim(\" To enable sync, run:\"));\n console.log(chalk.dim(\" workflow learn config --enable-sync\\n\"));\n console.log(\n chalk.dim(\n \" This allows you to share anonymized patterns with the community.\",\n ),\n );\n p.outro(chalk.yellow(\"Sync not enabled\"));\n process.exit(0);\n }\n\n // Determine what to sync\n const syncLearn = options.learn || options.all || (!options.solutions && !options.scopes);\n const syncSolutions = options.solutions || options.all;\n const syncScopes = options.scopes || options.all;\n\n // Determine direction\n let direction: \"push\" | \"pull\" | \"both\" = \"both\";\n if (options.push && !options.pull) {\n direction = \"push\";\n } else if (options.pull && !options.push) {\n direction = \"pull\";\n } else if (!options.push && !options.pull) {\n // Interactive mode - ask user\n const choice = await p.select({\n message: \"Sync direction:\",\n options: [\n { value: \"push\", label: \"📤 Push - Upload local patterns to registry\" },\n { value: \"pull\", label: \"📥 Pull - Download patterns from registry\" },\n { value: \"both\", label: \"🔄 Both - Push then pull\" },\n ],\n });\n\n if (p.isCancel(choice)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n direction = choice as \"push\" | \"pull\" | \"both\";\n }\n\n if (options.dryRun) {\n console.log(chalk.yellow(\"\\n📋 DRY-RUN MODE: No changes will be synced\\n\"));\n }\n\n // Show what will be synced\n console.log(chalk.cyan(\"\\n📦 Sync scope:\"));\n if (syncLearn) console.log(chalk.dim(\" • Learning patterns (fixes, blueprints)\"));\n if (syncSolutions) console.log(chalk.dim(\" • Solution patterns\"));\n if (syncScopes) console.log(chalk.dim(\" • Custom scopes\"));\n console.log(chalk.dim(` • Direction: ${direction === \"both\" ? \"push + pull\" : direction}`));\n console.log(\"\");\n\n const store = new PatternStore(cwd);\n const anonymizer = new PatternAnonymizer();\n\n // Get patterns to sync\n const { fixes, blueprints, solutions } = await store.getPatternsForSync();\n\n // Filter based on options\n const patternsToSync: Array<{\n pattern: FixPattern | Blueprint | SolutionPattern;\n type: \"fix\" | \"blueprint\" | \"solution\";\n originalId: string;\n }> = [];\n\n if (syncLearn) {\n console.log(\n chalk.dim(\n ` Found ${fixes.length} fixes, ${blueprints.length} blueprints ready to sync`,\n ),\n );\n\n for (const fix of fixes) {\n const result = anonymizer.anonymizeFixPattern(fix);\n if (result.success && result.data) {\n patternsToSync.push({\n pattern: result.data,\n type: \"fix\",\n originalId: fix.id,\n });\n }\n }\n\n for (const bp of blueprints) {\n const result = anonymizer.anonymizeBlueprint(bp);\n if (result.success && result.data) {\n patternsToSync.push({\n pattern: result.data,\n type: \"blueprint\",\n originalId: bp.id,\n });\n }\n }\n }\n\n if (syncSolutions) {\n console.log(\n chalk.dim(\n ` Found ${solutions.length} solutions ready to sync`,\n ),\n );\n\n for (const solution of solutions) {\n const result = anonymizer.anonymizeSolution(solution);\n if (result.success && result.data) {\n patternsToSync.push({\n pattern: result.data,\n type: \"solution\",\n originalId: solution.id,\n });\n }\n }\n }\n\n if (syncScopes) {\n // TODO: Implement scope sync when scope registry is available\n console.log(chalk.dim(\" Scope sync: Coming soon\"));\n }\n\n // PUSH operation\n if (direction === \"push\" || direction === \"both\") {\n console.log(chalk.cyan(\"\\n📤 Pushing patterns...\\n\"));\n\n if (patternsToSync.length === 0) {\n console.log(chalk.yellow(\" No patterns to push\\n\"));\n } else {\n const fixCount = patternsToSync.filter((p) => p.type === \"fix\").length;\n const bpCount = patternsToSync.filter((p) => p.type === \"blueprint\").length;\n const solutionCount = patternsToSync.filter((p) => p.type === \"solution\").length;\n\n console.log(\n chalk.dim(\n ` Ready to push: ${fixCount} fixes, ${bpCount} blueprints, ${solutionCount} solutions`,\n ),\n );\n\n if (options.dryRun) {\n console.log(chalk.yellow(\"\\n [DRY-RUN] Would push patterns to registry\"));\n } else {\n // Get contributor ID\n const contributorResult = await contributorManager.getOrCreateId();\n if (!contributorResult.success || !contributorResult.data) {\n console.log(chalk.red(\"\\n ❌ Failed to get contributor ID\"));\n process.exit(1);\n }\n\n // Push to registry\n const registryClient = new RegistryClient();\n\n try {\n console.log(chalk.dim(\"\\n Connecting to registry...\"));\n\n const pushResult = await registryClient.push(\n patternsToSync.map((p) => ({\n pattern: p.pattern,\n type: p.type,\n })),\n contributorResult.data,\n );\n\n // Mark pushed patterns as synced\n if (pushResult.pushed > 0) {\n const pushedFixIds = patternsToSync\n .filter((p) => p.type === \"fix\")\n .map((p) => p.originalId);\n const pushedBpIds = patternsToSync\n .filter((p) => p.type === \"blueprint\")\n .map((p) => p.originalId);\n const pushedSolutionIds = patternsToSync\n .filter((p) => p.type === \"solution\")\n .map((p) => p.originalId);\n\n if (pushedFixIds.length > 0) {\n await store.markAsSynced(pushedFixIds, \"fix\");\n }\n if (pushedBpIds.length > 0) {\n await store.markAsSynced(pushedBpIds, \"blueprint\");\n }\n if (pushedSolutionIds.length > 0) {\n await store.markAsSynced(pushedSolutionIds, \"solution\");\n }\n }\n\n console.log(\n chalk.green(`\\n ✅ Pushed ${pushResult.pushed} patterns to registry`),\n );\n\n if (pushResult.skipped > 0) {\n console.log(\n chalk.dim(` (${pushResult.skipped} already existed)`),\n );\n }\n\n if (pushResult.errors && pushResult.errors.length > 0) {\n console.log(chalk.yellow(`\\n ⚠️ Some patterns had errors:`));\n for (const err of pushResult.errors) {\n console.log(chalk.dim(` - ${err}`));\n }\n }\n\n console.log(\n chalk.dim(\n `\\n Rate limit: ${pushResult.rateLimit.remaining} patterns remaining this hour`,\n ),\n );\n } catch (error) {\n if (error instanceof RateLimitedException) {\n console.log(chalk.red(\"\\n ❌ Rate limit exceeded\"));\n console.log(\n chalk.dim(\n ` Try again in ${error.getTimeUntilReset()}`,\n ),\n );\n } else if (error instanceof RegistryError) {\n console.log(chalk.red(`\\n ❌ Registry error: ${error.message}`));\n } else {\n console.log(\n chalk.red(\n `\\n ❌ Failed to push: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n process.exit(1);\n }\n }\n }\n }\n\n // PULL operation\n if (direction === \"pull\" || direction === \"both\") {\n console.log(chalk.cyan(\"\\n📥 Pulling patterns from registry...\\n\"));\n\n if (options.dryRun) {\n console.log(chalk.yellow(\" [DRY-RUN] Would pull patterns from registry\"));\n } else {\n const registryClient = new RegistryClient();\n\n try {\n console.log(chalk.dim(\" Connecting to registry...\"));\n\n // Pull patterns based on sync options - need to call separately for each type\n const pullTypes: (\"fix\" | \"blueprint\" | \"solution\")[] = [];\n if (syncLearn) {\n pullTypes.push(\"fix\", \"blueprint\");\n }\n if (syncSolutions) {\n pullTypes.push(\"solution\");\n }\n\n let totalPatterns = 0;\n let savedCount = 0;\n\n for (const pullType of pullTypes) {\n const pullResult = await registryClient.pull({\n type: pullType,\n });\n\n totalPatterns += pullResult.patterns.length;\n\n for (const pulled of pullResult.patterns) {\n try {\n if (pulled.type === \"fix\" && pulled.data) {\n await store.saveFixPattern(pulled.data as FixPattern);\n savedCount++;\n } else if (pulled.type === \"blueprint\" && pulled.data) {\n await store.saveBlueprint(pulled.data as Blueprint);\n savedCount++;\n } else if (pulled.type === \"solution\" && pulled.data) {\n await store.saveSolution(pulled.data as SolutionPattern);\n savedCount++;\n }\n } catch {\n // Pattern might already exist\n }\n }\n }\n\n if (totalPatterns === 0) {\n console.log(chalk.dim(\" No new patterns to pull\"));\n } else {\n console.log(\n chalk.green(`\\n ✅ Pulled ${savedCount} patterns from registry`),\n );\n }\n } catch (error) {\n if (error instanceof RateLimitedException) {\n console.log(chalk.red(\"\\n ❌ Rate limit exceeded\"));\n console.log(\n chalk.dim(\n ` Try again in ${error.getTimeUntilReset()}`,\n ),\n );\n } else if (error instanceof RegistryError) {\n console.log(chalk.red(`\\n ❌ Registry error: ${error.message}`));\n } else {\n console.log(\n chalk.red(\n `\\n ❌ Failed to pull: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n process.exit(1);\n }\n }\n }\n\n p.outro(chalk.green(\"Sync complete!\"));\n}\n","/**\n * Registry Client for pattern sync\n *\n * HTTP client for pushing patterns to and pulling patterns from\n * the community pattern registry.\n */\n\nimport type { FixPattern, Blueprint, SolutionPattern } from \"@hawkinside_out/workflow-improvement-tracker\";\n\n// Default registry URL\nconst DEFAULT_REGISTRY_URL = \"https://registry-api-rust.vercel.app\";\n\n/**\n * Pattern payload for push/pull operations\n */\nexport interface RegistryPattern {\n id: string;\n type: \"fix\" | \"blueprint\" | \"solution\";\n data: Record<string, unknown>;\n hash?: string;\n createdAt?: string;\n}\n\n/**\n * Push response from registry\n */\nexport interface PushResponse {\n status: \"ok\" | \"error\";\n pushed: number;\n skipped: number;\n errors?: string[];\n rateLimit: {\n remaining: number;\n resetAt: string | null;\n };\n}\n\n/**\n * Pull response from registry\n */\nexport interface PullResponse {\n patterns: RegistryPattern[];\n pagination: {\n offset: number;\n limit: number;\n total: number;\n hasMore: boolean;\n };\n}\n\n/**\n * Rate limit error details\n */\nexport interface RateLimitError {\n message: string;\n resetAt: string | null;\n remaining: number;\n}\n\n/**\n * Registry client options\n */\nexport interface RegistryClientOptions {\n /**\n * Base URL of the registry API\n * Defaults to https://patterns.workflow-agent.dev\n * Can be overridden via WORKFLOW_REGISTRY_URL env var\n */\n baseUrl?: string;\n\n /**\n * Request timeout in milliseconds\n * Defaults to 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Number of retry attempts for failed requests\n * Defaults to 3\n */\n retries?: number;\n}\n\n/**\n * Registry Client\n *\n * Handles HTTP communication with the pattern registry API\n */\nexport class RegistryClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly retries: number;\n\n constructor(options: RegistryClientOptions = {}) {\n // Priority: options > env var > default\n this.baseUrl =\n options.baseUrl ||\n process.env.WORKFLOW_REGISTRY_URL ||\n DEFAULT_REGISTRY_URL;\n\n // Ensure no trailing slash\n this.baseUrl = this.baseUrl.replace(/\\/$/, \"\");\n\n this.timeout = options.timeout ?? 30000;\n this.retries = options.retries ?? 3;\n }\n\n /**\n * Push patterns to the registry\n *\n * @param patterns - Array of anonymized patterns to push\n * @param contributorId - Anonymous contributor ID\n * @returns Push result with count of pushed/skipped patterns\n * @throws Error if rate limited or push fails\n */\n async push(\n patterns: Array<{\n pattern: FixPattern | Blueprint | SolutionPattern;\n type: \"fix\" | \"blueprint\" | \"solution\";\n hash?: string;\n }>,\n contributorId: string,\n ): Promise<PushResponse> {\n const payload = {\n patterns: patterns.map((p) => ({\n id: p.pattern.id,\n type: p.type,\n data: p.pattern as unknown as Record<string, unknown>,\n hash: p.hash,\n })),\n };\n\n const response = await this.request<PushResponse>(\n \"/api/patterns/push\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-contributor-id\": contributorId,\n },\n body: JSON.stringify(payload),\n },\n );\n\n return response;\n }\n\n /**\n * Pull patterns from the registry\n *\n * @param options - Pull options\n * @returns Array of patterns from the registry\n */\n async pull(options: {\n type?: \"fix\" | \"blueprint\" | \"solution\";\n limit?: number;\n offset?: number;\n since?: string;\n } = {}): Promise<PullResponse> {\n const params = new URLSearchParams();\n\n if (options.type) {\n params.set(\"type\", options.type);\n }\n if (options.limit) {\n params.set(\"limit\", options.limit.toString());\n }\n if (options.offset) {\n params.set(\"offset\", options.offset.toString());\n }\n if (options.since) {\n params.set(\"since\", options.since);\n }\n\n const queryString = params.toString();\n const url = `/api/patterns/pull${queryString ? `?${queryString}` : \"\"}`;\n\n return this.request<PullResponse>(url, {\n method: \"GET\",\n });\n }\n\n /**\n * Get a single pattern by ID\n *\n * @param patternId - UUID of the pattern\n * @returns Pattern data or null if not found\n */\n async getPattern(patternId: string): Promise<RegistryPattern | null> {\n try {\n return await this.request<RegistryPattern>(`/api/patterns/${patternId}`, {\n method: \"GET\",\n });\n } catch (error) {\n if (error instanceof RegistryError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check if the registry is available\n */\n async healthCheck(): Promise<boolean> {\n try {\n await this.request<{ status: string }>(\"/api/health\", {\n method: \"GET\",\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Make an HTTP request to the registry\n */\n private async request<T>(\n path: string,\n options: RequestInit,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 429) {\n // Rate limited\n const body = await response.json() as { message?: string; resetAt?: string | null; remaining?: number };\n throw new RateLimitedException(\n body.message || \"Rate limit exceeded\",\n body.resetAt ?? null,\n body.remaining ?? 0,\n );\n }\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({})) as { error?: string };\n throw new RegistryError(\n body.error || `Request failed with status ${response.status}`,\n response.status,\n body,\n );\n }\n\n return await response.json() as T;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry rate limit errors\n if (error instanceof RateLimitedException) {\n throw error;\n }\n\n // Don't retry on 4xx errors (except timeout)\n if (\n error instanceof RegistryError &&\n error.statusCode >= 400 &&\n error.statusCode < 500\n ) {\n throw error;\n }\n\n // Wait before retrying (exponential backoff)\n if (attempt < this.retries) {\n await new Promise((resolve) =>\n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n }\n\n throw lastError ?? new Error(\"Request failed after retries\");\n }\n}\n\n/**\n * Registry API error\n */\nexport class RegistryError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly body?: unknown,\n ) {\n super(message);\n this.name = \"RegistryError\";\n }\n}\n\n/**\n * Rate limit exceeded error\n */\nexport class RateLimitedException extends Error {\n constructor(\n message: string,\n public readonly resetAt: string | null,\n public readonly remaining: number,\n ) {\n super(message);\n this.name = \"RateLimitedException\";\n }\n\n /**\n * Get human-readable time until rate limit resets\n */\n getTimeUntilReset(): string {\n if (!this.resetAt) {\n return \"unknown\";\n }\n\n const resetTime = new Date(this.resetAt).getTime();\n const now = Date.now();\n const diffMs = resetTime - now;\n\n if (diffMs <= 0) {\n return \"now\";\n }\n\n const minutes = Math.ceil(diffMs / 60000);\n if (minutes < 60) {\n return `${minutes} minute${minutes === 1 ? \"\" : \"s\"}`;\n }\n\n const hours = Math.ceil(minutes / 60);\n return `${hours} hour${hours === 1 ? \"\" : \"s\"}`;\n }\n}\n"],"mappings":"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","names":["p","p"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -36,11 +36,11 @@ import {
|
|
|
36
36
|
} from "../chunk-YELUGXOM.js";
|
|
37
37
|
import {
|
|
38
38
|
verifyCommand
|
|
39
|
-
} from "../chunk-
|
|
40
|
-
import "../chunk-
|
|
39
|
+
} from "../chunk-3ARRW423.js";
|
|
40
|
+
import "../chunk-3ADL5QDN.js";
|
|
41
41
|
import {
|
|
42
42
|
syncCommand
|
|
43
|
-
} from "../chunk-
|
|
43
|
+
} from "../chunk-G5L77VD5.js";
|
|
44
44
|
|
|
45
45
|
// src/cli/index.ts
|
|
46
46
|
import { Command as Command7 } from "commander";
|
|
@@ -7995,7 +7995,7 @@ ${chalk21.bold("Pro Tip:")}
|
|
|
7995
7995
|
$ workflow sync --all ${chalk21.dim("# Sync everything")}
|
|
7996
7996
|
`
|
|
7997
7997
|
).action(async (options) => {
|
|
7998
|
-
const { syncCommand: syncCommand2 } = await import("../sync-
|
|
7998
|
+
const { syncCommand: syncCommand2 } = await import("../sync-SOERVZT3.js");
|
|
7999
7999
|
return syncCommand2({ ...options, learn: true });
|
|
8000
8000
|
});
|
|
8001
8001
|
learnCmd.command("config").description("Configure learning settings").option("--enable-sync", "Enable pattern sync").option("--disable-sync", "Disable pattern sync").option("--enable-telemetry", "Enable anonymous telemetry").option("--disable-telemetry", "Disable telemetry").option("--reset-id", "Reset contributor ID").option("--show", "Show current configuration").addHelpText(
|
|
@@ -8192,7 +8192,7 @@ async function scopeRemoveCommand(name) {
|
|
|
8192
8192
|
}
|
|
8193
8193
|
async function scopeSyncCommand(options) {
|
|
8194
8194
|
console.log(chalk22.bold.cyan("\n\u{1F504} Syncing Scopes\n"));
|
|
8195
|
-
const { syncCommand: syncCommand2 } = await import("../sync-
|
|
8195
|
+
const { syncCommand: syncCommand2 } = await import("../sync-SOERVZT3.js");
|
|
8196
8196
|
await syncCommand2({
|
|
8197
8197
|
...options,
|
|
8198
8198
|
scopes: true,
|
|
@@ -8298,7 +8298,7 @@ async function hooksTestCommand(options) {
|
|
|
8298
8298
|
if (options.dryRun) {
|
|
8299
8299
|
console.log(chalk22.bold.cyan("\n Dry-run hook simulation:\n"));
|
|
8300
8300
|
console.log(chalk22.dim(" Simulating pre-commit hook..."));
|
|
8301
|
-
const { verifyCommand: verifyCommand2 } = await import("../verify-
|
|
8301
|
+
const { verifyCommand: verifyCommand2 } = await import("../verify-XGCZKY7S.js");
|
|
8302
8302
|
try {
|
|
8303
8303
|
await verifyCommand2({ fix: false, dryRun: true, maxRetries: "1" });
|
|
8304
8304
|
} catch {
|
|
@@ -8424,10 +8424,16 @@ program.addCommand(createDocsCommand());
|
|
|
8424
8424
|
program.addCommand(createSolutionCommand());
|
|
8425
8425
|
program.addCommand(createLearnCommand());
|
|
8426
8426
|
program.addCommand(createScopeCommand());
|
|
8427
|
-
program.command("sync").description("Sync patterns and solutions with the community registry").option("--push", "Push local patterns to registry").option("--pull", "Pull patterns from registry").option("--solutions", "Include solution patterns").option("--learn", "Include learning patterns (default)").option("--scopes", "Sync custom scope packages").option("--all", "Sync everything").option("--dry-run", "Preview without syncing").addHelpText(
|
|
8427
|
+
program.command("sync").description("Sync patterns and solutions with the community registry").option("--push", "Push local patterns to registry").option("--pull", "Pull patterns from registry").option("--solutions", "Include solution patterns").option("--learn", "Include learning patterns (default)").option("--scopes", "Sync custom scope packages").option("--all", "Sync everything").option("--dry-run", "Preview without syncing").option("--enable-sync", "Enable pattern sync").option("--disable-sync", "Disable pattern sync").addHelpText(
|
|
8428
8428
|
"after",
|
|
8429
8429
|
`
|
|
8430
8430
|
${chalk23.bold("Examples:")}
|
|
8431
|
+
${chalk23.dim("# Enable sync")}
|
|
8432
|
+
$ workflow sync --enable-sync
|
|
8433
|
+
|
|
8434
|
+
${chalk23.dim("# Disable sync")}
|
|
8435
|
+
$ workflow sync --disable-sync
|
|
8436
|
+
|
|
8431
8437
|
${chalk23.dim("# Interactive sync (prompts for direction)")}
|
|
8432
8438
|
$ workflow sync
|
|
8433
8439
|
|