@buoy-design/cli 0.1.0 → 0.1.2
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/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +235 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/baseline.d.ts +39 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +298 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/check.d.ts +16 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +168 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/ci.d.ts +2 -2
- package/dist/commands/ci.d.ts.map +1 -1
- package/dist/commands/ci.js +124 -142
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/compare.d.ts +3 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +170 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/drift.d.ts +1 -1
- package/dist/commands/drift.d.ts.map +1 -1
- package/dist/commands/drift.js +79 -121
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/explain.d.ts +3 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +212 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/graph.d.ts +3 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +430 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/index.d.ts +14 -8
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +14 -8
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +404 -237
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plugins.d.ts.map +1 -1
- package/dist/commands/plugins.js +32 -41
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/scan.d.ts +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +107 -219
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +114 -122
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tokens.d.ts +3 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +261 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/config/auto-detect.d.ts +21 -0
- package/dist/config/auto-detect.d.ts.map +1 -0
- package/dist/config/auto-detect.js +278 -0
- package/dist/config/auto-detect.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +17 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +63 -63
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +20 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +37 -0
- package/dist/constants.js.map +1 -0
- package/dist/detect/frameworks.d.ts +11 -2
- package/dist/detect/frameworks.d.ts.map +1 -1
- package/dist/detect/frameworks.js +78 -78
- package/dist/detect/frameworks.js.map +1 -1
- package/dist/detect/index.d.ts +1 -0
- package/dist/detect/index.d.ts.map +1 -1
- package/dist/detect/index.js +3 -0
- package/dist/detect/index.js.map +1 -1
- package/dist/detect/monorepo-patterns.d.ts +54 -0
- package/dist/detect/monorepo-patterns.d.ts.map +1 -0
- package/dist/detect/monorepo-patterns.js +209 -0
- package/dist/detect/monorepo-patterns.js.map +1 -0
- package/dist/detect/project-detector.d.ts +1 -1
- package/dist/detect/project-detector.d.ts.map +1 -1
- package/dist/detect/project-detector.js +132 -0
- package/dist/detect/project-detector.js.map +1 -1
- package/dist/explain/agents.d.ts +31 -0
- package/dist/explain/agents.d.ts.map +1 -0
- package/dist/explain/agents.js +507 -0
- package/dist/explain/agents.js.map +1 -0
- package/dist/hooks/index.d.ts +26 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +283 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/dist/integrations/github-formatter.d.ts +55 -0
- package/dist/integrations/github-formatter.d.ts.map +1 -0
- package/dist/integrations/github-formatter.js +391 -0
- package/dist/integrations/github-formatter.js.map +1 -0
- package/dist/integrations/github.d.ts +95 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +281 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +4 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/output/formatters.d.ts.map +1 -1
- package/dist/output/formatters.js +5 -10
- package/dist/output/formatters.js.map +1 -1
- package/dist/scan/orchestrator.d.ts +76 -0
- package/dist/scan/orchestrator.d.ts.map +1 -0
- package/dist/scan/orchestrator.js +247 -0
- package/dist/scan/orchestrator.js.map +1 -0
- package/dist/services/ai-analysis.d.ts +54 -0
- package/dist/services/ai-analysis.d.ts.map +1 -0
- package/dist/services/ai-analysis.js +239 -0
- package/dist/services/ai-analysis.js.map +1 -0
- package/dist/services/drift-analysis.d.ts +77 -0
- package/dist/services/drift-analysis.d.ts.map +1 -0
- package/dist/services/drift-analysis.js +145 -0
- package/dist/services/drift-analysis.js.map +1 -0
- package/package.json +17 -5
- package/dist/commands/__tests__/ci.test.d.ts +0 -2
- package/dist/commands/__tests__/ci.test.d.ts.map +0 -1
- package/dist/commands/__tests__/ci.test.js +0 -33
- package/dist/commands/__tests__/ci.test.js.map +0 -1
- package/dist/commands/bootstrap.d.ts +0 -3
- package/dist/commands/bootstrap.d.ts.map +0 -1
- package/dist/commands/bootstrap.js +0 -458
- package/dist/commands/bootstrap.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -3
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -3
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/loader.d.ts +0 -11
- package/dist/plugins/loader.d.ts.map +0 -1
- package/dist/plugins/loader.js +0 -77
- package/dist/plugins/loader.js.map +0 -1
- package/dist/plugins/registry.d.ts +0 -15
- package/dist/plugins/registry.d.ts.map +0 -1
- package/dist/plugins/registry.js +0 -32
- package/dist/plugins/registry.js.map +0 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
// apps/cli/src/hooks/index.ts
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync, chmodSync, readFileSync, } from "fs";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
/**
|
|
5
|
+
* Pre-commit hook script content
|
|
6
|
+
*/
|
|
7
|
+
const PRE_COMMIT_HOOK = `#!/bin/sh
|
|
8
|
+
# Buoy pre-commit hook
|
|
9
|
+
# Auto-generated by 'buoy init --hooks'
|
|
10
|
+
# See: https://buoy.dev/docs/pre-commit
|
|
11
|
+
|
|
12
|
+
# Run buoy check on staged files
|
|
13
|
+
buoy check --staged --fail-on critical
|
|
14
|
+
|
|
15
|
+
# If buoy check fails, prevent the commit
|
|
16
|
+
if [ $? -ne 0 ]; then
|
|
17
|
+
echo ""
|
|
18
|
+
echo "Commit blocked by buoy. Fix drift issues or use --no-verify to bypass."
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
`;
|
|
22
|
+
/**
|
|
23
|
+
* Husky pre-commit hook content (for .husky/pre-commit)
|
|
24
|
+
*/
|
|
25
|
+
const HUSKY_PRE_COMMIT_HOOK = `#!/usr/bin/env sh
|
|
26
|
+
. "$(dirname -- "$0")/_/husky.sh"
|
|
27
|
+
|
|
28
|
+
# Run buoy check on staged files
|
|
29
|
+
npx buoy check --staged --fail-on critical
|
|
30
|
+
`;
|
|
31
|
+
/**
|
|
32
|
+
* lint-staged configuration for package.json
|
|
33
|
+
*/
|
|
34
|
+
export const LINT_STAGED_CONFIG = {
|
|
35
|
+
"*.{tsx,jsx,ts,js,vue,svelte}": ["buoy check --staged --fail-on critical"],
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Pre-commit config YAML content
|
|
39
|
+
*/
|
|
40
|
+
const PRE_COMMIT_CONFIG_YAML = `# .pre-commit-config.yaml
|
|
41
|
+
# See: https://pre-commit.com/
|
|
42
|
+
|
|
43
|
+
repos:
|
|
44
|
+
- repo: local
|
|
45
|
+
hooks:
|
|
46
|
+
- id: buoy
|
|
47
|
+
name: buoy drift check
|
|
48
|
+
entry: buoy check --staged --fail-on critical
|
|
49
|
+
language: system
|
|
50
|
+
types: [file]
|
|
51
|
+
files: \\.(tsx|jsx|ts|js|vue|svelte)$
|
|
52
|
+
`;
|
|
53
|
+
/**
|
|
54
|
+
* Detect which hook system is in use
|
|
55
|
+
*/
|
|
56
|
+
export function detectHookSystem(projectRoot) {
|
|
57
|
+
// Check for Husky
|
|
58
|
+
if (existsSync(resolve(projectRoot, ".husky"))) {
|
|
59
|
+
return "husky";
|
|
60
|
+
}
|
|
61
|
+
// Check for pre-commit
|
|
62
|
+
if (existsSync(resolve(projectRoot, ".pre-commit-config.yaml"))) {
|
|
63
|
+
return "pre-commit";
|
|
64
|
+
}
|
|
65
|
+
// Check for lint-staged in package.json
|
|
66
|
+
const pkgPath = resolve(projectRoot, "package.json");
|
|
67
|
+
if (existsSync(pkgPath)) {
|
|
68
|
+
try {
|
|
69
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
70
|
+
if (pkg["lint-staged"]) {
|
|
71
|
+
return "lint-staged";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Ignore parse errors
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Check for .git directory (can use raw git hooks)
|
|
79
|
+
if (existsSync(resolve(projectRoot, ".git"))) {
|
|
80
|
+
return "git";
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Setup pre-commit hooks for the project
|
|
86
|
+
*/
|
|
87
|
+
export function setupHooks(projectRoot) {
|
|
88
|
+
const hookSystem = detectHookSystem(projectRoot);
|
|
89
|
+
if (!hookSystem) {
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
hookSystem: null,
|
|
93
|
+
message: "No git repository found. Run 'git init' first.",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
switch (hookSystem) {
|
|
97
|
+
case "husky":
|
|
98
|
+
return setupHuskyHook(projectRoot);
|
|
99
|
+
case "pre-commit":
|
|
100
|
+
return setupPreCommitConfig(projectRoot);
|
|
101
|
+
case "lint-staged":
|
|
102
|
+
return setupLintStaged(projectRoot);
|
|
103
|
+
case "git":
|
|
104
|
+
return setupGitHook(projectRoot);
|
|
105
|
+
default:
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
hookSystem,
|
|
109
|
+
message: `Unsupported hook system: ${hookSystem}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Setup raw git pre-commit hook
|
|
115
|
+
*/
|
|
116
|
+
function setupGitHook(projectRoot) {
|
|
117
|
+
const hooksDir = resolve(projectRoot, ".git", "hooks");
|
|
118
|
+
const hookPath = resolve(hooksDir, "pre-commit");
|
|
119
|
+
// Ensure hooks directory exists
|
|
120
|
+
if (!existsSync(hooksDir)) {
|
|
121
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
122
|
+
}
|
|
123
|
+
// Check if hook already exists
|
|
124
|
+
if (existsSync(hookPath)) {
|
|
125
|
+
const existing = readFileSync(hookPath, "utf-8");
|
|
126
|
+
if (existing.includes("buoy check")) {
|
|
127
|
+
return {
|
|
128
|
+
success: true,
|
|
129
|
+
hookSystem: "git",
|
|
130
|
+
message: "Buoy hook already configured in .git/hooks/pre-commit",
|
|
131
|
+
filePath: hookPath,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Append to existing hook
|
|
135
|
+
const updated = existing +
|
|
136
|
+
"\n\n# Added by buoy init --hooks\n" +
|
|
137
|
+
PRE_COMMIT_HOOK.split("\n").slice(4).join("\n");
|
|
138
|
+
writeFileSync(hookPath, updated);
|
|
139
|
+
return {
|
|
140
|
+
success: true,
|
|
141
|
+
hookSystem: "git",
|
|
142
|
+
message: "Added buoy check to existing .git/hooks/pre-commit",
|
|
143
|
+
filePath: hookPath,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Write new hook
|
|
147
|
+
writeFileSync(hookPath, PRE_COMMIT_HOOK);
|
|
148
|
+
chmodSync(hookPath, 0o755);
|
|
149
|
+
return {
|
|
150
|
+
success: true,
|
|
151
|
+
hookSystem: "git",
|
|
152
|
+
message: "Created .git/hooks/pre-commit",
|
|
153
|
+
filePath: hookPath,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Setup Husky pre-commit hook
|
|
158
|
+
*/
|
|
159
|
+
function setupHuskyHook(projectRoot) {
|
|
160
|
+
const huskyDir = resolve(projectRoot, ".husky");
|
|
161
|
+
const hookPath = resolve(huskyDir, "pre-commit");
|
|
162
|
+
// Check if hook already exists
|
|
163
|
+
if (existsSync(hookPath)) {
|
|
164
|
+
const existing = readFileSync(hookPath, "utf-8");
|
|
165
|
+
if (existing.includes("buoy check")) {
|
|
166
|
+
return {
|
|
167
|
+
success: true,
|
|
168
|
+
hookSystem: "husky",
|
|
169
|
+
message: "Buoy hook already configured in .husky/pre-commit",
|
|
170
|
+
filePath: hookPath,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Append buoy check to existing hook
|
|
174
|
+
const updated = existing.trimEnd() +
|
|
175
|
+
"\n\n# Added by buoy init --hooks\nnpx buoy check --staged --fail-on critical\n";
|
|
176
|
+
writeFileSync(hookPath, updated);
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
hookSystem: "husky",
|
|
180
|
+
message: "Added buoy check to existing .husky/pre-commit",
|
|
181
|
+
filePath: hookPath,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// Create new Husky hook
|
|
185
|
+
writeFileSync(hookPath, HUSKY_PRE_COMMIT_HOOK);
|
|
186
|
+
chmodSync(hookPath, 0o755);
|
|
187
|
+
return {
|
|
188
|
+
success: true,
|
|
189
|
+
hookSystem: "husky",
|
|
190
|
+
message: "Created .husky/pre-commit",
|
|
191
|
+
filePath: hookPath,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Setup pre-commit framework config
|
|
196
|
+
*/
|
|
197
|
+
function setupPreCommitConfig(projectRoot) {
|
|
198
|
+
const configPath = resolve(projectRoot, ".pre-commit-config.yaml");
|
|
199
|
+
if (existsSync(configPath)) {
|
|
200
|
+
const existing = readFileSync(configPath, "utf-8");
|
|
201
|
+
if (existing.includes("buoy")) {
|
|
202
|
+
return {
|
|
203
|
+
success: true,
|
|
204
|
+
hookSystem: "pre-commit",
|
|
205
|
+
message: "Buoy hook already configured in .pre-commit-config.yaml",
|
|
206
|
+
filePath: configPath,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// Need to append to existing config - provide instructions
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
hookSystem: "pre-commit",
|
|
213
|
+
message: `Add buoy hook to your .pre-commit-config.yaml:\n\n - repo: local\n hooks:\n - id: buoy\n name: buoy drift check\n entry: buoy check --staged --fail-on critical\n language: system\n types: [file]\n files: \\.(tsx|jsx|ts|js|vue|svelte)$`,
|
|
214
|
+
filePath: configPath,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Create new pre-commit config
|
|
218
|
+
writeFileSync(configPath, PRE_COMMIT_CONFIG_YAML);
|
|
219
|
+
return {
|
|
220
|
+
success: true,
|
|
221
|
+
hookSystem: "pre-commit",
|
|
222
|
+
message: "Created .pre-commit-config.yaml",
|
|
223
|
+
filePath: configPath,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Setup lint-staged configuration
|
|
228
|
+
*/
|
|
229
|
+
function setupLintStaged(projectRoot) {
|
|
230
|
+
const pkgPath = resolve(projectRoot, "package.json");
|
|
231
|
+
try {
|
|
232
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
233
|
+
const lintStaged = pkg["lint-staged"] || {};
|
|
234
|
+
// Check if buoy is already configured
|
|
235
|
+
const hasbuoy = Object.values(lintStaged).some((commands) => Array.isArray(commands) &&
|
|
236
|
+
commands.some((cmd) => cmd.includes("buoy")));
|
|
237
|
+
if (hasbuoy) {
|
|
238
|
+
return {
|
|
239
|
+
success: true,
|
|
240
|
+
hookSystem: "lint-staged",
|
|
241
|
+
message: "Buoy already configured in lint-staged",
|
|
242
|
+
filePath: pkgPath,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// Provide instructions for lint-staged
|
|
246
|
+
return {
|
|
247
|
+
success: false,
|
|
248
|
+
hookSystem: "lint-staged",
|
|
249
|
+
message: `Add buoy to your lint-staged config in package.json:\n\n"lint-staged": {\n "*.{tsx,jsx,ts,js,vue,svelte}": ["buoy check --staged --fail-on critical"]\n}`,
|
|
250
|
+
filePath: pkgPath,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return {
|
|
255
|
+
success: false,
|
|
256
|
+
hookSystem: "lint-staged",
|
|
257
|
+
message: "Failed to read package.json",
|
|
258
|
+
filePath: pkgPath,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Generate a standalone pre-commit hook script for .buoy/hooks/
|
|
264
|
+
*/
|
|
265
|
+
export function generateStandaloneHook(projectRoot) {
|
|
266
|
+
const buoyDir = resolve(projectRoot, ".buoy");
|
|
267
|
+
const hooksDir = resolve(buoyDir, "hooks");
|
|
268
|
+
const hookPath = resolve(hooksDir, "pre-commit");
|
|
269
|
+
// Create directories
|
|
270
|
+
if (!existsSync(hooksDir)) {
|
|
271
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
272
|
+
}
|
|
273
|
+
// Write hook script
|
|
274
|
+
writeFileSync(hookPath, PRE_COMMIT_HOOK);
|
|
275
|
+
chmodSync(hookPath, 0o755);
|
|
276
|
+
return {
|
|
277
|
+
success: true,
|
|
278
|
+
hookSystem: "git",
|
|
279
|
+
message: "Created .buoy/hooks/pre-commit",
|
|
280
|
+
filePath: hookPath,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Command } from
|
|
1
|
+
import { Command } from "commander";
|
|
2
2
|
export declare function createCli(): Command;
|
|
3
|
-
export { defineConfig } from
|
|
4
|
-
export type { BuoyConfig } from
|
|
3
|
+
export { defineConfig } from "./config/schema.js";
|
|
4
|
+
export type { BuoyConfig } from "./config/schema.js";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,SAAS,IAAI,OAAO,CAyBnC;AAGD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
import { Command } from
|
|
2
|
-
import { createInitCommand, createScanCommand, createDriftCommand, createStatusCommand,
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createInitCommand, createScanCommand, createDriftCommand, createStatusCommand, createTokensCommand, createBuildCommand, createPluginsCommand, createCICommand, createCheckCommand, createBaselineCommand, createExplainCommand, createCompareCommand, createAuditCommand, createGraphCommand, } from "./commands/index.js";
|
|
3
3
|
export function createCli() {
|
|
4
4
|
const program = new Command();
|
|
5
5
|
program
|
|
6
|
-
.name(
|
|
7
|
-
.description(
|
|
8
|
-
.version(
|
|
6
|
+
.name("buoy")
|
|
7
|
+
.description("Design drift detection for the AI era")
|
|
8
|
+
.version("0.0.1");
|
|
9
9
|
// Add commands
|
|
10
10
|
program.addCommand(createInitCommand());
|
|
11
11
|
program.addCommand(createScanCommand());
|
|
12
12
|
program.addCommand(createDriftCommand());
|
|
13
13
|
program.addCommand(createStatusCommand());
|
|
14
|
-
program.addCommand(
|
|
14
|
+
program.addCommand(createTokensCommand());
|
|
15
15
|
program.addCommand(createBuildCommand());
|
|
16
16
|
program.addCommand(createPluginsCommand());
|
|
17
17
|
program.addCommand(createCICommand());
|
|
18
|
+
program.addCommand(createCheckCommand());
|
|
19
|
+
program.addCommand(createBaselineCommand());
|
|
20
|
+
program.addCommand(createExplainCommand());
|
|
21
|
+
program.addCommand(createCompareCommand());
|
|
22
|
+
program.addCommand(createAuditCommand());
|
|
23
|
+
program.addCommand(createGraphCommand());
|
|
18
24
|
return program;
|
|
19
25
|
}
|
|
20
26
|
// Re-export config utilities for user config files
|
|
21
|
-
export { defineConfig } from
|
|
27
|
+
export { defineConfig } from "./config/schema.js";
|
|
22
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,uCAAuC,CAAC;SACpD,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,eAAe;IACf,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { DriftResult, DriftSignal } from '@buoy-design/core';
|
|
2
|
+
export interface PRContext {
|
|
3
|
+
filesChanged?: string[];
|
|
4
|
+
baseBranch?: string;
|
|
5
|
+
headBranch?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function formatPRComment(results: DriftResult, _context?: PRContext): string;
|
|
8
|
+
/**
|
|
9
|
+
* Format an inline comment for a specific drift signal (CodeRabbit style)
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatInlineComment(signal: {
|
|
12
|
+
type: string;
|
|
13
|
+
severity: 'critical' | 'warning' | 'info';
|
|
14
|
+
message: string;
|
|
15
|
+
component?: string;
|
|
16
|
+
suggestion?: string;
|
|
17
|
+
currentValue?: string;
|
|
18
|
+
expectedValue?: string;
|
|
19
|
+
}, signalId?: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Format a signal for inline commenting from a DriftSignal
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatDriftSignalForInline(drift: DriftSignal, signalId: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* AI Analysis types (imported from ai-analysis service)
|
|
26
|
+
*/
|
|
27
|
+
interface DriftAnalysis {
|
|
28
|
+
signal: {
|
|
29
|
+
type: string;
|
|
30
|
+
severity: 'critical' | 'warning' | 'info';
|
|
31
|
+
message: string;
|
|
32
|
+
source: {
|
|
33
|
+
entityName: string;
|
|
34
|
+
location?: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
analysis: string;
|
|
38
|
+
isLikelyIntentional: boolean;
|
|
39
|
+
confidence: number;
|
|
40
|
+
suggestedAction: 'fix' | 'approve' | 'discuss';
|
|
41
|
+
relatedHistory: string[];
|
|
42
|
+
}
|
|
43
|
+
interface PRAnalysisSummary {
|
|
44
|
+
overview: string;
|
|
45
|
+
criticalIssues: DriftAnalysis[];
|
|
46
|
+
warnings: DriftAnalysis[];
|
|
47
|
+
recommendations: string[];
|
|
48
|
+
riskLevel: 'low' | 'medium' | 'high';
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Format PR comment with AI-powered analysis (CodeRabbit style)
|
|
52
|
+
*/
|
|
53
|
+
export declare function formatAIPRComment(analysis: PRAnalysisSummary, results: DriftResult): string;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=github-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-formatter.d.ts","sourceRoot":"","sources":["../../src/integrations/github-formatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGlE,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAmIlF;AA+ED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA0D5B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUvF;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACxI,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/C,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CA4G3F"}
|