@bhimudev/gnanai 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +270 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +188 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/commands/cleanup.d.ts +21 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +380 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/dispatch.d.ts +13 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +85 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +155 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +167 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +711 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge-sync.d.ts +69 -0
- package/dist/commands/knowledge-sync.d.ts.map +1 -0
- package/dist/commands/knowledge-sync.js +661 -0
- package/dist/commands/knowledge-sync.js.map +1 -0
- package/dist/commands/knowledge.d.ts +35 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +254 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/rollback.d.ts +13 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +186 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/setup-config.d.ts +6 -0
- package/dist/commands/setup-config.d.ts.map +1 -0
- package/dist/commands/setup-config.js +663 -0
- package/dist/commands/setup-config.js.map +1 -0
- package/dist/commands/setup-project.d.ts +6 -0
- package/dist/commands/setup-project.d.ts.map +1 -0
- package/dist/commands/setup-project.js +361 -0
- package/dist/commands/setup-project.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +293 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +51 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +182 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +173 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +10 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +435 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/worktree.d.ts +30 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +262 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/generator/claude-cli.d.ts +24 -0
- package/dist/generator/claude-cli.d.ts.map +1 -0
- package/dist/generator/claude-cli.js +239 -0
- package/dist/generator/claude-cli.js.map +1 -0
- package/dist/generator/prompt-builder.d.ts +7 -0
- package/dist/generator/prompt-builder.d.ts.map +1 -0
- package/dist/generator/prompt-builder.js +144 -0
- package/dist/generator/prompt-builder.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/embeddings.d.ts +53 -0
- package/dist/mcp/embeddings.d.ts.map +1 -0
- package/dist/mcp/embeddings.js +68 -0
- package/dist/mcp/embeddings.js.map +1 -0
- package/dist/mcp/hybrid-search.d.ts +25 -0
- package/dist/mcp/hybrid-search.d.ts.map +1 -0
- package/dist/mcp/hybrid-search.js +72 -0
- package/dist/mcp/hybrid-search.js.map +1 -0
- package/dist/mcp/knowledge-server.d.ts +4 -0
- package/dist/mcp/knowledge-server.d.ts.map +1 -0
- package/dist/mcp/knowledge-server.js +294 -0
- package/dist/mcp/knowledge-server.js.map +1 -0
- package/dist/mcp/knowledge-utils.d.ts +65 -0
- package/dist/mcp/knowledge-utils.d.ts.map +1 -0
- package/dist/mcp/knowledge-utils.js +207 -0
- package/dist/mcp/knowledge-utils.js.map +1 -0
- package/dist/mcp/search-factory.d.ts +9 -0
- package/dist/mcp/search-factory.d.ts.map +1 -0
- package/dist/mcp/search-factory.js +23 -0
- package/dist/mcp/search-factory.js.map +1 -0
- package/dist/mcp/search-index.d.ts +45 -0
- package/dist/mcp/search-index.d.ts.map +1 -0
- package/dist/mcp/search-index.js +2 -0
- package/dist/mcp/search-index.js.map +1 -0
- package/dist/mcp/search-minisearch.d.ts +46 -0
- package/dist/mcp/search-minisearch.d.ts.map +1 -0
- package/dist/mcp/search-minisearch.js +99 -0
- package/dist/mcp/search-minisearch.js.map +1 -0
- package/dist/mcp/search-sqlite.d.ts +30 -0
- package/dist/mcp/search-sqlite.d.ts.map +1 -0
- package/dist/mcp/search-sqlite.js +188 -0
- package/dist/mcp/search-sqlite.js.map +1 -0
- package/dist/mcp/vector-store.d.ts +52 -0
- package/dist/mcp/vector-store.d.ts.map +1 -0
- package/dist/mcp/vector-store.js +183 -0
- package/dist/mcp/vector-store.js.map +1 -0
- package/dist/scaffold/copy-core-agents.d.ts +2 -0
- package/dist/scaffold/copy-core-agents.d.ts.map +1 -0
- package/dist/scaffold/copy-core-agents.js +90 -0
- package/dist/scaffold/copy-core-agents.js.map +1 -0
- package/dist/scaffold/create-claude-settings.d.ts +40 -0
- package/dist/scaffold/create-claude-settings.d.ts.map +1 -0
- package/dist/scaffold/create-claude-settings.js +422 -0
- package/dist/scaffold/create-claude-settings.js.map +1 -0
- package/dist/scaffold/create-config.d.ts +14 -0
- package/dist/scaffold/create-config.d.ts.map +1 -0
- package/dist/scaffold/create-config.js +199 -0
- package/dist/scaffold/create-config.js.map +1 -0
- package/dist/scaffold/create-project-description.d.ts +12 -0
- package/dist/scaffold/create-project-description.d.ts.map +1 -0
- package/dist/scaffold/create-project-description.js +104 -0
- package/dist/scaffold/create-project-description.js.map +1 -0
- package/dist/scaffold/create-structure.d.ts +2 -0
- package/dist/scaffold/create-structure.d.ts.map +1 -0
- package/dist/scaffold/create-structure.js +146 -0
- package/dist/scaffold/create-structure.js.map +1 -0
- package/dist/types/dependency-analysis.d.ts +11 -0
- package/dist/types/dependency-analysis.d.ts.map +1 -0
- package/dist/types/dependency-analysis.js +2 -0
- package/dist/types/dependency-analysis.js.map +1 -0
- package/dist/types/index.d.ts +526 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/task.d.ts +25 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +3 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/analyze-files.d.ts +7 -0
- package/dist/utils/analyze-files.d.ts.map +1 -0
- package/dist/utils/analyze-files.js +27 -0
- package/dist/utils/analyze-files.js.map +1 -0
- package/dist/utils/backup.d.ts +102 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +352 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/ci-provider.d.ts +23 -0
- package/dist/utils/ci-provider.d.ts.map +1 -0
- package/dist/utils/ci-provider.js +525 -0
- package/dist/utils/ci-provider.js.map +1 -0
- package/dist/utils/ci-status.d.ts +57 -0
- package/dist/utils/ci-status.d.ts.map +1 -0
- package/dist/utils/ci-status.js +349 -0
- package/dist/utils/ci-status.js.map +1 -0
- package/dist/utils/dependency-analysis.d.ts +34 -0
- package/dist/utils/dependency-analysis.d.ts.map +1 -0
- package/dist/utils/dependency-analysis.js +298 -0
- package/dist/utils/dependency-analysis.js.map +1 -0
- package/dist/utils/detect-git.d.ts +57 -0
- package/dist/utils/detect-git.d.ts.map +1 -0
- package/dist/utils/detect-git.js +439 -0
- package/dist/utils/detect-git.js.map +1 -0
- package/dist/utils/detect-mcp.d.ts +32 -0
- package/dist/utils/detect-mcp.d.ts.map +1 -0
- package/dist/utils/detect-mcp.js +178 -0
- package/dist/utils/detect-mcp.js.map +1 -0
- package/dist/utils/detect-project.d.ts +3 -0
- package/dist/utils/detect-project.d.ts.map +1 -0
- package/dist/utils/detect-project.js +155 -0
- package/dist/utils/detect-project.js.map +1 -0
- package/dist/utils/file-comparison.d.ts +89 -0
- package/dist/utils/file-comparison.d.ts.map +1 -0
- package/dist/utils/file-comparison.js +301 -0
- package/dist/utils/file-comparison.js.map +1 -0
- package/dist/utils/file-merger.d.ts +74 -0
- package/dist/utils/file-merger.d.ts.map +1 -0
- package/dist/utils/file-merger.js +350 -0
- package/dist/utils/file-merger.js.map +1 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/managed-process.d.ts +109 -0
- package/dist/utils/managed-process.d.ts.map +1 -0
- package/dist/utils/managed-process.js +481 -0
- package/dist/utils/managed-process.js.map +1 -0
- package/dist/utils/merge-claude-settings.d.ts +65 -0
- package/dist/utils/merge-claude-settings.d.ts.map +1 -0
- package/dist/utils/merge-claude-settings.js +133 -0
- package/dist/utils/merge-claude-settings.js.map +1 -0
- package/dist/utils/migration.d.ts +74 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +345 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/process-health.d.ts +51 -0
- package/dist/utils/process-health.d.ts.map +1 -0
- package/dist/utils/process-health.js +123 -0
- package/dist/utils/process-health.js.map +1 -0
- package/dist/utils/process-registry.d.ts +20 -0
- package/dist/utils/process-registry.d.ts.map +1 -0
- package/dist/utils/process-registry.js +151 -0
- package/dist/utils/process-registry.js.map +1 -0
- package/dist/utils/process-tree.d.ts +51 -0
- package/dist/utils/process-tree.d.ts.map +1 -0
- package/dist/utils/process-tree.js +499 -0
- package/dist/utils/process-tree.js.map +1 -0
- package/dist/utils/repair-mcp-config.d.ts +15 -0
- package/dist/utils/repair-mcp-config.d.ts.map +1 -0
- package/dist/utils/repair-mcp-config.js +129 -0
- package/dist/utils/repair-mcp-config.js.map +1 -0
- package/dist/utils/task-lifecycle.d.ts +60 -0
- package/dist/utils/task-lifecycle.d.ts.map +1 -0
- package/dist/utils/task-lifecycle.js +310 -0
- package/dist/utils/task-lifecycle.js.map +1 -0
- package/dist/utils/update-agent-mcp.d.ts +7 -0
- package/dist/utils/update-agent-mcp.d.ts.map +1 -0
- package/dist/utils/update-agent-mcp.js +115 -0
- package/dist/utils/update-agent-mcp.js.map +1 -0
- package/dist/utils/update-agent-templates.d.ts +6 -0
- package/dist/utils/update-agent-templates.d.ts.map +1 -0
- package/dist/utils/update-agent-templates.js +56 -0
- package/dist/utils/update-agent-templates.js.map +1 -0
- package/dist/utils/update-config-ci.d.ts +7 -0
- package/dist/utils/update-config-ci.d.ts.map +1 -0
- package/dist/utils/update-config-ci.js +72 -0
- package/dist/utils/update-config-ci.js.map +1 -0
- package/dist/utils/update-config-git.d.ts +18 -0
- package/dist/utils/update-config-git.d.ts.map +1 -0
- package/dist/utils/update-config-git.js +146 -0
- package/dist/utils/update-config-git.js.map +1 -0
- package/dist/utils/update-config-mcp.d.ts +7 -0
- package/dist/utils/update-config-mcp.d.ts.map +1 -0
- package/dist/utils/update-config-mcp.js +98 -0
- package/dist/utils/update-config-mcp.js.map +1 -0
- package/dist/utils/validate-config.d.ts +3 -0
- package/dist/utils/validate-config.d.ts.map +1 -0
- package/dist/utils/validate-config.js +109 -0
- package/dist/utils/validate-config.js.map +1 -0
- package/dist/utils/version-tracker.d.ts +130 -0
- package/dist/utils/version-tracker.d.ts.map +1 -0
- package/dist/utils/version-tracker.js +298 -0
- package/dist/utils/version-tracker.js.map +1 -0
- package/dist/utils/worktree.d.ts +68 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +446 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +77 -0
- package/templates/ARCHAI_README.md +329 -0
- package/templates/CLAUDE.md +67 -0
- package/templates/PROMPTS.md +506 -0
- package/templates/core-agents/boss-agent.md +671 -0
- package/templates/core-agents/cleanup-agent.md +145 -0
- package/templates/core-agents/code-reviewer.md +175 -0
- package/templates/core-agents/critical-reviewer.md +117 -0
- package/templates/core-agents/deep-analyst.md +216 -0
- package/templates/core-agents/finalization-agent.md +252 -0
- package/templates/core-agents/git-coordinator.md +240 -0
- package/templates/core-agents/implementation-agent.md +151 -0
- package/templates/core-agents/maestro-agent.md +413 -0
- package/templates/core-agents/maestro-headless-agent.md +422 -0
- package/templates/core-agents/plan-validator.md +198 -0
- package/templates/core-agents/quick-fix.md +56 -0
- package/templates/core-agents/routing-templates.md +338 -0
- package/templates/core-agents/task-orchestrator.md +143 -0
- package/templates/core-agents/task-prep.md +202 -0
- package/templates/core-agents/tdd-designer.md +143 -0
- package/templates/specialist-meta.md +275 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import { logger } from "./logger.js";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Internal helpers
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Enhanced CLI command executor with rate-limit and auth-failure detection.
|
|
8
|
+
* NOT exported -- internal to ci-status.ts only.
|
|
9
|
+
*/
|
|
10
|
+
function ciExec(cmd, ctx) {
|
|
11
|
+
const cwd = ctx.config?.projectRoot ?? process.cwd();
|
|
12
|
+
const timeout = ctx.config?.timeout ?? 10000;
|
|
13
|
+
const env = { ...process.env };
|
|
14
|
+
delete env.GIT_DIR;
|
|
15
|
+
delete env.GIT_WORK_TREE;
|
|
16
|
+
delete env.GIT_INDEX_FILE;
|
|
17
|
+
delete env.GIT_QUARANTINE_PATH;
|
|
18
|
+
try {
|
|
19
|
+
const result = execSync(cmd, {
|
|
20
|
+
encoding: "utf-8",
|
|
21
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
22
|
+
timeout,
|
|
23
|
+
cwd,
|
|
24
|
+
env,
|
|
25
|
+
});
|
|
26
|
+
return { output: result.trim() || null, rateLimited: false, authError: false };
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const stderr = error?.stderr?.toString?.() ?? "";
|
|
30
|
+
const stdout = error?.stdout?.toString?.() ?? "";
|
|
31
|
+
const combined = stderr + stdout;
|
|
32
|
+
// Rate-limit detection
|
|
33
|
+
if (/rate limit|API rate limit exceeded|429|too many requests/i.test(combined)) {
|
|
34
|
+
return { output: null, rateLimited: true, authError: false };
|
|
35
|
+
}
|
|
36
|
+
// Auth failure detection
|
|
37
|
+
if (/auth.*(fail|denied|required)|(HTTP )?(401|403)|not logged in|gh auth login|glab auth login/i.test(combined)) {
|
|
38
|
+
return { output: null, rateLimited: false, authError: true };
|
|
39
|
+
}
|
|
40
|
+
return { output: null, rateLimited: false, authError: false };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Pure utility functions
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/**
|
|
47
|
+
* Truncate a log to the last maxLines lines.
|
|
48
|
+
* Normalizes CRLF to LF. Prepends a truncation message if truncated.
|
|
49
|
+
*/
|
|
50
|
+
export function truncateLog(log, maxLines = 200) {
|
|
51
|
+
if (log === "")
|
|
52
|
+
return "";
|
|
53
|
+
// Normalize CRLF to LF
|
|
54
|
+
const normalized = log.replace(/\r\n/g, "\n");
|
|
55
|
+
const lines = normalized.split("\n");
|
|
56
|
+
// Remove trailing empty line from trailing newline
|
|
57
|
+
if (lines[lines.length - 1] === "") {
|
|
58
|
+
lines.pop();
|
|
59
|
+
}
|
|
60
|
+
if (lines.length <= maxLines) {
|
|
61
|
+
return lines.join("\n");
|
|
62
|
+
}
|
|
63
|
+
const truncated = lines.slice(lines.length - maxLines);
|
|
64
|
+
const droppedCount = lines.length - maxLines;
|
|
65
|
+
return `[...truncated ${droppedCount} lines...]\n${truncated.join("\n")}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compute exponential backoff delay with jitter.
|
|
69
|
+
* Base: 1000ms * 2^attempt, capped at 60000ms, plus random jitter up to 1000ms.
|
|
70
|
+
*/
|
|
71
|
+
export function exponentialBackoff(attempt) {
|
|
72
|
+
const delay = Math.min(1000 * Math.pow(2, attempt), 60000);
|
|
73
|
+
return delay + Math.random() * 1000;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Classify a failure based on log content using regex pattern matching.
|
|
77
|
+
* Priority order: infrastructure > timeout > lint > test > build > deploy > unknown.
|
|
78
|
+
*/
|
|
79
|
+
export function classifyFailure(logs) {
|
|
80
|
+
if (!logs || !logs.trim())
|
|
81
|
+
return "unknown";
|
|
82
|
+
const patterns = [
|
|
83
|
+
["infrastructure", /out of memory|OOM|no space left|connection refused|runner.*offline/i],
|
|
84
|
+
["timeout", /timed? ?out|timeout|exceeded.*time.*limit/i],
|
|
85
|
+
["lint", /eslint|prettier|stylelint|linting failed|lint error|tslint/i],
|
|
86
|
+
["test", /tests? failed|FAIL\s|AssertionError|vitest|jest|mocha|pytest/i],
|
|
87
|
+
["build", /build failed|compilation error|tsc.*error|error TS\d+|webpack|Cannot find module/i],
|
|
88
|
+
["deploy", /deploy failed|kubectl|docker push|helm|terraform/i],
|
|
89
|
+
];
|
|
90
|
+
for (const [type, regex] of patterns) {
|
|
91
|
+
if (regex.test(logs))
|
|
92
|
+
return type;
|
|
93
|
+
}
|
|
94
|
+
return "unknown";
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Status checking
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Check pipeline status with extended semantics (not_found, not_configured).
|
|
101
|
+
* Note: Returns "not_found" for ANY null from provider, including network errors.
|
|
102
|
+
* The grace period in waitForPipelineCompletion handles transient errors by retrying.
|
|
103
|
+
*/
|
|
104
|
+
export async function checkPipelineStatus(ctx, branch, commit) {
|
|
105
|
+
if (ctx.provider.getProviderName() === "none") {
|
|
106
|
+
return { status: "not_configured", pipeline: null };
|
|
107
|
+
}
|
|
108
|
+
const result = await ctx.provider.getPipelineStatus(branch, commit);
|
|
109
|
+
if (result === null) {
|
|
110
|
+
return { status: "not_found", pipeline: null };
|
|
111
|
+
}
|
|
112
|
+
return { status: result.status, pipeline: result };
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Wait for completion
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
const TERMINAL_STATUSES = ["success", "failed", "cancelled"];
|
|
118
|
+
function sleep(ms) {
|
|
119
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Wait for a pipeline to reach a terminal status with grace period support.
|
|
123
|
+
* Does NOT call ctx.provider.waitForPipeline() -- supersedes it with grace period
|
|
124
|
+
* and better not_found handling.
|
|
125
|
+
*
|
|
126
|
+
* Known limitation: Rate-limit detection is NOT possible in the polling path because
|
|
127
|
+
* CIProvider.getPipelineStatus() swallows all errors. Rate-limit detection is only
|
|
128
|
+
* available in getFailingJobLogs via ciExec.
|
|
129
|
+
*/
|
|
130
|
+
export async function waitForPipelineCompletion(ctx, branch, options) {
|
|
131
|
+
if (ctx.provider.getProviderName() === "none") {
|
|
132
|
+
return { status: "not_configured", timedOut: false, pipeline: null };
|
|
133
|
+
}
|
|
134
|
+
const pollInterval = options?.pollInterval ?? 15000;
|
|
135
|
+
const maxWait = options?.maxWait ?? 600000;
|
|
136
|
+
const gracePeriod = options?.gracePeriod ?? 60000;
|
|
137
|
+
const startTime = Date.now();
|
|
138
|
+
// Phase 1: Grace period -- wait for pipeline to appear
|
|
139
|
+
let lastCheck = await checkPipelineStatus(ctx, branch);
|
|
140
|
+
if (lastCheck.status === "not_found" || lastCheck.status === "not_configured") {
|
|
141
|
+
// Pipeline not yet found, enter grace period polling
|
|
142
|
+
while (Date.now() - startTime < gracePeriod) {
|
|
143
|
+
if (lastCheck.status !== "not_found" && lastCheck.status !== "not_configured") {
|
|
144
|
+
break; // Pipeline found, exit grace period
|
|
145
|
+
}
|
|
146
|
+
await sleep(pollInterval);
|
|
147
|
+
lastCheck = await checkPipelineStatus(ctx, branch);
|
|
148
|
+
}
|
|
149
|
+
// If still not found after grace period, return not_found
|
|
150
|
+
if (lastCheck.status === "not_found" || lastCheck.status === "not_configured") {
|
|
151
|
+
return { status: "not_found", timedOut: false, pipeline: null };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Phase 2: Wait for terminal status
|
|
155
|
+
let lastStatus = lastCheck.status;
|
|
156
|
+
let lastPipeline = lastCheck.pipeline;
|
|
157
|
+
if (TERMINAL_STATUSES.includes(lastStatus)) {
|
|
158
|
+
return { status: lastStatus, timedOut: false, pipeline: lastPipeline };
|
|
159
|
+
}
|
|
160
|
+
while (Date.now() - startTime < maxWait) {
|
|
161
|
+
await sleep(pollInterval);
|
|
162
|
+
const check = await checkPipelineStatus(ctx, branch);
|
|
163
|
+
lastStatus = check.status;
|
|
164
|
+
lastPipeline = check.pipeline;
|
|
165
|
+
if (TERMINAL_STATUSES.includes(lastStatus)) {
|
|
166
|
+
return { status: lastStatus, timedOut: false, pipeline: lastPipeline };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { status: lastStatus, timedOut: true, pipeline: lastPipeline };
|
|
170
|
+
}
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// Parsers
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
/**
|
|
175
|
+
* Parse GitHub Actions --log-failed output into per-job logs.
|
|
176
|
+
* Each line is tab-separated: jobName TAB stepName TAB timestamp message.
|
|
177
|
+
* Groups lines by job name, extracts message portion after the timestamp.
|
|
178
|
+
*/
|
|
179
|
+
export function parseGitHubFailedLogs(output) {
|
|
180
|
+
if (!output || !output.trim())
|
|
181
|
+
return [];
|
|
182
|
+
const lines = output.split("\n");
|
|
183
|
+
const jobMap = new Map();
|
|
184
|
+
const jobOrder = [];
|
|
185
|
+
for (const line of lines) {
|
|
186
|
+
if (!line.trim())
|
|
187
|
+
continue;
|
|
188
|
+
const parts = line.split("\t");
|
|
189
|
+
if (parts.length < 3) {
|
|
190
|
+
// Malformed line -- treat entire output as single job
|
|
191
|
+
if (!jobMap.has("unknown")) {
|
|
192
|
+
jobMap.set("unknown", []);
|
|
193
|
+
jobOrder.push("unknown");
|
|
194
|
+
}
|
|
195
|
+
jobMap.get("unknown").push(line);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const jobName = parts[0];
|
|
199
|
+
// Message is everything after the second tab and the timestamp prefix
|
|
200
|
+
// Format: "2026-03-04T10:00:00Z actual message"
|
|
201
|
+
const timestampAndMessage = parts.slice(2).join("\t");
|
|
202
|
+
// Strip the ISO timestamp prefix (first space-delimited token)
|
|
203
|
+
const spaceIdx = timestampAndMessage.indexOf(" ");
|
|
204
|
+
const message = spaceIdx >= 0 ? timestampAndMessage.substring(spaceIdx + 1) : timestampAndMessage;
|
|
205
|
+
if (!jobMap.has(jobName)) {
|
|
206
|
+
jobMap.set(jobName, []);
|
|
207
|
+
jobOrder.push(jobName);
|
|
208
|
+
}
|
|
209
|
+
jobMap.get(jobName).push(message);
|
|
210
|
+
}
|
|
211
|
+
return jobOrder.map((name) => ({
|
|
212
|
+
name,
|
|
213
|
+
log: jobMap.get(name).join("\n"),
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Parse GitLab REST API job list JSON response.
|
|
218
|
+
* Filters to failed jobs only.
|
|
219
|
+
*/
|
|
220
|
+
export function parseGitLabJobList(jsonOutput) {
|
|
221
|
+
try {
|
|
222
|
+
const parsed = JSON.parse(jsonOutput);
|
|
223
|
+
if (!Array.isArray(parsed))
|
|
224
|
+
return [];
|
|
225
|
+
return parsed
|
|
226
|
+
.filter((item) => item.status === "failed")
|
|
227
|
+
.map((item) => ({
|
|
228
|
+
id: String(item.id),
|
|
229
|
+
name: item.name,
|
|
230
|
+
status: item.status,
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Failing job logs
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
/**
|
|
241
|
+
* Fetch logs for failing jobs only in a pipeline.
|
|
242
|
+
* Uses CLI commands directly via ciExec for per-job log extraction.
|
|
243
|
+
*/
|
|
244
|
+
export async function getFailingJobLogs(ctx, pipelineId) {
|
|
245
|
+
const providerName = ctx.provider.getProviderName();
|
|
246
|
+
if (providerName === "none")
|
|
247
|
+
return [];
|
|
248
|
+
if (ctx.config === null)
|
|
249
|
+
return [];
|
|
250
|
+
if (providerName === "github") {
|
|
251
|
+
return getGitHubFailingJobLogs(ctx, pipelineId);
|
|
252
|
+
}
|
|
253
|
+
if (providerName === "gitlab") {
|
|
254
|
+
return getGitLabFailingJobLogs(ctx, pipelineId);
|
|
255
|
+
}
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
async function getGitHubFailingJobLogs(ctx, pipelineId) {
|
|
259
|
+
const result = ciExec(`gh run view ${pipelineId} --log-failed`, ctx);
|
|
260
|
+
if (result.authError) {
|
|
261
|
+
logger.warn("CI authentication failed. Run gh auth login to authenticate with GitHub Actions.");
|
|
262
|
+
return [];
|
|
263
|
+
}
|
|
264
|
+
if (result.rateLimited) {
|
|
265
|
+
logger.warn("CI API rate limited while fetching logs");
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
if (result.output === null)
|
|
269
|
+
return [];
|
|
270
|
+
const jobs = parseGitHubFailedLogs(result.output);
|
|
271
|
+
return jobs.map((job) => ({
|
|
272
|
+
name: job.name,
|
|
273
|
+
log: truncateLog(job.log, 200),
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
async function getGitLabFailingJobLogs(ctx, pipelineId) {
|
|
277
|
+
if (!ctx.config?.projectPath) {
|
|
278
|
+
logger.warn("GitLab API unavailable: no project path detected.");
|
|
279
|
+
// Fallback to glab ci view
|
|
280
|
+
const token = process.env.GITLAB_TOKEN || process.env.CI_JOB_TOKEN;
|
|
281
|
+
if (!token) {
|
|
282
|
+
const fallbackResult = ciExec(`glab ci view ${pipelineId}`, ctx);
|
|
283
|
+
if (fallbackResult.output) {
|
|
284
|
+
return [{ name: "pipeline", log: truncateLog(fallbackResult.output, 200) }];
|
|
285
|
+
}
|
|
286
|
+
return [];
|
|
287
|
+
}
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
const token = process.env.GITLAB_TOKEN || process.env.CI_JOB_TOKEN;
|
|
291
|
+
if (!token) {
|
|
292
|
+
// Fallback to glab ci view
|
|
293
|
+
const fallbackResult = ciExec(`glab ci view ${pipelineId}`, ctx);
|
|
294
|
+
if (fallbackResult.authError) {
|
|
295
|
+
logger.warn("CI authentication failed. Run glab auth login or set GITLAB_TOKEN to authenticate with GitLab CI.");
|
|
296
|
+
return [];
|
|
297
|
+
}
|
|
298
|
+
if (fallbackResult.output) {
|
|
299
|
+
return [{ name: "pipeline", log: truncateLog(fallbackResult.output, 200) }];
|
|
300
|
+
}
|
|
301
|
+
return [];
|
|
302
|
+
}
|
|
303
|
+
// Use GitLab REST API for per-job logs
|
|
304
|
+
const apiBase = ctx.config.apiBaseUrl || "https://gitlab.com/api/v4";
|
|
305
|
+
const encodedPath = ctx.config.projectPath
|
|
306
|
+
.split("/")
|
|
307
|
+
.map(encodeURIComponent)
|
|
308
|
+
.join("%2F");
|
|
309
|
+
// Get failed jobs list
|
|
310
|
+
const jobListResult = ciExec(`curl -s -H "PRIVATE-TOKEN: ${token}" "${apiBase}/projects/${encodedPath}/pipelines/${pipelineId}/jobs?scope=failed"`, ctx);
|
|
311
|
+
if (jobListResult.authError) {
|
|
312
|
+
logger.warn("CI authentication failed. Run glab auth login or set GITLAB_TOKEN to authenticate with GitLab CI.");
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
if (jobListResult.rateLimited) {
|
|
316
|
+
logger.warn("CI API rate limited while fetching logs");
|
|
317
|
+
return [];
|
|
318
|
+
}
|
|
319
|
+
if (jobListResult.output === null)
|
|
320
|
+
return [];
|
|
321
|
+
const failedJobs = parseGitLabJobList(jobListResult.output);
|
|
322
|
+
const result = [];
|
|
323
|
+
for (const job of failedJobs) {
|
|
324
|
+
const traceResult = ciExec(`curl -s -H "PRIVATE-TOKEN: ${token}" "${apiBase}/projects/${encodedPath}/jobs/${job.id}/trace"`, ctx);
|
|
325
|
+
const logText = traceResult.output ?? "";
|
|
326
|
+
result.push({
|
|
327
|
+
name: job.name,
|
|
328
|
+
log: truncateLog(logText, 200),
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
// ---------------------------------------------------------------------------
|
|
334
|
+
// Report builder
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
/**
|
|
337
|
+
* Assemble a structured CIFailureReport from pipeline data, failing jobs, and failure type.
|
|
338
|
+
*/
|
|
339
|
+
export function buildFailureReport(pipeline, failingJobs, failureType) {
|
|
340
|
+
return {
|
|
341
|
+
pipelineId: pipeline.id,
|
|
342
|
+
status: pipeline.status,
|
|
343
|
+
failureType,
|
|
344
|
+
failingJobs,
|
|
345
|
+
url: pipeline.url,
|
|
346
|
+
timestamp: new Date().toISOString(),
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=ci-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-status.js","sourceRoot":"","sources":["../../src/utils/ci-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAcrC,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,MAAM,CACb,GAAW,EACX,GAAc;IAEd,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC;IAE7C,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC;IACnB,OAAO,GAAG,CAAC,aAAa,CAAC;IACzB,OAAO,GAAG,CAAC,cAAc,CAAC;IAC1B,OAAO,GAAG,CAAC,mBAAmB,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;YAC3B,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO;YACP,GAAG;YACH,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACjF,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,MAAM,GAAY,KAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;QAClE,MAAM,MAAM,GAAY,KAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;QAEjC,uBAAuB;QACvB,IAAI,2DAA2D,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC/D,CAAC;QAED,yBAAyB;QACzB,IAAI,6FAA6F,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC/D,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,WAAmB,GAAG;IAC7D,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAE1B,uBAAuB;IACvB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,mDAAmD;IACnD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC7C,OAAO,iBAAiB,YAAY,eAAe,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAE5C,MAAM,QAAQ,GAAmC;QAC/C,CAAC,gBAAgB,EAAE,qEAAqE,CAAC;QACzF,CAAC,SAAS,EAAE,4CAA4C,CAAC;QACzD,CAAC,MAAM,EAAE,6DAA6D,CAAC;QACvE,CAAC,MAAM,EAAE,+DAA+D,CAAC;QACzE,CAAC,OAAO,EAAE,mFAAmF,CAAC;QAC9F,CAAC,QAAQ,EAAE,mDAAmD,CAAC;KAChE,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACpC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAc,EACd,MAAc,EACd,MAAe;IAEf,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,iBAAiB,GAA4B,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAEtF,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,GAAc,EACd,MAAc,EACd,OAA+B;IAE/B,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,KAAK,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,uDAAuD;IACvD,IAAI,SAAS,GAAwB,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE5E,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAC9E,qDAAqD;QACrD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,WAAW,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;gBAC9E,MAAM,CAAC,oCAAoC;YAC7C,CAAC;YACD,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1B,SAAS,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAED,0DAA0D;QAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAC9E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,UAAU,GAAuB,SAAS,CAAC,MAAM,CAAC;IACtD,IAAI,YAAY,GAA4B,SAAS,CAAC,QAAQ,CAAC;IAE/D,IAAI,iBAAiB,CAAC,QAAQ,CAAC,UAAmC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzE,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC;QAE9B,IAAI,iBAAiB,CAAC,QAAQ,CAAC,UAAmC,CAAC,EAAE,CAAC;YACpE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACxE,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,sDAAsD;YACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,mBAAmB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAElG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI;QACJ,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC;KAClC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;aAC/C,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YACnB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAc,EACd,UAAkB;IAElB,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IAEpD,IAAI,YAAY,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAEnC,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,uBAAuB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,uBAAuB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,GAAc,EACd,UAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,UAAU,eAAe,EAAE,GAAG,CAAC,CAAC;IAErE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CACT,kFAAkF,CACnF,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;KAC/B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,GAAc,EACd,UAAkB;IAElB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAEjE,2BAA2B;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACnE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;YACjE,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC1B,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAEnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,2BAA2B;QAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CACT,mGAAmG,CACpG,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,uCAAuC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,2BAA2B,CAAC;IACrE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW;SACvC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,kBAAkB,CAAC;SACvB,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,uBAAuB;IACvB,MAAM,aAAa,GAAG,MAAM,CAC1B,8BAA8B,KAAK,MAAM,OAAO,aAAa,WAAW,cAAc,UAAU,qBAAqB,EACrH,GAAG,CACJ,CAAC;IAEF,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,mGAAmG,CACpG,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,CACxB,8BAA8B,KAAK,MAAM,OAAO,aAAa,WAAW,SAAS,GAAG,CAAC,EAAE,SAAS,EAChG,GAAG,CACJ,CAAC;QACF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,EAAE,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA0B,EAC1B,WAA2B,EAC3B,WAA0B;IAE1B,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,WAAW;QACX,WAAW;QACX,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { TaskSpec } from '../types/task.js';
|
|
2
|
+
import type { ExecutionGroup } from '../types/dependency-analysis.js';
|
|
3
|
+
/**
|
|
4
|
+
* Error thrown when cyclic dependencies are detected among tasks.
|
|
5
|
+
*/
|
|
6
|
+
export declare class CyclicDependencyError extends Error {
|
|
7
|
+
/** The task IDs forming the cycle */
|
|
8
|
+
readonly cycle: string[];
|
|
9
|
+
constructor(cycle: string[]);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a filesystem path for comparison.
|
|
13
|
+
*/
|
|
14
|
+
export declare function normalizePath(p: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Parse affected area paths from a task body markdown.
|
|
17
|
+
* Returns null if no Affected Areas section found, or string[] of normalized paths.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseAffectedAreas(body: string): string[] | null;
|
|
20
|
+
/**
|
|
21
|
+
* Check if two sets of paths have hierarchical overlap.
|
|
22
|
+
* Paths should already be normalized (trailing slash, lowercase).
|
|
23
|
+
*/
|
|
24
|
+
export declare function pathsOverlap(pathsA: string[], pathsB: string[]): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Build an execution graph from task specs.
|
|
27
|
+
* Returns an ordered list of execution groups where tasks within a group
|
|
28
|
+
* are independent (can run in parallel) and groups must execute sequentially.
|
|
29
|
+
*
|
|
30
|
+
* Note: Only `depends_on` is consulted for explicit dependencies.
|
|
31
|
+
* The `blocks` field is not used by this function.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildExecutionGraph(tasks: TaskSpec[]): ExecutionGroup[];
|
|
34
|
+
//# sourceMappingURL=dependency-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-analysis.d.ts","sourceRoot":"","sources":["../../src/utils/dependency-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,qCAAqC;IACrC,SAAgB,KAAK,EAAE,MAAM,EAAE,CAAC;gBAEpB,KAAK,EAAE,MAAM,EAAE;CAM5B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAY/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAkChE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAcxE;AAoMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAwDvE"}
|