archbyte 0.2.2 → 0.2.5
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/README.md +33 -5
- package/bin/archbyte.js +47 -7
- package/dist/agents/prompt-data.js +4 -4
- package/dist/agents/providers/router.js +1 -16
- package/dist/agents/runtime/types.d.ts +5 -1
- package/dist/agents/runtime/types.js +3 -3
- package/dist/agents/static/code-sampler.js +1 -4
- package/dist/agents/static/component-detector.js +1 -4
- package/dist/agents/static/event-detector.js +2 -1
- package/dist/agents/static/excluded-dirs.d.ts +3 -0
- package/dist/agents/static/excluded-dirs.js +11 -0
- package/dist/agents/static/file-tree-collector.js +1 -5
- package/dist/agents/tools/claude-code.js +2 -5
- package/dist/agents/tools/local-fs.js +2 -6
- package/dist/cli/analyze.d.ts +1 -0
- package/dist/cli/analyze.js +5 -5
- package/dist/cli/auth.js +8 -6
- package/dist/cli/config.d.ts +1 -0
- package/dist/cli/config.js +80 -61
- package/dist/cli/constants.d.ts +13 -0
- package/dist/cli/constants.js +20 -0
- package/dist/cli/diff.js +1 -1
- package/dist/cli/export.js +3 -3
- package/dist/cli/gate.js +3 -3
- package/dist/cli/generate.js +2 -1
- package/dist/cli/license-gate.js +5 -5
- package/dist/cli/mcp-server.d.ts +1 -0
- package/dist/cli/mcp-server.js +443 -0
- package/dist/cli/mcp.d.ts +1 -0
- package/dist/cli/mcp.js +102 -0
- package/dist/cli/patrol.js +4 -4
- package/dist/cli/run.d.ts +1 -0
- package/dist/cli/run.js +3 -7
- package/dist/cli/serve.js +3 -2
- package/dist/cli/setup.js +153 -72
- package/dist/cli/stats.js +1 -1
- package/dist/cli/ui.js +3 -3
- package/dist/cli/validate.js +2 -2
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.js +84 -0
- package/dist/cli/workflow.js +7 -7
- package/dist/cli/yaml-io.js +1 -1
- package/dist/server/src/index.js +52 -0
- package/package.json +4 -2
- package/ui/dist/assets/{index-Bl1r8zrI.css → index-0_XpUUZQ.css} +1 -1
- package/ui/dist/assets/index-BdfGbhpp.js +70 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-CqbB6DOK.js +0 -70
package/README.md
CHANGED
|
@@ -6,21 +6,49 @@ AI-powered architecture visualization for your codebase. Analyzes code, generate
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
# Install
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
curl -fsSL https://archbyte.heartbyte.io/install.sh | bash
|
|
10
|
+
|
|
11
|
+
# Sign in or create a free account
|
|
12
|
+
archbyte login
|
|
13
|
+
|
|
14
|
+
# Configure your AI provider (BYOK)
|
|
15
|
+
archbyte init
|
|
16
|
+
|
|
17
|
+
# Or, if you use Claude Code / Codex — skip BYOK entirely:
|
|
18
|
+
archbyte mcp install
|
|
12
19
|
```
|
|
13
20
|
|
|
21
|
+
Your API keys stay on your machine. ArchByte never stores or transmits your provider credentials.
|
|
22
|
+
|
|
14
23
|
### Setup with Claude Code
|
|
15
24
|
|
|
16
|
-
|
|
25
|
+
**Option A: MCP (recommended)** — use ArchByte tools directly in Claude Code, no API key needed:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
archbyte mcp install
|
|
29
|
+
# or manually:
|
|
30
|
+
claude mcp add archbyte --transport stdio -- npx -y archbyte@latest mcp
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then just ask Claude Code in plain English:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
"Analyze the architecture of this project"
|
|
37
|
+
"Export the architecture as a Mermaid diagram"
|
|
38
|
+
"Show me the architecture stats"
|
|
39
|
+
"Read the current architecture diagram"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Available MCP tools: `archbyte_analyze`, `archbyte_generate`, `archbyte_validate` (Pro), `archbyte_export`, `archbyte_stats`, `archbyte_diff`, `archbyte_read_diagram`.
|
|
43
|
+
|
|
44
|
+
**Option B: Slash commands** — installed globally so they work in any project:
|
|
17
45
|
|
|
18
46
|
```bash
|
|
19
47
|
mkdir -p ~/.claude/commands
|
|
20
48
|
cp commands/archbyte-*.md ~/.claude/commands/
|
|
21
49
|
```
|
|
22
50
|
|
|
23
|
-
Run `/archbyte-help` in Claude Code to see all commands.
|
|
51
|
+
Run `/archbyte-help` in Claude Code to see all commands.
|
|
24
52
|
|
|
25
53
|
## Usage (Claude Code slash commands)
|
|
26
54
|
|
package/bin/archbyte.js
CHANGED
|
@@ -6,6 +6,7 @@ if (major < 18) {
|
|
|
6
6
|
process.exit(1);
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
import { createRequire } from 'module';
|
|
9
10
|
import { Command } from 'commander';
|
|
10
11
|
import { handleServe } from '../dist/cli/serve.js';
|
|
11
12
|
import { handleGenerate } from '../dist/cli/generate.js';
|
|
@@ -20,14 +21,19 @@ import { handleConfig } from '../dist/cli/config.js';
|
|
|
20
21
|
import { handleLogin, handleLoginWithToken, handleLogout, handleStatus } from '../dist/cli/auth.js';
|
|
21
22
|
import { handleRun } from '../dist/cli/run.js';
|
|
22
23
|
import { handleSetup } from '../dist/cli/setup.js';
|
|
24
|
+
import { handleVersion, handleUpdate } from '../dist/cli/version.js';
|
|
23
25
|
import { requireLicense } from '../dist/cli/license-gate.js';
|
|
26
|
+
import { DEFAULT_PORT } from '../dist/cli/constants.js';
|
|
27
|
+
|
|
28
|
+
const require = createRequire(import.meta.url);
|
|
29
|
+
const { version: PKG_VERSION } = require('../package.json');
|
|
24
30
|
|
|
25
31
|
const program = new Command();
|
|
26
32
|
|
|
27
33
|
program
|
|
28
34
|
.name('archbyte')
|
|
29
35
|
.description('ArchByte - See what agents build. As they build it.')
|
|
30
|
-
.version(
|
|
36
|
+
.version(PKG_VERSION)
|
|
31
37
|
.addHelpText('after', `
|
|
32
38
|
Quick start:
|
|
33
39
|
$ archbyte login Sign in
|
|
@@ -41,7 +47,7 @@ program
|
|
|
41
47
|
|
|
42
48
|
program
|
|
43
49
|
.command('login')
|
|
44
|
-
.description('Sign in
|
|
50
|
+
.description('Sign in or create a free account (required for scan/analyze/generate)')
|
|
45
51
|
.option('--token <jwt>', 'Login with a pre-existing JWT token')
|
|
46
52
|
.option('--github', 'Sign in with GitHub')
|
|
47
53
|
.option('--google', 'Sign in with Google')
|
|
@@ -73,11 +79,12 @@ program
|
|
|
73
79
|
program
|
|
74
80
|
.command('run')
|
|
75
81
|
.description('Analyze, generate, and serve - full pipeline in one shot')
|
|
82
|
+
.option('-d, --dir <path>', 'Project root directory (default: current directory)')
|
|
76
83
|
.option('--static', 'Static-only analysis (no model, free)')
|
|
77
84
|
.option('--skip-llm', 'Alias for --static')
|
|
78
|
-
.option('--provider <name>', 'Model provider: anthropic, openai, google
|
|
85
|
+
.option('--provider <name>', 'Model provider: anthropic, openai, google')
|
|
79
86
|
.option('--api-key <key>', 'Model API key (overrides config)')
|
|
80
|
-
.option('-p, --port <number>',
|
|
87
|
+
.option('-p, --port <number>', `UI server port (default: ${DEFAULT_PORT})`, parseInt)
|
|
81
88
|
.option('-v, --verbose', 'Show detailed output')
|
|
82
89
|
.option('--force', 'Force full re-scan (skip incremental detection)')
|
|
83
90
|
.option('--dry-run', 'Preview without running')
|
|
@@ -89,9 +96,10 @@ program
|
|
|
89
96
|
program
|
|
90
97
|
.command('analyze')
|
|
91
98
|
.description('Run AI-powered architecture analysis (BYOK - uses your model API key)')
|
|
99
|
+
.option('-d, --dir <path>', 'Project root directory (default: current directory)')
|
|
92
100
|
.option('-o, --output <path>', 'Output analysis path (default: .archbyte/analysis.json)')
|
|
93
101
|
.option('-v, --verbose', 'Show detailed output')
|
|
94
|
-
.option('--provider <name>', 'Model provider: anthropic, openai, google
|
|
102
|
+
.option('--provider <name>', 'Model provider: anthropic, openai, google')
|
|
95
103
|
.option('--api-key <key>', 'Model API key (overrides config)')
|
|
96
104
|
.option('--static', 'Static-only analysis (no model, free)')
|
|
97
105
|
.option('--skip-llm', 'Alias for --static')
|
|
@@ -116,7 +124,7 @@ program
|
|
|
116
124
|
program
|
|
117
125
|
.command('serve')
|
|
118
126
|
.description('Start the visualization UI server')
|
|
119
|
-
.option('-p, --port <number>',
|
|
127
|
+
.option('-p, --port <number>', `Server port (default: ${DEFAULT_PORT})`, parseInt)
|
|
120
128
|
.option('-d, --diagram <path>', 'Path to architecture JSON (default: .archbyte/architecture.json)')
|
|
121
129
|
.action(async (options) => {
|
|
122
130
|
await handleServe(options);
|
|
@@ -208,12 +216,44 @@ program
|
|
|
208
216
|
.command('config')
|
|
209
217
|
.description('Manage ArchByte configuration (provider, API key)')
|
|
210
218
|
.argument('[action]', 'show, set, get, or path')
|
|
211
|
-
.argument('[key]', 'config key (provider, api-key,
|
|
219
|
+
.argument('[key]', 'config key (provider, api-key, model)')
|
|
212
220
|
.argument('[value]', 'config value')
|
|
213
221
|
.action(async (action, key, value) => {
|
|
214
222
|
await handleConfig({ args: [action, key, value].filter(Boolean) });
|
|
215
223
|
});
|
|
216
224
|
|
|
225
|
+
program
|
|
226
|
+
.command('version')
|
|
227
|
+
.description('Show ArchByte version and environment info')
|
|
228
|
+
.action(async () => {
|
|
229
|
+
await handleVersion();
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
program
|
|
233
|
+
.command('update')
|
|
234
|
+
.description('Update ArchByte to the latest version')
|
|
235
|
+
.action(async () => {
|
|
236
|
+
await handleUpdate();
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// — MCP server —
|
|
240
|
+
|
|
241
|
+
const mcpCmd = program
|
|
242
|
+
.command('mcp')
|
|
243
|
+
.description('Start MCP server for AI coding tools (Claude Code, Codex)')
|
|
244
|
+
.action(async () => {
|
|
245
|
+
const { startMcpServer } = await import('../dist/cli/mcp-server.js');
|
|
246
|
+
await startMcpServer();
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
mcpCmd
|
|
250
|
+
.command('install')
|
|
251
|
+
.description('Auto-configure Claude Code and/or Codex CLI')
|
|
252
|
+
.action(async () => {
|
|
253
|
+
const { handleMcpInstall } = await import('../dist/cli/mcp.js');
|
|
254
|
+
await handleMcpInstall();
|
|
255
|
+
});
|
|
256
|
+
|
|
217
257
|
// Default: show help
|
|
218
258
|
program
|
|
219
259
|
.action(() => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Auto-generated by prompts-encode.ts — DO NOT EDIT
|
|
2
2
|
// Run: node agents/prompts-encode.ts
|
|
3
3
|
import { registerPrompt } from "./prompts.js";
|
|
4
|
-
registerPrompt("pipeline/component-identifier", "
|
|
5
|
-
registerPrompt("pipeline/connection-mapper", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFktCjQAQwItG1QMMlIXB2IUFRVhMy8kYhobCy8XABwrFhoWYRAGHDUcEQthEQwFMhYaAC8GEEgrF1QEYQEMDjYOFRckUhARMQ0RCG94aSstFxoAIgYKByxZABwxFxBSSFRURygfEwcwDVZfYRYKGicaAEUiHQcNYhAZFS4AF0cmHAQALxYGBiEAfkhhUAscNglWX2EgJjsWVhM3ETFMIBYtJEUiEw8EMXNZRWMWAhwjGxUWJFBZSCEWGRUuHAYGNlkGACAWEEc1Cx0RJAFDHC1ZFUUlExcJIBgHAEtfQ0onDxELNVBZSCMKDQsiUgYeJxcASiwXEBsjHhFFaQIWCm0KAQdtUhIdJwwRFmh4TkhgHgYVIlBZSCUrJCZhEQIELgp+SGFQFA0gChsGKhcXSnhZIwAjIQwLKRwARSIdDQYnGgAMLhwQYm9ZVgMoHgZKeFkHDSAABgxiHx0JJAEaGzYcGUUgEQANMQp+bwcdEUgnGBcNYREMBiwcFxEoHQ1SSFRUAzMdDlJiChsQMxEGSCEWGRUuHAYGNlk9IWFaDh0xDVQIIAYAAGIYGkUkCgobNhAaAmERDAUyFhoALwZDIQZZER0gERcEO1B+SGEGDFJiDRUXJhcXSCEWGRUuHAYGNlk9IWFaDh0xDVQIIAYAAGIYGkUkCgobNhAaAmERDAUyFhoALwZDIQZZER0gERcEO1B+
|
|
4
|
+
registerPrompt("pipeline/component-identifier", "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");
|
|
5
|
+
registerPrompt("pipeline/connection-mapper", "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");
|
|
6
6
|
registerPrompt("pipeline/flow-detector", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMREyQcFystFxoAIgYKBywKXk97UiYeJxcASCUACh4nF1QGLh8OHSwQFwQ1GwwGYgkVETUXEQYxWVwIJAEQCSUcVBQ0FxYNMVVUFTQQTBs3G1hFNhcBAC0WHxZtUgYeJxcARSQfChw2HAYWaFxpSGJZMgozUgYJIRFORTpSEx0gFR0WKRcRRGIKAQcyEREBIBwGSWERCwksFxEJbVIXDSERGgotHQQRYgR+RWFSTkgyDBYJKAELDTBWBxAjAQAaKxsRF3tSAAcvCRsLJBwXSAs9B0VpGQYKIxtZBiABBkgxFQECMltpSGJZWUUiGgIGLBwYX2EXFQ0sDVsRLgIKC20IAQA0F0MGIxQRb2FSQ0ViDREGKRwMBC0eDV9hBgsNYgoEACIbBQEhWQAAIhoNBy4WExxhBxANJllcAG8VTURiWxETJBwXRScUHRE1FxFKbllWEiQQCwctElZMS3hRRmJTXgQxGzEHNw0RFmtYWUgDKT1FMx0WHCcKWwAvFhMHKxcAFmEWBhwnGgAAJVIFGi0UVAYuFgZIMhgAESQADRtsc1RFYTQMGmIcFQYpSEMTYgkVESleQwUnDRwKJV5DACMXEAkkACUBLhxUGEt4IDoLLT0mAD5ZSA0XGBxhAAYYLQsARSQEBgY2WRcKLxwGCzYQGwsyUgIGJlkGCjQGBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUxAAweKx0RAWERDAwnWQcELAIPDTFVVBY1ExcBIVkHBiAcDQ0wWQYAMgcPHDFVVAozUicHIRIRF2EBBho0EBcAMlxDISRZAA0kUhAcIw0dBmEBAAksFxEXYQECETFZVisuUgYeJxcASCUACh4nF1QVIAYXDTAXB0UlFxcNIQ0RAWNeQxonDQEXL1IGBTINDUUkBAYGNjobCy8XABwrFhoWb1InB2I3OzFhGw0eJxcARTETFxwnCxoWYQYLCTZZFRckUg0HNlkREygWBgYhHBBFKBxDHCocVAwvAhYcbHN+NyQBEwcsHVQSKAYLSA03ODxhE0MiETY6RS4QCQ0hDU5vOnhDSGAcAgAvBiAHLBcRBjUbDAYxW05FGlxNRh9VfkVhUAIYKysbEDUXEEp4WS9Lb1w+Yj9zfiwnUg0HYgkVETUXEQYxWRIKNBwHRGILERE0AA1IJxQEEThSAhowGA0Wbw==");
|
|
7
|
-
registerPrompt("pipeline/service-describer", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMEFy4YBgs2PREWIgAKGDYQGwtrWFlIA1kXCSQTEUhwVEdFMhcNHCcXFwBhFgYbIQsdFTUbDAZiFhJFNhoCHGINHAwyUhMaLRMRBjVSBwcnClpvc1xDQmgJBgwsExERDhgaAjQTBA1oU05FFRoGSC8YHQthAhEHJQsVCCwbDQ9iFRULJgcCDydZXABvFU1EYlsgHDEXMAswEAQRY15DShIAAA0uHEFEYlszCmNeQ0oQDAcRY1tNYnFXVE9rFgIcIxsVFiQBSUJ4WTAENRMBCTEcB0U0AQYMYhAaRTUaChtiCQYKKxcAHGxzQEthWEkNOg0RFy8TDzsnCwIMIhcQQmhDVCA5BgYaLBgYRTIXER4rGhEWbjMzITFZFwovARYFJx1UBzhSFwArClQVMx0JDSENWm9LNAwaYh0VESAQAhsnClQELxZDDToNERcvEw87JwsCDCIXEERiCQYKNxsHDXhzWUUoFllIKRwWBCNfAAkxHFQWLQcEYm9ZGgQsF1lIKgwZBC9fEQ0jHRUHLRdDBiMUEW9sUhcRMhxORTUXAAAsFhgKJgtDHDsJEUVpF00PbFVURzEdEBwlCxEWMB5BRGJbBgAlGxBKbllWFjUAChgnW11vbFIHDTEaBgwxBgoHLENUEikTF0grDVMWYQcQDSZZEgozeE5INwoRAQMLWUgjCwYEOFIMDmIaGwgxHQ0NLA1ULAUBQxwqGABFNAEGSDYRHRZhWhYbJ1kfACMTAUUhGAcAYQEPHSUKVAggBgAAKxcTRTUaBkghFhkVLhwGBjZZGgQsFxBBSHM3NwgmKisDNU5FDhwPEWIQGgYtBwcNYh0VESAQAhsnClQELxZDDToNERcvEw9IMRwGEygRBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUiHQcNIBgHAHt4TkgSGBcOIBUGRyYcBAAvFgYGIQBUDCwCDBo2ClRNJFwERm5ZVhUmUE9IYAsRASgBQURiWwcRMxsTDWBVVEcBExQbbwoQDm4RDwEnFwBIMkFBQUhUVCAvBAoaLRcZAC8GQx4jCx0EIx4GG2ILEQMkAAYGIRAaAmEGCw0vWVwAbxVNRGI9NTEAMCI7ByYhNw1eQzoHPT02HicxJG5ZJzETOzMtHSoxJhM3NzcJPC1MS19DLC0aHwAzUiAHLwkbFiRSEA0wDx0GJAFDHysNHEUsExcLKhAaAmEbDgklHAdvbFIgBywfHQI0AAIcKxYaRScbDw0xWQYAJxcRDSwaHQsmUhcAJxR+
|
|
8
|
-
registerPrompt("pipeline/validator", "
|
|
7
|
+
registerPrompt("pipeline/service-describer", "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");
|
|
8
|
+
registerPrompt("pipeline/validator", "GB0WSCMLEUUgUhAHJA0DBDMXQwkwGhwMNRcAHDcLEUUzFxUBJw4RF29SNQkuEBAENRdDHCocVAQvEw8RMRAHRTMXEB0uDQdFIBwHSDEMEwIkARdIIRYGFyQRFwEtFwdLS3ggACcaH0UnHRFSSEhaRWtYNBotFxNFIh0OGC0XEQs1UhcRMhwHT2tIQw1sHlpJYRNDOicYFxFhExMYYg0NFSQWQwkxWVYWJAAVASEcVkUyGgwdLh1UByRSQQ4wFhoRJBwHSkhLWkVrWDQNIxJUASQBABorCQAMLhwQQmhDVCYuHxMHLBwaETJSFAE2EVQALAIXEWIWBkU0HAAEJxgGRSUXEAswEAQRKB0NG2Kb9PFhAhEHNBAQAGEQBhw2HAZFLhwGG0hKWkVrWDENJgwaASAcF0ghFhoLJBEXAS0XB09rSEMsNwkYDCITFw1iFgZFNBwNDSEcBxYgABpIIRYaCyQRFwEtFwdFNRoCHGIKHAo0HgdIIBxUFyQfDB4nHX5Rb1JJQhULGwsmUgAHLBcRBjUbDAZiDQ0VJAFJQnhZEUsmXE9IIxdUDCwCDBo2WRcKLxwGCzYQGwthBgsJNlkHDS4HDwxiGxFFYxoXHDJbfm8CICo8Czo1KWExLCYRLSYkCDw3O3hzWUUYHRZILxgNRQ48LzFiCxEDJAAGBiEcVAYuHxMHLBwaEWE7JxtiDRwENVICBDAcFQE4UgYQKwoARSgcQxwqHFQGLh8TBywcGhEyUg8BMQ1UBCMdFQ1sc1lFBR1DJg0tVAwvBAYGNlkaADZSAAcvCRsLJBwXG25ZEAQ1EwEJMRwHSWEdEUgnAQAAMxwCBGIKERc3GwANMVd+SGE2DEgMNiBFIBYHSCEWGgskERcBLRcHRTUdQwstFAQKLxcNHDFZAA0gBkMMLRdTEWEXGwExDVQML1IXACdZGAwyBk1ib1k7Cy0LQwkmHVQGLhwNDSENHQovAUMRLQxUBDMXQwArHhwJOFIABywfHQEkHBdIIxsbEDVSAQkxHBBFLhxDHCocVAYuHxMHLBwaEWECAhwqClhFNRcAACwWGAomGwYbblkVCyVSBhArCgAMLxVDCy0XGgAiBgoHLApab2xSMxonHxEXYQAGBS0PHQsmUgEJJlkXCi8cBgs2EBsLMlIMHicLVAQlFgoGJVkHFSQRFgQjDR0TJFIMBicKWm9sUioOYg0cAGETDQkuAAcMMlIPBy0SB0UzFwIbLRcVBy0XT0gwHAAQMxxDDS8JABxhEQwaMBwXESgdDRtsWTgAMgFDATFZGQozF01iSCsRFjEdDQxiDh0RKVIsJg4gVARhODAnDFkbBysXABx4cw9vYVJBCy0UBAovFw0cFgAEAAIdERonGgAMLhwQSnhZD0VjEQwFMhYaAC8GTgEmW05FYxEMGjAcFxFsBhoYJ1tUGG14Q0hgGhsIMR0NDSwNMAAyEREBMg0dCi8BQVJiAlRHIh0OGC0XEQs1XwoMYENURyMXFxwnC1QBJAEAGisJAAwuHEFIP1V+RWFQAgwmHBAmLhwNDSENHQovAUFSYiIPRWMUEQcvW05FYxsHSm5ZVhEuUFlIYBAQR21SQRw7CRFHHF5pSGJbFwovFAoMJxcXAGNIQ1hsQUFJS1JDSisKBxAkAUFSYiJWASQBABorCQAMLhxDByRZFQs4UhENLxgdCygcBEgrCgcQJAFBNUgEfm8UAQZIJxQEEThSDAooHBcRMl0CGjAYDRZhGwVILBZUBi4AEQ0hDR0KLwFDBiccEAAlXEM8KhxUBi4cBQEmHBoGJFIQCy0LEUVpQk5Za1kGACceBgs2ClQcLgcRSC0PERcgHg9IIRYaAygWBgYhHFQML1IXACdZFQsgHhobKwpUFDQTDwE2AFo=");
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { AnthropicProvider } from "./anthropic.js";
|
|
2
2
|
import { OpenAIProvider } from "./openai.js";
|
|
3
3
|
import { GoogleProvider } from "./google.js";
|
|
4
|
-
import { OllamaProvider } from "./ollama.js";
|
|
5
4
|
export function createProvider(config) {
|
|
6
5
|
switch (config.provider) {
|
|
7
6
|
case "anthropic":
|
|
@@ -10,8 +9,6 @@ export function createProvider(config) {
|
|
|
10
9
|
return new OpenAIProvider(config.apiKey);
|
|
11
10
|
case "google":
|
|
12
11
|
return new GoogleProvider(config.apiKey);
|
|
13
|
-
case "ollama":
|
|
14
|
-
return new OllamaProvider(config.ollamaBaseUrl ?? "http://localhost:11434");
|
|
15
12
|
default:
|
|
16
13
|
throw new Error(`Unknown provider: ${config.provider}`);
|
|
17
14
|
}
|
|
@@ -24,11 +21,7 @@ export function detectConfig() {
|
|
|
24
21
|
const explicit = process.env.ARCHBYTE_PROVIDER;
|
|
25
22
|
const apiKey = process.env.ARCHBYTE_API_KEY;
|
|
26
23
|
if (explicit && apiKey) {
|
|
27
|
-
return {
|
|
28
|
-
provider: explicit,
|
|
29
|
-
apiKey,
|
|
30
|
-
ollamaBaseUrl: process.env.OLLAMA_BASE_URL,
|
|
31
|
-
};
|
|
24
|
+
return { provider: explicit, apiKey };
|
|
32
25
|
}
|
|
33
26
|
// Auto-detect from known env vars
|
|
34
27
|
if (process.env.ANTHROPIC_API_KEY) {
|
|
@@ -43,13 +36,5 @@ export function detectConfig() {
|
|
|
43
36
|
apiKey: process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY ?? "",
|
|
44
37
|
};
|
|
45
38
|
}
|
|
46
|
-
// Ollama doesn't need an API key
|
|
47
|
-
if (explicit === "ollama") {
|
|
48
|
-
return {
|
|
49
|
-
provider: "ollama",
|
|
50
|
-
apiKey: "",
|
|
51
|
-
ollamaBaseUrl: process.env.OLLAMA_BASE_URL ?? "http://localhost:11434",
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
39
|
return null;
|
|
55
40
|
}
|
|
@@ -98,12 +98,16 @@ export interface License {
|
|
|
98
98
|
isValid: boolean;
|
|
99
99
|
}
|
|
100
100
|
export type ProviderName = "anthropic" | "openai" | "google" | "ollama";
|
|
101
|
+
export interface ProviderProfile {
|
|
102
|
+
apiKey?: string;
|
|
103
|
+
model?: string;
|
|
104
|
+
}
|
|
101
105
|
export interface ArchByteConfig {
|
|
102
106
|
provider: ProviderName;
|
|
103
107
|
apiKey: string;
|
|
104
108
|
model?: string;
|
|
105
109
|
modelOverrides?: Partial<Record<ModelTier, string>>;
|
|
106
|
-
|
|
110
|
+
profiles?: Record<string, ProviderProfile>;
|
|
107
111
|
}
|
|
108
112
|
export interface PipelineResult {
|
|
109
113
|
agents: AgentResult[];
|
|
@@ -7,12 +7,12 @@ export const MODEL_MAP = {
|
|
|
7
7
|
advanced: "claude-opus-4-6",
|
|
8
8
|
},
|
|
9
9
|
openai: {
|
|
10
|
-
fast: "gpt-
|
|
11
|
-
standard: "gpt-
|
|
10
|
+
fast: "gpt-5.2-codex",
|
|
11
|
+
standard: "gpt-5.2",
|
|
12
12
|
advanced: "o3",
|
|
13
13
|
},
|
|
14
14
|
google: {
|
|
15
|
-
fast: "gemini-2.
|
|
15
|
+
fast: "gemini-2.5-flash",
|
|
16
16
|
standard: "gemini-2.5-pro",
|
|
17
17
|
advanced: "gemini-2.5-pro",
|
|
18
18
|
},
|
|
@@ -140,10 +140,7 @@ function extractImportPath(line) {
|
|
|
140
140
|
return cjsMatch[1];
|
|
141
141
|
return null;
|
|
142
142
|
}
|
|
143
|
-
|
|
144
|
-
"node_modules", "dist", "build", ".git", "venv", "__pycache__",
|
|
145
|
-
"target", "coverage", "vendor", ".next", ".nuxt",
|
|
146
|
-
]);
|
|
143
|
+
import { EXCLUDED_DIRS as VENDORED } from "./excluded-dirs.js";
|
|
147
144
|
function isVendored(name) {
|
|
148
145
|
return VENDORED.has(name);
|
|
149
146
|
}
|
|
@@ -69,10 +69,7 @@ const BUILD_CONFIG_FILES = [
|
|
|
69
69
|
"tsconfig.json",
|
|
70
70
|
];
|
|
71
71
|
// Skip these dirs — not components
|
|
72
|
-
|
|
73
|
-
"node_modules", "dist", "build", "target", ".git",
|
|
74
|
-
"coverage", "tmp", ".cache", "venv", "__pycache__",
|
|
75
|
-
]);
|
|
72
|
+
import { EXCLUDED_DIRS as SKIP_DIRS } from "./excluded-dirs.js";
|
|
76
73
|
export async function detectComponents(tk, structure) {
|
|
77
74
|
// Strategy 1: Monorepo workspaces
|
|
78
75
|
if (structure.isMonorepo) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Static Analysis — Event Detector
|
|
2
2
|
// Detects event-driven architecture patterns from deps and code grep
|
|
3
|
+
import { EXCLUDED_DIRS_REGEX } from "./excluded-dirs.js";
|
|
3
4
|
const EDA_DEPS = [
|
|
4
5
|
{ dep: "kafkajs", technology: "Kafka" },
|
|
5
6
|
{ dep: "@confluentinc/kafka-javascript", technology: "Kafka" },
|
|
@@ -50,7 +51,7 @@ export async function detectEvents(tk) {
|
|
|
50
51
|
tk.grepFiles("\\.emit\\(|\\.dispatch\\(|\\.trigger\\("),
|
|
51
52
|
]);
|
|
52
53
|
// Exclude vendored/generated dirs from all results
|
|
53
|
-
const excludeDirs =
|
|
54
|
+
const excludeDirs = EXCLUDED_DIRS_REGEX;
|
|
54
55
|
const filterVendored = (results) => results.filter((r) => !excludeDirs.test("/" + r.file));
|
|
55
56
|
// Filter subscribe results to only EDA-relevant ones (skip generic .on() calls)
|
|
56
57
|
const filteredSubscribe = filterVendored(subscribeResults).filter((r) => /\.(subscribe|consume)\(/.test(r.content));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Shared set of directories to skip during static analysis.
|
|
2
|
+
// Imported by all scanners to avoid duplication.
|
|
3
|
+
export const EXCLUDED_DIRS = new Set([
|
|
4
|
+
"node_modules", "dist", "build", "target", ".git",
|
|
5
|
+
"coverage", "tmp", ".cache", ".turbo", ".nx",
|
|
6
|
+
"venv", ".venv", "env", "__pycache__",
|
|
7
|
+
".next", ".nuxt", ".output",
|
|
8
|
+
"vendor",
|
|
9
|
+
]);
|
|
10
|
+
/** Regex version for filtering grep/file results by path segment */
|
|
11
|
+
export const EXCLUDED_DIRS_REGEX = /\/(node_modules|dist|build|target|\.git|coverage|tmp|\.cache|\.turbo|\.nx|venv|\.venv|env|__pycache__|\.next|\.nuxt|\.output|vendor)\//;
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
// Static Analysis — File Tree Collector
|
|
2
2
|
// Collects depth-limited directory tree for LLM context
|
|
3
|
-
|
|
4
|
-
"node_modules", "dist", "build", ".git", "venv", "__pycache__",
|
|
5
|
-
"target", "coverage", ".next", ".nuxt", ".output", ".cache",
|
|
6
|
-
".turbo", ".nx", "vendor", ".venv", "env",
|
|
7
|
-
]);
|
|
3
|
+
import { EXCLUDED_DIRS as SKIP_DIRS } from "./excluded-dirs.js";
|
|
8
4
|
const MAX_ENTRIES = 2000;
|
|
9
5
|
const MAX_DEPTH = 3;
|
|
10
6
|
export async function collectFileTree(tk) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile, readdir, stat } from "node:fs/promises";
|
|
2
2
|
import { resolve, join } from "node:path";
|
|
3
|
+
import { EXCLUDED_DIRS } from "../static/excluded-dirs.js";
|
|
3
4
|
/**
|
|
4
5
|
* ClaudeCodeBackend — uses the same local FS operations as LocalFSBackend
|
|
5
6
|
* but is designed to be instantiated when running inside Claude Code.
|
|
@@ -101,11 +102,7 @@ export class ClaudeCodeBackend {
|
|
|
101
102
|
}
|
|
102
103
|
for (const entry of entries) {
|
|
103
104
|
if (entry.name.startsWith(".") ||
|
|
104
|
-
entry.name
|
|
105
|
-
entry.name === "dist" ||
|
|
106
|
-
entry.name === "__pycache__" ||
|
|
107
|
-
entry.name === ".git" ||
|
|
108
|
-
entry.name === ".archbyte") {
|
|
105
|
+
EXCLUDED_DIRS.has(entry.name)) {
|
|
109
106
|
continue;
|
|
110
107
|
}
|
|
111
108
|
const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile, readdir, stat } from "node:fs/promises";
|
|
2
2
|
import { resolve, relative, join } from "node:path";
|
|
3
|
+
import { EXCLUDED_DIRS } from "../static/excluded-dirs.js";
|
|
3
4
|
export class LocalFSBackend {
|
|
4
5
|
root;
|
|
5
6
|
constructor(projectRoot) {
|
|
@@ -82,12 +83,7 @@ export class LocalFSBackend {
|
|
|
82
83
|
return;
|
|
83
84
|
}
|
|
84
85
|
for (const entry of entries) {
|
|
85
|
-
|
|
86
|
-
if (entry.name.startsWith(".") ||
|
|
87
|
-
entry.name === "node_modules" ||
|
|
88
|
-
entry.name === "dist" ||
|
|
89
|
-
entry.name === "__pycache__" ||
|
|
90
|
-
entry.name === ".git") {
|
|
86
|
+
if (entry.name.startsWith(".") || EXCLUDED_DIRS.has(entry.name)) {
|
|
91
87
|
continue;
|
|
92
88
|
}
|
|
93
89
|
const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
package/dist/cli/analyze.d.ts
CHANGED
package/dist/cli/analyze.js
CHANGED
|
@@ -8,7 +8,7 @@ import { staticResultToSpec, writeSpec, writeMetadata, loadSpec, loadMetadata }
|
|
|
8
8
|
import { getChangedFiles, mapFilesToComponents, shouldRunAgents, isGitAvailable } from "./incremental.js";
|
|
9
9
|
import { progressBar } from "./ui.js";
|
|
10
10
|
export async function handleAnalyze(options) {
|
|
11
|
-
const rootDir = process.cwd();
|
|
11
|
+
const rootDir = options.dir ? path.resolve(options.dir) : process.cwd();
|
|
12
12
|
const isStaticOnly = options.static || options.skipLlm;
|
|
13
13
|
console.log();
|
|
14
14
|
console.log(chalk.bold.cyan("ArchByte Analyzer"));
|
|
@@ -27,7 +27,7 @@ export async function handleAnalyze(options) {
|
|
|
27
27
|
const diagramPath = path.join(rootDir, ".archbyte", "architecture.json");
|
|
28
28
|
const diagramExists = fs.existsSync(diagramPath);
|
|
29
29
|
const outputPath = options.output ?? ".archbyte/analysis.json";
|
|
30
|
-
console.log(chalk.bold("ArchByte Analyze
|
|
30
|
+
console.log(chalk.bold("ArchByte Analyze: Dry Run"));
|
|
31
31
|
console.log(chalk.gray(` Project: ${path.basename(rootDir)}`));
|
|
32
32
|
console.log(chalk.gray(` Mode: ${mode}`));
|
|
33
33
|
console.log(chalk.gray(` Provider: ${provider}`));
|
|
@@ -73,7 +73,6 @@ export async function handleAnalyze(options) {
|
|
|
73
73
|
config = {
|
|
74
74
|
provider: options.provider,
|
|
75
75
|
apiKey: options.apiKey ?? config?.apiKey ?? "",
|
|
76
|
-
ollamaBaseUrl: config?.ollamaBaseUrl,
|
|
77
76
|
};
|
|
78
77
|
}
|
|
79
78
|
if (options.apiKey && config) {
|
|
@@ -124,7 +123,7 @@ export async function handleAnalyze(options) {
|
|
|
124
123
|
}
|
|
125
124
|
const { affected, unmapped } = mapFilesToComponents(changedFiles, priorSpec);
|
|
126
125
|
if (!shouldRunAgents(affected, unmapped)) {
|
|
127
|
-
console.log(chalk.green("Only config changes detected
|
|
126
|
+
console.log(chalk.green("Only config changes detected. No re-scan needed. Use --force to re-scan."));
|
|
128
127
|
console.log();
|
|
129
128
|
return;
|
|
130
129
|
}
|
|
@@ -320,8 +319,9 @@ function printSummary(analysis, durationMs, mode) {
|
|
|
320
319
|
console.log();
|
|
321
320
|
console.log(chalk.bold("Next steps:"));
|
|
322
321
|
console.log(chalk.gray(` ${chalk.cyan("archbyte serve")} -- view the architecture diagram`));
|
|
323
|
-
console.log(chalk.gray(` ${chalk.cyan("archbyte validate")} -- check architecture fitness rules`));
|
|
324
322
|
console.log(chalk.gray(` ${chalk.cyan("archbyte export")} -- export to mermaid, plantuml, etc.`));
|
|
323
|
+
console.log(chalk.gray(` ${chalk.cyan("archbyte validate")} -- check architecture fitness rules ${chalk.yellow("[Pro]")}`));
|
|
324
|
+
console.log(chalk.gray(` ${chalk.cyan("archbyte patrol")} -- continuous architecture monitoring ${chalk.yellow("[Pro]")}`));
|
|
325
325
|
console.log();
|
|
326
326
|
}
|
|
327
327
|
// ─── Analysis converters ───
|
package/dist/cli/auth.js
CHANGED
|
@@ -3,13 +3,11 @@ import * as path from "path";
|
|
|
3
3
|
import * as http from "http";
|
|
4
4
|
import { spawn } from "child_process";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
-
|
|
7
|
-
const CREDENTIALS_PATH = path.join(CONFIG_DIR, "credentials.json");
|
|
8
|
-
const API_BASE = process.env.ARCHBYTE_API_URL ?? "https://api.heartbyte.io";
|
|
9
|
-
const CLI_CALLBACK_PORT = 19274;
|
|
6
|
+
import { CONFIG_DIR, CREDENTIALS_PATH, API_BASE, CLI_CALLBACK_PORT, OAUTH_TIMEOUT_MS, } from "./constants.js";
|
|
10
7
|
export async function handleLogin(provider) {
|
|
11
8
|
console.log();
|
|
12
9
|
console.log(chalk.bold.cyan("ArchByte Login"));
|
|
10
|
+
console.log(chalk.gray("Sign in or create a free account to get started."));
|
|
13
11
|
console.log();
|
|
14
12
|
const existing = loadCredentials();
|
|
15
13
|
if (existing && !isExpired(existing)) {
|
|
@@ -36,7 +34,8 @@ export async function handleLogin(provider) {
|
|
|
36
34
|
return;
|
|
37
35
|
}
|
|
38
36
|
const selectedProvider = provider ?? "github";
|
|
39
|
-
console.log(chalk.gray(`Opening browser for ${selectedProvider}
|
|
37
|
+
console.log(chalk.gray(`Opening browser for ${selectedProvider} sign-in...`));
|
|
38
|
+
console.log(chalk.gray("Don't have an account? One will be created automatically."));
|
|
40
39
|
console.log();
|
|
41
40
|
try {
|
|
42
41
|
const credentials = await startOAuthFlow(selectedProvider);
|
|
@@ -46,6 +45,9 @@ export async function handleLogin(provider) {
|
|
|
46
45
|
console.log();
|
|
47
46
|
console.log(chalk.green(`Logged in as ${chalk.bold(credentials.email)} (${credentials.tier} tier)`));
|
|
48
47
|
console.log(chalk.gray(`Credentials saved to ${CREDENTIALS_PATH}`));
|
|
48
|
+
console.log();
|
|
49
|
+
console.log(chalk.gray("Your credentials and API keys are stored locally on your machine."));
|
|
50
|
+
console.log(chalk.gray("ArchByte never transmits or stores your model provider keys."));
|
|
49
51
|
}
|
|
50
52
|
catch (err) {
|
|
51
53
|
console.error(chalk.red(`Login failed: ${err instanceof Error ? err.message : "Unknown error"}`));
|
|
@@ -322,7 +324,7 @@ function startOAuthFlow(provider = "github") {
|
|
|
322
324
|
const timeout = setTimeout(() => {
|
|
323
325
|
server.close();
|
|
324
326
|
reject(new Error("Login timed out (60s). Try again or use --token."));
|
|
325
|
-
},
|
|
327
|
+
}, OAUTH_TIMEOUT_MS);
|
|
326
328
|
const server = http.createServer(async (req, res) => {
|
|
327
329
|
const url = new URL(req.url ?? "/", `http://localhost:${CLI_CALLBACK_PORT}`);
|
|
328
330
|
if (url.pathname === "/callback") {
|
package/dist/cli/config.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ interface ConfigOptions {
|
|
|
5
5
|
export declare function handleConfig(options: ConfigOptions): Promise<void>;
|
|
6
6
|
/**
|
|
7
7
|
* Resolve the full ArchByteConfig from config file + env vars.
|
|
8
|
+
* Supports profiles (new) and legacy flat config (backward compat).
|
|
8
9
|
* Env vars override config file.
|
|
9
10
|
*/
|
|
10
11
|
export declare function resolveConfig(): ArchByteConfig | null;
|