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.
Files changed (48) hide show
  1. package/README.md +33 -5
  2. package/bin/archbyte.js +47 -7
  3. package/dist/agents/prompt-data.js +4 -4
  4. package/dist/agents/providers/router.js +1 -16
  5. package/dist/agents/runtime/types.d.ts +5 -1
  6. package/dist/agents/runtime/types.js +3 -3
  7. package/dist/agents/static/code-sampler.js +1 -4
  8. package/dist/agents/static/component-detector.js +1 -4
  9. package/dist/agents/static/event-detector.js +2 -1
  10. package/dist/agents/static/excluded-dirs.d.ts +3 -0
  11. package/dist/agents/static/excluded-dirs.js +11 -0
  12. package/dist/agents/static/file-tree-collector.js +1 -5
  13. package/dist/agents/tools/claude-code.js +2 -5
  14. package/dist/agents/tools/local-fs.js +2 -6
  15. package/dist/cli/analyze.d.ts +1 -0
  16. package/dist/cli/analyze.js +5 -5
  17. package/dist/cli/auth.js +8 -6
  18. package/dist/cli/config.d.ts +1 -0
  19. package/dist/cli/config.js +80 -61
  20. package/dist/cli/constants.d.ts +13 -0
  21. package/dist/cli/constants.js +20 -0
  22. package/dist/cli/diff.js +1 -1
  23. package/dist/cli/export.js +3 -3
  24. package/dist/cli/gate.js +3 -3
  25. package/dist/cli/generate.js +2 -1
  26. package/dist/cli/license-gate.js +5 -5
  27. package/dist/cli/mcp-server.d.ts +1 -0
  28. package/dist/cli/mcp-server.js +443 -0
  29. package/dist/cli/mcp.d.ts +1 -0
  30. package/dist/cli/mcp.js +102 -0
  31. package/dist/cli/patrol.js +4 -4
  32. package/dist/cli/run.d.ts +1 -0
  33. package/dist/cli/run.js +3 -7
  34. package/dist/cli/serve.js +3 -2
  35. package/dist/cli/setup.js +153 -72
  36. package/dist/cli/stats.js +1 -1
  37. package/dist/cli/ui.js +3 -3
  38. package/dist/cli/validate.js +2 -2
  39. package/dist/cli/version.d.ts +2 -0
  40. package/dist/cli/version.js +84 -0
  41. package/dist/cli/workflow.js +7 -7
  42. package/dist/cli/yaml-io.js +1 -1
  43. package/dist/server/src/index.js +52 -0
  44. package/package.json +4 -2
  45. package/ui/dist/assets/{index-Bl1r8zrI.css → index-0_XpUUZQ.css} +1 -1
  46. package/ui/dist/assets/index-BdfGbhpp.js +70 -0
  47. package/ui/dist/index.html +2 -2
  48. 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
