@mrpatronz/nexusflow 0.2.13 → 0.2.17
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/.github/dependabot.yml +52 -52
- package/.github/workflows/dependabot-merge.yml +53 -0
- package/.github/workflows/release.yml +112 -100
- package/.vscode/launch.json +17 -17
- package/.vscode/tasks.json +17 -17
- package/GETTING_STARTED.md +114 -109
- package/README.md +336 -311
- package/desktop/build-installer.js +228 -0
- package/desktop/build.js +118 -0
- package/desktop/installer/nexusflow.iss +35 -0
- package/desktop/neutralino.config.json +39 -0
- package/desktop/package-lock.json +1060 -0
- package/desktop/package.json +14 -0
- package/dist/commands/desktop.d.ts +12 -0
- package/dist/commands/desktop.d.ts.map +1 -0
- package/dist/commands/desktop.js +119 -0
- package/dist/commands/desktop.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +1 -3
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/tui.d.ts +8 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +386 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/ui.d.ts +3 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +76 -19
- package/dist/commands/ui.js.map +1 -1
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/base.js +78 -66
- package/dist/generators/base.js.map +1 -1
- package/dist/generators/codex.js +11 -11
- package/dist/generators/copilot.js +17 -17
- package/dist/generators/cursor.js +5 -5
- package/dist/generators/index.js +50 -50
- package/dist/generators/map-generator.js +14 -14
- package/dist/generators/skills-generator.js +28 -28
- package/dist/gui/app_logo.png +0 -0
- package/dist/gui/assets/index-Ct3qq-X4.js +25 -0
- package/dist/gui/assets/index-P_ZrgHXg.css +1 -0
- package/dist/gui/icons.svg +24 -24
- package/dist/gui/index.html +18 -18
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +182 -1
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +78 -0
- package/dist/server.test.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/git.d.ts +16 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +52 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/multi-git.d.ts +2 -0
- package/dist/utils/multi-git.d.ts.map +1 -1
- package/dist/utils/multi-git.js +5 -2
- package/dist/utils/multi-git.js.map +1 -1
- package/dist/utils/update-check.d.ts +3 -1
- package/dist/utils/update-check.d.ts.map +1 -1
- package/dist/utils/update-check.js +23 -6
- package/dist/utils/update-check.js.map +1 -1
- package/dist/utils/workflows.d.ts +11 -0
- package/dist/utils/workflows.d.ts.map +1 -0
- package/dist/utils/workflows.js +156 -0
- package/dist/utils/workflows.js.map +1 -0
- package/dist/utils/workflows.test.d.ts +2 -0
- package/dist/utils/workflows.test.d.ts.map +1 -0
- package/dist/utils/workflows.test.js +86 -0
- package/dist/utils/workflows.test.js.map +1 -0
- package/extension/media/icon.svg +1 -0
- package/extension/package-lock.json +2673 -2811
- package/extension/package.json +108 -70
- package/extension/src/extension.ts +631 -204
- package/extension/tsconfig.json +21 -19
- package/gui/README.md +73 -73
- package/gui/e2e/wizard.spec.ts +346 -327
- package/gui/eslint.config.js +26 -26
- package/gui/index.html +17 -17
- package/gui/package-lock.json +3079 -3118
- package/gui/package.json +36 -36
- package/gui/playwright.config.ts +41 -41
- package/gui/public/app_logo.png +0 -0
- package/gui/public/icons.svg +24 -24
- package/gui/src/App.css +1 -1
- package/gui/src/App.tsx +3407 -2722
- package/gui/src/assets/vite.svg +1 -1
- package/gui/src/features/changes/ChangesViewer.tsx +388 -388
- package/gui/src/features/knowledge/KnowledgeBase.tsx +84 -84
- package/gui/src/features/onboarding/OnboardingWizard.tsx +230 -230
- package/gui/src/features/plan/ImplementationPlan.tsx +32 -32
- package/gui/src/features/services/ServiceConsole.tsx +250 -250
- package/gui/src/features/sessions/SessionHistory.tsx +195 -195
- package/gui/src/features/workspace/WorkspaceList.tsx +666 -666
- package/gui/src/index.css +152 -110
- package/gui/src/main.tsx +94 -10
- package/gui/src/types.ts +62 -62
- package/gui/tsconfig.app.json +25 -25
- package/gui/tsconfig.json +7 -7
- package/gui/tsconfig.node.json +24 -24
- package/gui/vite.config.ts +12 -12
- package/package.json +56 -56
- package/resources/workflows/plan-implement-review.md +8 -0
- package/resources/workflows/research-verify.md +6 -0
- package/resources/workflows/solo-developer.md +3 -0
- package/scripts/simulate-workspaces.ts +55 -55
- package/src/analyzers/detect-apis.ts +290 -290
- package/src/analyzers/detect-deps.ts +315 -315
- package/src/analyzers/detect-existing.ts +74 -74
- package/src/analyzers/detect-ports.ts +110 -110
- package/src/analyzers/index.ts +97 -97
- package/src/analyzers/messaging-analyzer.ts +254 -254
- package/src/analyzers/readme-summarizer.ts +102 -102
- package/src/analyzers/run-analyzer.ts +269 -269
- package/src/analyzers/tech-stack.ts +283 -283
- package/src/commands/add-repo.ts +157 -157
- package/src/commands/commands.test.ts +155 -155
- package/src/commands/commit.ts +131 -131
- package/src/commands/create.ts +207 -207
- package/src/commands/desktop.ts +128 -0
- package/src/commands/diff.ts +125 -125
- package/src/commands/doctor.ts +357 -357
- package/src/commands/handoff.ts +266 -266
- package/src/commands/init.ts +134 -134
- package/src/commands/list.ts +46 -46
- package/src/commands/logs.ts +63 -63
- package/src/commands/mcp.ts +92 -92
- package/src/commands/open.ts +129 -129
- package/src/commands/pack.ts +73 -73
- package/src/commands/refresh.ts +147 -147
- package/src/commands/remove.ts +98 -98
- package/src/commands/start.ts +117 -117
- package/src/commands/status.ts +54 -54
- package/src/commands/stop.ts +55 -55
- package/src/commands/sync.ts +151 -153
- package/src/commands/tui.ts +424 -0
- package/src/commands/ui.ts +111 -47
- package/src/core/config.test.ts +96 -96
- package/src/core/config.ts +115 -115
- package/src/core/graph.ts +344 -344
- package/src/core/packer.test.ts +99 -99
- package/src/core/packer.ts +107 -107
- package/src/core/scanner.test.ts +61 -61
- package/src/core/scanner.ts +91 -91
- package/src/core/workspace.ts +380 -380
- package/src/core/worktree.ts +120 -120
- package/src/generators/antigravity.ts +32 -32
- package/src/generators/base.ts +240 -227
- package/src/generators/claude.ts +34 -34
- package/src/generators/codex.ts +48 -48
- package/src/generators/copilot.ts +56 -56
- package/src/generators/cursor.ts +44 -44
- package/src/generators/index.ts +250 -250
- package/src/generators/map-generator.test.ts +159 -159
- package/src/generators/map-generator.ts +542 -542
- package/src/generators/plan-generator.ts +481 -481
- package/src/generators/skills-generator.ts +259 -259
- package/src/index.ts +426 -382
- package/src/mcp/server.ts +294 -294
- package/src/orchestration/detect.ts +313 -313
- package/src/orchestration/index.ts +7 -7
- package/src/orchestration/runner.ts +283 -283
- package/src/server.test.ts +555 -464
- package/src/server.ts +1308 -1104
- package/src/types.ts +408 -403
- package/src/utils/detect-ai.test.ts +44 -44
- package/src/utils/detect-ai.ts +84 -84
- package/src/utils/detect-editors.test.ts +48 -48
- package/src/utils/detect-editors.ts +57 -57
- package/src/utils/git.test.ts +74 -74
- package/src/utils/git.ts +117 -61
- package/src/utils/local-ai.test.ts +130 -130
- package/src/utils/local-ai.ts +111 -111
- package/src/utils/multi-git.ts +313 -306
- package/src/utils/prompts.ts +209 -209
- package/src/utils/session-finder.ts +483 -483
- package/src/utils/system-scanner.test.ts +89 -89
- package/src/utils/system-scanner.ts +96 -96
- package/src/utils/update-check.ts +309 -275
- package/src/utils/workflows.test.ts +114 -0
- package/src/utils/workflows.ts +178 -0
- package/tsconfig.json +19 -19
- package/vitest.config.ts +14 -14
- package/dist/gui/assets/index-CFWwqFux.js +0 -23
- package/dist/gui/assets/index-Dvc9QMvl.css +0 -2
|
@@ -1,102 +1,102 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module analyzers/readme-summarizer
|
|
3
|
-
* Extracts a summary from a repository's README.md file.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as fs from 'node:fs/promises';
|
|
7
|
-
import * as path from 'node:path';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Reads a repository's README.md and extracts the first meaningful
|
|
11
|
-
* prose paragraph as a summary. Looks for README.md (case-insensitive).
|
|
12
|
-
*
|
|
13
|
-
* It automatically strips badges, TOC lists, headers, HTML tags, and redacts ClientIDs/Secrets.
|
|
14
|
-
*
|
|
15
|
-
* @param repoPath - Absolute path to the repository root.
|
|
16
|
-
* @returns The extracted summary text, or null if no README is found.
|
|
17
|
-
*/
|
|
18
|
-
export async function extractReadmeSummary(
|
|
19
|
-
repoPath: string,
|
|
20
|
-
): Promise<string | null> {
|
|
21
|
-
// Try common README filenames
|
|
22
|
-
const candidates = ['README.md', 'readme.md', 'Readme.md', 'README.MD', 'README'];
|
|
23
|
-
|
|
24
|
-
let content: string | null = null;
|
|
25
|
-
|
|
26
|
-
for (const filename of candidates) {
|
|
27
|
-
try {
|
|
28
|
-
content = await fs.readFile(path.join(repoPath, filename), 'utf-8');
|
|
29
|
-
break;
|
|
30
|
-
} catch {
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (!content) return null;
|
|
36
|
-
|
|
37
|
-
// 1. Strip code blocks to avoid false matching on secrets/prose
|
|
38
|
-
content = content.replace(/```[\s\S]*?```/g, '');
|
|
39
|
-
|
|
40
|
-
// 2. Scrub ClientIDs/Secrets/Credentials
|
|
41
|
-
// Match standard secret/ID patterns: GUIDs, client_id/secret variables, hex keys
|
|
42
|
-
const clientSecretsRegex = /(client_id|client_secret|appid|secret|password|key|token|credential)\s*[:=]\s*["']?[a-zA-Z0-9-_\/\+\.]{16,}["']?/gi;
|
|
43
|
-
const guidRegex = /[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/g;
|
|
44
|
-
|
|
45
|
-
content = content
|
|
46
|
-
.replace(clientSecretsRegex, (match, p1) => `${p1}: [REDACTED]`)
|
|
47
|
-
.replace(guidRegex, '[REDACTED_ID]');
|
|
48
|
-
|
|
49
|
-
// 3. Process line-by-line to find the first prose paragraph
|
|
50
|
-
const lines = content.split('\n');
|
|
51
|
-
const proseLines: string[] = [];
|
|
52
|
-
|
|
53
|
-
for (const line of lines) {
|
|
54
|
-
const trimmed = line.trim();
|
|
55
|
-
|
|
56
|
-
// Skip empty lines
|
|
57
|
-
if (!trimmed) {
|
|
58
|
-
if (proseLines.length > 0) {
|
|
59
|
-
// We found a paragraph and hit an empty line. Let's finish!
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Skip HTML tags
|
|
66
|
-
if (trimmed.startsWith('<') && trimmed.endsWith('>')) continue;
|
|
67
|
-
|
|
68
|
-
// Skip badges
|
|
69
|
-
if (trimmed.startsWith('[ or 1. [About](#about) or * 1. [Section](#section)
|
|
79
|
-
if (/^(?:[-*+]\s*|\d+\.\s*)(\d+\.)?\s*\[[^\]]+\]\(#[^)]+\)/.test(trimmed)) {
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Skip link-only lines (e.g., "[API Docs](https://...)")
|
|
84
|
-
if (/^\[[^\]]+\]\([^)]+\)$/.test(trimmed)) {
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Skip standard bullet and numbered lists if we are searching for prose (e.g. at the top of README before prose)
|
|
89
|
-
if (proseLines.length === 0 && (/^[-*+]\s+/.test(trimmed) || /^\d+\.\s+/.test(trimmed))) {
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Accumulate prose lines
|
|
94
|
-
proseLines.push(line);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const summary = proseLines.join(' ').replace(/\s+/g, ' ').trim();
|
|
98
|
-
if (!summary) return null;
|
|
99
|
-
|
|
100
|
-
// Limit the summary to a concise paragraph (first 250 characters)
|
|
101
|
-
return summary.length > 250 ? summary.slice(0, 250) + '...' : summary;
|
|
102
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @module analyzers/readme-summarizer
|
|
3
|
+
* Extracts a summary from a repository's README.md file.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import * as fs from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Reads a repository's README.md and extracts the first meaningful
|
|
11
|
+
* prose paragraph as a summary. Looks for README.md (case-insensitive).
|
|
12
|
+
*
|
|
13
|
+
* It automatically strips badges, TOC lists, headers, HTML tags, and redacts ClientIDs/Secrets.
|
|
14
|
+
*
|
|
15
|
+
* @param repoPath - Absolute path to the repository root.
|
|
16
|
+
* @returns The extracted summary text, or null if no README is found.
|
|
17
|
+
*/
|
|
18
|
+
export async function extractReadmeSummary(
|
|
19
|
+
repoPath: string,
|
|
20
|
+
): Promise<string | null> {
|
|
21
|
+
// Try common README filenames
|
|
22
|
+
const candidates = ['README.md', 'readme.md', 'Readme.md', 'README.MD', 'README'];
|
|
23
|
+
|
|
24
|
+
let content: string | null = null;
|
|
25
|
+
|
|
26
|
+
for (const filename of candidates) {
|
|
27
|
+
try {
|
|
28
|
+
content = await fs.readFile(path.join(repoPath, filename), 'utf-8');
|
|
29
|
+
break;
|
|
30
|
+
} catch {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!content) return null;
|
|
36
|
+
|
|
37
|
+
// 1. Strip code blocks to avoid false matching on secrets/prose
|
|
38
|
+
content = content.replace(/```[\s\S]*?```/g, '');
|
|
39
|
+
|
|
40
|
+
// 2. Scrub ClientIDs/Secrets/Credentials
|
|
41
|
+
// Match standard secret/ID patterns: GUIDs, client_id/secret variables, hex keys
|
|
42
|
+
const clientSecretsRegex = /(client_id|client_secret|appid|secret|password|key|token|credential)\s*[:=]\s*["']?[a-zA-Z0-9-_\/\+\.]{16,}["']?/gi;
|
|
43
|
+
const guidRegex = /[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/g;
|
|
44
|
+
|
|
45
|
+
content = content
|
|
46
|
+
.replace(clientSecretsRegex, (match, p1) => `${p1}: [REDACTED]`)
|
|
47
|
+
.replace(guidRegex, '[REDACTED_ID]');
|
|
48
|
+
|
|
49
|
+
// 3. Process line-by-line to find the first prose paragraph
|
|
50
|
+
const lines = content.split('\n');
|
|
51
|
+
const proseLines: string[] = [];
|
|
52
|
+
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
const trimmed = line.trim();
|
|
55
|
+
|
|
56
|
+
// Skip empty lines
|
|
57
|
+
if (!trimmed) {
|
|
58
|
+
if (proseLines.length > 0) {
|
|
59
|
+
// We found a paragraph and hit an empty line. Let's finish!
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Skip HTML tags
|
|
66
|
+
if (trimmed.startsWith('<') && trimmed.endsWith('>')) continue;
|
|
67
|
+
|
|
68
|
+
// Skip badges
|
|
69
|
+
if (trimmed.startsWith('[ or 1. [About](#about) or * 1. [Section](#section)
|
|
79
|
+
if (/^(?:[-*+]\s*|\d+\.\s*)(\d+\.)?\s*\[[^\]]+\]\(#[^)]+\)/.test(trimmed)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Skip link-only lines (e.g., "[API Docs](https://...)")
|
|
84
|
+
if (/^\[[^\]]+\]\([^)]+\)$/.test(trimmed)) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Skip standard bullet and numbered lists if we are searching for prose (e.g. at the top of README before prose)
|
|
89
|
+
if (proseLines.length === 0 && (/^[-*+]\s+/.test(trimmed) || /^\d+\.\s+/.test(trimmed))) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Accumulate prose lines
|
|
94
|
+
proseLines.push(line);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const summary = proseLines.join(' ').replace(/\s+/g, ' ').trim();
|
|
98
|
+
if (!summary) return null;
|
|
99
|
+
|
|
100
|
+
// Limit the summary to a concise paragraph (first 250 characters)
|
|
101
|
+
return summary.length > 250 ? summary.slice(0, 250) + '...' : summary;
|
|
102
|
+
}
|