aspectcode 0.4.1 → 1.0.0
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 +2 -2
- package/dist/agentsMdRenderer.d.ts +16 -0
- package/dist/agentsMdRenderer.d.ts.map +1 -0
- package/dist/agentsMdRenderer.js +137 -0
- package/dist/agentsMdRenderer.js.map +1 -0
- package/dist/auth.d.ts +31 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +385 -0
- package/dist/auth.js.map +1 -0
- package/dist/autoResolve.d.ts +41 -0
- package/dist/autoResolve.d.ts.map +1 -0
- package/dist/autoResolve.js +196 -0
- package/dist/autoResolve.js.map +1 -0
- package/dist/changeEvaluator.d.ts +56 -0
- package/dist/changeEvaluator.d.ts.map +1 -0
- package/dist/changeEvaluator.js +674 -0
- package/dist/changeEvaluator.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +37 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +50 -2
- package/dist/config.js.map +1 -1
- package/dist/dreamCycle.d.ts +57 -0
- package/dist/dreamCycle.d.ts.map +1 -0
- package/dist/dreamCycle.js +334 -0
- package/dist/dreamCycle.js.map +1 -0
- package/dist/kbBuilder.d.ts +1 -2
- package/dist/kbBuilder.d.ts.map +1 -1
- package/dist/kbBuilder.js +1 -2
- package/dist/kbBuilder.js.map +1 -1
- package/dist/main.d.ts +2 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +148 -7
- package/dist/main.js.map +1 -1
- package/dist/optimize.d.ts +13 -6
- package/dist/optimize.d.ts.map +1 -1
- package/dist/optimize.js +433 -142
- package/dist/optimize.js.map +1 -1
- package/dist/pipeline.d.ts +19 -21
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +1093 -160
- package/dist/pipeline.js.map +1 -1
- package/dist/preferences.d.ts +80 -0
- package/dist/preferences.d.ts.map +1 -0
- package/dist/preferences.js +238 -0
- package/dist/preferences.js.map +1 -0
- package/dist/runtimeState.d.ts +30 -0
- package/dist/runtimeState.d.ts.map +1 -0
- package/dist/runtimeState.js +39 -0
- package/dist/runtimeState.js.map +1 -0
- package/dist/scopedRules.d.ts +84 -0
- package/dist/scopedRules.d.ts.map +1 -0
- package/dist/scopedRules.js +449 -0
- package/dist/scopedRules.js.map +1 -0
- package/dist/ui/Dashboard.d.ts +4 -16
- package/dist/ui/Dashboard.d.ts.map +1 -1
- package/dist/ui/Dashboard.js +339 -140
- package/dist/ui/Dashboard.js.map +1 -1
- package/dist/ui/MemoryMap.d.ts +16 -0
- package/dist/ui/MemoryMap.d.ts.map +1 -0
- package/dist/ui/MemoryMap.js +266 -0
- package/dist/ui/MemoryMap.js.map +1 -0
- package/dist/ui/SettingsPanel.d.ts +18 -0
- package/dist/ui/SettingsPanel.d.ts.map +1 -0
- package/dist/ui/SettingsPanel.js +241 -0
- package/dist/ui/SettingsPanel.js.map +1 -0
- package/dist/ui/prompts.d.ts +7 -0
- package/dist/ui/prompts.d.ts.map +1 -1
- package/dist/ui/prompts.js +63 -0
- package/dist/ui/prompts.js.map +1 -1
- package/dist/ui/store.d.ts +154 -18
- package/dist/ui/store.d.ts.map +1 -1
- package/dist/ui/store.js +154 -24
- package/dist/ui/store.js.map +1 -1
- package/dist/ui/theme.d.ts +1 -8
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js +2 -21
- package/dist/ui/theme.js.map +1 -1
- package/dist/updateChecker.d.ts +13 -0
- package/dist/updateChecker.d.ts.map +1 -0
- package/dist/updateChecker.js +66 -0
- package/dist/updateChecker.js.map +1 -0
- package/dist/usageTracker.d.ts +12 -0
- package/dist/usageTracker.d.ts.map +1 -0
- package/dist/usageTracker.js +89 -0
- package/dist/usageTracker.js.map +1 -0
- package/dist/writer.d.ts +1 -7
- package/dist/writer.d.ts.map +1 -1
- package/dist/writer.js +1 -11
- package/dist/writer.js.map +1 -1
- package/node_modules/@aspectcode/core/dist/analysis/repo.d.ts.map +1 -1
- package/node_modules/@aspectcode/core/dist/analysis/repo.js +13 -2
- package/node_modules/@aspectcode/core/dist/analysis/repo.js.map +1 -1
- package/node_modules/@aspectcode/core/dist/index.d.ts +1 -3
- package/node_modules/@aspectcode/core/dist/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/core/dist/index.js +1 -3
- package/node_modules/@aspectcode/core/dist/index.js.map +1 -1
- package/node_modules/@aspectcode/core/dist/parsers/genericExtractors.d.ts +14 -0
- package/node_modules/@aspectcode/core/dist/parsers/genericExtractors.d.ts.map +1 -0
- package/node_modules/@aspectcode/core/dist/parsers/genericExtractors.js +191 -0
- package/node_modules/@aspectcode/core/dist/parsers/genericExtractors.js.map +1 -0
- package/node_modules/@aspectcode/core/dist/parsers/index.d.ts +1 -0
- package/node_modules/@aspectcode/core/dist/parsers/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/core/dist/parsers/index.js +6 -1
- package/node_modules/@aspectcode/core/dist/parsers/index.js.map +1 -1
- package/node_modules/@aspectcode/core/dist/parsers/languages.d.ts +20 -0
- package/node_modules/@aspectcode/core/dist/parsers/languages.d.ts.map +1 -1
- package/node_modules/@aspectcode/core/dist/parsers/languages.js +25 -0
- package/node_modules/@aspectcode/core/dist/parsers/languages.js.map +1 -1
- package/node_modules/@aspectcode/core/dist/parsers/tsJsExtractors.d.ts.map +1 -1
- package/node_modules/@aspectcode/core/dist/parsers/tsJsExtractors.js +4 -1
- package/node_modules/@aspectcode/core/dist/parsers/tsJsExtractors.js.map +1 -1
- package/node_modules/@aspectcode/core/package.json +2 -2
- package/node_modules/@aspectcode/core/parsers/cpp.wasm +0 -0
- package/node_modules/@aspectcode/core/parsers/go.wasm +0 -0
- package/node_modules/@aspectcode/core/parsers/php.wasm +0 -0
- package/node_modules/@aspectcode/core/parsers/ruby.wasm +0 -0
- package/node_modules/@aspectcode/core/parsers/rust.wasm +0 -0
- package/node_modules/@aspectcode/emitters/dist/index.d.ts +1 -17
- package/node_modules/@aspectcode/emitters/dist/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/index.js +2 -90
- package/node_modules/@aspectcode/emitters/dist/index.js.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/index.d.ts +0 -2
- package/node_modules/@aspectcode/emitters/dist/instructions/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/index.js +1 -7
- package/node_modules/@aspectcode/emitters/dist/instructions/index.js.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/kb/analyzers.d.ts +0 -18
- package/node_modules/@aspectcode/emitters/dist/kb/analyzers.d.ts.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/kb/analyzers.js +0 -57
- package/node_modules/@aspectcode/emitters/dist/kb/analyzers.js.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/kb/conventions.d.ts +0 -18
- package/node_modules/@aspectcode/emitters/dist/kb/conventions.d.ts.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/kb/conventions.js +0 -130
- package/node_modules/@aspectcode/emitters/dist/kb/conventions.js.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/kb/index.d.ts +2 -4
- package/node_modules/@aspectcode/emitters/dist/kb/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/emitters/dist/kb/index.js +1 -11
- package/node_modules/@aspectcode/emitters/dist/kb/index.js.map +1 -1
- package/node_modules/@aspectcode/emitters/package.json +3 -3
- package/node_modules/@aspectcode/evaluator/dist/apply.d.ts +55 -0
- package/node_modules/@aspectcode/evaluator/dist/apply.d.ts.map +1 -0
- package/node_modules/@aspectcode/evaluator/dist/apply.js +368 -0
- package/node_modules/@aspectcode/evaluator/dist/apply.js.map +1 -0
- package/node_modules/@aspectcode/evaluator/dist/diagnosis.d.ts +16 -25
- package/node_modules/@aspectcode/evaluator/dist/diagnosis.d.ts.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/diagnosis.js +115 -138
- package/node_modules/@aspectcode/evaluator/dist/diagnosis.js.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/index.d.ts +8 -43
- package/node_modules/@aspectcode/evaluator/dist/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/index.js +15 -61
- package/node_modules/@aspectcode/evaluator/dist/index.js.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/judge.d.ts +32 -0
- package/node_modules/@aspectcode/evaluator/dist/judge.d.ts.map +1 -0
- package/node_modules/@aspectcode/evaluator/dist/judge.js +165 -0
- package/node_modules/@aspectcode/evaluator/dist/judge.js.map +1 -0
- package/node_modules/@aspectcode/evaluator/dist/llmUtil.d.ts +15 -0
- package/node_modules/@aspectcode/evaluator/dist/llmUtil.d.ts.map +1 -0
- package/node_modules/@aspectcode/evaluator/dist/llmUtil.js +41 -0
- package/node_modules/@aspectcode/evaluator/dist/llmUtil.js.map +1 -0
- package/node_modules/@aspectcode/evaluator/dist/probes.d.ts +20 -47
- package/node_modules/@aspectcode/evaluator/dist/probes.d.ts.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/probes.js +188 -278
- package/node_modules/@aspectcode/evaluator/dist/probes.js.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/runner.d.ts +7 -32
- package/node_modules/@aspectcode/evaluator/dist/runner.d.ts.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/runner.js +21 -146
- package/node_modules/@aspectcode/evaluator/dist/runner.js.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/types.d.ts +141 -99
- package/node_modules/@aspectcode/evaluator/dist/types.d.ts.map +1 -1
- package/node_modules/@aspectcode/evaluator/dist/types.js +10 -2
- package/node_modules/@aspectcode/evaluator/dist/types.js.map +1 -1
- package/node_modules/@aspectcode/evaluator/package.json +4 -4
- package/node_modules/@aspectcode/optimizer/dist/index.d.ts +3 -10
- package/node_modules/@aspectcode/optimizer/dist/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/index.js +1 -19
- package/node_modules/@aspectcode/optimizer/dist/index.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/anthropic.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/anthropic.js +40 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/anthropic.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/aspectcode.d.ts +9 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/aspectcode.d.ts.map +1 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/aspectcode.js +83 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/aspectcode.js.map +1 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/index.d.ts +4 -3
- package/node_modules/@aspectcode/optimizer/dist/providers/index.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/index.js +24 -10
- package/node_modules/@aspectcode/optimizer/dist/providers/index.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/openai.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/openai.js +22 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/openai.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/retry.d.ts +14 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/retry.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/providers/retry.js +1 -0
- package/node_modules/@aspectcode/optimizer/dist/providers/retry.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/types.d.ts +14 -0
- package/node_modules/@aspectcode/optimizer/dist/types.d.ts.map +1 -1
- package/node_modules/@aspectcode/optimizer/dist/types.js.map +1 -1
- package/node_modules/@aspectcode/optimizer/package.json +2 -2
- package/package.json +6 -7
- package/dist/complaintProcessor.d.ts +0 -16
- package/dist/complaintProcessor.d.ts.map +0 -1
- package/dist/complaintProcessor.js +0 -134
- package/dist/complaintProcessor.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/emitter.d.ts +0 -72
- package/node_modules/@aspectcode/emitters/dist/emitter.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/emitter.js +0 -10
- package/node_modules/@aspectcode/emitters/dist/emitter.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/content.d.ts +0 -26
- package/node_modules/@aspectcode/emitters/dist/instructions/content.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/content.js +0 -501
- package/node_modules/@aspectcode/emitters/dist/instructions/content.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/detection.d.ts +0 -13
- package/node_modules/@aspectcode/emitters/dist/instructions/detection.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/detection.js +0 -55
- package/node_modules/@aspectcode/emitters/dist/instructions/detection.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/instructionsEmitter.d.ts +0 -9
- package/node_modules/@aspectcode/emitters/dist/instructions/instructionsEmitter.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/instructions/instructionsEmitter.js +0 -30
- package/node_modules/@aspectcode/emitters/dist/instructions/instructionsEmitter.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/kb/kbEmitter.d.ts +0 -21
- package/node_modules/@aspectcode/emitters/dist/kb/kbEmitter.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/kb/kbEmitter.js +0 -125
- package/node_modules/@aspectcode/emitters/dist/kb/kbEmitter.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/manifest.d.ts +0 -37
- package/node_modules/@aspectcode/emitters/dist/manifest.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/manifest.js +0 -50
- package/node_modules/@aspectcode/emitters/dist/manifest.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/report.d.ts +0 -22
- package/node_modules/@aspectcode/emitters/dist/report.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/report.js +0 -3
- package/node_modules/@aspectcode/emitters/dist/report.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/stableJson.d.ts +0 -14
- package/node_modules/@aspectcode/emitters/dist/stableJson.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/stableJson.js +0 -40
- package/node_modules/@aspectcode/emitters/dist/stableJson.js.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/transaction.d.ts +0 -29
- package/node_modules/@aspectcode/emitters/dist/transaction.d.ts.map +0 -1
- package/node_modules/@aspectcode/emitters/dist/transaction.js +0 -104
- package/node_modules/@aspectcode/emitters/dist/transaction.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,6 +8,6 @@ aspectcode # watch mode
|
|
|
8
8
|
aspectcode --once # single run
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
**Docs & source:** [github.com/
|
|
11
|
+
**Docs & source:** [github.com/Aspect-Code-Labs/aspectcode](https://github.com/Aspect-Code-Labs/aspectcode)
|
|
12
12
|
|
|
13
|
-
**Website:** [aspectcode.
|
|
13
|
+
**Website:** [aspectcode.com](https://aspectcode.com)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct AGENTS.md renderer from AnalysisModel.
|
|
3
|
+
*
|
|
4
|
+
* Generates a compact, exploration-first AGENTS.md matching the
|
|
5
|
+
* sweagent_bench/kb/agents_md.py format. No intermediate KB string,
|
|
6
|
+
* no table parsing, no emoji stripping. Deterministic.
|
|
7
|
+
*
|
|
8
|
+
* Budget: 3000 characters.
|
|
9
|
+
*/
|
|
10
|
+
import type { AnalysisModel } from '@aspectcode/core';
|
|
11
|
+
/**
|
|
12
|
+
* Render a compact, exploration-first AGENTS.md from AnalysisModel.
|
|
13
|
+
* Deterministic. No LLM calls. Matches sweagent_bench format.
|
|
14
|
+
*/
|
|
15
|
+
export declare function renderAgentsMd(model: AnalysisModel, projectName?: string): string;
|
|
16
|
+
//# sourceMappingURL=agentsMdRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentsMdRenderer.d.ts","sourceRoot":"","sources":["../src/agentsMdRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA6EtD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,SAAY,GAAG,MAAM,CA0DpF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Direct AGENTS.md renderer from AnalysisModel.
|
|
4
|
+
*
|
|
5
|
+
* Generates a compact, exploration-first AGENTS.md matching the
|
|
6
|
+
* sweagent_bench/kb/agents_md.py format. No intermediate KB string,
|
|
7
|
+
* no table parsing, no emoji stripping. Deterministic.
|
|
8
|
+
*
|
|
9
|
+
* Budget: 3000 characters.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.renderAgentsMd = renderAgentsMd;
|
|
13
|
+
const CHAR_BUDGET = 3000;
|
|
14
|
+
const MAX_HUB_RULES = 2;
|
|
15
|
+
const MAX_ENTRY_RULES = 2;
|
|
16
|
+
const MAX_CONVENTION_RULES = 3;
|
|
17
|
+
function extractHubRules(model) {
|
|
18
|
+
const hubs = model.metrics.hubs
|
|
19
|
+
.filter((h) => h.inDegree >= 3)
|
|
20
|
+
.sort((a, b) => b.inDegree - a.inDegree)
|
|
21
|
+
.slice(0, MAX_HUB_RULES);
|
|
22
|
+
return hubs.map((h) => `- \`${h.file}\` — hub (${h.inDegree} importers).`);
|
|
23
|
+
}
|
|
24
|
+
function extractEntryPointRules(model) {
|
|
25
|
+
// Entry points are files with no inbound edges but outbound edges (roots of the graph)
|
|
26
|
+
// Or files matching common entry point patterns
|
|
27
|
+
const entryPatterns = /\b(main|index|app|server|handler|worker|cli)\b/i;
|
|
28
|
+
const rules = [];
|
|
29
|
+
for (const file of model.files) {
|
|
30
|
+
if (entryPatterns.test(file.relativePath)) {
|
|
31
|
+
const kind = file.relativePath.includes('test') ? 'test entry'
|
|
32
|
+
: file.relativePath.includes('route') || file.relativePath.includes('handler') ? 'HTTP handler'
|
|
33
|
+
: file.relativePath.includes('worker') ? 'worker'
|
|
34
|
+
: file.relativePath.includes('cli') ? 'CLI entry'
|
|
35
|
+
: 'entry point';
|
|
36
|
+
rules.push(`- \`${file.relativePath}\` (${kind}).`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return rules.slice(0, MAX_ENTRY_RULES);
|
|
40
|
+
}
|
|
41
|
+
function extractConventionRules(model) {
|
|
42
|
+
const rules = [];
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
// Detect dominant file extension
|
|
45
|
+
const extCounts = new Map();
|
|
46
|
+
for (const file of model.files) {
|
|
47
|
+
const ext = file.relativePath.split('.').pop() || '';
|
|
48
|
+
extCounts.set(ext, (extCounts.get(ext) ?? 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
const topExt = [...extCounts.entries()].sort((a, b) => b[1] - a[1])[0];
|
|
51
|
+
if (topExt) {
|
|
52
|
+
const lang = topExt[0] === 'py' ? 'Python' : topExt[0] === 'ts' ? 'TypeScript'
|
|
53
|
+
: topExt[0] === 'tsx' ? 'TypeScript/React' : topExt[0] === 'js' ? 'JavaScript'
|
|
54
|
+
: topExt[0] === 'java' ? 'Java' : topExt[0] === 'cs' ? 'C#' : topExt[0];
|
|
55
|
+
const rule = `Primary language: ${lang} (${topExt[1]} files).`;
|
|
56
|
+
if (!seen.has(rule.toLowerCase())) {
|
|
57
|
+
seen.add(rule.toLowerCase());
|
|
58
|
+
rules.push(`- ${rule}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Detect test directory
|
|
62
|
+
for (const file of model.files) {
|
|
63
|
+
const p = file.relativePath.toLowerCase();
|
|
64
|
+
if (p.includes('test') || p.includes('spec')) {
|
|
65
|
+
const dir = file.relativePath.split('/').slice(0, -1).join('/');
|
|
66
|
+
if (dir) {
|
|
67
|
+
const rule = `Tests in \`${dir}/\`.`;
|
|
68
|
+
if (!seen.has(rule.toLowerCase())) {
|
|
69
|
+
seen.add(rule.toLowerCase());
|
|
70
|
+
rules.push(`- ${rule}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return rules.slice(0, MAX_CONVENTION_RULES);
|
|
77
|
+
}
|
|
78
|
+
function extractImportChainRules(model) {
|
|
79
|
+
const circular = model.graph.edges.filter((e) => e.type === 'circular');
|
|
80
|
+
if (circular.length === 0)
|
|
81
|
+
return [];
|
|
82
|
+
return circular.slice(0, 2).map((e) => `- Chain: \`${e.source}\` <-> \`${e.target}\``);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Render a compact, exploration-first AGENTS.md from AnalysisModel.
|
|
86
|
+
* Deterministic. No LLM calls. Matches sweagent_bench format.
|
|
87
|
+
*/
|
|
88
|
+
function renderAgentsMd(model, projectName = 'Project') {
|
|
89
|
+
const lines = [];
|
|
90
|
+
lines.push(`# AGENTS.md — ${projectName}`);
|
|
91
|
+
lines.push(`## Operating Mode`);
|
|
92
|
+
lines.push(`- Verify repo priors with targeted reads before editing.`);
|
|
93
|
+
lines.push(`- Localize, trace deps, then apply minimal scoped edit.`);
|
|
94
|
+
lines.push(`- Run the smallest relevant test first, broaden only if needed.`);
|
|
95
|
+
lines.push(`## Procedural Standards`);
|
|
96
|
+
lines.push(`- Reproduce the failure before editing when possible.`);
|
|
97
|
+
lines.push(`- Read target files and nearby callers before patching.`);
|
|
98
|
+
lines.push(`- Keep first patch minimal; inspect call sites if public API changes.`);
|
|
99
|
+
lines.push(`- Require evidence from file reads or command output — no fabricated edits.`);
|
|
100
|
+
lines.push(`- Patches must be syntactically complete; remove unused imports.`);
|
|
101
|
+
const hubRules = extractHubRules(model);
|
|
102
|
+
const epRules = extractEntryPointRules(model);
|
|
103
|
+
const convRules = extractConventionRules(model);
|
|
104
|
+
const chainRules = extractImportChainRules(model);
|
|
105
|
+
const hasPriors = hubRules.length > 0 || epRules.length > 0 || convRules.length > 0 || chainRules.length > 0;
|
|
106
|
+
if (hasPriors) {
|
|
107
|
+
lines.push(`## Repo Priors`);
|
|
108
|
+
}
|
|
109
|
+
if (hubRules.length > 0) {
|
|
110
|
+
lines.push(`### High-Impact Hubs`);
|
|
111
|
+
lines.push(...hubRules);
|
|
112
|
+
}
|
|
113
|
+
if (epRules.length > 0) {
|
|
114
|
+
lines.push(`### Entry Points`);
|
|
115
|
+
lines.push(...epRules);
|
|
116
|
+
}
|
|
117
|
+
if (chainRules.length > 0) {
|
|
118
|
+
lines.push(`### Import Chains`);
|
|
119
|
+
lines.push(...chainRules);
|
|
120
|
+
}
|
|
121
|
+
if (convRules.length > 0) {
|
|
122
|
+
lines.push(`### Conventions`);
|
|
123
|
+
lines.push(...convRules);
|
|
124
|
+
}
|
|
125
|
+
lines.push(`## Guardrails`);
|
|
126
|
+
lines.push(`- No speculative changes or broad refactors without evidence.`);
|
|
127
|
+
lines.push(`- Every touched file must tie to the diagnosed path.`);
|
|
128
|
+
lines.push(`## Tooling`);
|
|
129
|
+
lines.push(`This project uses [Aspect Code](https://aspectcode.com) to maintain AI context.`);
|
|
130
|
+
lines.push(`Run \`aspectcode --background\` to keep instructions current as you code.`);
|
|
131
|
+
let result = lines.join('\n') + '\n';
|
|
132
|
+
if (result.length > CHAR_BUDGET) {
|
|
133
|
+
result = result.slice(0, CHAR_BUDGET - 20) + '\n[... truncated]\n';
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=agentsMdRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentsMdRenderer.js","sourceRoot":"","sources":["../src/agentsMdRenderer.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAmFH,wCA0DC;AAzID,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,SAAS,eAAe,CAAC,KAAoB;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAoB;IAClD,uFAAuF;IACvF,gDAAgD;IAChD,MAAM,aAAa,GAAG,iDAAiD,CAAC;IACxE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY;gBAC5D,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc;oBAC/F,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;wBACjD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW;4BACjD,CAAC,CAAC,aAAa,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,OAAO,IAAI,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAoB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACrD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY;YAC5E,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY;gBAC9E,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,qBAAqB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;IAC/F,CAAC;IAED,wBAAwB;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChE,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,cAAc,GAAG,MAAM,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;oBAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC;YAC/F,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAoB;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AACzF,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAoB,EAAE,WAAW,GAAG,SAAS;IAC1E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAE3C,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAE9E,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;IAC1F,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAE/E,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAElD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7G,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IAEnE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC9F,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAExF,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAErC,IAAI,MAAM,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAChC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,EAAE,CAAC,GAAG,qBAAqB,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aspectcode CLI — authentication (login/logout/whoami).
|
|
3
|
+
*
|
|
4
|
+
* Uses a browser-based OAuth flow: the CLI opens the user's browser to the
|
|
5
|
+
* Aspect Code web app, which handles Google OAuth and redirects back to a
|
|
6
|
+
* temporary localhost server with a CLI token.
|
|
7
|
+
*/
|
|
8
|
+
export declare const WEB_APP_URL: string;
|
|
9
|
+
interface Credentials {
|
|
10
|
+
token: string;
|
|
11
|
+
email?: string;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
tier?: 'free' | 'pro';
|
|
14
|
+
tierTokensUsed?: number;
|
|
15
|
+
tierTokensCap?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function loadCredentials(): Credentials | null;
|
|
18
|
+
export declare function updateCredentials(update: Partial<Credentials>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Start a browser-based login flow in the background.
|
|
21
|
+
* Returns a promise that resolves with the email on success, or null on failure.
|
|
22
|
+
* Does not use console.log — safe to call while ink is rendering.
|
|
23
|
+
*/
|
|
24
|
+
export declare function startBackgroundLogin(): Promise<string | null>;
|
|
25
|
+
export declare function loginCommand(args?: string[]): Promise<void>;
|
|
26
|
+
export declare function logoutCommand(): Promise<void>;
|
|
27
|
+
export declare function whoamiCommand(): Promise<void>;
|
|
28
|
+
export declare function upgradeCommand(): Promise<void>;
|
|
29
|
+
export declare function usageCommand(): Promise<void>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,eAAO,MAAM,WAAW,QAA6D,CAAC;AAOtF,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAOpD;AAWD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAIpE;AAyBD;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuDnE;AAID,wBAAsB,YAAY,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHrE;AAuCD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CASnD;AAID,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCnD;AAID,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAWpD;AAUD,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAmDlD"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* aspectcode CLI — authentication (login/logout/whoami).
|
|
4
|
+
*
|
|
5
|
+
* Uses a browser-based OAuth flow: the CLI opens the user's browser to the
|
|
6
|
+
* Aspect Code web app, which handles Google OAuth and redirects back to a
|
|
7
|
+
* temporary localhost server with a CLI token.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.WEB_APP_URL = void 0;
|
|
44
|
+
exports.loadCredentials = loadCredentials;
|
|
45
|
+
exports.updateCredentials = updateCredentials;
|
|
46
|
+
exports.startBackgroundLogin = startBackgroundLogin;
|
|
47
|
+
exports.loginCommand = loginCommand;
|
|
48
|
+
exports.logoutCommand = logoutCommand;
|
|
49
|
+
exports.whoamiCommand = whoamiCommand;
|
|
50
|
+
exports.upgradeCommand = upgradeCommand;
|
|
51
|
+
exports.usageCommand = usageCommand;
|
|
52
|
+
const http = __importStar(require("http"));
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const crypto = __importStar(require("crypto"));
|
|
56
|
+
const logger_1 = require("./logger");
|
|
57
|
+
exports.WEB_APP_URL = process.env.ASPECTCODE_WEB_URL ?? 'https://aspectcode.com';
|
|
58
|
+
const CREDENTIALS_DIR = path.join(process.env.HOME ?? process.env.USERPROFILE ?? '~', '.aspectcode');
|
|
59
|
+
const CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, 'credentials.json');
|
|
60
|
+
// ── Credentials helpers ─────────────────────────────────────
|
|
61
|
+
function loadCredentials() {
|
|
62
|
+
try {
|
|
63
|
+
if (!fs.existsSync(CREDENTIALS_FILE))
|
|
64
|
+
return null;
|
|
65
|
+
return JSON.parse(fs.readFileSync(CREDENTIALS_FILE, 'utf-8'));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function saveCredentials(creds) {
|
|
72
|
+
if (!fs.existsSync(CREDENTIALS_DIR)) {
|
|
73
|
+
fs.mkdirSync(CREDENTIALS_DIR, { recursive: true });
|
|
74
|
+
}
|
|
75
|
+
fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2) + '\n', {
|
|
76
|
+
mode: 0o600,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function updateCredentials(update) {
|
|
80
|
+
const existing = loadCredentials();
|
|
81
|
+
if (!existing)
|
|
82
|
+
return;
|
|
83
|
+
saveCredentials({ ...existing, ...update });
|
|
84
|
+
}
|
|
85
|
+
function clearCredentials() {
|
|
86
|
+
try {
|
|
87
|
+
if (fs.existsSync(CREDENTIALS_FILE))
|
|
88
|
+
fs.unlinkSync(CREDENTIALS_FILE);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// ignore
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// ── Open browser (cross-platform) ──────────────────────────
|
|
95
|
+
async function openBrowser(url) {
|
|
96
|
+
const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
97
|
+
const cmd = process.platform === 'darwin'
|
|
98
|
+
? 'open'
|
|
99
|
+
: process.platform === 'win32'
|
|
100
|
+
? 'start ""'
|
|
101
|
+
: 'xdg-open';
|
|
102
|
+
exec(`${cmd} "${url}"`);
|
|
103
|
+
}
|
|
104
|
+
// ── Background login (for dashboard use) ────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* Start a browser-based login flow in the background.
|
|
107
|
+
* Returns a promise that resolves with the email on success, or null on failure.
|
|
108
|
+
* Does not use console.log — safe to call while ink is rendering.
|
|
109
|
+
*/
|
|
110
|
+
async function startBackgroundLogin() {
|
|
111
|
+
const existing = loadCredentials();
|
|
112
|
+
if (existing)
|
|
113
|
+
return existing.email ?? null;
|
|
114
|
+
const state = crypto.randomBytes(16).toString('hex');
|
|
115
|
+
try {
|
|
116
|
+
const { token, receivedState } = await new Promise((resolve, reject) => {
|
|
117
|
+
const server = http.createServer((req, res) => {
|
|
118
|
+
const url = new URL(req.url ?? '/', `http://localhost`);
|
|
119
|
+
if (url.pathname === '/callback') {
|
|
120
|
+
const tk = url.searchParams.get('token');
|
|
121
|
+
const rs = url.searchParams.get('state');
|
|
122
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
123
|
+
res.end('<!DOCTYPE html><html><head><style>body{font-family:system-ui,-apple-system,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0a;color:#fafafa}.container{text-align:center;max-width:400px;padding:2rem}h1{font-size:1.5rem;margin-bottom:.5rem}p{color:#a1a1aa}</style></head><body><div class="container"><h1>Login Successful</h1><p>You can close this tab and return to your terminal.</p></div></body></html>');
|
|
124
|
+
server.close();
|
|
125
|
+
if (tk && rs)
|
|
126
|
+
resolve({ token: tk, receivedState: rs });
|
|
127
|
+
else
|
|
128
|
+
reject(new Error('Missing token or state'));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
res.writeHead(404);
|
|
132
|
+
res.end();
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
server.listen(0, '127.0.0.1', () => {
|
|
136
|
+
const addr = server.address();
|
|
137
|
+
const authUrl = `${exports.WEB_APP_URL}/api/cli/auth?port=${addr.port}&state=${encodeURIComponent(state)}`;
|
|
138
|
+
openBrowser(authUrl);
|
|
139
|
+
});
|
|
140
|
+
setTimeout(() => { server.close(); reject(new Error('Timeout')); }, 120000);
|
|
141
|
+
});
|
|
142
|
+
if (receivedState !== state)
|
|
143
|
+
return null;
|
|
144
|
+
let email;
|
|
145
|
+
try {
|
|
146
|
+
const res = await fetch(`${exports.WEB_APP_URL}/api/cli/verify`, {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
149
|
+
});
|
|
150
|
+
if (res.ok) {
|
|
151
|
+
const data = (await res.json());
|
|
152
|
+
email = data.user?.email ?? undefined;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch { /* non-fatal */ }
|
|
156
|
+
saveCredentials({ token, email, createdAt: new Date().toISOString() });
|
|
157
|
+
return email ?? null;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// ── Login command ───────────────────────────────────────────
|
|
164
|
+
async function loginCommand(args = []) {
|
|
165
|
+
const existing = loadCredentials();
|
|
166
|
+
if (existing) {
|
|
167
|
+
console.log(`Already logged in${existing.email ? ` as ${logger_1.fmt.bold(existing.email)}` : ''}.`);
|
|
168
|
+
console.log(`Run ${logger_1.fmt.bold('aspectcode logout')} first to switch accounts.`);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// If a login code was provided, use it directly
|
|
172
|
+
const codeArg = args[0];
|
|
173
|
+
if (codeArg) {
|
|
174
|
+
await loginWithCode(codeArg);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const state = crypto.randomBytes(16).toString('hex');
|
|
178
|
+
const { token, receivedState } = await new Promise((resolve, reject) => {
|
|
179
|
+
const sockets = new Set();
|
|
180
|
+
const server = http.createServer((req, res) => {
|
|
181
|
+
const url = new URL(req.url ?? '/', `http://localhost`);
|
|
182
|
+
if (url.pathname === '/callback') {
|
|
183
|
+
const token = url.searchParams.get('token');
|
|
184
|
+
const receivedState = url.searchParams.get('state');
|
|
185
|
+
res.writeHead(200, {
|
|
186
|
+
'Content-Type': 'text/html',
|
|
187
|
+
'Connection': 'close',
|
|
188
|
+
});
|
|
189
|
+
res.end('<!DOCTYPE html><html><head><style>body{font-family:system-ui,-apple-system,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0a;color:#fafafa}.container{text-align:center;max-width:400px;padding:2rem}h1{font-size:1.5rem;margin-bottom:.5rem}p{color:#a1a1aa}</style></head><body><div class="container"><h1>Login Successful</h1><p>You can close this tab and return to your terminal.</p></div></body></html>', () => {
|
|
190
|
+
// Force-destroy all connections so server.close() completes immediately
|
|
191
|
+
for (const s of sockets)
|
|
192
|
+
s.destroy();
|
|
193
|
+
server.close();
|
|
194
|
+
if (token && receivedState) {
|
|
195
|
+
resolve({ token, receivedState });
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
reject(new Error('Missing token or state in callback'));
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
res.writeHead(404);
|
|
204
|
+
res.end();
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
// Track connections so we can force-close them
|
|
208
|
+
server.on('connection', (socket) => {
|
|
209
|
+
sockets.add(socket);
|
|
210
|
+
socket.on('close', () => sockets.delete(socket));
|
|
211
|
+
});
|
|
212
|
+
// Listen on random port
|
|
213
|
+
server.listen(0, '127.0.0.1', () => {
|
|
214
|
+
const addr = server.address();
|
|
215
|
+
const authUrl = `${exports.WEB_APP_URL}/api/cli/auth?port=${addr.port}&state=${encodeURIComponent(state)}`;
|
|
216
|
+
console.log(`Opening browser to log in...`);
|
|
217
|
+
console.log(logger_1.fmt.dim(` ${authUrl}`));
|
|
218
|
+
console.log();
|
|
219
|
+
openBrowser(authUrl);
|
|
220
|
+
});
|
|
221
|
+
// Timeout after 2 minutes
|
|
222
|
+
const timeout = setTimeout(() => {
|
|
223
|
+
for (const s of sockets)
|
|
224
|
+
s.destroy();
|
|
225
|
+
server.close();
|
|
226
|
+
reject(new Error('Login timed out. Please try again.'));
|
|
227
|
+
}, 120000);
|
|
228
|
+
timeout.unref();
|
|
229
|
+
});
|
|
230
|
+
// Verify state
|
|
231
|
+
if (receivedState !== state) {
|
|
232
|
+
console.error('Login failed: state mismatch (possible CSRF attack).');
|
|
233
|
+
process.exitCode = 1;
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// Verify the token against the web app and get user info
|
|
237
|
+
let email;
|
|
238
|
+
try {
|
|
239
|
+
const res = await fetch(`${exports.WEB_APP_URL}/api/cli/verify`, {
|
|
240
|
+
method: 'POST',
|
|
241
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
242
|
+
});
|
|
243
|
+
if (res.ok) {
|
|
244
|
+
const data = (await res.json());
|
|
245
|
+
email = data.user?.email ?? undefined;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// Non-fatal — save token anyway
|
|
250
|
+
}
|
|
251
|
+
saveCredentials({
|
|
252
|
+
token,
|
|
253
|
+
email,
|
|
254
|
+
createdAt: new Date().toISOString(),
|
|
255
|
+
});
|
|
256
|
+
console.log(`${logger_1.fmt.bold('Logged in')}${email ? ` as ${logger_1.fmt.bold(email)}` : ''}.`);
|
|
257
|
+
}
|
|
258
|
+
// ── Login with code ─────────────────────────────────────────
|
|
259
|
+
async function loginWithCode(token) {
|
|
260
|
+
console.log('Verifying login code...');
|
|
261
|
+
try {
|
|
262
|
+
const res = await fetch(`${exports.WEB_APP_URL}/api/cli/verify`, {
|
|
263
|
+
method: 'POST',
|
|
264
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
265
|
+
});
|
|
266
|
+
if (!res.ok) {
|
|
267
|
+
console.error('Invalid or expired login code.');
|
|
268
|
+
process.exitCode = 1;
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const data = (await res.json());
|
|
272
|
+
const email = data.user?.email ?? undefined;
|
|
273
|
+
saveCredentials({
|
|
274
|
+
token,
|
|
275
|
+
email,
|
|
276
|
+
createdAt: new Date().toISOString(),
|
|
277
|
+
});
|
|
278
|
+
console.log(`${logger_1.fmt.bold('Logged in')}${email ? ` as ${logger_1.fmt.bold(email)}` : ''}.`);
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
console.error('Failed to verify login code:', err.message);
|
|
282
|
+
process.exitCode = 1;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// ── Logout command ──────────────────────────────────────────
|
|
286
|
+
async function logoutCommand() {
|
|
287
|
+
const existing = loadCredentials();
|
|
288
|
+
if (!existing) {
|
|
289
|
+
console.log('Not logged in.');
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
clearCredentials();
|
|
293
|
+
console.log('Logged out.');
|
|
294
|
+
}
|
|
295
|
+
// ── Whoami command ──────────────────────────────────────────
|
|
296
|
+
async function whoamiCommand() {
|
|
297
|
+
const creds = loadCredentials();
|
|
298
|
+
if (!creds) {
|
|
299
|
+
console.log(`Not logged in. Run ${logger_1.fmt.bold('aspectcode login')} to authenticate.`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
const res = await fetch(`${exports.WEB_APP_URL}/api/cli/verify`, {
|
|
304
|
+
method: 'POST',
|
|
305
|
+
headers: { Authorization: `Bearer ${creds.token}` },
|
|
306
|
+
});
|
|
307
|
+
if (!res.ok) {
|
|
308
|
+
console.log('Session expired or token revoked. Please log in again.');
|
|
309
|
+
clearCredentials();
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const data = (await res.json());
|
|
313
|
+
const user = data.user;
|
|
314
|
+
if (user?.email) {
|
|
315
|
+
console.log(`Logged in as ${logger_1.fmt.bold(user.email)}${user.name ? ` (${user.name})` : ''}`);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
console.log('Logged in (could not retrieve user info).');
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
console.error('Failed to verify credentials:', err.message);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// ── Upgrade command ────────────────────────────────────────
|
|
326
|
+
async function upgradeCommand() {
|
|
327
|
+
const creds = loadCredentials();
|
|
328
|
+
if (!creds) {
|
|
329
|
+
console.log(`Not logged in. Run ${logger_1.fmt.bold('aspectcode login')} first.`);
|
|
330
|
+
process.exitCode = 1;
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const url = `${exports.WEB_APP_URL}/pricing`;
|
|
334
|
+
console.log(`Opening ${logger_1.fmt.bold(url)}…`);
|
|
335
|
+
await openBrowser(url);
|
|
336
|
+
}
|
|
337
|
+
// ── Usage command ──────────────────────────────────────────
|
|
338
|
+
function formatTokens(n) {
|
|
339
|
+
if (n >= 1000000)
|
|
340
|
+
return `${(n / 1000000).toFixed(1)}M`;
|
|
341
|
+
if (n >= 1000)
|
|
342
|
+
return `${(n / 1000).toFixed(1)}K`;
|
|
343
|
+
return String(n);
|
|
344
|
+
}
|
|
345
|
+
async function usageCommand() {
|
|
346
|
+
const creds = loadCredentials();
|
|
347
|
+
if (!creds) {
|
|
348
|
+
console.log(`Not logged in. Run ${logger_1.fmt.bold('aspectcode login')} first.`);
|
|
349
|
+
process.exitCode = 1;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
const res = await fetch(`${exports.WEB_APP_URL}/api/cli/usage`, {
|
|
354
|
+
headers: { Authorization: `Bearer ${creds.token}` },
|
|
355
|
+
});
|
|
356
|
+
if (!res.ok) {
|
|
357
|
+
console.error('Failed to fetch usage:', res.status);
|
|
358
|
+
process.exitCode = 1;
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const data = (await res.json());
|
|
362
|
+
const pct = Math.round((data.tokensUsed / data.tokensCap) * 100);
|
|
363
|
+
const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));
|
|
364
|
+
console.log();
|
|
365
|
+
console.log(` ${logger_1.fmt.bold('Plan:')} ${data.tier === 'PRO' ? 'Pro ($8/mo)' : 'Free'}`);
|
|
366
|
+
console.log(` ${logger_1.fmt.bold('Used:')} ${formatTokens(data.tokensUsed)} / ${formatTokens(data.tokensCap)} ${data.period} tokens`);
|
|
367
|
+
console.log(` ${bar} ${pct}%`);
|
|
368
|
+
console.log(` ${logger_1.fmt.dim(`${formatTokens(data.tokensRemaining)} remaining`)}`);
|
|
369
|
+
if (data.resetAt) {
|
|
370
|
+
const d = new Date(data.resetAt);
|
|
371
|
+
console.log(` ${logger_1.fmt.dim(`Resets ${d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' })}`)}`);
|
|
372
|
+
}
|
|
373
|
+
console.log();
|
|
374
|
+
if (data.tier === 'FREE' && data.tokensRemaining === 0) {
|
|
375
|
+
console.log(` Run ${logger_1.fmt.bold('aspectcode upgrade')} to switch to Pro, or add your own key:`);
|
|
376
|
+
console.log(` ${logger_1.fmt.dim('ASPECTCODE_LLM_KEY=sk-...')}`);
|
|
377
|
+
console.log();
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
console.error('Failed to fetch usage:', err.message);
|
|
382
|
+
process.exitCode = 1;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|