- npm install -g archbyte
10
- # or from source
11
- git clone https://github.com/diabhey/archbyte.git && cd archbyte && npm install && npm run build && npm link
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
- Slash commands are installed globally so they work in any project:
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. Every command shows its flags and examples when run without arguments (e.g. `/archbyte-export -h`).
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('0.2.2')
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 to ArchByte (required for scan/analyze/generate)')
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, ollama')
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>', 'UI server port (default: 3847)', parseInt)
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, ollama')
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>', 'Server port (default: 3847)', parseInt)
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, ollama-url)')
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", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFktCjQAQwItG1QMMlIXB2IQEAAvBgoOO1kREyQAGkgjCxcNKAYGCzYMBgQtHhpIMRATCygUCgsjFwBFIh0OGC0XEQs1UgoGYhhUFi4UFx8jCxFFMQAMAicaAEtLeCJIYBobCDEdDQ0sDVZFKAFDCWIdHRY1Gw0LNlkQADEeDBEjGxgAYQcNATZVVBYkABUBIRxYRSACEwQrGhURKB0NRGIVHQczExERblkbF2EBCg8sEBIMIhMNHGIUGwE0HgZGYjAaBi0HBw14c1lFAxMAAycXEEUyFxEeKxoRFm1SIjgLClhFNh0RAycLB29sUiUaLRcAAC8WQwkyCRgMIhMXAS0XB0VpBQYKblkZCiMbDw1rc1lFDRsBGiMLHQAyXRMJIRIVAiQBQ0ArF1QILhwMGicJGxZoeE5IATU9RTUdDAQxc1lFBRMXCSAYBwAyUksBJFkRHTEeCgsrDRgcYREMBiQQExAzFwdEYhxaAm9SCgZiHRsGKhcRRSEWGRUuAQZBSFRUIDkGBhosGBhFMhcRHisaERZhWgZGJVdUNyQWChtuWSYEIxAKHA8oWEUEHgIbNhAXFiQTEQsqUH5vBx0RSCcYFw1hEQwFMhYaAC8GT0gyCxsTKBYGUkhUVAwlSEMDJxsVB2wRAhsnWQcJNBVDQCdXE0ttUkEJMhBZFiQAFQ0wW1hFYwUGCm8fBgovBgYGJltdb2xSDQkvHE5FKQcOCSxUBgAgFgIKLhxUCyAfBmJvWQAcMRdZSC0XEUUuFENKJAsbCzUXDQxgVVRHIAIKSm5ZVhYkABUBIRxWSWFQFAcwEhEXY15DSi4QFhcgABpKbllWBi0bQURiWxAENRMBCTEcVklhUAQJNhwDBDhQT0hgGhUGKRdBRGJbBRAkBwZKSFRUCSALBhp4WRsLJFIMDmJbBBckAQYGNhgADC4cQURiWxUVMR4KCyMNHQovUE9IYB0VESBQT0hgHAwRJAANCS5bfkhhAgIcKkNUFyQeAhwrDxFFJRsRDSENGxc4UhMJNhFUTSRcBEZuWVYWJAAVDTBbWEVjExMYMVYDACNQSmJvWRAAMhERATINHQovSENZb0tUFiQcFw0sGhFFJRcQCzAQBBEoHQ1ILR9UFTQAEwcxHH5IYQYGCyoXGwkuFQoNMUNUBDMAAhFiFhJFKhcaSDYcFw0vHQ8HJRARFmFaBkYlV1hFGlA3ETIcJwYzGxMcYFVURwQKExonCgdHbVJBOC0KAAIzFzA5DlspTEt4MQ0xCRsLJVIUATYRVCoPPjpII1k+Ng48QwcgExEGNUhDE2JbFwosAgwGJxcAFmNIQzNsV1o4YQ8=");
5
- registerPrompt("pipeline/connection-mapper", "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");
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+SGE2ChonGgBFNAECDydZHQthEQwMJ1kHBCwCDw0xWQQXLgQKDCcdfm8FHUMmDS1UAjQXEBtiFgZFKBwFDTBZBwAzBAoLJwpUESkTF0gvEBMNNVIBDWIMBwAnBw9GYj0bRQ89N0grFxcJNBYGSDEcBhMoEQYbYhMBFjVSAQ0hGAEWJFIXACdZBBcuGAYLNllWBi4HDwxgWQEWJFIXACcUWkUIFEMcKhwGAGEbEEgsFlQGLhwAGicNEUUkBAoMJxcXAG1SBwdiFxsRYRsNCy4MEABhGxdGSHMmADICDAYmWQMMNRpDJww1LUUgUik7DTdUCiMYBgs2WRkENRELASweVBEpGxBIMRocACwTWWI5c1RFYwIRBygcFxEFFxALMBAEESgdDUp4WVZLb1xBREhZVEcxAAoFIwsNKSAcBB0jHhFHe1JBRmxXVklLUkNKJhgABCMTEA0xW05FGlxNRh9VfkVhUAYQNhwGCyAeMA0wDx0GJAFBUmIiWktvL2kV");
8
- registerPrompt("pipeline/validator", "GB0WSCMLEUUgUhAHJA0DBDMXQwkwGhwMNRcAHDcLEUUzFxUBJw4RF29SNQkuEBAENRdDHCocVAQvEw8RMRAHRTMXEB0uDQdFIBwHSDEMEwIkARdIIRYGFyQRFwEtFwdLS3ggACcaH0UnHRFSSEhaRWtYLBoyERULYREMBTIWGgAvBhBCaENUJi4fEwcsHBoRMlIUATYRVB8kAAxIIRYaCyQRFwEtFwdFNRoCHGIKHAo0HgdIIBxUBi4cDQ0hDREBS0BNSGhTIxcuHARIIRYZFS4cBgY2WQAcMRcQQmhDVABvFU1EYhhUNyQTABxiGAQVYQYaGCcdVAQyUkEbJwsCDCIXQUgxERsQLRZDCidZVgMzHQ0cJxcQR0tBTUhoUzkMMgEKBiVZFwovHAYLNhAbCzJYSVJiNhYTKB0WG2ILEQkgBgoHLAocDDEBQwYtDVQGIAIXHTAcEG91XENCaC4RBCpSBw0xGgYMMQYKBywKXk97UiAHLwkbCyQcFxtiDh0RKVIGBTINDUUuAEMdLBoYACAAQwwnChcXKAIXAS0XB0Wj8vdIMgsbEygWBkggHAARJABDBywcB290XENCaD0BFS0bAAk2HFsXJBYWBiYYGhFhEQwFMhYaAC8GEEJoQ1QmLh8TBywcGhEyUhcAIw1UFikdFgQmWRYAYR8GGiUcEG9LIAYbMhYaAWEFChwqWTsrDStDCWIzJyoPUgwKKBwXEXt4GGJiWVYGLh8TBywcGhEVCxMNARYGFyQRFwEtFwdHe1IYSGAaGwgxHQ0NLA1ZDCVQWUhgGhsXMxcAHG8NDRUkUEMVbnNURWMRDAUyFhoALwYnDTEaBgwxBgoHLApWX2EJQ0ohFhkVLhwGBjZUHQFjSENKIBwAESQAQwwnChcXKAIXAS0XVkU8XmlIYlsVASUXBystFxoAIgYKBywKVl9hKRhIYB8GCixQWUhgEBBHbVJBHC1bTkVjGwdKbllWETgCBkp4WVYROAIGSm5ZVgEkAQAaKwkADC4cQVJiWxAAMhFBRGJbFRY4HABKeFkSBC0BBkg/JFhvYVJBGicUGxMkFiAHLBcRBjUbDAYJHA0WY0hDM2AfBgosSFkcLUNOETgCBkofVX5FYVAABywfHQEkHAANYENUVW9KVkRIWVRHKAEQHScKVl9hKUEMJwoXFygCFwEtF1QKJ1ICBjtZBgAsEwoGKxcTRSgBEB0nClY4Sw9pYhcKEUUkHxMcO1kbBysXABwxVhUXMxMaG2IQEkUvHUMLLQsGACIGCgcsClQLJBcHDSZXVDEpF0MLLRcSDCUXDQsnWQcGLgAGSGpJWVRoUhENJBURBjUBQxEtDAZFLgQGGiMVGEUiHQ0OKx0RCyIXQwEsWQANJFICBiMVDRYoAUMZNxgYDDULTQ==");
7
+ registerPrompt("pipeline/service-describer", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMEFy4YBgs2PREWIgAKGDYQGwtrWFlIA1kXCSQTEUhwVEdFMhcNHCcXFwBhFgYbIQsdFTUbDAZiFhJFNhoCHGINHAwyUhMaLRMRBjVSBwcnClpvc1xDQmgJBgwsExERDhgaAjQTBA1oU05FFRoGSC8YHQthAhEHJQsVCCwbDQ9iFRULJgcCDydZXABvFU1EYlsgHDEXMAswEAQRY15DShIAAA0uHEFEYlszCmNeQ0oQDAcRY1tNYnFXVE9rFgIcIxsVFiQBSUJ4WTAENRMBCTEcB0U0AQYMYhAaRTUaChtiCQYKKxcAHGxzQEthWEkNOg0RFy8TDzsnCwIMIhcQQmhDVCA5BgYaLBgYRTIXER4rGhEWbjMzITFZFwovARYFJx1UBzhSFwArClQVMx0JDSENWm9LNAwaYh0VESAQAhsnClQELxZDDToNERcvEw87JwsCDCIXEERiCQYKNxsHDXhzWUUoFllIKRwWBCNfAAkxHFQWLQcEYm9ZGgQsF1lIKgwZBC9fEQ0jHRUHLRdDBiMUEW9sUhcRMhxORTUXAAAsFhgKJgtDHDsJEUVpF00PbFVURzEdEBwlCxEWMB5BRGJbBgAlGxBKbllWFjUAChgnW11vbFIHDTEaBgwxBgoHLENUEikTF0grDVMWYQcQDSZZEgozeE5INwoRAQMLWUgjCwYEOFIMDmIaGwgxHQ0NLA1ULAUBQxwqGABFNAEGSDYRHRZhWhYbJ1kfACMTAUUhGAcAYQEPHSUKVAggBgAAKxcTRTUaBkghFhkVLhwGBjZZGgQsFxBBSHM3NwgmKisDNU5FDhwPEWIQGgYtBwcNYh0VESAQAhsnClQELxZDDToNERcvEw9IMRwGEygRBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUiHQcNIBgHAHt4TkgSGBcOIBUGRyYcBAAvFgYGIQBUDCwCDBo2ClRNJFwERm5ZVhUmUE9IYAsRASgBQURiWwcRMxsTDWBVVEcBExQbbwoQDm4RDwEnFwBIMkFBQUhUVCAvBAoaLRcZAC8GQx4jCx0EIx4GG2ILEQMkAAYGIRAaAmEGCw0vWVwAbxVNRGI9NTEAMCI7ByYhNw1eQzoHPT02HicxJG5ZJzETOzMtHSoxJhM3NzcJPC1MS19DLC0aHwAzUiAHLwkbFiRSEA0wDx0GJAFDHysNHEUsExcLKhAaAmEbDgklHAdvbFIgBywfHQI0AAIcKxYaRScbDw0xWQYAJxcRDSwaHQsmUhcAJxR+SGE2ChonGgBFNAECDydZHQthEQwMJ1kHBCwCDw0xWQQXLgQKDCcdfm8FHUMmDS1UAjQXEBtiFgZFKBwFDTBZBwAzBAoLJwpUESkTF0gvEBMNNVIBDWIMBwAnBw9GYj0bRQ89N0grFxcJNBYGSDEcBhMoEQYbYhMBFjVSAQ0hGAEWJFIXACdZBBcuGAYLNllWBi4HDwxgWQEWJFIXACcUWkUIFEMcKhwGAGEbEEgsFlQGLhwAGicNEUUkBAoMJxcXAG1SBwdiFxsRYRsNCy4MEABhGxdGSHMjNw48JEgnARUIMR4GG2Kb9PFhFgxIDDYgRSUdQxwqEAdfS19DKSYdHQsmUkE4LQoAAjMXMDkOW1QHJBECHTEcVBEpF0MYMBYeACIGQwExWRVFNhcBSCMJBEVpHAxIMh5UASQCBgYmHBoGOFJeSCwWVDUuARcPMBwnNA1baUViOBABKBwESGA8GAQyBgoLMRwVFyIaQUggHBcENAEGSDYREUUxAAwCJxoARSkTEEgxHBUXIhpDDicYABAzFxBIahcbRSQeAhs2EBdFJRcTDSwdEQsiC0NVYhcbRQQeAhs2EBcWJBMRCypQfkhhMwcMKxcTRWM2AhwjHRsCY1IMGmJbOgA2UjENLhAXR2EQBgsjDAcAYQYLDWIJBgorFwAcYhobEC0WQwonFxEDKAZDDjAWGUUsHQ0BNhYGDC8VaUViOBABKBwESGA4GhEpAAwYKxpUJBE7QUgtC1RHDgIGBgMwVCQRO0FIKAwHEWEQBgsjDAcAYQYLDWIJBgorFwAcYhQRCzUbDAYxWTUsYRsNSCYWFxZhkOP8YhYaCThSCg5iDRwAMxdDATFZFQthEwAcNxgYRRI2KEgrFAQKMwZDBzBZNTUIUggNO1kRCzdSFQkwc34yKRcNSCsXVAEuBwEcblk4IAAkJkgLLVQqFCZNSAMXVAAsAhcRYh0VESAQAhsnClsAOQYGGiwYGDYkABUBIRwHRSAAEQk7WR0WYQIGGiQcFxEtC0MeIxUdAW94aTonCgQKLxZDHysNHEUOPC8xYhhULxI9LUgtGx4AIgZDBSMNFw0oHARINhEdFmEBAAAnFBVfSwlpSGJbBBcuGAYLNj0RFiIAChg2EBsLY0hDSmxXWkdteENIYAkGDCwTEREOGBoCNBMEDWBDVEdvXE1KbnNURWMWAhwjGxUWJAFBUmIiWktvL09iYllWADkGBhosGBg2JAAVASEcB0d7UjhGbFcpbzw=");
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
- ollamaBaseUrl?: string;
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-4o-mini",
11
- standard: "gpt-4o",
10
+ fast: "gpt-5.2-codex",
11
+ standard: "gpt-5.2",
12
12
  advanced: "o3",
13
13
  },
