argustack 0.1.6 → 0.1.7
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 +25 -12
- package/dist/adapters/git/mapper.d.ts +1 -1
- package/dist/adapters/git/mapper.js +1 -1
- package/dist/adapters/github/mapper.d.ts +1 -1
- package/dist/adapters/github/mapper.js +1 -1
- package/dist/cli/init/generators.d.ts +6 -0
- package/dist/cli/init/generators.d.ts.map +1 -0
- package/dist/cli/init/generators.js +153 -0
- package/dist/cli/init/generators.js.map +1 -0
- package/dist/cli/init/index.d.ts +4 -0
- package/dist/cli/init/index.d.ts.map +1 -0
- package/dist/cli/init/index.js +254 -0
- package/dist/cli/init/index.js.map +1 -0
- package/dist/cli/init/setup-csv.d.ts +4 -0
- package/dist/cli/init/setup-csv.d.ts.map +1 -0
- package/dist/cli/init/setup-csv.js +52 -0
- package/dist/cli/init/setup-csv.js.map +1 -0
- package/dist/cli/init/setup-db.d.ts +4 -0
- package/dist/cli/init/setup-db.d.ts.map +1 -0
- package/dist/cli/init/setup-db.js +33 -0
- package/dist/cli/init/setup-db.js.map +1 -0
- package/dist/cli/init/setup-git.d.ts +4 -0
- package/dist/cli/init/setup-git.d.ts.map +1 -0
- package/dist/cli/init/setup-git.js +244 -0
- package/dist/cli/init/setup-git.js.map +1 -0
- package/dist/cli/init/setup-github.d.ts +4 -0
- package/dist/cli/init/setup-github.d.ts.map +1 -0
- package/dist/cli/init/setup-github.js +102 -0
- package/dist/cli/init/setup-github.js.map +1 -0
- package/dist/cli/init/setup-jira.d.ts +4 -0
- package/dist/cli/init/setup-jira.d.ts.map +1 -0
- package/dist/cli/init/setup-jira.js +124 -0
- package/dist/cli/init/setup-jira.js.map +1 -0
- package/dist/cli/init/types.d.ts +59 -0
- package/dist/cli/init/types.d.ts.map +1 -0
- package/dist/cli/init/types.js +31 -0
- package/dist/cli/init/types.js.map +1 -0
- package/dist/core/types/config.js +1 -1
- package/dist/core/types/config.js.map +1 -1
- package/dist/mcp/helpers.d.ts +24 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +73 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -3
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +12 -1579
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/estimate.d.ts +3 -0
- package/dist/mcp/tools/estimate.d.ts.map +1 -0
- package/dist/mcp/tools/estimate.js +478 -0
- package/dist/mcp/tools/estimate.js.map +1 -0
- package/dist/mcp/tools/issue.d.ts +3 -0
- package/dist/mcp/tools/issue.d.ts.map +1 -0
- package/dist/mcp/tools/issue.js +468 -0
- package/dist/mcp/tools/issue.js.map +1 -0
- package/dist/mcp/tools/query.d.ts +3 -0
- package/dist/mcp/tools/query.d.ts.map +1 -0
- package/dist/mcp/tools/query.js +319 -0
- package/dist/mcp/tools/query.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +3 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +61 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/workspace.d.ts +3 -0
- package/dist/mcp/tools/workspace.d.ts.map +1 -0
- package/dist/mcp/tools/workspace.js +86 -0
- package/dist/mcp/tools/workspace.js.map +1 -0
- package/dist/mcp/types.d.ts +157 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ Argustack builds this knowledge base from your project's sources of truth:
|
|
|
41
41
|
> *Is this bug still relevant or already fixed in code?*
|
|
42
42
|
> *Was the feature implemented as described in the ticket?*
|
|
43
43
|
> *Who worked on this module and what changed last month?*
|
|
44
|
-
> *Which commits and PRs reference ticket
|
|
44
|
+
> *Which commits and PRs reference ticket PROJ-123?*
|
|
45
45
|
> *Who approved the PR and what was the review feedback?*
|
|
46
46
|
|
|
47
47
|
## How it works
|
|
@@ -218,7 +218,7 @@ Every custom field is preserved exactly as Jira returns it. 500 custom fields? A
|
|
|
218
218
|
| `commit_files` | Per-file changes — path, status, additions, deletions |
|
|
219
219
|
| `commit_issue_refs` | Cross-reference: commit ↔ Jira issue (extracted from commit messages) |
|
|
220
220
|
|
|
221
|
-
Commit messages mentioning issue keys like `
|
|
221
|
+
Commit messages mentioning issue keys like `PROJ-123` or `PROJ-45` are automatically linked to Jira issues.
|
|
222
222
|
|
|
223
223
|
### GitHub tables
|
|
224
224
|
|
|
@@ -233,7 +233,7 @@ Select "GitHub" during `argustack init` or add later with `argustack source add
|
|
|
233
233
|
| `pr_issue_refs` | Cross-reference: PR ↔ Jira issue (extracted from PR title and body) |
|
|
234
234
|
| `releases` | GitHub releases with tags, notes, and full-text search |
|
|
235
235
|
|
|
236
|
-
PR titles and bodies mentioning issue keys like `
|
|
236
|
+
PR titles and bodies mentioning issue keys like `PROJ-123` are automatically linked to Jira issues — just like commits.
|
|
237
237
|
|
|
238
238
|
## MCP Tools
|
|
239
239
|
|
|
@@ -271,7 +271,7 @@ When connected to Claude, these tools are available:
|
|
|
271
271
|
|------|-------------|
|
|
272
272
|
| `issue_timeline` | Chronological timeline — changelogs + commits + PRs for one issue |
|
|
273
273
|
| `semantic_search` | Find similar issues by meaning (pgvector embeddings) |
|
|
274
|
-
| `estimate` | Predict
|
|
274
|
+
| `estimate` | Predict task duration per developer. With effort data: "without bugs" / "with bugs" predictions. With CSV only: resolution timeline in business days (lead time, not active dev) |
|
|
275
275
|
|
|
276
276
|
### System tools
|
|
277
277
|
|
|
@@ -403,15 +403,27 @@ DB_NAME=argustack
|
|
|
403
403
|
|
|
404
404
|
**`.env` is in `.gitignore`** — if you accidentally run `git add .`, your credentials won't be committed.
|
|
405
405
|
|
|
406
|
+
## Architecture — Hexagonal (Ports & Adapters)
|
|
407
|
+
|
|
408
|
+
```
|
|
409
|
+
Driving adapters (entries): cli/, mcp/
|
|
410
|
+
Driven adapters (external systems): adapters/jira/, adapters/git/, adapters/github/, adapters/postgres/
|
|
411
|
+
|
|
412
|
+
Dependency Rule: cli/,mcp/ → use-cases/ → core/ports ← adapters/
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
Core has zero dependencies — only pure TypeScript types and interfaces. Adapters implement core ports and are independently replaceable.
|
|
416
|
+
|
|
406
417
|
## Tech Stack
|
|
407
418
|
|
|
408
|
-
- TypeScript / Node.js
|
|
409
|
-
- Commander.js — CLI
|
|
410
|
-
-
|
|
411
|
-
-
|
|
412
|
-
-
|
|
413
|
-
-
|
|
414
|
-
-
|
|
419
|
+
- TypeScript / Node.js — Hexagonal Architecture
|
|
420
|
+
- Commander.js — CLI (driving adapter)
|
|
421
|
+
- MCP SDK — Claude integration (driving adapter)
|
|
422
|
+
- jira.js — Jira REST API (driven adapter)
|
|
423
|
+
- Octokit — GitHub REST API (driven adapter)
|
|
424
|
+
- es-git — native Git bindings, N-API, powered by libgit2 (driven adapter)
|
|
425
|
+
- csv-parse — streaming RFC 4180 CSV parser (driven adapter)
|
|
426
|
+
- PostgreSQL 16 + pgvector — storage + vector search (driven adapter)
|
|
415
427
|
- Docker — database infrastructure
|
|
416
428
|
|
|
417
429
|
## Roadmap
|
|
@@ -424,9 +436,10 @@ DB_NAME=argustack
|
|
|
424
436
|
- [x] Cross-source timeline (issue_timeline: changelogs + commits + PRs)
|
|
425
437
|
- [x] Multi-repo Git support (multiple repos per workspace, `GIT_REPO_PATHS`)
|
|
426
438
|
- [x] Progress indicators during sync (e.g. `150/506 issues (30%)`)
|
|
439
|
+
- [x] CSV import (Jira export without API token)
|
|
440
|
+
- [x] Estimate tool — task duration prediction with data-source awareness
|
|
427
441
|
- [ ] Database adapter (schema, sample data)
|
|
428
442
|
- [ ] Cross-source analysis (Jira ticket vs actual code vs DB state)
|
|
429
|
-
- [x] CSV import (Jira export without API token)
|
|
430
443
|
|
|
431
444
|
## License
|
|
432
445
|
|
|
@@ -4,7 +4,7 @@ export declare function mapCommit(esCommit: EsGitCommit, repoPath: string): Comm
|
|
|
4
4
|
export declare function mapDiffDelta(delta: DiffDelta, commitHash: string, additions: number, deletions: number): CommitFile;
|
|
5
5
|
/**
|
|
6
6
|
* Extract issue references from a commit message.
|
|
7
|
-
* Matches patterns like:
|
|
7
|
+
* Matches patterns like: PROJ-123, PROJ-45, ABC-1
|
|
8
8
|
* Returns unique keys, uppercased.
|
|
9
9
|
*/
|
|
10
10
|
export declare function extractIssueRefs(commitHash: string, message: string): CommitIssueRef[];
|
|
@@ -28,7 +28,7 @@ export function mapDiffDelta(delta, commitHash, additions, deletions) {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Extract issue references from a commit message.
|
|
31
|
-
* Matches patterns like:
|
|
31
|
+
* Matches patterns like: PROJ-123, PROJ-45, ABC-1
|
|
32
32
|
* Returns unique keys, uppercased.
|
|
33
33
|
*/
|
|
34
34
|
export function extractIssueRefs(commitHash, message) {
|
|
@@ -6,7 +6,7 @@ export declare function mapPrFile(raw: Record<string, unknown>, prNumber: number
|
|
|
6
6
|
export declare function mapRelease(raw: Record<string, unknown>, repoFullName: string): Release;
|
|
7
7
|
/**
|
|
8
8
|
* Extract issue references from PR title and body.
|
|
9
|
-
* Matches Jira-style keys:
|
|
9
|
+
* Matches Jira-style keys: PROJ-123, PROJ-45
|
|
10
10
|
*/
|
|
11
11
|
export declare function extractPrIssueRefs(prNumber: number, repoFullName: string, title: string, body: string | null): PullRequestIssueRef[];
|
|
12
12
|
//# sourceMappingURL=mapper.d.ts.map
|
|
@@ -98,7 +98,7 @@ export function mapRelease(raw, repoFullName) {
|
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
100
|
* Extract issue references from PR title and body.
|
|
101
|
-
* Matches Jira-style keys:
|
|
101
|
+
* Matches Jira-style keys: PROJ-123, PROJ-45
|
|
102
102
|
*/
|
|
103
103
|
export function extractPrIssueRefs(prNumber, repoFullName, title, body) {
|
|
104
104
|
const pattern = /\b([A-Z][A-Z0-9]+-\d+)\b/g;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { JiraSetupResult, GitSetupResult, GitHubSetupResult, CsvSetupResult, DbSetupResult } from './types.js';
|
|
2
|
+
export declare function generateEnv(jira: JiraSetupResult | null, git: GitSetupResult | null, github: GitHubSetupResult | null, csv: CsvSetupResult | null, db: DbSetupResult | null, argustackDbPort: number): string;
|
|
3
|
+
export declare function generateDockerCompose(dbPort: number, pgwebPort: number): string;
|
|
4
|
+
export declare function createWorkspaceFiles(workspaceDir: string, jira: JiraSetupResult | null, git: GitSetupResult | null, github: GitHubSetupResult | null, csv: CsvSetupResult | null, db: DbSetupResult | null, dbPort: number, pgwebPort: number): void;
|
|
5
|
+
export declare function printSummary(workspaceDir: string, jira: JiraSetupResult | null, git: GitSetupResult | null, github: GitHubSetupResult | null, csv: CsvSetupResult | null, db: DbSetupResult | null, pgwebPort: number, willAutoStart: boolean): void;
|
|
6
|
+
//# sourceMappingURL=generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../../src/cli/init/generators.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAYpB,wBAAgB,WAAW,CACzB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,GAAG,EAAE,cAAc,GAAG,IAAI,EAC1B,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAChC,GAAG,EAAE,cAAc,GAAG,IAAI,EAC1B,EAAE,EAAE,aAAa,GAAG,IAAI,EACxB,eAAe,EAAE,MAAM,GACtB,MAAM,CAiER;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAmC/E;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,GAAG,EAAE,cAAc,GAAG,IAAI,EAC1B,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAChC,GAAG,EAAE,cAAc,GAAG,IAAI,EAC1B,EAAE,EAAE,aAAa,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,IAAI,CAiDN;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,GAAG,EAAE,cAAc,GAAG,IAAI,EAC1B,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAChC,GAAG,EAAE,cAAc,GAAG,IAAI,EAC1B,EAAE,EAAE,aAAa,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,GACrB,IAAI,CA4CN"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync, copyFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { createEmptyConfig, addSource, writeConfig } from '../../workspace/config.js';
|
|
6
|
+
import { resolveServerPath } from '../mcp-install.js';
|
|
7
|
+
const currentDir = fileURLToPath(new URL('.', import.meta.url));
|
|
8
|
+
function getTemplatesDir() {
|
|
9
|
+
const templatesDir = resolve(currentDir, '..', '..', '..', 'templates');
|
|
10
|
+
if (!existsSync(templatesDir)) {
|
|
11
|
+
throw new Error(`Templates directory not found: ${templatesDir}`);
|
|
12
|
+
}
|
|
13
|
+
return templatesDir;
|
|
14
|
+
}
|
|
15
|
+
export function generateEnv(jira, git, github, csv, db, argustackDbPort) {
|
|
16
|
+
const lines = [];
|
|
17
|
+
if (jira) {
|
|
18
|
+
lines.push('# === Jira ===', `JIRA_URL=${jira.jiraUrl}`, `JIRA_EMAIL=${jira.jiraEmail}`, `JIRA_API_TOKEN=${jira.jiraToken}`, `JIRA_PROJECTS=${jira.jiraProjects.join(',')}`, '');
|
|
19
|
+
}
|
|
20
|
+
if (git) {
|
|
21
|
+
lines.push('# === Git ===', `GIT_REPO_PATHS=${git.gitRepoPaths.join(',')}`, '');
|
|
22
|
+
}
|
|
23
|
+
if (github) {
|
|
24
|
+
lines.push('# === GitHub ===', `GITHUB_TOKEN=${github.githubToken}`, `GITHUB_OWNER=${github.githubOwner}`, `GITHUB_REPO=${github.githubRepo}`, '');
|
|
25
|
+
}
|
|
26
|
+
if (csv) {
|
|
27
|
+
lines.push('# === Jira CSV ===', `CSV_FILE_PATH=${csv.csvFilePath}`, '');
|
|
28
|
+
}
|
|
29
|
+
if (db) {
|
|
30
|
+
lines.push('# === Target Database (project DB to analyze) ===', `TARGET_DB_HOST=${db.targetDbHost}`, `TARGET_DB_PORT=${db.targetDbPort}`, `TARGET_DB_USER=${db.targetDbUser}`, `TARGET_DB_PASSWORD=${db.targetDbPassword}`, `TARGET_DB_NAME=${db.targetDbName}`, '');
|
|
31
|
+
}
|
|
32
|
+
lines.push('# === Argustack internal PostgreSQL (match docker-compose.yml) ===', 'DB_HOST=localhost', `DB_PORT=${argustackDbPort}`, 'DB_USER=argustack', 'DB_PASSWORD=argustack_local', 'DB_NAME=argustack', '', '# === OpenAI embeddings (optional, for semantic search) ===', '# OPENAI_API_KEY=sk-...');
|
|
33
|
+
return lines.join('\n') + '\n';
|
|
34
|
+
}
|
|
35
|
+
export function generateDockerCompose(dbPort, pgwebPort) {
|
|
36
|
+
return `services:
|
|
37
|
+
db:
|
|
38
|
+
image: pgvector/pgvector:pg16
|
|
39
|
+
container_name: argustack-db
|
|
40
|
+
ports:
|
|
41
|
+
- "${dbPort}:5432"
|
|
42
|
+
environment:
|
|
43
|
+
POSTGRES_USER: argustack
|
|
44
|
+
POSTGRES_PASSWORD: argustack_local
|
|
45
|
+
POSTGRES_DB: argustack
|
|
46
|
+
volumes:
|
|
47
|
+
- argustack-data:/var/lib/postgresql/data
|
|
48
|
+
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
|
|
49
|
+
healthcheck:
|
|
50
|
+
test: ["CMD-SHELL", "pg_isready -U argustack"]
|
|
51
|
+
interval: 2s
|
|
52
|
+
timeout: 5s
|
|
53
|
+
retries: 15
|
|
54
|
+
|
|
55
|
+
pgweb:
|
|
56
|
+
image: sosedoff/pgweb
|
|
57
|
+
container_name: argustack-pgweb
|
|
58
|
+
ports:
|
|
59
|
+
- "${pgwebPort}:8081"
|
|
60
|
+
environment:
|
|
61
|
+
PGWEB_DATABASE_URL: postgres://argustack:argustack_local@db:5432/argustack?sslmode=disable
|
|
62
|
+
depends_on:
|
|
63
|
+
db:
|
|
64
|
+
condition: service_healthy
|
|
65
|
+
restart: on-failure
|
|
66
|
+
|
|
67
|
+
volumes:
|
|
68
|
+
argustack-data:
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
export function createWorkspaceFiles(workspaceDir, jira, git, github, csv, db, dbPort, pgwebPort) {
|
|
72
|
+
const templatesDir = getTemplatesDir();
|
|
73
|
+
mkdirSync(workspaceDir, { recursive: true });
|
|
74
|
+
mkdirSync(join(workspaceDir, '.argustack'), { recursive: true });
|
|
75
|
+
mkdirSync(join(workspaceDir, 'db'), { recursive: true });
|
|
76
|
+
mkdirSync(join(workspaceDir, 'data'), { recursive: true });
|
|
77
|
+
let config = createEmptyConfig();
|
|
78
|
+
if (jira) {
|
|
79
|
+
config = addSource(config, 'jira');
|
|
80
|
+
}
|
|
81
|
+
if (git) {
|
|
82
|
+
config = addSource(config, 'git');
|
|
83
|
+
}
|
|
84
|
+
if (github) {
|
|
85
|
+
config = addSource(config, 'github');
|
|
86
|
+
}
|
|
87
|
+
if (csv) {
|
|
88
|
+
config = addSource(config, 'csv');
|
|
89
|
+
}
|
|
90
|
+
if (db) {
|
|
91
|
+
config = addSource(config, 'db');
|
|
92
|
+
}
|
|
93
|
+
writeConfig(workspaceDir, config);
|
|
94
|
+
writeFileSync(join(workspaceDir, '.env'), generateEnv(jira, git, github, csv, db, dbPort));
|
|
95
|
+
writeFileSync(join(workspaceDir, 'docker-compose.yml'), generateDockerCompose(dbPort, pgwebPort));
|
|
96
|
+
copyFileSync(join(templatesDir, 'init.sql'), join(workspaceDir, 'db', 'init.sql'));
|
|
97
|
+
copyFileSync(join(templatesDir, 'gitignore'), join(workspaceDir, '.gitignore'));
|
|
98
|
+
try {
|
|
99
|
+
const serverPath = resolveServerPath();
|
|
100
|
+
const mcpConfig = {
|
|
101
|
+
mcpServers: {
|
|
102
|
+
argustack: {
|
|
103
|
+
command: 'node',
|
|
104
|
+
args: [serverPath],
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
writeFileSync(join(workspaceDir, '.mcp.json'), JSON.stringify(mcpConfig, null, 2) + '\n');
|
|
109
|
+
}
|
|
110
|
+
catch { /* optional file, ignore */ }
|
|
111
|
+
}
|
|
112
|
+
export function printSummary(workspaceDir, jira, git, github, csv, db, pgwebPort, willAutoStart) {
|
|
113
|
+
console.log('');
|
|
114
|
+
console.log(chalk.green.bold(' Done! Your workspace is ready.'));
|
|
115
|
+
console.log('');
|
|
116
|
+
console.log(chalk.dim(' Sources configured:'));
|
|
117
|
+
if (jira) {
|
|
118
|
+
console.log(` ${chalk.green('✓')} Jira — ${jira.jiraUrl}`);
|
|
119
|
+
}
|
|
120
|
+
if (git) {
|
|
121
|
+
for (const p of git.gitRepoPaths) {
|
|
122
|
+
console.log(` ${chalk.green('✓')} Git — ${p}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (github) {
|
|
126
|
+
console.log(` ${chalk.green('✓')} GitHub — ${github.githubOwner}/${github.githubRepo}`);
|
|
127
|
+
}
|
|
128
|
+
if (csv) {
|
|
129
|
+
console.log(` ${chalk.green('✓')} Jira CSV — ${csv.csvFilePath}`);
|
|
130
|
+
}
|
|
131
|
+
if (db) {
|
|
132
|
+
console.log(` ${chalk.green('✓')} Database — ${db.targetDbHost}:${db.targetDbPort}`);
|
|
133
|
+
}
|
|
134
|
+
if (!jira && !git && !github && !csv && !db) {
|
|
135
|
+
console.log(` ${chalk.yellow('—')} None yet. Use ${chalk.cyan('argustack source add <type>')}`);
|
|
136
|
+
}
|
|
137
|
+
if (!willAutoStart) {
|
|
138
|
+
console.log('');
|
|
139
|
+
console.log(chalk.dim(' Next steps:'));
|
|
140
|
+
console.log(` ${chalk.cyan('cd')} ${workspaceDir}`);
|
|
141
|
+
console.log(` ${chalk.cyan('docker compose up -d')} # start database`);
|
|
142
|
+
if (jira) {
|
|
143
|
+
console.log(` ${chalk.cyan('argustack sync jira')} # sync from Jira`);
|
|
144
|
+
}
|
|
145
|
+
console.log(` ${chalk.cyan(`http://localhost:${pgwebPort}`)} # browse data in pgweb`);
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log(chalk.dim(' Claude integration:'));
|
|
148
|
+
console.log(` Claude Code: ${chalk.green('Open this folder — MCP tools ready!')}`);
|
|
149
|
+
console.log(` Claude Desktop: ${chalk.cyan('argustack mcp install')}`);
|
|
150
|
+
}
|
|
151
|
+
console.log('');
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../src/cli/init/generators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/init/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AASpB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAmQ5C,wBAAsB,OAAO,CAAC,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { input, confirm, checkbox } from '@inquirer/prompts';
|
|
2
|
+
import { execSync } from 'node:child_process';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { isWorkspace } from '../../workspace/resolver.js';
|
|
6
|
+
import { ALL_SOURCES, SOURCE_META } from '../../core/types/index.js';
|
|
7
|
+
import { DEFAULT_DB_PORT, DEFAULT_PGWEB_PORT, resolvePath, validatePort, getErrorMsg } from './types.js';
|
|
8
|
+
import { setupJiraInteractive, setupJiraFromFlags } from './setup-jira.js';
|
|
9
|
+
import { setupGitInteractive, setupGitFromFlags } from './setup-git.js';
|
|
10
|
+
import { setupGithubInteractive, setupGithubFromFlags } from './setup-github.js';
|
|
11
|
+
import { setupCsvInteractive, setupCsvFromFlags } from './setup-csv.js';
|
|
12
|
+
import { setupDbInteractive, setupDbFromFlags } from './setup-db.js';
|
|
13
|
+
import { createWorkspaceFiles, printSummary } from './generators.js';
|
|
14
|
+
async function startAndSync(workspaceDir, hasJira, hasGit, hasGithub, csv, pgwebPort) {
|
|
15
|
+
const spinnerDb = ora('Starting Docker containers...').start();
|
|
16
|
+
try {
|
|
17
|
+
execSync('docker compose up -d', { cwd: workspaceDir, stdio: 'pipe' });
|
|
18
|
+
spinnerDb.succeed('Database running!');
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
spinnerDb.fail('Failed to start Docker');
|
|
22
|
+
console.log(chalk.red(` Error: ${getErrorMsg(err)}`));
|
|
23
|
+
console.log(chalk.dim(' Make sure Docker Desktop is running, then:'));
|
|
24
|
+
console.log(chalk.cyan(` cd ${workspaceDir} && docker compose up -d`));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const spinnerWait = ora('Waiting for PostgreSQL...').start();
|
|
28
|
+
const MAX_WAIT_SECONDS = 30;
|
|
29
|
+
for (let i = 0; i < MAX_WAIT_SECONDS; i++) {
|
|
30
|
+
try {
|
|
31
|
+
execSync('docker compose exec -T db pg_isready -U argustack', { cwd: workspaceDir, stdio: 'pipe' });
|
|
32
|
+
spinnerWait.succeed('PostgreSQL ready!');
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
if (i === MAX_WAIT_SECONDS - 1) {
|
|
37
|
+
spinnerWait.fail('PostgreSQL not ready after 30s');
|
|
38
|
+
console.log(chalk.dim(' Try manually: docker compose logs db'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (hasJira) {
|
|
45
|
+
console.log('');
|
|
46
|
+
try {
|
|
47
|
+
const { syncJiraFromInit } = await import('../sync.js');
|
|
48
|
+
await syncJiraFromInit(workspaceDir);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.log(chalk.red(` Jira sync failed: ${getErrorMsg(err)}`));
|
|
52
|
+
console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync jira`));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (hasGit) {
|
|
56
|
+
console.log('');
|
|
57
|
+
try {
|
|
58
|
+
const { syncGitFromInit } = await import('../sync.js');
|
|
59
|
+
await syncGitFromInit(workspaceDir);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
console.log(chalk.red(` Git sync failed: ${getErrorMsg(err)}`));
|
|
63
|
+
console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync git`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (hasGithub) {
|
|
67
|
+
console.log('');
|
|
68
|
+
try {
|
|
69
|
+
const { syncGithubFromInit } = await import('../sync.js');
|
|
70
|
+
await syncGithubFromInit(workspaceDir);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
console.log(chalk.red(` GitHub sync failed: ${getErrorMsg(err)}`));
|
|
74
|
+
console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync github`));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (csv) {
|
|
78
|
+
console.log('');
|
|
79
|
+
try {
|
|
80
|
+
const { syncCsvFromInit } = await import('../sync.js');
|
|
81
|
+
await syncCsvFromInit(workspaceDir, csv.csvFilePath);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
console.log(chalk.red(` CSV import failed: ${getErrorMsg(err)}`));
|
|
85
|
+
console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync csv`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
console.log(chalk.dim(' What\'s next:'));
|
|
89
|
+
console.log(` ${chalk.cyan(`http://localhost:${pgwebPort}`)} # browse data in pgweb`);
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log(chalk.dim(' Claude integration:'));
|
|
92
|
+
console.log(` Claude Code: ${chalk.green('Open this folder — MCP tools ready!')}`);
|
|
93
|
+
console.log(` Claude Desktop: ${chalk.cyan('argustack mcp install')}`);
|
|
94
|
+
console.log('');
|
|
95
|
+
}
|
|
96
|
+
async function runInitNonInteractive(flags) {
|
|
97
|
+
console.log(chalk.bold('\n Argustack — non-interactive setup\n'));
|
|
98
|
+
const workspaceDir = resolvePath(flags.dir ?? process.cwd());
|
|
99
|
+
const selectedSources = flags.source
|
|
100
|
+
? flags.source.split(',').map((s) => s.trim().toLowerCase())
|
|
101
|
+
: [];
|
|
102
|
+
for (const s of selectedSources) {
|
|
103
|
+
if (!ALL_SOURCES.includes(s)) {
|
|
104
|
+
throw new Error(`Unknown source: ${s}. Available: ${ALL_SOURCES.join(', ')}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
let jiraResult = null;
|
|
108
|
+
let gitResult = null;
|
|
109
|
+
let githubResult = null;
|
|
110
|
+
let csvResult = null;
|
|
111
|
+
let dbResult = null;
|
|
112
|
+
for (const source of selectedSources) {
|
|
113
|
+
switch (source) {
|
|
114
|
+
case 'jira':
|
|
115
|
+
jiraResult = await setupJiraFromFlags(flags);
|
|
116
|
+
break;
|
|
117
|
+
case 'git':
|
|
118
|
+
gitResult = setupGitFromFlags(flags);
|
|
119
|
+
break;
|
|
120
|
+
case 'github':
|
|
121
|
+
githubResult = setupGithubFromFlags(flags);
|
|
122
|
+
break;
|
|
123
|
+
case 'csv':
|
|
124
|
+
csvResult = setupCsvFromFlags(flags);
|
|
125
|
+
break;
|
|
126
|
+
case 'db':
|
|
127
|
+
dbResult = setupDbFromFlags(flags);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const dbPort = parseInt(flags.dbPort ?? String(DEFAULT_DB_PORT), 10);
|
|
132
|
+
const pgwebPort = parseInt(flags.pgwebPort ?? String(DEFAULT_PGWEB_PORT), 10);
|
|
133
|
+
const spinner = ora('Creating workspace...').start();
|
|
134
|
+
try {
|
|
135
|
+
createWorkspaceFiles(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, dbPort, pgwebPort);
|
|
136
|
+
spinner.succeed('Workspace created!');
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
spinner.fail('Failed');
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
printSummary(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, pgwebPort, false);
|
|
143
|
+
}
|
|
144
|
+
async function runInitInteractive(flags) {
|
|
145
|
+
console.log('');
|
|
146
|
+
console.log(chalk.bold(' Argustack — workspace setup'));
|
|
147
|
+
console.log(chalk.dim(' Cross-reference Jira + Git + DB to analyze your project.\n'));
|
|
148
|
+
const targetDir = await input({
|
|
149
|
+
message: 'Workspace directory:',
|
|
150
|
+
default: flags.dir ?? process.cwd(),
|
|
151
|
+
validate: (val) => {
|
|
152
|
+
if (!val.trim()) {
|
|
153
|
+
return 'Directory path is required';
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
const workspaceDir = resolvePath(targetDir);
|
|
159
|
+
if (isWorkspace(workspaceDir)) {
|
|
160
|
+
console.log(chalk.yellow(`\n Already an Argustack workspace: ${workspaceDir}`));
|
|
161
|
+
const proceed = await confirm({ message: 'Reinitialize this workspace?', default: false });
|
|
162
|
+
if (!proceed) {
|
|
163
|
+
console.log(chalk.dim(' Cancelled.'));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
console.log('');
|
|
168
|
+
const selectedSources = await checkbox({
|
|
169
|
+
message: 'Which sources do you have access to?',
|
|
170
|
+
choices: ALL_SOURCES.map((s) => ({
|
|
171
|
+
value: s,
|
|
172
|
+
name: SOURCE_META[s].label,
|
|
173
|
+
description: SOURCE_META[s].description,
|
|
174
|
+
})),
|
|
175
|
+
});
|
|
176
|
+
if (selectedSources.length === 0) {
|
|
177
|
+
console.log(chalk.yellow('\n No sources selected. You can add them later with:'));
|
|
178
|
+
console.log(chalk.cyan(' argustack source add jira'));
|
|
179
|
+
console.log(chalk.cyan(' argustack source add git'));
|
|
180
|
+
console.log(chalk.cyan(' argustack source add github'));
|
|
181
|
+
console.log(chalk.cyan(' argustack source add db'));
|
|
182
|
+
const continueAnyway = await confirm({
|
|
183
|
+
message: 'Create workspace without sources?',
|
|
184
|
+
default: true,
|
|
185
|
+
});
|
|
186
|
+
if (!continueAnyway) {
|
|
187
|
+
console.log(chalk.dim(' Cancelled.'));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
let jiraResult = null;
|
|
192
|
+
let gitResult = null;
|
|
193
|
+
let githubResult = null;
|
|
194
|
+
let csvResult = null;
|
|
195
|
+
let dbResult = null;
|
|
196
|
+
for (const source of selectedSources) {
|
|
197
|
+
switch (source) {
|
|
198
|
+
case 'jira':
|
|
199
|
+
jiraResult = await setupJiraInteractive();
|
|
200
|
+
break;
|
|
201
|
+
case 'git':
|
|
202
|
+
gitResult = await setupGitInteractive();
|
|
203
|
+
break;
|
|
204
|
+
case 'github':
|
|
205
|
+
githubResult = await setupGithubInteractive(gitResult?.githubToken, gitResult?.githubRepos);
|
|
206
|
+
break;
|
|
207
|
+
case 'csv':
|
|
208
|
+
csvResult = await setupCsvInteractive();
|
|
209
|
+
break;
|
|
210
|
+
case 'db':
|
|
211
|
+
dbResult = await setupDbInteractive();
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
console.log('');
|
|
216
|
+
console.log(chalk.dim(' Argustack internal database (Docker):'));
|
|
217
|
+
const dbPortStr = await input({
|
|
218
|
+
message: 'PostgreSQL port:', default: flags.dbPort ?? String(DEFAULT_DB_PORT),
|
|
219
|
+
validate: (val) => validatePort(val, 1024),
|
|
220
|
+
});
|
|
221
|
+
const pgwebPortStr = await input({
|
|
222
|
+
message: 'pgweb UI port:', default: flags.pgwebPort ?? String(DEFAULT_PGWEB_PORT),
|
|
223
|
+
validate: (val) => validatePort(val, 1024),
|
|
224
|
+
});
|
|
225
|
+
const dbPort = parseInt(dbPortStr, 10);
|
|
226
|
+
const pgwebPort = parseInt(pgwebPortStr, 10);
|
|
227
|
+
const spinner = ora('Creating workspace...').start();
|
|
228
|
+
try {
|
|
229
|
+
createWorkspaceFiles(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, dbPort, pgwebPort);
|
|
230
|
+
spinner.succeed('Workspace created!');
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
spinner.fail('Failed to create workspace');
|
|
234
|
+
console.log(chalk.red(`\n Error: ${getErrorMsg(err)}`));
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const autoStart = await confirm({
|
|
238
|
+
message: 'Start database and sync now?',
|
|
239
|
+
default: true,
|
|
240
|
+
});
|
|
241
|
+
printSummary(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, pgwebPort, autoStart);
|
|
242
|
+
if (autoStart) {
|
|
243
|
+
await startAndSync(workspaceDir, jiraResult !== null, gitResult !== null, githubResult !== null, csvResult, pgwebPort);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
export async function runInit(flags = {}) {
|
|
247
|
+
if (flags.interactive === false) {
|
|
248
|
+
await runInitNonInteractive(flags);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
await runInitInteractive(flags);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-csv.d.ts","sourceRoot":"","sources":["../../../src/cli/init/setup-csv.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgB5D,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC,CA+BnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,GAAG,IAAI,CAKzE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { input } from '@inquirer/prompts';
|
|
2
|
+
import { readdirSync } from 'node:fs';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { resolvePath } from './types.js';
|
|
6
|
+
async function promptCsvPath() {
|
|
7
|
+
const raw = await input({
|
|
8
|
+
message: 'Path to Jira CSV file:',
|
|
9
|
+
validate: (val) => {
|
|
10
|
+
if (!val.trim()) {
|
|
11
|
+
return 'CSV file path is required';
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
return resolvePath(raw);
|
|
17
|
+
}
|
|
18
|
+
export async function setupCsvInteractive() {
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(chalk.bold(' Jira CSV Import setup'));
|
|
21
|
+
console.log(chalk.dim(' Import issues from a Jira CSV export file.\n'));
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
const csvFiles = readdirSync(cwd).filter((f) => f.toLowerCase().endsWith('.csv'));
|
|
24
|
+
let csvFilePath;
|
|
25
|
+
if (csvFiles.length > 0) {
|
|
26
|
+
const { select } = await import('@inquirer/prompts');
|
|
27
|
+
const MANUAL_ENTRY = '__manual__';
|
|
28
|
+
const selected = await select({
|
|
29
|
+
message: csvFiles.length === 1
|
|
30
|
+
? `Found CSV file in current directory:`
|
|
31
|
+
: `Found ${csvFiles.length} CSV files in current directory:`,
|
|
32
|
+
choices: [
|
|
33
|
+
...csvFiles.map((f) => ({ value: join(cwd, f), name: f })),
|
|
34
|
+
{ value: MANUAL_ENTRY, name: 'Enter path manually…' },
|
|
35
|
+
],
|
|
36
|
+
});
|
|
37
|
+
csvFilePath = selected === MANUAL_ENTRY ? await promptCsvPath() : selected;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
csvFilePath = await promptCsvPath();
|
|
41
|
+
}
|
|
42
|
+
const resolved = resolve(csvFilePath);
|
|
43
|
+
console.log(chalk.green(` CSV file: ${resolved}`));
|
|
44
|
+
return { csvFilePath: resolved };
|
|
45
|
+
}
|
|
46
|
+
export function setupCsvFromFlags(flags) {
|
|
47
|
+
if (!flags.csvFile) {
|
|
48
|
+
throw new Error('CSV requires: --csv-file');
|
|
49
|
+
}
|
|
50
|
+
return { csvFilePath: flags.csvFile };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=setup-csv.js.map
|