@driftless-sh/cli 0.1.1 → 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/init.d.ts.map +1 -1
- package/dist/commands/init.js +129 -36
- package/dist/commands/init.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA2FjD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.initCommand = initCommand;
|
|
4
4
|
const api_client_1 = require("../api-client");
|
|
5
5
|
const git_1 = require("../git");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
6
8
|
async function initCommand() {
|
|
7
9
|
console.log('Driftless — context integrity for engineering teams\n');
|
|
8
10
|
if (!(0, git_1.isGitRepo)()) {
|
|
@@ -33,13 +35,10 @@ async function initCommand() {
|
|
|
33
35
|
try {
|
|
34
36
|
const repos = (await api_client_1.api.get(`/workspaces/${remote.org}/repos`));
|
|
35
37
|
repo = repos.find((r) => r.github_org === remote.org && r.github_repo === remote.repo);
|
|
36
|
-
if (repo)
|
|
38
|
+
if (repo)
|
|
37
39
|
console.log(`Repo: ${remote.repo} (existing)`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
// ignore
|
|
42
40
|
}
|
|
41
|
+
catch { /* ignore */ }
|
|
43
42
|
if (!repo) {
|
|
44
43
|
repo = await api_client_1.api.post(`/workspaces/${remote.org}/repos`, {
|
|
45
44
|
github_org: remote.org,
|
|
@@ -47,42 +46,39 @@ async function initCommand() {
|
|
|
47
46
|
});
|
|
48
47
|
console.log(`Repo: ${remote.repo} (connected)`);
|
|
49
48
|
}
|
|
50
|
-
// 3.
|
|
51
|
-
console.log('\nScanning codebase...');
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
console.error(`Scan failed: ${scanResult.error}`);
|
|
55
|
-
if (scanResult.error?.includes('clone') || scanResult.error?.includes('Cloning')) {
|
|
56
|
-
console.error('\nTip: Make sure the repo is public, or add a GitHub token.');
|
|
57
|
-
console.error('The scan runs server-side — the API clones your repo for AST analysis.');
|
|
58
|
-
}
|
|
59
|
-
process.exit(1);
|
|
60
|
-
}
|
|
61
|
-
const summary = scanResult.summary;
|
|
62
|
-
if (!summary) {
|
|
63
|
-
console.error('Scan returned no summary. The API might be unable to clone this repo.');
|
|
64
|
-
console.error(`Status: ${scanResult.status}`);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
}
|
|
49
|
+
// 3. Local scan — no cloning, no server-side access
|
|
50
|
+
console.log('\nScanning codebase locally...');
|
|
51
|
+
const cwd = process.cwd();
|
|
52
|
+
const summary = scanLocal(cwd);
|
|
67
53
|
console.log(`\nResults:`);
|
|
68
54
|
console.log(` Framework: ${summary.framework}`);
|
|
69
55
|
console.log(` Type: ${summary.system_type}`);
|
|
70
|
-
console.log(` Auth: ${summary.auth_patterns?.join(', ') || 'none'}`);
|
|
71
56
|
console.log(` Endpoints: ${summary.endpoints}`);
|
|
72
|
-
console.log(` Guards: ${summary.guards}`);
|
|
73
57
|
console.log(` Services: ${summary.services}`);
|
|
74
58
|
console.log(` Modules: ${summary.modules}`);
|
|
75
|
-
|
|
59
|
+
console.log(` Guards: ${summary.guards}`);
|
|
60
|
+
if (summary.auth_patterns.length > 0) {
|
|
61
|
+
console.log(` Auth: ${summary.auth_patterns.join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
// 4. Upload baseline to Cloud
|
|
64
|
+
try {
|
|
65
|
+
await api_client_1.api.post(`/workspaces/${remote.org}/repos/${repo.id}/scan`, summary);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Non-blocking — upload happens via full scan later
|
|
69
|
+
}
|
|
70
|
+
// 5. Suggest rules
|
|
76
71
|
console.log('\nSuggested rules:');
|
|
77
|
-
const suggestions = [
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
72
|
+
const suggestions = [];
|
|
73
|
+
if (summary.auth_patterns.includes('apikey') || summary.guards > 0) {
|
|
74
|
+
suggestions.push('Every B2B endpoint must use BusinessAccessGuard');
|
|
75
|
+
}
|
|
76
|
+
if (summary.services > summary.modules) {
|
|
77
|
+
suggestions.push('Services must not import controllers directly');
|
|
78
|
+
}
|
|
79
|
+
if (summary.endpoints > 50) {
|
|
80
|
+
suggestions.push('app.controller.ts should be split — over 50 endpoints detected');
|
|
81
|
+
}
|
|
86
82
|
if (suggestions.length === 0) {
|
|
87
83
|
console.log(' No automatic suggestions for this repo.');
|
|
88
84
|
}
|
|
@@ -90,9 +86,106 @@ async function initCommand() {
|
|
|
90
86
|
for (const s of suggestions) {
|
|
91
87
|
console.log(` • ${s}`);
|
|
92
88
|
}
|
|
93
|
-
console.log('\nAccept these suggestions? Run:');
|
|
94
|
-
console.log(` driftless rule accept --all`);
|
|
95
89
|
}
|
|
96
90
|
console.log(`\nDone! Run 'driftless scan --diff' before pushing to check for violations.`);
|
|
91
|
+
console.log(`View your ecosystem: https://driftless.icu/ecosystem`);
|
|
92
|
+
}
|
|
93
|
+
function scanLocal(rootPath) {
|
|
94
|
+
const pkg = readJson((0, node_path_1.join)(rootPath, 'package.json'));
|
|
95
|
+
const deps = { ...pkg?.dependencies, ...pkg?.devDependencies };
|
|
96
|
+
// Framework detection
|
|
97
|
+
let framework = 'other';
|
|
98
|
+
if (deps?.['@nestjs/core'] || deps?.['@nestjs/common'])
|
|
99
|
+
framework = 'nestjs';
|
|
100
|
+
else if (deps?.['next'])
|
|
101
|
+
framework = 'nextjs';
|
|
102
|
+
else if (deps?.['express'])
|
|
103
|
+
framework = 'express';
|
|
104
|
+
// System type
|
|
105
|
+
let systemType = 'unknown';
|
|
106
|
+
if (framework === 'nestjs')
|
|
107
|
+
systemType = 'api';
|
|
108
|
+
else if (framework === 'nextjs')
|
|
109
|
+
systemType = 'app';
|
|
110
|
+
else if ((0, node_fs_1.existsSync)((0, node_path_1.join)(rootPath, 'pages')) || (0, node_fs_1.existsSync)((0, node_path_1.join)(rootPath, 'app')))
|
|
111
|
+
systemType = 'app';
|
|
112
|
+
// Count source files
|
|
113
|
+
const srcDir = (0, node_path_1.join)(rootPath, 'src');
|
|
114
|
+
const allFiles = listFiles(srcDir);
|
|
115
|
+
// Basic counts from source analysis
|
|
116
|
+
let endpoints = 0;
|
|
117
|
+
let services = 0;
|
|
118
|
+
let modules = 0;
|
|
119
|
+
let guards = 0;
|
|
120
|
+
for (const file of allFiles) {
|
|
121
|
+
try {
|
|
122
|
+
const content = (0, node_fs_1.readFileSync)(file, 'utf8');
|
|
123
|
+
if (content.includes('@Controller')) {
|
|
124
|
+
// Count HTTP decorators
|
|
125
|
+
const matches = content.match(/@(Get|Post|Put|Patch|Delete|All)\s*\(/g);
|
|
126
|
+
if (matches)
|
|
127
|
+
endpoints += matches.length;
|
|
128
|
+
}
|
|
129
|
+
if (content.includes('@Injectable'))
|
|
130
|
+
services++;
|
|
131
|
+
if (content.includes('@Module'))
|
|
132
|
+
modules++;
|
|
133
|
+
if (content.match(/class\s+\w*Guard/) && content.includes('CanActivate'))
|
|
134
|
+
guards++;
|
|
135
|
+
}
|
|
136
|
+
catch { /* skip unreadable files */ }
|
|
137
|
+
}
|
|
138
|
+
// Auth patterns
|
|
139
|
+
const authPatterns = [];
|
|
140
|
+
for (const file of allFiles.slice(0, 200)) {
|
|
141
|
+
try {
|
|
142
|
+
const content = (0, node_fs_1.readFileSync)(file, 'utf8');
|
|
143
|
+
if (content.includes('@clerk/') || content.includes('Clerk'))
|
|
144
|
+
authPatterns.push('clerk');
|
|
145
|
+
if (content.includes('Cognito') || content.includes('cognito'))
|
|
146
|
+
authPatterns.push('cognito');
|
|
147
|
+
if (content.includes('@UseGuards') || content.includes('AuthGuard'))
|
|
148
|
+
authPatterns.push('jwt');
|
|
149
|
+
if (content.includes('x-api-key') || content.includes('ApiKeyGuard') || content.includes('BusinessAccessGuard'))
|
|
150
|
+
authPatterns.push('apikey');
|
|
151
|
+
}
|
|
152
|
+
catch { /* skip */ }
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
framework,
|
|
156
|
+
system_type: systemType,
|
|
157
|
+
endpoints,
|
|
158
|
+
services,
|
|
159
|
+
modules,
|
|
160
|
+
guards,
|
|
161
|
+
auth_patterns: [...new Set(authPatterns)],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function listFiles(dir) {
|
|
165
|
+
const result = [];
|
|
166
|
+
if (!(0, node_fs_1.existsSync)(dir))
|
|
167
|
+
return result;
|
|
168
|
+
try {
|
|
169
|
+
const entries = (0, node_fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
170
|
+
for (const entry of entries) {
|
|
171
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist')
|
|
172
|
+
continue;
|
|
173
|
+
const full = (0, node_path_1.join)(dir, entry.name);
|
|
174
|
+
if (entry.isDirectory())
|
|
175
|
+
result.push(...listFiles(full));
|
|
176
|
+
else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.d.ts'))
|
|
177
|
+
result.push(full);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch { /* permission denied */ }
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
function readJson(path) {
|
|
184
|
+
try {
|
|
185
|
+
return JSON.parse((0, node_fs_1.readFileSync)(path, 'utf8'));
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
97
190
|
}
|
|
98
191
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|