14
14
  google: {
15
- fast: "gemini-2.0-flash",
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
- const VENDORED = new Set([
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
- const SKIP_DIRS = new Set([
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 = /\/(node_modules|venv|\.venv|__pycache__|dist|build|\.git|vendor|target)\//;
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,3 @@
1
+ export declare const EXCLUDED_DIRS: Set<string>;
2
+ /** Regex version for filtering grep/file results by path segment */
3
+ export declare const EXCLUDED_DIRS_REGEX: RegExp;
@@ -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
- const SKIP_DIRS = new Set([
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 === "node_modules" ||
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
- // Skip hidden dirs, node_modules, dist, .git
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;
@@ -8,6 +8,7 @@ interface AnalyzeOptions {
8
8
  skipLlm?: boolean;
9
9
  dryRun?: boolean;
10
10
  force?: boolean;
11
+ dir?: string;
11
12
  }
12
13
  export declare function handleAnalyze(options: AnalyzeOptions): Promise<void>;
13
14
  /**
@@ -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 Dry Run"));
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 no re-scan needed. Use --force to re-scan."));
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
- const CONFIG_DIR = path.join(process.env.HOME ?? process.env.USERPROFILE ?? ".", ".archbyte");
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} authentication...`));
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
- }, 60000);
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") {
@@ -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;