@driftless-sh/cli 0.1.43 → 0.1.44

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@driftless-sh/cli",
3
- "version": "0.1.43",
3
+ "version": "0.1.44",
4
4
  "description": "Driftless CLI — context integrity for AI engineering teams",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,9 +0,0 @@
1
- export declare const api: {
2
- get: <T = unknown>(path: string) => Promise<T>;
3
- post: <T = unknown>(path: string, body?: unknown) => Promise<T>;
4
- put: <T = unknown>(path: string, body?: unknown) => Promise<T>;
5
- delete: <T = unknown>(path: string) => Promise<T>;
6
- };
7
- export declare function getApiUrl(): string;
8
- export declare function getApiKey(): string | null;
9
- //# sourceMappingURL=api-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAqFA,eAAO,MAAM,GAAG;UACR,CAAC,kBAAkB,MAAM,KAA6B,OAAO,CAAC,CAAC,CAAC;WAC/D,CAAC,kBAAkB,MAAM,SAAS,OAAO,KACf,OAAO,CAAC,CAAC,CAAC;UACrC,CAAC,kBAAkB,MAAM,SAAS,OAAO,KACf,OAAO,CAAC,CAAC,CAAC;aACjC,CAAC,kBAAkB,MAAM,KAAgC,OAAO,CAAC,CAAC,CAAC;CAC7E,CAAA;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzC"}
@@ -1,92 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.api = void 0;
4
- exports.getApiUrl = getApiUrl;
5
- exports.getApiKey = getApiKey;
6
- const node_http_1 = require("node:http");
7
- const node_https_1 = require("node:https");
8
- const node_fs_1 = require("node:fs");
9
- const node_path_1 = require("node:path");
10
- const node_os_1 = require("node:os");
11
- const CONFIG_PATH = (0, node_path_1.resolve)((0, node_os_1.homedir)(), '.driftless', 'config.json');
12
- function loadApiKey() {
13
- // 1. Env var
14
- const envKey = process.env['DRIFTLESS_API_KEY'];
15
- if (envKey)
16
- return envKey;
17
- // 2. Config file
18
- try {
19
- if ((0, node_fs_1.existsSync)(CONFIG_PATH)) {
20
- const config = JSON.parse((0, node_fs_1.readFileSync)(CONFIG_PATH, 'utf8'));
21
- return config.api_key || null;
22
- }
23
- }
24
- catch {
25
- // ignore
26
- }
27
- return null;
28
- }
29
- const DEFAULT_URL = 'http://localhost:3000/api/v1';
30
- function getBaseUrl() {
31
- const envUrl = process.env['DRIFTLESS_API_URL'];
32
- if (envUrl) {
33
- return envUrl.endsWith('/api/v1') ? envUrl : `${envUrl}/api/v1`;
34
- }
35
- // Try config file
36
- try {
37
- if ((0, node_fs_1.existsSync)(CONFIG_PATH)) {
38
- const config = JSON.parse((0, node_fs_1.readFileSync)(CONFIG_PATH, 'utf8'));
39
- return config.api_url || DEFAULT_URL;
40
- }
41
- }
42
- catch {
43
- // ignore
44
- }
45
- return DEFAULT_URL;
46
- }
47
- function request(method, path, body) {
48
- return new Promise((resolve, reject) => {
49
- const baseUrl = getBaseUrl();
50
- const fullUrl = `${baseUrl}${path}`;
51
- const url = new URL(fullUrl);
52
- const isHttps = url.protocol === 'https:';
53
- const fn = isHttps ? node_https_1.request : node_http_1.request;
54
- const headers = {
55
- 'Content-Type': 'application/json',
56
- Accept: 'application/json',
57
- };
58
- const apiKey = loadApiKey();
59
- if (apiKey) {
60
- headers['X-API-Key'] = apiKey;
61
- }
62
- const req = fn(fullUrl, { method, headers }, (res) => {
63
- let data = '';
64
- res.on('data', (chunk) => (data += chunk.toString()));
65
- res.on('end', () => {
66
- try {
67
- resolve(JSON.parse(data));
68
- }
69
- catch {
70
- resolve(data);
71
- }
72
- });
73
- });
74
- req.on('error', reject);
75
- if (body)
76
- req.write(JSON.stringify(body));
77
- req.end();
78
- });
79
- }
80
- exports.api = {
81
- get: (path) => request('GET', path),
82
- post: (path, body) => request('POST', path, body),
83
- put: (path, body) => request('PUT', path, body),
84
- delete: (path) => request('DELETE', path),
85
- };
86
- function getApiUrl() {
87
- return getBaseUrl();
88
- }
89
- function getApiKey() {
90
- return loadApiKey();
91
- }
92
- //# sourceMappingURL=api-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function contextCommand(args: string[]): Promise<void>;
2
- //# sourceMappingURL=context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFlE"}
@@ -1,84 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.contextCommand = contextCommand;
4
- const api_client_1 = require("../api-client");
5
- const git_1 = require("../git");
6
- async function contextCommand(args) {
7
- if (!(0, git_1.isGitRepo)()) {
8
- console.error('Error: not a git repository.');
9
- process.exit(1);
10
- }
11
- const remote = (0, git_1.getGitRemote)();
12
- if (!remote) {
13
- console.error('Error: no git remote found.');
14
- process.exit(1);
15
- }
16
- // Get workspace
17
- let workspace;
18
- try {
19
- workspace = await api_client_1.api.get(`/workspaces/${remote.org}`);
20
- }
21
- catch {
22
- console.error(`Workspace '${remote.org}' not found. Run 'driftless init' first.`);
23
- process.exit(1);
24
- }
25
- const subCommand = args[0];
26
- if (subCommand === 'list') {
27
- try {
28
- const watchers = (await api_client_1.api.get(`/workspaces/${remote.org}/watchers`));
29
- if (watchers.length === 0) {
30
- console.log('No watchers defined yet.');
31
- console.log('Create one with: driftless context add "name" --what "..." --how "..." --where "..."');
32
- }
33
- else {
34
- for (const w of watchers) {
35
- console.log(` • ${w.slug} — ${w.name}`);
36
- }
37
- }
38
- }
39
- catch {
40
- console.log('Watchers API not available yet (coming in M5).');
41
- }
42
- return;
43
- }
44
- if (subCommand === 'get') {
45
- const slug = args[1];
46
- if (!slug) {
47
- console.error('Usage: driftless context get <name>');
48
- process.exit(1);
49
- }
50
- try {
51
- const watcher = await api_client_1.api.get(`/workspaces/${remote.org}/watchers/${slug}`);
52
- console.log(`Name: ${watcher.name}`);
53
- console.log(`What: ${watcher.what || 'N/A'}`);
54
- console.log(`How: ${watcher.how || 'N/A'}`);
55
- console.log(`Where: ${watcher.where_files?.join(', ') || 'N/A'}`);
56
- console.log(`Used by: ${watcher.where_used_by?.join(', ') || 'N/A'}`);
57
- console.log(`Updated: ${watcher.last_updated || 'never'}`);
58
- }
59
- catch {
60
- console.log(`Watcher '${slug}' not found or API not available.`);
61
- }
62
- return;
63
- }
64
- if (subCommand === 'add') {
65
- const name = args[1];
66
- if (!name) {
67
- console.error('Usage: driftless context add "name" --what "..." --how "..." --where "..."');
68
- process.exit(1);
69
- }
70
- try {
71
- await api_client_1.api.post(`/workspaces/${remote.org}/watchers`, {
72
- name,
73
- slug: name.toLowerCase().replace(/\s+/g, '-'),
74
- });
75
- console.log(`Watcher '${name}' created.`);
76
- }
77
- catch {
78
- console.log('Watchers API not available yet (coming in M5).');
79
- }
80
- return;
81
- }
82
- console.log('Usage: driftless context <list|get|add> [args]');
83
- }
84
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function initCommand(): Promise<void>;
2
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAqHjD"}
@@ -1,117 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initCommand = initCommand;
4
- const api_client_1 = require("../api-client");
5
- const git_1 = require("../git");
6
- const scanner_1 = require("@driftless/scanner");
7
- async function initCommand() {
8
- console.log('Driftless — context integrity for engineering teams\n');
9
- if (!(0, git_1.isGitRepo)()) {
10
- console.error('Error: not a git repository.');
11
- process.exit(1);
12
- }
13
- const remote = (0, git_1.getGitRemote)();
14
- if (!remote) {
15
- console.error('Error: no git remote found.');
16
- process.exit(1);
17
- }
18
- console.log(`Repository: ${remote.org}/${remote.repo}`);
19
- // 1. Get workspace from API key (not from git remote!)
20
- console.log('\nConnecting to Driftless Cloud...');
21
- let workspace;
22
- try {
23
- workspace = await api_client_1.api.get('/me');
24
- if (!workspace?.workspace_id) {
25
- console.error('Could not resolve workspace. Check your API key.');
26
- process.exit(1);
27
- }
28
- console.log(` Workspace: ${workspace.slug} ✓`);
29
- }
30
- catch (err) {
31
- console.error(` Failed: ${err?.message || 'unreachable'}`);
32
- process.exit(1);
33
- }
34
- const workspaceSlug = workspace.slug;
35
- // 2. Local scan
36
- console.log('\nScanning codebase locally...');
37
- const cwd = process.cwd();
38
- const scanResult = await (0, scanner_1.scanRepo)(cwd);
39
- const summary = {
40
- endpoints: scanResult.stats.total_endpoints,
41
- guards: scanResult.stats.total_guards,
42
- services: scanResult.stats.total_services,
43
- modules: scanResult.stats.total_modules,
44
- framework: scanResult.identity.framework,
45
- system_type: scanResult.identity.system_type,
46
- auth_patterns: scanResult.identity.auth_patterns,
47
- };
48
- const components = scanResult.components;
49
- const relationCount = components.reduce((sum, component) => sum + (component.relations?.length || 0), 0);
50
- console.log(` Framework: ${summary.framework} | Endpoints: ${summary.endpoints} | Services: ${summary.services}`);
51
- console.log(` Modules: ${summary.modules} | Guards: ${summary.guards}`);
52
- console.log(` Relations: ${relationCount}`);
53
- if (summary.auth_patterns.length > 0) {
54
- console.log(` Auth: ${summary.auth_patterns.join(', ')}`);
55
- }
56
- // 3. Connect repo
57
- let repo;
58
- try {
59
- const repos = (await api_client_1.api.get(`/workspaces/${workspaceSlug}/repos`));
60
- repo = Array.isArray(repos)
61
- ? repos.find((r) => r.github_org === remote.org && r.github_repo === remote.repo)
62
- : null;
63
- }
64
- catch { /* will create */ }
65
- if (repo) {
66
- console.log(`\n Repo: ${remote.repo} ✓`);
67
- }
68
- else {
69
- try {
70
- repo = await api_client_1.api.post(`/workspaces/${workspaceSlug}/repos`, {
71
- github_org: remote.org,
72
- github_repo: remote.repo,
73
- });
74
- console.log(` Repo: ${remote.repo} (connected)`);
75
- }
76
- catch (err) {
77
- console.error(` Failed to connect repo: ${err?.message || 'unknown'}`);
78
- process.exit(1);
79
- }
80
- }
81
- // 4. Upload baseline
82
- try {
83
- await api_client_1.api.post(`/workspaces/${workspaceSlug}/repos/${repo.id}/baseline`, summary);
84
- console.log(' Baseline uploaded ✓');
85
- }
86
- catch (err) {
87
- console.error(` Upload failed: ${err?.message || 'unknown'}`);
88
- }
89
- // 5. Upload components
90
- if (components.length > 0) {
91
- try {
92
- await api_client_1.api.post(`/workspaces/${workspaceSlug}/repos/${repo.id}/components`, { components });
93
- console.log(` Components uploaded (${components.length}, relations ${relationCount}) ✓`);
94
- }
95
- catch (err) {
96
- console.error(` Component upload failed: ${err?.message || 'unknown'}`);
97
- }
98
- }
99
- // 5. Rules
100
- console.log('\nSuggested rules:');
101
- const suggestions = [];
102
- if (summary.auth_patterns.includes('apikey') || summary.guards > 0) {
103
- suggestions.push('Every B2B endpoint must use BusinessAccessGuard');
104
- }
105
- if (summary.services > summary.modules) {
106
- suggestions.push('Services must not import controllers directly');
107
- }
108
- if (summary.endpoints > 50) {
109
- suggestions.push('Split large controllers — over 50 endpoints detected');
110
- }
111
- if (suggestions.length === 0)
112
- console.log(' No suggestions.');
113
- else
114
- suggestions.forEach((s) => console.log(` • ${s}`));
115
- console.log(`\nView: https://driftless.icu/ecosystem`);
116
- }
117
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function installSkillCommand(): void;
2
- //# sourceMappingURL=install-skill.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,IAAI,IAAI,CA4C1C"}
@@ -1,49 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.installSkillCommand = installSkillCommand;
4
- const node_fs_1 = require("node:fs");
5
- const node_path_1 = require("node:path");
6
- function installSkillCommand() {
7
- const cwd = process.cwd();
8
- const agentsPath = (0, node_path_1.resolve)(cwd, 'AGENTS.md');
9
- const template = `# Driftless — Team Codebase Memory
10
-
11
- Driftless Cloud is the source of truth for this repo's architecture context.
12
-
13
- Before touching backend architecture, auth, routes, guards, services, modules, or package boundaries, load relevant context:
14
-
15
- \\\`\\\`\\\`bash
16
- driftless context get <feature>
17
- \\\`\\\`\\\`
18
-
19
- Before completing work, verify the current diff:
20
-
21
- \\\`\\\`\\\`bash
22
- driftless scan --diff
23
- \\\`\\\`\\\`
24
-
25
- If Driftless reports violations, fix them before finishing.
26
-
27
- If you discover durable context about the codebase, add it to the team memory:
28
-
29
- \\\`\\\`\\\`bash
30
- driftless context add "<name>" --what "..." --how "..." --where "..."
31
- \\\`\\\`\\\`
32
-
33
- Driftless is not local session memory. It is shared team context stored in Cloud and kept updated through scans, agent activity, and repo changes.
34
- `;
35
- if ((0, node_fs_1.existsSync)(agentsPath)) {
36
- console.log('AGENTS.md already exists. Appending Driftless section...');
37
- const existing = require('node:fs').readFileSync(agentsPath, 'utf8');
38
- if (existing.includes('Driftless — Context & Integrity')) {
39
- console.log('Driftless section already present.');
40
- return;
41
- }
42
- (0, node_fs_1.writeFileSync)(agentsPath, existing + '\n---\n\n' + template);
43
- }
44
- else {
45
- (0, node_fs_1.writeFileSync)(agentsPath, template);
46
- }
47
- console.log(`Driftless skill installed at ${agentsPath}`);
48
- }
49
- //# sourceMappingURL=install-skill.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":";;AAGA,kDA4CC;AA/CD,qCAAmD;AACnD,yCAAmC;AAEnC,SAAgB,mBAAmB;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,UAAU,GAAG,IAAA,mBAAO,EAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IAE5C,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAA;IAEC,IAAI,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;QACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QACpE,IAAI,QAAQ,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QACD,IAAA,uBAAa,EAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAA;IAC9D,CAAC;SAAM,CAAC;QACN,IAAA,uBAAa,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAA;AAC3D,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function loginCommand(args: string[]): Promise<void>;
2
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAeA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChE"}
@@ -1,74 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loginCommand = loginCommand;
4
- const node_fs_1 = require("node:fs");
5
- const node_path_1 = require("node:path");
6
- const node_readline_1 = require("node:readline");
7
- const node_child_process_1 = require("node:child_process");
8
- const node_os_1 = require("node:os");
9
- const CONFIG_DIR = (0, node_path_1.resolve)((0, node_os_1.homedir)(), '.driftless');
10
- const CONFIG_PATH = (0, node_path_1.resolve)(CONFIG_DIR, 'config.json');
11
- function openBrowser(url) {
12
- const cmd = process.platform === 'darwin' ? 'open' :
13
- process.platform === 'win32' ? 'start' : 'xdg-open';
14
- (0, node_child_process_1.exec)(`${cmd} ${url}`);
15
- }
16
- async function loginCommand(args) {
17
- // --key flag for quick setup (CI, scripts)
18
- const keyIndex = args.indexOf('--key');
19
- if (keyIndex !== -1 && args[keyIndex + 1]) {
20
- const apiKey = args[keyIndex + 1];
21
- saveConfig(apiKey);
22
- return;
23
- }
24
- const apiUrl = process.env['DRIFTLESS_API_URL'] || 'https://api.driftless.icu/api/v1';
25
- const dashboardUrl = 'https://driftless.icu';
26
- console.log('Opening Driftless Dashboard to get your API key...');
27
- console.log();
28
- // Open browser to dashboard API keys section
29
- openBrowser(dashboardUrl);
30
- console.log('If the browser doesn\'t open, visit:');
31
- console.log(` ${dashboardUrl}`);
32
- console.log();
33
- console.log('1. Sign in with your account');
34
- console.log('2. Go to Settings → API Keys');
35
- console.log('3. Create a new API key');
36
- console.log('4. Copy the key (starts with drift_)');
37
- console.log();
38
- // Interactive prompt
39
- const rl = (0, node_readline_1.createInterface)({
40
- input: process.stdin,
41
- output: process.stdout,
42
- });
43
- const apiKey = await new Promise((resolve) => {
44
- rl.question('Paste your API key: ', (answer) => {
45
- rl.close();
46
- resolve(answer.trim());
47
- });
48
- });
49
- if (!apiKey.startsWith('drift_')) {
50
- console.error('Error: API key must start with "drift_".');
51
- console.error('Get a valid key from your Driftless Dashboard → Settings → API Keys.');
52
- process.exit(1);
53
- }
54
- saveConfig(apiKey, apiUrl);
55
- }
56
- function saveConfig(apiKey, apiUrl) {
57
- const url = apiUrl || 'https://api.driftless.icu/api/v1';
58
- try {
59
- if (!(0, node_fs_1.existsSync)(CONFIG_DIR)) {
60
- (0, node_fs_1.mkdirSync)(CONFIG_DIR, { recursive: true });
61
- }
62
- (0, node_fs_1.writeFileSync)(CONFIG_PATH, JSON.stringify({ api_key: apiKey, api_url: url }, null, 2) + '\n');
63
- console.log();
64
- console.log('Logged in successfully.');
65
- console.log(` Config: ${CONFIG_PATH}`);
66
- console.log();
67
- console.log('Try: driftless scan --diff');
68
- }
69
- catch (err) {
70
- console.error('Failed to save config:', err);
71
- process.exit(1);
72
- }
73
- }
74
- //# sourceMappingURL=login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function scanCommand(args: string[]): Promise<void>;
2
- //# sourceMappingURL=scan.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgG/D"}
@@ -1,91 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.scanCommand = scanCommand;
4
- const api_client_1 = require("../api-client");
5
- const git_1 = require("../git");
6
- async function scanCommand(args) {
7
- if (!(0, git_1.isGitRepo)()) {
8
- console.error('Error: not a git repository.');
9
- process.exit(1);
10
- }
11
- const remote = (0, git_1.getGitRemote)();
12
- if (!remote) {
13
- console.error('Error: no git remote found.');
14
- process.exit(1);
15
- }
16
- // Get workspace via /me (resolves from API key, not git remote slug)
17
- let workspace;
18
- try {
19
- workspace = await api_client_1.api.get('/me');
20
- }
21
- catch {
22
- console.error('Could not resolve workspace. Run driftless login first.');
23
- process.exit(1);
24
- }
25
- const repos = (await api_client_1.api.get(`/workspaces/${workspace.slug}/repos`));
26
- if (!Array.isArray(repos)) {
27
- console.error(`Error: Could not fetch repos for workspace '${workspace.slug}'.`);
28
- console.error(`Response:`, JSON.stringify(repos).slice(0, 200));
29
- console.error('\nTip: Make sure your API key belongs to this workspace.');
30
- console.error('Run: driftless login --key <key>');
31
- process.exit(1);
32
- }
33
- const repo = repos.find((r) => r.github_org === remote.org && r.github_repo === remote.repo);
34
- if (!repo) {
35
- console.error(`Repo '${remote.repo}' not found. Run 'driftless init' first.`);
36
- process.exit(1);
37
- }
38
- // Get diff
39
- const onlyDiff = args.includes('--diff');
40
- let diff = '';
41
- let source = '';
42
- if (onlyDiff) {
43
- diff = (0, git_1.getUncommittedDiff)();
44
- source = 'uncommitted changes';
45
- if (!diff) {
46
- console.log('No uncommitted changes. Clean.');
47
- process.exit(0);
48
- }
49
- }
50
- else {
51
- const staged = (0, git_1.getStagedDiff)();
52
- const unstaged = (0, git_1.getUncommittedDiff)();
53
- diff = [staged, unstaged].filter(Boolean).join('\n');
54
- source = staged && unstaged ? 'staged + unstaged' : staged ? 'staged' : 'unstaged';
55
- if (!diff) {
56
- console.log('No changes to scan. Clean.');
57
- process.exit(0);
58
- }
59
- }
60
- const commitHash = (0, git_1.getLastCommitHash)();
61
- const author = (0, git_1.getAuthorName)();
62
- console.log(`Scanning ${source}...`);
63
- // Evaluate
64
- const result = await api_client_1.api.post('/scan', {
65
- workspace_id: workspace.workspace_id,
66
- repo_id: repo.id,
67
- diff,
68
- commit_hash: commitHash,
69
- author,
70
- });
71
- if (result.status === 'clean') {
72
- console.log('Clean — no violations detected.');
73
- process.exit(0);
74
- }
75
- if (!result.violations || result.violations.length === 0) {
76
- console.log('Clean — no violations detected.');
77
- process.exit(0);
78
- }
79
- console.log(`\n${result.violations.length} violation(s) found:\n`);
80
- for (const v of result.violations) {
81
- const severityColor = v.severity === 'critical' || v.severity === 'high' ? '\x1b[31m' : '\x1b[33m';
82
- console.log(` ${severityColor}[${v.severity.toUpperCase()}]\x1b[0m ${v.rule_name}`);
83
- console.log(` ${v.explanation}`);
84
- console.log(` File: ${v.file_path}:${v.line_number}`);
85
- console.log(` Code: ${v.diff_snippet}`);
86
- console.log();
87
- }
88
- console.log('Fix these violations before pushing.');
89
- process.exit(1);
90
- }
91
- //# sourceMappingURL=scan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts DELETED
@@ -1,10 +0,0 @@
1
- export declare function getGitRemote(): {
2
- org: string;
3
- repo: string;
4
- } | null;
5
- export declare function isGitRepo(): boolean;
6
- export declare function getUncommittedDiff(): string;
7
- export declare function getStagedDiff(): string;
8
- export declare function getLastCommitHash(): string;
9
- export declare function getAuthorName(): string;
10
- //# sourceMappingURL=git.d.ts.map
package/dist/git.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgBnE;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAM3C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAMtC"}