agent-nuvira 1.14.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/LICENSE +21 -0
- package/README.md +891 -0
- package/dist/agent-sdk/src/agent.d.ts +118 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -0
- package/dist/agent-sdk/src/agent.js +88 -0
- package/dist/agent-sdk/src/agent.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +33 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -0
- package/dist/agent-sdk/src/index.js +32 -0
- package/dist/agent-sdk/src/index.js.map +1 -0
- package/dist/agent-sdk/src/register.d.ts +70 -0
- package/dist/agent-sdk/src/register.d.ts.map +1 -0
- package/dist/agent-sdk/src/register.js +181 -0
- package/dist/agent-sdk/src/register.js.map +1 -0
- package/dist/agent-sdk/src/scaffold.d.ts +50 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
- package/dist/agent-sdk/src/scaffold.js +291 -0
- package/dist/agent-sdk/src/scaffold.js.map +1 -0
- package/dist/agent-sdk/src/testing.d.ts +187 -0
- package/dist/agent-sdk/src/testing.d.ts.map +1 -0
- package/dist/agent-sdk/src/testing.js +243 -0
- package/dist/agent-sdk/src/testing.js.map +1 -0
- package/dist/agent-sdk/src/types.d.ts +202 -0
- package/dist/agent-sdk/src/types.d.ts.map +1 -0
- package/dist/agent-sdk/src/types.js +11 -0
- package/dist/agent-sdk/src/types.js.map +1 -0
- package/dist/agents/agent.d.ts +132 -0
- package/dist/agents/agent.d.ts.map +1 -0
- package/dist/agents/agent.js +19 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agents/context-gatherer.d.ts +42 -0
- package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
- package/dist/agents/agents/context-gatherer.js +366 -0
- package/dist/agents/agents/context-gatherer.js.map +1 -0
- package/dist/agents/agents/debugger.d.ts +58 -0
- package/dist/agents/agents/debugger.d.ts.map +1 -0
- package/dist/agents/agents/debugger.js +257 -0
- package/dist/agents/agents/debugger.js.map +1 -0
- package/dist/agents/agents/git-agent.d.ts +34 -0
- package/dist/agents/agents/git-agent.d.ts.map +1 -0
- package/dist/agents/agents/git-agent.js +200 -0
- package/dist/agents/agents/git-agent.js.map +1 -0
- package/dist/agents/agents/github-release-agent.d.ts +65 -0
- package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
- package/dist/agents/agents/github-release-agent.js +439 -0
- package/dist/agents/agents/github-release-agent.js.map +1 -0
- package/dist/agents/agents/package-agent.d.ts +33 -0
- package/dist/agents/agents/package-agent.d.ts.map +1 -0
- package/dist/agents/agents/package-agent.js +233 -0
- package/dist/agents/agents/package-agent.js.map +1 -0
- package/dist/agents/agents/planner.d.ts +26 -0
- package/dist/agents/agents/planner.d.ts.map +1 -0
- package/dist/agents/agents/planner.js +222 -0
- package/dist/agents/agents/planner.js.map +1 -0
- package/dist/agents/agents/reviewer.d.ts +34 -0
- package/dist/agents/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/agents/reviewer.js +159 -0
- package/dist/agents/agents/reviewer.js.map +1 -0
- package/dist/agents/agents/runner.d.ts +73 -0
- package/dist/agents/agents/runner.d.ts.map +1 -0
- package/dist/agents/agents/runner.js +299 -0
- package/dist/agents/agents/runner.js.map +1 -0
- package/dist/agents/agents/security-agent.d.ts +33 -0
- package/dist/agents/agents/security-agent.d.ts.map +1 -0
- package/dist/agents/agents/security-agent.js +184 -0
- package/dist/agents/agents/security-agent.js.map +1 -0
- package/dist/agents/agents/tester.d.ts +96 -0
- package/dist/agents/agents/tester.d.ts.map +1 -0
- package/dist/agents/agents/tester.js +410 -0
- package/dist/agents/agents/tester.js.map +1 -0
- package/dist/agents/agents/writer.d.ts +51 -0
- package/dist/agents/agents/writer.d.ts.map +1 -0
- package/dist/agents/agents/writer.js +384 -0
- package/dist/agents/agents/writer.js.map +1 -0
- package/dist/agents/context-vault.d.ts +49 -0
- package/dist/agents/context-vault.d.ts.map +1 -0
- package/dist/agents/context-vault.js +134 -0
- package/dist/agents/context-vault.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +97 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +696 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/utils/file-tree.d.ts +28 -0
- package/dist/agents/utils/file-tree.d.ts.map +1 -0
- package/dist/agents/utils/file-tree.js +93 -0
- package/dist/agents/utils/file-tree.js.map +1 -0
- package/dist/cli/agent.d.ts +25 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +374 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/benchmark.d.ts +24 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +235 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/cache.d.ts +12 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +58 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/chat.d.ts +37 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +393 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/commands.d.ts +24 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +18 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +162 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dashboard.d.ts +34 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +126 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/doctor.d.ts +68 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +585 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/edit.d.ts +11 -0
- package/dist/cli/edit.d.ts.map +1 -0
- package/dist/cli/edit.js +86 -0
- package/dist/cli/edit.js.map +1 -0
- package/dist/cli/execute.d.ts +25 -0
- package/dist/cli/execute.d.ts.map +1 -0
- package/dist/cli/execute.js +186 -0
- package/dist/cli/execute.js.map +1 -0
- package/dist/cli/federation.d.ts +31 -0
- package/dist/cli/federation.d.ts.map +1 -0
- package/dist/cli/federation.js +387 -0
- package/dist/cli/federation.js.map +1 -0
- package/dist/cli/history.d.ts +22 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +140 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/init.d.ts +49 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +423 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/learn.d.ts +31 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +320 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/memory.d.ts +38 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +295 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model-picker.d.ts +18 -0
- package/dist/cli/model-picker.d.ts.map +1 -0
- package/dist/cli/model-picker.js +225 -0
- package/dist/cli/model-picker.js.map +1 -0
- package/dist/cli/models.d.ts +11 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +132 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/plan.d.ts +11 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +94 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/plugins.d.ts +15 -0
- package/dist/cli/plugins.d.ts.map +1 -0
- package/dist/cli/plugins.js +123 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/router.d.ts +20 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +142 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +110 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +27 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +264 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sdk.d.ts +27 -0
- package/dist/cli/sdk.d.ts.map +1 -0
- package/dist/cli/sdk.js +204 -0
- package/dist/cli/sdk.js.map +1 -0
- package/dist/cli/stats.d.ts +18 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +78 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/team.d.ts +42 -0
- package/dist/cli/team.d.ts.map +1 -0
- package/dist/cli/team.js +473 -0
- package/dist/cli/team.js.map +1 -0
- package/dist/cli/workflow.d.ts +27 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +347 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/config/manager.d.ts +37 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +147 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +53 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/cache.d.ts +27 -0
- package/dist/context/cache.d.ts.map +1 -0
- package/dist/context/cache.js +116 -0
- package/dist/context/cache.js.map +1 -0
- package/dist/context/history.d.ts +87 -0
- package/dist/context/history.d.ts.map +1 -0
- package/dist/context/history.js +249 -0
- package/dist/context/history.js.map +1 -0
- package/dist/context/parser.d.ts +61 -0
- package/dist/context/parser.d.ts.map +1 -0
- package/dist/context/parser.js +194 -0
- package/dist/context/parser.js.map +1 -0
- package/dist/federation/client.d.ts +49 -0
- package/dist/federation/client.d.ts.map +1 -0
- package/dist/federation/client.js +239 -0
- package/dist/federation/client.js.map +1 -0
- package/dist/federation/protocol.d.ts +155 -0
- package/dist/federation/protocol.d.ts.map +1 -0
- package/dist/federation/protocol.js +57 -0
- package/dist/federation/protocol.js.map +1 -0
- package/dist/federation/server.d.ts +25 -0
- package/dist/federation/server.d.ts.map +1 -0
- package/dist/federation/server.js +401 -0
- package/dist/federation/server.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/factory.d.ts +20 -0
- package/dist/inference/factory.d.ts.map +1 -0
- package/dist/inference/factory.js +46 -0
- package/dist/inference/factory.js.map +1 -0
- package/dist/inference/gemini-adapter.d.ts +17 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -0
- package/dist/inference/gemini-adapter.js +176 -0
- package/dist/inference/gemini-adapter.js.map +1 -0
- package/dist/inference/groq-adapter.d.ts +17 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -0
- package/dist/inference/groq-adapter.js +103 -0
- package/dist/inference/groq-adapter.js.map +1 -0
- package/dist/inference/interface.d.ts +49 -0
- package/dist/inference/interface.d.ts.map +1 -0
- package/dist/inference/interface.js +2 -0
- package/dist/inference/interface.js.map +1 -0
- package/dist/inference/local-adapter.d.ts +35 -0
- package/dist/inference/local-adapter.d.ts.map +1 -0
- package/dist/inference/local-adapter.js +311 -0
- package/dist/inference/local-adapter.js.map +1 -0
- package/dist/inference/model-catalog.d.ts +53 -0
- package/dist/inference/model-catalog.d.ts.map +1 -0
- package/dist/inference/model-catalog.js +306 -0
- package/dist/inference/model-catalog.js.map +1 -0
- package/dist/inference/nim-adapter.d.ts +17 -0
- package/dist/inference/nim-adapter.d.ts.map +1 -0
- package/dist/inference/nim-adapter.js +103 -0
- package/dist/inference/nim-adapter.js.map +1 -0
- package/dist/inference/openrouter-adapter.d.ts +17 -0
- package/dist/inference/openrouter-adapter.d.ts.map +1 -0
- package/dist/inference/openrouter-adapter.js +105 -0
- package/dist/inference/openrouter-adapter.js.map +1 -0
- package/dist/inference/sse.d.ts +20 -0
- package/dist/inference/sse.d.ts.map +1 -0
- package/dist/inference/sse.js +91 -0
- package/dist/inference/sse.js.map +1 -0
- package/dist/learning/agent-stats.d.ts +109 -0
- package/dist/learning/agent-stats.d.ts.map +1 -0
- package/dist/learning/agent-stats.js +240 -0
- package/dist/learning/agent-stats.js.map +1 -0
- package/dist/learning/benchmark.d.ts +161 -0
- package/dist/learning/benchmark.d.ts.map +1 -0
- package/dist/learning/benchmark.js +589 -0
- package/dist/learning/benchmark.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts +101 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -0
- package/dist/learning/cost-tracker.js +224 -0
- package/dist/learning/cost-tracker.js.map +1 -0
- package/dist/learning/feedback.d.ts +88 -0
- package/dist/learning/feedback.d.ts.map +1 -0
- package/dist/learning/feedback.js +169 -0
- package/dist/learning/feedback.js.map +1 -0
- package/dist/learning/hybrid-router.d.ts +201 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -0
- package/dist/learning/hybrid-router.js +450 -0
- package/dist/learning/hybrid-router.js.map +1 -0
- package/dist/learning/model-compare.d.ts +76 -0
- package/dist/learning/model-compare.d.ts.map +1 -0
- package/dist/learning/model-compare.js +252 -0
- package/dist/learning/model-compare.js.map +1 -0
- package/dist/learning/model-router.d.ts +68 -0
- package/dist/learning/model-router.d.ts.map +1 -0
- package/dist/learning/model-router.js +140 -0
- package/dist/learning/model-router.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +99 -0
- package/dist/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/learning/pattern-extractor.js +310 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/learning/scorer.d.ts +51 -0
- package/dist/learning/scorer.d.ts.map +1 -0
- package/dist/learning/scorer.js +64 -0
- package/dist/learning/scorer.js.map +1 -0
- package/dist/learning/self-improver.d.ts +48 -0
- package/dist/learning/self-improver.d.ts.map +1 -0
- package/dist/learning/self-improver.js +161 -0
- package/dist/learning/self-improver.js.map +1 -0
- package/dist/memory/embedder.d.ts +65 -0
- package/dist/memory/embedder.d.ts.map +1 -0
- package/dist/memory/embedder.js +424 -0
- package/dist/memory/embedder.js.map +1 -0
- package/dist/memory/memory-integration.d.ts +56 -0
- package/dist/memory/memory-integration.d.ts.map +1 -0
- package/dist/memory/memory-integration.js +95 -0
- package/dist/memory/memory-integration.js.map +1 -0
- package/dist/memory/trajectory-store.d.ts +149 -0
- package/dist/memory/trajectory-store.d.ts.map +1 -0
- package/dist/memory/trajectory-store.js +476 -0
- package/dist/memory/trajectory-store.js.map +1 -0
- package/dist/memory/vector-store.d.ts +78 -0
- package/dist/memory/vector-store.d.ts.map +1 -0
- package/dist/memory/vector-store.js +186 -0
- package/dist/memory/vector-store.js.map +1 -0
- package/dist/plugins/agent-plugin.d.ts +73 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -0
- package/dist/plugins/agent-plugin.js +199 -0
- package/dist/plugins/agent-plugin.js.map +1 -0
- package/dist/plugins/registry.d.ts +61 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +67 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/sandbox/images.d.ts +31 -0
- package/dist/sandbox/images.d.ts.map +1 -0
- package/dist/sandbox/images.js +129 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/manager.d.ts +134 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +470 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/types.d.ts +113 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +107 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/security/scanner.d.ts +53 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +271 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/team/config.d.ts +50 -0
- package/dist/team/config.d.ts.map +1 -0
- package/dist/team/config.js +108 -0
- package/dist/team/config.js.map +1 -0
- package/dist/team/memory.d.ts +63 -0
- package/dist/team/memory.d.ts.map +1 -0
- package/dist/team/memory.js +282 -0
- package/dist/team/memory.js.map +1 -0
- package/dist/team/review.d.ts +123 -0
- package/dist/team/review.d.ts.map +1 -0
- package/dist/team/review.js +293 -0
- package/dist/team/review.js.map +1 -0
- package/dist/utils/env.d.ts +19 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +250 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +59 -0
- package/dist/web-dashboard/server.d.ts.map +1 -0
- package/dist/web-dashboard/server.js +418 -0
- package/dist/web-dashboard/server.js.map +1 -0
- package/dist/workflow/registry.d.ts +127 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +482 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/templates.d.ts +93 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +481 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +78 -0
- package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
- package/src/web-dashboard/public/index.html +13 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Review — Review workflow (agent PR → review → merge).
|
|
3
|
+
*
|
|
4
|
+
* The review workflow enables team members to review agent-generated changes
|
|
5
|
+
* before applying them. It mimics a simplified PR workflow:
|
|
6
|
+
*
|
|
7
|
+
* 1. PR Creation: Agent proposes changes → saved as a "review bundle"
|
|
8
|
+
* 2. Review: Team member reviews the proposed changes
|
|
9
|
+
* 3. Merge: Approved changes are applied to the working directory
|
|
10
|
+
*
|
|
11
|
+
* Review bundles are stored in ~/.buff/team/reviews/ and can be shared
|
|
12
|
+
* via git (if team memory is set up) or locally.
|
|
13
|
+
*
|
|
14
|
+
* Each bundle contains:
|
|
15
|
+
* - Metadata (author, timestamp, goal, provider)
|
|
16
|
+
* - Proposed file changes (path, original, new content)
|
|
17
|
+
* - Review comments (status, feedback)
|
|
18
|
+
*/
|
|
19
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
20
|
+
import { join, resolve } from 'node:path';
|
|
21
|
+
import { homedir } from 'node:os';
|
|
22
|
+
import { logger } from '../utils/logger.js';
|
|
23
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
24
|
+
const REVIEWS_DIR = join(homedir(), '.buff', 'team', 'reviews');
|
|
25
|
+
const REVIEWS_INDEX_PATH = join(REVIEWS_DIR, 'index.json');
|
|
26
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
27
|
+
function ensureDir() {
|
|
28
|
+
if (!existsSync(REVIEWS_DIR)) {
|
|
29
|
+
mkdirSync(REVIEWS_DIR, { recursive: true });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function generateReviewId() {
|
|
33
|
+
return `review-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
34
|
+
}
|
|
35
|
+
function readIndex() {
|
|
36
|
+
try {
|
|
37
|
+
ensureDir();
|
|
38
|
+
if (!existsSync(REVIEWS_INDEX_PATH)) {
|
|
39
|
+
return { reviews: [] };
|
|
40
|
+
}
|
|
41
|
+
return JSON.parse(readFileSync(REVIEWS_INDEX_PATH, 'utf-8'));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { reviews: [] };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function writeIndex(index) {
|
|
48
|
+
ensureDir();
|
|
49
|
+
writeFileSync(REVIEWS_INDEX_PATH, JSON.stringify(index, null, 2), 'utf-8');
|
|
50
|
+
}
|
|
51
|
+
function bundlePath(id) {
|
|
52
|
+
return join(REVIEWS_DIR, `${id}.json`);
|
|
53
|
+
}
|
|
54
|
+
// ─── Review Operations ──────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Create a new review bundle from proposed file changes.
|
|
57
|
+
* Typically called after an agent execution to capture the proposed changes
|
|
58
|
+
* for review before applying them.
|
|
59
|
+
*
|
|
60
|
+
* @param title — Short title for the review
|
|
61
|
+
* @param goal — The original goal
|
|
62
|
+
* @param changes — Proposed file changes
|
|
63
|
+
* @param options — Optional metadata
|
|
64
|
+
* @returns The created ReviewBundle
|
|
65
|
+
*/
|
|
66
|
+
export function createReview(title, goal, changes, options) {
|
|
67
|
+
const id = generateReviewId();
|
|
68
|
+
const bundle = {
|
|
69
|
+
id,
|
|
70
|
+
title,
|
|
71
|
+
goal,
|
|
72
|
+
author: options?.author || process.env.USER || 'unknown',
|
|
73
|
+
status: 'pending',
|
|
74
|
+
createdAt: Date.now(),
|
|
75
|
+
provider: options?.provider || 'unknown',
|
|
76
|
+
model: options?.model || 'unknown',
|
|
77
|
+
changes,
|
|
78
|
+
comments: [],
|
|
79
|
+
summary: options?.summary,
|
|
80
|
+
tags: options?.tags || [],
|
|
81
|
+
};
|
|
82
|
+
// Save to disk
|
|
83
|
+
ensureDir();
|
|
84
|
+
writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
|
|
85
|
+
// Update index
|
|
86
|
+
const index = readIndex();
|
|
87
|
+
index.reviews.unshift({
|
|
88
|
+
id,
|
|
89
|
+
title,
|
|
90
|
+
status: 'pending',
|
|
91
|
+
createdAt: bundle.createdAt,
|
|
92
|
+
author: bundle.author,
|
|
93
|
+
});
|
|
94
|
+
// Keep only last 100 entries in the index
|
|
95
|
+
if (index.reviews.length > 100) {
|
|
96
|
+
index.reviews = index.reviews.slice(0, 100);
|
|
97
|
+
}
|
|
98
|
+
writeIndex(index);
|
|
99
|
+
logger.success(`Created review bundle: ${id} — "${title}"`);
|
|
100
|
+
return bundle;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Load a review bundle by ID.
|
|
104
|
+
*/
|
|
105
|
+
export function getReview(id) {
|
|
106
|
+
const path = bundlePath(id);
|
|
107
|
+
if (!existsSync(path))
|
|
108
|
+
return null;
|
|
109
|
+
try {
|
|
110
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* List all review bundles, sorted by recency.
|
|
118
|
+
*/
|
|
119
|
+
export function listReviews(limit = 20) {
|
|
120
|
+
const index = readIndex();
|
|
121
|
+
const reviews = [];
|
|
122
|
+
for (const entry of index.reviews.slice(0, limit)) {
|
|
123
|
+
const bundle = getReview(entry.id);
|
|
124
|
+
if (bundle)
|
|
125
|
+
reviews.push(bundle);
|
|
126
|
+
}
|
|
127
|
+
return reviews;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Add a review comment to a bundle.
|
|
131
|
+
*/
|
|
132
|
+
export function addReviewComment(id, reviewer, status, comment) {
|
|
133
|
+
const bundle = getReview(id);
|
|
134
|
+
if (!bundle) {
|
|
135
|
+
logger.error(`Review not found: ${id}`);
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
bundle.comments.push({
|
|
139
|
+
reviewer,
|
|
140
|
+
status,
|
|
141
|
+
comment,
|
|
142
|
+
timestamp: Date.now(),
|
|
143
|
+
});
|
|
144
|
+
// Update status based on comment
|
|
145
|
+
if (status === 'approve') {
|
|
146
|
+
bundle.status = 'approved';
|
|
147
|
+
}
|
|
148
|
+
else if (status === 'request-changes') {
|
|
149
|
+
bundle.status = 'changes-requested';
|
|
150
|
+
}
|
|
151
|
+
// Save
|
|
152
|
+
writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
|
|
153
|
+
// Update index
|
|
154
|
+
const index = readIndex();
|
|
155
|
+
const entry = index.reviews.find((r) => r.id === id);
|
|
156
|
+
if (entry)
|
|
157
|
+
entry.status = bundle.status;
|
|
158
|
+
writeIndex(index);
|
|
159
|
+
return bundle;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Merge a review bundle — apply approved changes to the working directory.
|
|
163
|
+
*
|
|
164
|
+
* @param id — Review bundle ID
|
|
165
|
+
* @param workingDir — Working directory to apply changes to (default: process.cwd())
|
|
166
|
+
* @returns The number of files changed
|
|
167
|
+
*/
|
|
168
|
+
export function mergeReview(id, workingDir) {
|
|
169
|
+
const bundle = getReview(id);
|
|
170
|
+
if (!bundle) {
|
|
171
|
+
logger.error(`Review not found: ${id}`);
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
if (bundle.status === 'rejected') {
|
|
175
|
+
logger.error('Cannot merge a rejected review.');
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
if (bundle.status === 'pending') {
|
|
179
|
+
logger.warn('Review is still pending. Approve first with `buff team review approve <id>`.');
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
const dir = resolve(workingDir || process.cwd());
|
|
183
|
+
let count = 0;
|
|
184
|
+
for (const change of bundle.changes) {
|
|
185
|
+
const fullPath = resolve(dir, change.path);
|
|
186
|
+
switch (change.status) {
|
|
187
|
+
case 'created':
|
|
188
|
+
case 'modified':
|
|
189
|
+
if (change.newContent !== undefined) {
|
|
190
|
+
const targetDir = join(fullPath, '..');
|
|
191
|
+
if (!existsSync(targetDir)) {
|
|
192
|
+
mkdirSync(targetDir, { recursive: true });
|
|
193
|
+
}
|
|
194
|
+
writeFileSync(fullPath, change.newContent, 'utf-8');
|
|
195
|
+
count++;
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
case 'deleted':
|
|
199
|
+
if (existsSync(fullPath)) {
|
|
200
|
+
try {
|
|
201
|
+
const { unlinkSync } = require('node:fs');
|
|
202
|
+
unlinkSync(fullPath);
|
|
203
|
+
count++;
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
logger.warn(`Could not delete ${change.path}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Update status
|
|
213
|
+
bundle.status = 'merged';
|
|
214
|
+
writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
|
|
215
|
+
const index = readIndex();
|
|
216
|
+
const entry = index.reviews.find((r) => r.id === id);
|
|
217
|
+
if (entry)
|
|
218
|
+
entry.status = 'merged';
|
|
219
|
+
writeIndex(index);
|
|
220
|
+
logger.success(`Merged review ${id}: ${count} file(s) changed.`);
|
|
221
|
+
return count;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Reject a review bundle.
|
|
225
|
+
*/
|
|
226
|
+
export function rejectReview(id, reason) {
|
|
227
|
+
const bundle = getReview(id);
|
|
228
|
+
if (!bundle) {
|
|
229
|
+
logger.error(`Review not found: ${id}`);
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
bundle.status = 'rejected';
|
|
233
|
+
if (reason) {
|
|
234
|
+
bundle.comments.push({
|
|
235
|
+
reviewer: bundle.author,
|
|
236
|
+
status: 'request-changes',
|
|
237
|
+
comment: reason,
|
|
238
|
+
timestamp: Date.now(),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
writeFileSync(bundlePath(id), JSON.stringify(bundle, null, 2), 'utf-8');
|
|
242
|
+
const index = readIndex();
|
|
243
|
+
const entry = index.reviews.find((r) => r.id === id);
|
|
244
|
+
if (entry)
|
|
245
|
+
entry.status = 'rejected';
|
|
246
|
+
writeIndex(index);
|
|
247
|
+
logger.info(`Review ${id} rejected.${reason ? ` Reason: ${reason}` : ''}`);
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Create a review bundle from the current orchestrator result.
|
|
252
|
+
* This captures all file changes proposed by the agents into a review.
|
|
253
|
+
*
|
|
254
|
+
* @param goal — The original goal
|
|
255
|
+
* @param fileChanges — The proposed file changes from the orchestrator
|
|
256
|
+
* @param summary — Execution summary
|
|
257
|
+
* @returns The created ReviewBundle
|
|
258
|
+
*/
|
|
259
|
+
export function createReviewFromResult(goal, fileChanges, summary, options) {
|
|
260
|
+
// Read original content for modified files
|
|
261
|
+
const changes = fileChanges.map((fc) => {
|
|
262
|
+
const change = {
|
|
263
|
+
path: fc.path,
|
|
264
|
+
status: fc.status,
|
|
265
|
+
};
|
|
266
|
+
if (fc.originalContent)
|
|
267
|
+
change.originalContent = fc.originalContent;
|
|
268
|
+
if (fc.newContent)
|
|
269
|
+
change.newContent = fc.newContent;
|
|
270
|
+
// Try to read original content if not provided
|
|
271
|
+
if (!change.originalContent && change.status === 'modified') {
|
|
272
|
+
try {
|
|
273
|
+
const fullPath = resolve(process.cwd(), fc.path);
|
|
274
|
+
if (existsSync(fullPath)) {
|
|
275
|
+
change.originalContent = readFileSync(fullPath, 'utf-8');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch { /* ignore */ }
|
|
279
|
+
}
|
|
280
|
+
return change;
|
|
281
|
+
});
|
|
282
|
+
const title = summary
|
|
283
|
+
? summary.split('\n')[0].slice(0, 80)
|
|
284
|
+
: `Changes for: ${goal.slice(0, 60)}`;
|
|
285
|
+
return createReview(title, goal, changes, {
|
|
286
|
+
provider: options?.provider,
|
|
287
|
+
model: options?.model,
|
|
288
|
+
author: options?.author,
|
|
289
|
+
summary,
|
|
290
|
+
tags: ['agent-generated'],
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/team/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load environment variables from .env files
|
|
3
|
+
* Checks: project .env, home dir .env, and process.env
|
|
4
|
+
*
|
|
5
|
+
* .env file features:
|
|
6
|
+
* - Lines starting with # are comments
|
|
7
|
+
* - Inline comments are supported (KEY=value # comment)
|
|
8
|
+
* - export prefix is stripped (export KEY=value)
|
|
9
|
+
* - Variable expansion: $VAR, ${VAR}, ${VAR:-default}
|
|
10
|
+
* - References already-parsed vars in the same file first
|
|
11
|
+
* - Falls back to process.env
|
|
12
|
+
* - ${VAR:-default} uses 'default' if VAR is not set
|
|
13
|
+
* - Windows CRLF line endings are handled
|
|
14
|
+
* - Quoted values (single and double) are unquoted
|
|
15
|
+
* - Double-quoted values support variable expansion
|
|
16
|
+
* - Single-quoted values are literal (no expansion)
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadEnv(): Record<string, string | undefined>;
|
|
19
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAiB5D"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
/**
|
|
5
|
+
* Load environment variables from .env files
|
|
6
|
+
* Checks: project .env, home dir .env, and process.env
|
|
7
|
+
*
|
|
8
|
+
* .env file features:
|
|
9
|
+
* - Lines starting with # are comments
|
|
10
|
+
* - Inline comments are supported (KEY=value # comment)
|
|
11
|
+
* - export prefix is stripped (export KEY=value)
|
|
12
|
+
* - Variable expansion: $VAR, ${VAR}, ${VAR:-default}
|
|
13
|
+
* - References already-parsed vars in the same file first
|
|
14
|
+
* - Falls back to process.env
|
|
15
|
+
* - ${VAR:-default} uses 'default' if VAR is not set
|
|
16
|
+
* - Windows CRLF line endings are handled
|
|
17
|
+
* - Quoted values (single and double) are unquoted
|
|
18
|
+
* - Double-quoted values support variable expansion
|
|
19
|
+
* - Single-quoted values are literal (no expansion)
|
|
20
|
+
*/
|
|
21
|
+
export function loadEnv() {
|
|
22
|
+
const env = { ...process.env };
|
|
23
|
+
// Try loading from .env in project root
|
|
24
|
+
const projectEnv = findEnvFile(process.cwd());
|
|
25
|
+
if (projectEnv) {
|
|
26
|
+
Object.assign(env, projectEnv);
|
|
27
|
+
}
|
|
28
|
+
// Try loading from ~/.buff/.env
|
|
29
|
+
const homeEnvPath = join(homedir(), '.buff', '.env');
|
|
30
|
+
if (existsSync(homeEnvPath)) {
|
|
31
|
+
const homeEnv = parseEnvFile(readFileSync(homeEnvPath, 'utf-8'));
|
|
32
|
+
Object.assign(env, homeEnv);
|
|
33
|
+
}
|
|
34
|
+
return env;
|
|
35
|
+
}
|
|
36
|
+
function findEnvFile(dir) {
|
|
37
|
+
const envPath = join(dir, '.env');
|
|
38
|
+
if (existsSync(envPath)) {
|
|
39
|
+
return parseEnvFile(readFileSync(envPath, 'utf-8'));
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse a .env file content into key-value pairs.
|
|
45
|
+
*
|
|
46
|
+
* Supports:
|
|
47
|
+
* - Comments: # full line and KEY=val # inline comment
|
|
48
|
+
* - export prefix: export KEY=value
|
|
49
|
+
* - Variable expansion: $VAR, ${VAR}, ${VAR:-default}
|
|
50
|
+
* - Quoted values: KEY="value" KEY='value'
|
|
51
|
+
* - CRLF line endings
|
|
52
|
+
* - Empty lines
|
|
53
|
+
*/
|
|
54
|
+
function parseEnvFile(content) {
|
|
55
|
+
const env = {};
|
|
56
|
+
const lines = splitIntoLines(content);
|
|
57
|
+
for (const rawLine of lines) {
|
|
58
|
+
// Skip empty lines and full-line comments
|
|
59
|
+
if (rawLine.length === 0)
|
|
60
|
+
continue;
|
|
61
|
+
// Strip 'export ' prefix if present
|
|
62
|
+
const trimmed = rawLine.startsWith('export ')
|
|
63
|
+
? rawLine.slice(7).trimStart()
|
|
64
|
+
: rawLine;
|
|
65
|
+
// Check if the line is just a comment after stripping export
|
|
66
|
+
if (trimmed.startsWith('#') || trimmed.length === 0)
|
|
67
|
+
continue;
|
|
68
|
+
// Find the first '=' that separates key from value
|
|
69
|
+
const eqIndex = trimmed.indexOf('=');
|
|
70
|
+
if (eqIndex === -1)
|
|
71
|
+
continue;
|
|
72
|
+
const key = trimmed.slice(0, eqIndex).trim();
|
|
73
|
+
if (!key)
|
|
74
|
+
continue;
|
|
75
|
+
const rawValue = trimmed.slice(eqIndex + 1).trim();
|
|
76
|
+
// Parse the value, handling quotes and inline comments
|
|
77
|
+
const value = parseValue(rawValue, env);
|
|
78
|
+
env[key] = value;
|
|
79
|
+
}
|
|
80
|
+
return env;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Split content into lines, handling CRLF and trailing newlines.
|
|
84
|
+
*/
|
|
85
|
+
function splitIntoLines(content) {
|
|
86
|
+
// Normalize CRLF to LF, then split
|
|
87
|
+
const normalized = content.replace(/\r\n/g, '\n');
|
|
88
|
+
const lines = normalized.split('\n');
|
|
89
|
+
// Trim trailing empty line from final newline
|
|
90
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') {
|
|
91
|
+
return lines.slice(0, -1);
|
|
92
|
+
}
|
|
93
|
+
return lines;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Parse a value string from a .env file line.
|
|
97
|
+
*
|
|
98
|
+
* Handles:
|
|
99
|
+
* - Unquoted values: strip inline comments, expand vars
|
|
100
|
+
* - Double-quoted values: unquote, expand vars, preserve inline comments
|
|
101
|
+
* - Single-quoted values: unquote, literal (no expansion, no comment stripping)
|
|
102
|
+
*/
|
|
103
|
+
function parseValue(rawValue, env) {
|
|
104
|
+
if (rawValue.length === 0)
|
|
105
|
+
return '';
|
|
106
|
+
// Single-quoted: literal value, no expansion, no inline comments
|
|
107
|
+
if (rawValue.startsWith("'")) {
|
|
108
|
+
const closingQuote = rawValue.indexOf("'", 1);
|
|
109
|
+
if (closingQuote !== -1) {
|
|
110
|
+
return rawValue.slice(1, closingQuote);
|
|
111
|
+
}
|
|
112
|
+
// No closing quote — treat rest as literal
|
|
113
|
+
return rawValue.slice(1);
|
|
114
|
+
}
|
|
115
|
+
// Double-quoted or unquoted: handle inline comments and variable expansion
|
|
116
|
+
// First, strip inline comments from unquoted values
|
|
117
|
+
// (Double-quoted values keep everything inside the quotes, including #)
|
|
118
|
+
let value;
|
|
119
|
+
if (rawValue.startsWith('"')) {
|
|
120
|
+
// Find closing double quote
|
|
121
|
+
const closingQuote = findClosingQuote(rawValue, 0);
|
|
122
|
+
if (closingQuote !== -1) {
|
|
123
|
+
value = rawValue.slice(1, closingQuote);
|
|
124
|
+
// Rest after the closing quote is ignored (could be an inline comment)
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// No closing quote — treat entire rest as value
|
|
128
|
+
value = rawValue.slice(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Unquoted: strip inline comments
|
|
133
|
+
value = stripInlineComment(rawValue);
|
|
134
|
+
}
|
|
135
|
+
// Expand variables
|
|
136
|
+
value = expandVariables(value, env);
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Find the closing double quote starting from a given position.
|
|
141
|
+
* Handles escaped quotes inside the string.
|
|
142
|
+
*/
|
|
143
|
+
function findClosingQuote(s, start) {
|
|
144
|
+
let i = start + 1;
|
|
145
|
+
while (i < s.length) {
|
|
146
|
+
if (s[i] === '\\') {
|
|
147
|
+
i += 2; // Skip escaped character
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (s[i] === '"') {
|
|
151
|
+
return i;
|
|
152
|
+
}
|
|
153
|
+
i++;
|
|
154
|
+
}
|
|
155
|
+
return -1;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Strip inline comments from an unquoted value.
|
|
159
|
+
*
|
|
160
|
+
* A '#' starts a comment UNLESS it's inside:
|
|
161
|
+
* - A quoted string (single or double)
|
|
162
|
+
* - It's escaped (\#)
|
|
163
|
+
*/
|
|
164
|
+
function stripInlineComment(value) {
|
|
165
|
+
let result = '';
|
|
166
|
+
let i = 0;
|
|
167
|
+
while (i < value.length) {
|
|
168
|
+
// Escaped character — keep literally
|
|
169
|
+
if (value[i] === '\\' && i + 1 < value.length) {
|
|
170
|
+
result += value[i + 1];
|
|
171
|
+
i += 2;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
// Start of a quote — find matching closing quote and include the whole thing
|
|
175
|
+
if (value[i] === "'") {
|
|
176
|
+
const close = value.indexOf("'", i + 1);
|
|
177
|
+
if (close !== -1) {
|
|
178
|
+
result += value.slice(i, close + 1);
|
|
179
|
+
i = close + 1;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// No closing quote — include rest
|
|
183
|
+
result += value.slice(i);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
if (value[i] === '"') {
|
|
187
|
+
const close = findClosingQuote(value, i);
|
|
188
|
+
if (close !== -1) {
|
|
189
|
+
result += value.slice(i, close + 1);
|
|
190
|
+
i = close + 1;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// No closing quote — include rest
|
|
194
|
+
result += value.slice(i);
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
// Comment start — stop here
|
|
198
|
+
if (value[i] === '#') {
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
result += value[i];
|
|
202
|
+
i++;
|
|
203
|
+
}
|
|
204
|
+
return result.trim();
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Expand variable references in a value string.
|
|
208
|
+
*
|
|
209
|
+
* Supports:
|
|
210
|
+
* - $VAR — simple variable reference (ends at non-identifier char)
|
|
211
|
+
* - ${VAR} — explicit variable reference
|
|
212
|
+
* - ${VAR:-default} — with default value if VAR is unset or empty
|
|
213
|
+
*
|
|
214
|
+
* Variables are resolved from:
|
|
215
|
+
* 1. The current file's already-parsed env object
|
|
216
|
+
* 2. process.env as fallback
|
|
217
|
+
*/
|
|
218
|
+
function expandVariables(value, env) {
|
|
219
|
+
if (!value.includes('$'))
|
|
220
|
+
return value;
|
|
221
|
+
return value.replace(/\$(?:\{([^}]+)\}|([a-zA-Z_][a-zA-Z0-9_]*))/g, (match, bracedVar, simpleVar) => {
|
|
222
|
+
if (bracedVar !== undefined) {
|
|
223
|
+
// ${VAR} or ${VAR:-default}
|
|
224
|
+
const colonDefaultIndex = bracedVar.indexOf(':-');
|
|
225
|
+
if (colonDefaultIndex !== -1) {
|
|
226
|
+
const varName = bracedVar.slice(0, colonDefaultIndex);
|
|
227
|
+
const defaultValue = bracedVar.slice(colonDefaultIndex + 2);
|
|
228
|
+
// Bash semantics: use default if var is unset OR empty
|
|
229
|
+
const resolved = resolveVar(varName, env);
|
|
230
|
+
if (resolved !== null && resolved !== '')
|
|
231
|
+
return resolved;
|
|
232
|
+
return defaultValue;
|
|
233
|
+
}
|
|
234
|
+
return resolveVar(bracedVar, env) ?? '';
|
|
235
|
+
}
|
|
236
|
+
// $VAR
|
|
237
|
+
return resolveVar(simpleVar, env) ?? '';
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Resolve a single variable name from the env object or process.env.
|
|
242
|
+
*/
|
|
243
|
+
function resolveVar(varName, env) {
|
|
244
|
+
if (varName in env)
|
|
245
|
+
return env[varName];
|
|
246
|
+
if (varName in process.env)
|
|
247
|
+
return process.env[varName];
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
3
|
+
export declare const logger: {
|
|
4
|
+
debug: (message: string, ...args: unknown[]) => void;
|
|
5
|
+
info: (message: string, ...args: unknown[]) => void;
|
|
6
|
+
success: (message: string, ...args: unknown[]) => void;
|
|
7
|
+
warn: (message: string, ...args: unknown[]) => void;
|
|
8
|
+
error: (message: string, ...args: unknown[]) => void;
|
|
9
|
+
highlight: (message: string) => void;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAMD,eAAO,MAAM,MAAM;qBACA,MAAM,WAAW,OAAO,EAAE;oBAM3B,MAAM,WAAW,OAAO,EAAE;uBAMvB,MAAM,WAAW,OAAO,EAAE;oBAM7B,MAAM,WAAW,OAAO,EAAE;qBAMzB,MAAM,WAAW,OAAO,EAAE;yBAMtB,MAAM;CAG5B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
let currentLogLevel = 'info';
|
|
3
|
+
const LOG_LEVELS = {
|
|
4
|
+
debug: 0,
|
|
5
|
+
info: 1,
|
|
6
|
+
warn: 2,
|
|
7
|
+
error: 3,
|
|
8
|
+
};
|
|
9
|
+
export function setLogLevel(level) {
|
|
10
|
+
currentLogLevel = level;
|
|
11
|
+
}
|
|
12
|
+
function shouldLog(level) {
|
|
13
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[currentLogLevel];
|
|
14
|
+
}
|
|
15
|
+
export const logger = {
|
|
16
|
+
debug: (message, ...args) => {
|
|
17
|
+
if (shouldLog('debug')) {
|
|
18
|
+
console.log(chalk.gray(`[debug] ${message}`), ...args);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
info: (message, ...args) => {
|
|
22
|
+
if (shouldLog('info')) {
|
|
23
|
+
console.log(chalk.blue(`ℹ ${message}`), ...args);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
success: (message, ...args) => {
|
|
27
|
+
if (shouldLog('info')) {
|
|
28
|
+
console.log(chalk.green(`✔ ${message}`), ...args);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
warn: (message, ...args) => {
|
|
32
|
+
if (shouldLog('warn')) {
|
|
33
|
+
console.log(chalk.yellow(`⚠ ${message}`), ...args);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
error: (message, ...args) => {
|
|
37
|
+
if (shouldLog('error')) {
|
|
38
|
+
console.error(chalk.red(`✖ ${message}`), ...args);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
highlight: (message) => {
|
|
42
|
+
console.log(chalk.cyan(message));
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,IAAI,eAAe,GAAa,MAAM,CAAC;AAEvC,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,eAAe,GAAG,KAAK,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC/C,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,SAAS,EAAE,CAAC,OAAe,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;CACF,CAAC"}
|