@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,525 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Internal helpers
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
/**
|
|
9
|
+
* Run a CLI command and return trimmed stdout, or null on failure.
|
|
10
|
+
* Strips GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, GIT_QUARANTINE_PATH from env.
|
|
11
|
+
* Always passes projectRoot as cwd.
|
|
12
|
+
*/
|
|
13
|
+
function ciCommand(cmd, cwd, timeout = 10000) {
|
|
14
|
+
try {
|
|
15
|
+
const env = { ...process.env };
|
|
16
|
+
delete env.GIT_DIR;
|
|
17
|
+
delete env.GIT_WORK_TREE;
|
|
18
|
+
delete env.GIT_INDEX_FILE;
|
|
19
|
+
delete env.GIT_QUARANTINE_PATH;
|
|
20
|
+
const result = execSync(cmd, {
|
|
21
|
+
encoding: 'utf-8',
|
|
22
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
23
|
+
timeout,
|
|
24
|
+
cwd,
|
|
25
|
+
env,
|
|
26
|
+
});
|
|
27
|
+
return result.trim() || null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extract group/project path from a git remote URL.
|
|
35
|
+
* Supports both SSH (git@host:group/project.git) and HTTPS formats.
|
|
36
|
+
*/
|
|
37
|
+
function extractProjectPath(remoteUrl) {
|
|
38
|
+
// SSH format: git@host:group/project.git
|
|
39
|
+
const sshMatch = remoteUrl.match(/:([^/][^:]+?)(?:\.git)?$/);
|
|
40
|
+
if (sshMatch)
|
|
41
|
+
return sshMatch[1];
|
|
42
|
+
// HTTPS format: https://host/group/project.git
|
|
43
|
+
try {
|
|
44
|
+
const url = new URL(remoteUrl);
|
|
45
|
+
const pathPart = url.pathname.replace(/^\//, "").replace(/\.git$/, "");
|
|
46
|
+
return pathPart || null;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Detection tier functions
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
/**
|
|
56
|
+
* Tier 1: Check archai.config.md for CI Provider override.
|
|
57
|
+
*/
|
|
58
|
+
async function detectFromConfigOverride(projectRoot) {
|
|
59
|
+
const configPath = path.join(projectRoot, 'archai.config.md');
|
|
60
|
+
if (!(await fs.pathExists(configPath)))
|
|
61
|
+
return null;
|
|
62
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
63
|
+
const providerMatch = content.match(/\*\*CI Provider:\*\*\s*(\S+)/i);
|
|
64
|
+
if (!providerMatch)
|
|
65
|
+
return null;
|
|
66
|
+
const rawProvider = providerMatch[1].toLowerCase();
|
|
67
|
+
const validProviders = ['github', 'gitlab', 'none'];
|
|
68
|
+
if (!validProviders.includes(rawProvider))
|
|
69
|
+
return null;
|
|
70
|
+
const provider = rawProvider;
|
|
71
|
+
// Parse optional auth method and timeout
|
|
72
|
+
let authMethod;
|
|
73
|
+
const authMatch = content.match(/\*\*Auth Method:\*\*\s*(\S+)/i);
|
|
74
|
+
if (authMatch) {
|
|
75
|
+
const rawAuth = authMatch[1].toLowerCase();
|
|
76
|
+
if (rawAuth === 'cli' || rawAuth === 'token') {
|
|
77
|
+
authMethod = rawAuth;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
let timeout;
|
|
81
|
+
const timeoutMatch = content.match(/\*\*Timeout:\*\*\s*(\d+)/i);
|
|
82
|
+
if (timeoutMatch) {
|
|
83
|
+
timeout = parseInt(timeoutMatch[1], 10);
|
|
84
|
+
}
|
|
85
|
+
return { provider, authMethod, timeout };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Tier 2: Check for CI configuration files.
|
|
89
|
+
*/
|
|
90
|
+
async function detectFromConfigFiles(projectRoot) {
|
|
91
|
+
// GitLab checked first (single file is more specific)
|
|
92
|
+
if (await fs.pathExists(path.join(projectRoot, '.gitlab-ci.yml'))) {
|
|
93
|
+
return 'gitlab';
|
|
94
|
+
}
|
|
95
|
+
// GitHub: check for .yml or .yaml files in .github/workflows/
|
|
96
|
+
const workflowsDir = path.join(projectRoot, '.github', 'workflows');
|
|
97
|
+
if (await fs.pathExists(workflowsDir)) {
|
|
98
|
+
try {
|
|
99
|
+
const files = await fs.readdir(workflowsDir);
|
|
100
|
+
const hasYml = files.some((f) => f.endsWith('.yml') || f.endsWith('.yaml'));
|
|
101
|
+
if (hasYml)
|
|
102
|
+
return 'github';
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// ignore readdir errors
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Tier 3: Check git remote URL for provider hostname.
|
|
112
|
+
*/
|
|
113
|
+
function detectFromRemoteUrl(projectRoot) {
|
|
114
|
+
const remoteUrl = ciCommand('git remote get-url origin', projectRoot);
|
|
115
|
+
if (!remoteUrl)
|
|
116
|
+
return null;
|
|
117
|
+
const projPath = extractProjectPath(remoteUrl);
|
|
118
|
+
if (remoteUrl.includes('github.com')) {
|
|
119
|
+
return { provider: 'github', projectPath: projPath };
|
|
120
|
+
}
|
|
121
|
+
if (remoteUrl.toLowerCase().includes('gitlab')) {
|
|
122
|
+
return { provider: 'gitlab', projectPath: projPath };
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Tier 4: Check for installed CLI tools.
|
|
128
|
+
*/
|
|
129
|
+
function detectFromCliTools(projectRoot) {
|
|
130
|
+
if (ciCommand('gh --version', projectRoot) !== null) {
|
|
131
|
+
return 'github';
|
|
132
|
+
}
|
|
133
|
+
if (ciCommand('glab --version', projectRoot) !== null) {
|
|
134
|
+
return 'gitlab';
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Build a CIProviderConfig for a detected provider.
|
|
140
|
+
*/
|
|
141
|
+
function buildProviderConfig(projectRoot, provider, overrides) {
|
|
142
|
+
let authMethod = overrides?.authMethod || 'cli';
|
|
143
|
+
const timeout = overrides?.timeout || 30000;
|
|
144
|
+
// Determine auth method if not overridden
|
|
145
|
+
if (!overrides?.authMethod) {
|
|
146
|
+
if (provider === 'github') {
|
|
147
|
+
const ghAuth = ciCommand('gh auth status', projectRoot);
|
|
148
|
+
if (ghAuth !== null) {
|
|
149
|
+
authMethod = 'cli';
|
|
150
|
+
}
|
|
151
|
+
else if (process.env.GITHUB_TOKEN) {
|
|
152
|
+
authMethod = 'token';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (provider === 'gitlab') {
|
|
156
|
+
const glabAuth = ciCommand('glab auth status', projectRoot);
|
|
157
|
+
if (glabAuth !== null) {
|
|
158
|
+
authMethod = 'cli';
|
|
159
|
+
}
|
|
160
|
+
else if (process.env.GITLAB_TOKEN || process.env.CI_JOB_TOKEN) {
|
|
161
|
+
authMethod = 'token';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Always attempt to extract projectPath from remote URL
|
|
166
|
+
let projectPath = null;
|
|
167
|
+
const remoteUrl = ciCommand('git remote get-url origin', projectRoot);
|
|
168
|
+
if (remoteUrl) {
|
|
169
|
+
projectPath = extractProjectPath(remoteUrl);
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
provider,
|
|
173
|
+
authMethod,
|
|
174
|
+
apiBaseUrl: null,
|
|
175
|
+
timeout,
|
|
176
|
+
projectRoot,
|
|
177
|
+
projectPath,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Main detection function
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
/**
|
|
184
|
+
* Auto-detect the CI provider for a project.
|
|
185
|
+
* Priority: config override > config files > remote URL > CLI tools > fallback.
|
|
186
|
+
*/
|
|
187
|
+
export async function detectCIProvider(projectRoot, options) {
|
|
188
|
+
// Tier 1: Config override (skipped during setup to force fresh detection)
|
|
189
|
+
if (!options?.skipConfigOverride) {
|
|
190
|
+
const configOverride = await detectFromConfigOverride(projectRoot);
|
|
191
|
+
if (configOverride) {
|
|
192
|
+
if (configOverride.provider === 'none') {
|
|
193
|
+
return { provider: 'none', detectedVia: 'config-override', config: null };
|
|
194
|
+
}
|
|
195
|
+
const config = buildProviderConfig(projectRoot, configOverride.provider, {
|
|
196
|
+
authMethod: configOverride.authMethod,
|
|
197
|
+
timeout: configOverride.timeout,
|
|
198
|
+
});
|
|
199
|
+
return { provider: configOverride.provider, detectedVia: 'config-override', config };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Tier 2: Config files
|
|
203
|
+
const configFileProvider = await detectFromConfigFiles(projectRoot);
|
|
204
|
+
if (configFileProvider) {
|
|
205
|
+
const config = buildProviderConfig(projectRoot, configFileProvider);
|
|
206
|
+
return { provider: configFileProvider, detectedVia: 'config-file', config };
|
|
207
|
+
}
|
|
208
|
+
// Tier 3: Remote URL
|
|
209
|
+
const remoteResult = detectFromRemoteUrl(projectRoot);
|
|
210
|
+
if (remoteResult) {
|
|
211
|
+
const config = buildProviderConfig(projectRoot, remoteResult.provider);
|
|
212
|
+
return { provider: remoteResult.provider, detectedVia: 'remote-url', config };
|
|
213
|
+
}
|
|
214
|
+
// Tier 4: CLI tools
|
|
215
|
+
const cliProvider = detectFromCliTools(projectRoot);
|
|
216
|
+
if (cliProvider) {
|
|
217
|
+
const config = buildProviderConfig(projectRoot, cliProvider);
|
|
218
|
+
return { provider: cliProvider, detectedVia: 'cli-tool', config };
|
|
219
|
+
}
|
|
220
|
+
// Fallback: no CI detected
|
|
221
|
+
return { provider: 'none', detectedVia: 'none', config: null };
|
|
222
|
+
}
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// Normalization functions (exported for direct testing)
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
/**
|
|
227
|
+
* Normalize a GitHub Actions run JSON object to CIPipelineStatus.
|
|
228
|
+
*/
|
|
229
|
+
export function normalizeGitHubStatus(run) {
|
|
230
|
+
if (!run || typeof run !== 'object')
|
|
231
|
+
return null;
|
|
232
|
+
if (!('databaseId' in run) || !('status' in run))
|
|
233
|
+
return null;
|
|
234
|
+
const status = run.status;
|
|
235
|
+
const conclusion = run.conclusion;
|
|
236
|
+
let normalizedStatus;
|
|
237
|
+
switch (status) {
|
|
238
|
+
case 'queued':
|
|
239
|
+
case 'waiting':
|
|
240
|
+
case 'pending':
|
|
241
|
+
case 'requested':
|
|
242
|
+
normalizedStatus = 'pending';
|
|
243
|
+
break;
|
|
244
|
+
case 'in_progress':
|
|
245
|
+
normalizedStatus = 'running';
|
|
246
|
+
break;
|
|
247
|
+
case 'completed':
|
|
248
|
+
switch (conclusion) {
|
|
249
|
+
case 'success':
|
|
250
|
+
normalizedStatus = 'success';
|
|
251
|
+
break;
|
|
252
|
+
case 'failure':
|
|
253
|
+
normalizedStatus = 'failed';
|
|
254
|
+
break;
|
|
255
|
+
case 'cancelled':
|
|
256
|
+
normalizedStatus = 'cancelled';
|
|
257
|
+
break;
|
|
258
|
+
case 'timed_out':
|
|
259
|
+
normalizedStatus = 'failed';
|
|
260
|
+
break;
|
|
261
|
+
case 'skipped':
|
|
262
|
+
normalizedStatus = 'cancelled';
|
|
263
|
+
break;
|
|
264
|
+
default:
|
|
265
|
+
normalizedStatus = 'unknown';
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
break;
|
|
269
|
+
default:
|
|
270
|
+
normalizedStatus = 'unknown';
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
id: String(run.databaseId),
|
|
275
|
+
status: normalizedStatus,
|
|
276
|
+
branch: run.headBranch || '',
|
|
277
|
+
commit: run.headSha || '',
|
|
278
|
+
url: run.url || null,
|
|
279
|
+
createdAt: run.createdAt || null,
|
|
280
|
+
finishedAt: run.updatedAt || null,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Normalize a GitLab pipeline JSON object to CIPipelineStatus.
|
|
285
|
+
*/
|
|
286
|
+
export function normalizeGitLabStatus(pipeline) {
|
|
287
|
+
if (!pipeline || typeof pipeline !== 'object')
|
|
288
|
+
return null;
|
|
289
|
+
if (!('id' in pipeline) || !('status' in pipeline))
|
|
290
|
+
return null;
|
|
291
|
+
const status = pipeline.status;
|
|
292
|
+
let normalizedStatus;
|
|
293
|
+
switch (status) {
|
|
294
|
+
case 'created':
|
|
295
|
+
case 'waiting_for_resource':
|
|
296
|
+
case 'preparing':
|
|
297
|
+
case 'pending':
|
|
298
|
+
case 'manual':
|
|
299
|
+
case 'scheduled':
|
|
300
|
+
normalizedStatus = 'pending';
|
|
301
|
+
break;
|
|
302
|
+
case 'running':
|
|
303
|
+
normalizedStatus = 'running';
|
|
304
|
+
break;
|
|
305
|
+
case 'success':
|
|
306
|
+
normalizedStatus = 'success';
|
|
307
|
+
break;
|
|
308
|
+
case 'failed':
|
|
309
|
+
normalizedStatus = 'failed';
|
|
310
|
+
break;
|
|
311
|
+
case 'canceled':
|
|
312
|
+
case 'skipped':
|
|
313
|
+
normalizedStatus = 'cancelled';
|
|
314
|
+
break;
|
|
315
|
+
default:
|
|
316
|
+
normalizedStatus = 'unknown';
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
id: String(pipeline.id),
|
|
321
|
+
status: normalizedStatus,
|
|
322
|
+
branch: pipeline.ref || '',
|
|
323
|
+
commit: pipeline.sha || '',
|
|
324
|
+
url: pipeline.web_url || null,
|
|
325
|
+
createdAt: pipeline.created_at || null,
|
|
326
|
+
finishedAt: null, // finished_at not available in list endpoint
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
// Shared polling helper
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
async function pollForCompletion(provider, branch, options) {
|
|
333
|
+
const pollInterval = options?.pollInterval ?? 10000;
|
|
334
|
+
const maxWait = options?.maxWait ?? 600000;
|
|
335
|
+
const terminalStatuses = ['success', 'failed', 'cancelled'];
|
|
336
|
+
const startTime = Date.now();
|
|
337
|
+
let lastStatus = 'unknown';
|
|
338
|
+
while (true) {
|
|
339
|
+
const pipelineStatus = await provider.getPipelineStatus(branch);
|
|
340
|
+
if (!pipelineStatus) {
|
|
341
|
+
return { status: 'unknown', timedOut: false };
|
|
342
|
+
}
|
|
343
|
+
lastStatus = pipelineStatus.status;
|
|
344
|
+
if (terminalStatuses.includes(lastStatus)) {
|
|
345
|
+
return { status: lastStatus, timedOut: false };
|
|
346
|
+
}
|
|
347
|
+
if (Date.now() - startTime >= maxWait) {
|
|
348
|
+
return { status: lastStatus, timedOut: true };
|
|
349
|
+
}
|
|
350
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// ---------------------------------------------------------------------------
|
|
354
|
+
// Adapter classes
|
|
355
|
+
// ---------------------------------------------------------------------------
|
|
356
|
+
class GitHubActionsProvider {
|
|
357
|
+
config;
|
|
358
|
+
constructor(config) {
|
|
359
|
+
this.config = config;
|
|
360
|
+
}
|
|
361
|
+
getProviderName() {
|
|
362
|
+
return "github";
|
|
363
|
+
}
|
|
364
|
+
async getPipelineStatus(branch, commit) {
|
|
365
|
+
let cmd = `gh run list --branch ${branch} --limit 1 --json databaseId,status,conclusion,headSha,headBranch,url,createdAt,updatedAt`;
|
|
366
|
+
if (commit) {
|
|
367
|
+
cmd += ` --commit ${commit}`;
|
|
368
|
+
}
|
|
369
|
+
const output = ciCommand(cmd, this.config.projectRoot, this.config.timeout);
|
|
370
|
+
if (!output) {
|
|
371
|
+
logger.warn("Failed to get GitHub Actions pipeline status");
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
try {
|
|
375
|
+
const runs = JSON.parse(output);
|
|
376
|
+
if (!Array.isArray(runs) || runs.length === 0)
|
|
377
|
+
return null;
|
|
378
|
+
return normalizeGitHubStatus(runs[0]);
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
logger.warn("Failed to parse GitHub Actions response");
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
async getPipelineLogs(pipelineId) {
|
|
386
|
+
const output = ciCommand(`gh run view ${pipelineId} --log`, this.config.projectRoot, this.config.timeout);
|
|
387
|
+
if (!output) {
|
|
388
|
+
logger.warn("Failed to get GitHub Actions pipeline logs");
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
return {
|
|
392
|
+
pipelineId,
|
|
393
|
+
jobs: [{ name: "all", status: "unknown", log: output }],
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
async waitForPipeline(branch, options) {
|
|
397
|
+
return pollForCompletion(this, branch, options);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
class GitLabCIProvider {
|
|
401
|
+
config;
|
|
402
|
+
constructor(config) {
|
|
403
|
+
this.config = config;
|
|
404
|
+
}
|
|
405
|
+
getProviderName() {
|
|
406
|
+
return "gitlab";
|
|
407
|
+
}
|
|
408
|
+
async getPipelineStatus(branch, commit) {
|
|
409
|
+
// Try glab CLI first
|
|
410
|
+
if (this.config.authMethod === "cli") {
|
|
411
|
+
const output = ciCommand(`glab ci list --branch ${branch} --per-page 1 --output json`, this.config.projectRoot, this.config.timeout);
|
|
412
|
+
if (output) {
|
|
413
|
+
try {
|
|
414
|
+
const pipelines = JSON.parse(output);
|
|
415
|
+
if (!Array.isArray(pipelines) || pipelines.length === 0)
|
|
416
|
+
return null;
|
|
417
|
+
const pipeline = pipelines[0];
|
|
418
|
+
// glab has no --sha flag, so check manually
|
|
419
|
+
if (commit && pipeline.sha !== commit)
|
|
420
|
+
return null;
|
|
421
|
+
return normalizeGitLabStatus(pipeline);
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
logger.warn("Failed to parse GitLab CI response");
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// Fallback to curl with token
|
|
430
|
+
return this.getPipelineStatusViaCurl(branch, commit);
|
|
431
|
+
}
|
|
432
|
+
getPipelineStatusViaCurl(branch, commit) {
|
|
433
|
+
if (!this.config.projectPath) {
|
|
434
|
+
logger.warn("GitLab API fallback unavailable: no project path detected. Configure glab CLI or set CI Provider in archai.config.md.");
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
const token = process.env.GITLAB_TOKEN || process.env.CI_JOB_TOKEN;
|
|
438
|
+
if (!token) {
|
|
439
|
+
logger.warn("No GitLab token available for API fallback");
|
|
440
|
+
return null;
|
|
441
|
+
}
|
|
442
|
+
const apiBase = this.config.apiBaseUrl || "https://gitlab.com/api/v4";
|
|
443
|
+
const encodedPath = this.config.projectPath
|
|
444
|
+
.split("/")
|
|
445
|
+
.map(encodeURIComponent)
|
|
446
|
+
.join("%2F");
|
|
447
|
+
let url = `${apiBase}/projects/${encodedPath}/pipelines?ref=${branch}&per_page=1`;
|
|
448
|
+
if (commit) {
|
|
449
|
+
url += `&sha=${commit}`;
|
|
450
|
+
}
|
|
451
|
+
const output = ciCommand(`curl -s -H "PRIVATE-TOKEN: ${token}" "${url}"`, this.config.projectRoot, this.config.timeout);
|
|
452
|
+
if (!output) {
|
|
453
|
+
logger.warn("Failed to get GitLab CI pipeline status via API");
|
|
454
|
+
return null;
|
|
455
|
+
}
|
|
456
|
+
try {
|
|
457
|
+
const pipelines = JSON.parse(output);
|
|
458
|
+
if (!Array.isArray(pipelines) || pipelines.length === 0)
|
|
459
|
+
return null;
|
|
460
|
+
return normalizeGitLabStatus(pipelines[0]);
|
|
461
|
+
}
|
|
462
|
+
catch {
|
|
463
|
+
logger.warn("Failed to parse GitLab API response");
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
async getPipelineLogs(pipelineId) {
|
|
468
|
+
const output = ciCommand(`glab ci view ${pipelineId}`, this.config.projectRoot, this.config.timeout);
|
|
469
|
+
if (!output) {
|
|
470
|
+
logger.warn("Failed to get GitLab CI pipeline logs");
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
return {
|
|
474
|
+
pipelineId,
|
|
475
|
+
jobs: [{ name: "all", status: "unknown", log: output }],
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
async waitForPipeline(branch, options) {
|
|
479
|
+
return pollForCompletion(this, branch, options);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
class NullCIProvider {
|
|
483
|
+
getProviderName() {
|
|
484
|
+
return "none";
|
|
485
|
+
}
|
|
486
|
+
async getPipelineStatus(_branch, _commit) {
|
|
487
|
+
logger.warn("No CI provider configured");
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
async getPipelineLogs(_pipelineId) {
|
|
491
|
+
logger.warn("No CI provider configured");
|
|
492
|
+
return null;
|
|
493
|
+
}
|
|
494
|
+
async waitForPipeline(_branch, _options) {
|
|
495
|
+
logger.warn("No CI provider configured");
|
|
496
|
+
return { status: "unknown", timedOut: false };
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
// ---------------------------------------------------------------------------
|
|
500
|
+
// Factory functions
|
|
501
|
+
// ---------------------------------------------------------------------------
|
|
502
|
+
/**
|
|
503
|
+
* Create a CIProvider instance from a config.
|
|
504
|
+
*/
|
|
505
|
+
export function createCIProvider(config) {
|
|
506
|
+
if (!config || config.provider === "none") {
|
|
507
|
+
return new NullCIProvider();
|
|
508
|
+
}
|
|
509
|
+
switch (config.provider) {
|
|
510
|
+
case "github":
|
|
511
|
+
return new GitHubActionsProvider(config);
|
|
512
|
+
case "gitlab":
|
|
513
|
+
return new GitLabCIProvider(config);
|
|
514
|
+
default:
|
|
515
|
+
return new NullCIProvider();
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Convenience function: detect CI provider and create an adapter.
|
|
520
|
+
*/
|
|
521
|
+
export async function getCIProvider(projectRoot) {
|
|
522
|
+
const result = await detectCIProvider(projectRoot);
|
|
523
|
+
return createCIProvider(result.config);
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=ci-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-provider.js","sourceRoot":"","sources":["../../src/utils/ci-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { CIContext, CIFailingJob, CIFailureReport, CIFailureType, CIPipelineStatus, CIStatusCheckResult, CIWaitOptionsExtended, CIWaitResultExtended } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Truncate a log to the last maxLines lines.
|
|
4
|
+
* Normalizes CRLF to LF. Prepends a truncation message if truncated.
|
|
5
|
+
*/
|
|
6
|
+
export declare function truncateLog(log: string, maxLines?: number): string;
|
|
7
|
+
/**
|
|
8
|
+
* Compute exponential backoff delay with jitter.
|
|
9
|
+
* Base: 1000ms * 2^attempt, capped at 60000ms, plus random jitter up to 1000ms.
|
|
10
|
+
*/
|
|
11
|
+
export declare function exponentialBackoff(attempt: number): number;
|
|
12
|
+
/**
|
|
13
|
+
* Classify a failure based on log content using regex pattern matching.
|
|
14
|
+
* Priority order: infrastructure > timeout > lint > test > build > deploy > unknown.
|
|
15
|
+
*/
|
|
16
|
+
export declare function classifyFailure(logs: string): CIFailureType;
|
|
17
|
+
/**
|
|
18
|
+
* Check pipeline status with extended semantics (not_found, not_configured).
|
|
19
|
+
* Note: Returns "not_found" for ANY null from provider, including network errors.
|
|
20
|
+
* The grace period in waitForPipelineCompletion handles transient errors by retrying.
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkPipelineStatus(ctx: CIContext, branch: string, commit?: string): Promise<CIStatusCheckResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Wait for a pipeline to reach a terminal status with grace period support.
|
|
25
|
+
* Does NOT call ctx.provider.waitForPipeline() -- supersedes it with grace period
|
|
26
|
+
* and better not_found handling.
|
|
27
|
+
*
|
|
28
|
+
* Known limitation: Rate-limit detection is NOT possible in the polling path because
|
|
29
|
+
* CIProvider.getPipelineStatus() swallows all errors. Rate-limit detection is only
|
|
30
|
+
* available in getFailingJobLogs via ciExec.
|
|
31
|
+
*/
|
|
32
|
+
export declare function waitForPipelineCompletion(ctx: CIContext, branch: string, options?: CIWaitOptionsExtended): Promise<CIWaitResultExtended>;
|
|
33
|
+
/**
|
|
34
|
+
* Parse GitHub Actions --log-failed output into per-job logs.
|
|
35
|
+
* Each line is tab-separated: jobName TAB stepName TAB timestamp message.
|
|
36
|
+
* Groups lines by job name, extracts message portion after the timestamp.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseGitHubFailedLogs(output: string): CIFailingJob[];
|
|
39
|
+
/**
|
|
40
|
+
* Parse GitLab REST API job list JSON response.
|
|
41
|
+
* Filters to failed jobs only.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseGitLabJobList(jsonOutput: string): Array<{
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
status: string;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Fetch logs for failing jobs only in a pipeline.
|
|
50
|
+
* Uses CLI commands directly via ciExec for per-job log extraction.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getFailingJobLogs(ctx: CIContext, pipelineId: string): Promise<CIFailingJob[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Assemble a structured CIFailureReport from pipeline data, failing jobs, and failure type.
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildFailureReport(pipeline: CIPipelineStatus, failingJobs: CIFailingJob[], failureType: CIFailureType): CIFailureReport;
|
|
57
|
+
//# sourceMappingURL=ci-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-status.d.ts","sourceRoot":"","sources":["../../src/utils/ci-status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,aAAa,EACb,gBAAgB,EAEhB,mBAAmB,EAEnB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAuD3B;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAY,GAAG,MAAM,CAmBvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAiB3D;AAMD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAW9B;AAYD;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAiD/B;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAuCpE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAcrD;AAMD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,SAAS,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAezB;AA8GD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,YAAY,EAAE,EAC3B,WAAW,EAAE,aAAa,GACzB,eAAe,CASjB"}
|