vibe-fabric 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +171 -0
- package/dist/cli/commands/claude.d.ts +19 -0
- package/dist/cli/commands/claude.d.ts.map +1 -0
- package/dist/cli/commands/claude.js +107 -0
- package/dist/cli/commands/claude.js.map +1 -0
- package/dist/cli/commands/coverage.d.ts +37 -0
- package/dist/cli/commands/coverage.d.ts.map +1 -0
- package/dist/cli/commands/coverage.js +374 -0
- package/dist/cli/commands/coverage.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +30 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +187 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gaps.d.ts +52 -0
- package/dist/cli/commands/gaps.d.ts.map +1 -0
- package/dist/cli/commands/gaps.js +487 -0
- package/dist/cli/commands/gaps.js.map +1 -0
- package/dist/cli/commands/help.d.ts +7 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +51 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/init.d.ts +39 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +246 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/prd.d.ts +30 -0
- package/dist/cli/commands/prd.d.ts.map +1 -0
- package/dist/cli/commands/prd.js +179 -0
- package/dist/cli/commands/prd.js.map +1 -0
- package/dist/cli/commands/repo/add.d.ts +36 -0
- package/dist/cli/commands/repo/add.d.ts.map +1 -0
- package/dist/cli/commands/repo/add.js +303 -0
- package/dist/cli/commands/repo/add.js.map +1 -0
- package/dist/cli/commands/scope.d.ts +36 -0
- package/dist/cli/commands/scope.d.ts.map +1 -0
- package/dist/cli/commands/scope.js +312 -0
- package/dist/cli/commands/scope.js.map +1 -0
- package/dist/cli/commands/send.d.ts +43 -0
- package/dist/cli/commands/send.d.ts.map +1 -0
- package/dist/cli/commands/send.js +469 -0
- package/dist/cli/commands/send.js.map +1 -0
- package/dist/cli/commands/status.d.ts +32 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +422 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +37 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +299 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/version.d.ts +7 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +45 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +65 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/components/ActiveScopes.d.ts +13 -0
- package/dist/cli/ui/components/ActiveScopes.d.ts.map +1 -0
- package/dist/cli/ui/components/ActiveScopes.js +25 -0
- package/dist/cli/ui/components/ActiveScopes.js.map +1 -0
- package/dist/cli/ui/components/EmptyState.d.ts +24 -0
- package/dist/cli/ui/components/EmptyState.d.ts.map +1 -0
- package/dist/cli/ui/components/EmptyState.js +13 -0
- package/dist/cli/ui/components/EmptyState.js.map +1 -0
- package/dist/cli/ui/components/Header.d.ts +11 -0
- package/dist/cli/ui/components/Header.d.ts.map +1 -0
- package/dist/cli/ui/components/Header.js +32 -0
- package/dist/cli/ui/components/Header.js.map +1 -0
- package/dist/cli/ui/components/PrdCoverage.d.ts +12 -0
- package/dist/cli/ui/components/PrdCoverage.d.ts.map +1 -0
- package/dist/cli/ui/components/PrdCoverage.js +15 -0
- package/dist/cli/ui/components/PrdCoverage.js.map +1 -0
- package/dist/cli/ui/components/RecentActivity.d.ts +12 -0
- package/dist/cli/ui/components/RecentActivity.d.ts.map +1 -0
- package/dist/cli/ui/components/RecentActivity.js +40 -0
- package/dist/cli/ui/components/RecentActivity.js.map +1 -0
- package/dist/cli/ui/components/RepoList.d.ts +12 -0
- package/dist/cli/ui/components/RepoList.d.ts.map +1 -0
- package/dist/cli/ui/components/RepoList.js +24 -0
- package/dist/cli/ui/components/RepoList.js.map +1 -0
- package/dist/cli/ui/components/Shortcuts.d.ts +7 -0
- package/dist/cli/ui/components/Shortcuts.d.ts.map +1 -0
- package/dist/cli/ui/components/Shortcuts.js +7 -0
- package/dist/cli/ui/components/Shortcuts.js.map +1 -0
- package/dist/cli/ui/components/index.d.ts +12 -0
- package/dist/cli/ui/components/index.d.ts.map +1 -0
- package/dist/cli/ui/components/index.js +12 -0
- package/dist/cli/ui/components/index.js.map +1 -0
- package/dist/cli/ui/dashboard.d.ts +9 -0
- package/dist/cli/ui/dashboard.d.ts.map +1 -0
- package/dist/cli/ui/dashboard.js +102 -0
- package/dist/cli/ui/dashboard.js.map +1 -0
- package/dist/core/commands.d.ts +32 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +361 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +78 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/coverage.d.ts +32 -0
- package/dist/core/coverage.d.ts.map +1 -0
- package/dist/core/coverage.js +286 -0
- package/dist/core/coverage.js.map +1 -0
- package/dist/core/dashboard/data.d.ts +73 -0
- package/dist/core/dashboard/data.d.ts.map +1 -0
- package/dist/core/dashboard/data.js +250 -0
- package/dist/core/dashboard/data.js.map +1 -0
- package/dist/core/dependencies.d.ts +39 -0
- package/dist/core/dependencies.d.ts.map +1 -0
- package/dist/core/dependencies.js +160 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/doctor/auth.d.ts +22 -0
- package/dist/core/doctor/auth.d.ts.map +1 -0
- package/dist/core/doctor/auth.js +147 -0
- package/dist/core/doctor/auth.js.map +1 -0
- package/dist/core/doctor/config.d.ts +26 -0
- package/dist/core/doctor/config.d.ts.map +1 -0
- package/dist/core/doctor/config.js +172 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/environment.d.ts +26 -0
- package/dist/core/doctor/environment.d.ts.map +1 -0
- package/dist/core/doctor/environment.js +145 -0
- package/dist/core/doctor/environment.js.map +1 -0
- package/dist/core/doctor/index.d.ts +44 -0
- package/dist/core/doctor/index.d.ts.map +1 -0
- package/dist/core/doctor/index.js +134 -0
- package/dist/core/doctor/index.js.map +1 -0
- package/dist/core/doctor/repos.d.ts +22 -0
- package/dist/core/doctor/repos.d.ts.map +1 -0
- package/dist/core/doctor/repos.js +262 -0
- package/dist/core/doctor/repos.js.map +1 -0
- package/dist/core/doctor/sync.d.ts +18 -0
- package/dist/core/doctor/sync.d.ts.map +1 -0
- package/dist/core/doctor/sync.js +146 -0
- package/dist/core/doctor/sync.js.map +1 -0
- package/dist/core/gaps.d.ts +70 -0
- package/dist/core/gaps.d.ts.map +1 -0
- package/dist/core/gaps.js +448 -0
- package/dist/core/gaps.js.map +1 -0
- package/dist/core/github.d.ts +38 -0
- package/dist/core/github.d.ts.map +1 -0
- package/dist/core/github.js +102 -0
- package/dist/core/github.js.map +1 -0
- package/dist/core/prd/analyzer.d.ts +44 -0
- package/dist/core/prd/analyzer.d.ts.map +1 -0
- package/dist/core/prd/analyzer.js +259 -0
- package/dist/core/prd/analyzer.js.map +1 -0
- package/dist/core/prd/check.d.ts +17 -0
- package/dist/core/prd/check.d.ts.map +1 -0
- package/dist/core/prd/check.js +154 -0
- package/dist/core/prd/check.js.map +1 -0
- package/dist/core/prd/index.d.ts +6 -0
- package/dist/core/prd/index.d.ts.map +1 -0
- package/dist/core/prd/index.js +6 -0
- package/dist/core/prd/index.js.map +1 -0
- package/dist/core/project.d.ts +13 -0
- package/dist/core/project.d.ts.map +1 -0
- package/dist/core/project.js +810 -0
- package/dist/core/project.js.map +1 -0
- package/dist/core/prompts.d.ts +52 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +266 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/repo/framework.d.ts +38 -0
- package/dist/core/repo/framework.d.ts.map +1 -0
- package/dist/core/repo/framework.js +142 -0
- package/dist/core/repo/framework.js.map +1 -0
- package/dist/core/repo/index.d.ts +6 -0
- package/dist/core/repo/index.d.ts.map +1 -0
- package/dist/core/repo/index.js +6 -0
- package/dist/core/repo/index.js.map +1 -0
- package/dist/core/repo/templates/claude-agents.d.ts +6 -0
- package/dist/core/repo/templates/claude-agents.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-agents.js +173 -0
- package/dist/core/repo/templates/claude-agents.js.map +1 -0
- package/dist/core/repo/templates/claude-commands.d.ts +6 -0
- package/dist/core/repo/templates/claude-commands.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-commands.js +278 -0
- package/dist/core/repo/templates/claude-commands.js.map +1 -0
- package/dist/core/repo/templates/claude-prompts.d.ts +6 -0
- package/dist/core/repo/templates/claude-prompts.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-prompts.js +258 -0
- package/dist/core/repo/templates/claude-prompts.js.map +1 -0
- package/dist/core/repo/templates/claude-scripts.d.ts +6 -0
- package/dist/core/repo/templates/claude-scripts.d.ts.map +1 -0
- package/dist/core/repo/templates/claude-scripts.js +212 -0
- package/dist/core/repo/templates/claude-scripts.js.map +1 -0
- package/dist/core/repo/templates/index.d.ts +22 -0
- package/dist/core/repo/templates/index.d.ts.map +1 -0
- package/dist/core/repo/templates/index.js +121 -0
- package/dist/core/repo/templates/index.js.map +1 -0
- package/dist/core/repo/templates/vibe-readme.d.ts +6 -0
- package/dist/core/repo/templates/vibe-readme.d.ts.map +1 -0
- package/dist/core/repo/templates/vibe-readme.js +204 -0
- package/dist/core/repo/templates/vibe-readme.js.map +1 -0
- package/dist/core/repo/templates/vibe-scripts.d.ts +6 -0
- package/dist/core/repo/templates/vibe-scripts.d.ts.map +1 -0
- package/dist/core/repo/templates/vibe-scripts.js +308 -0
- package/dist/core/repo/templates/vibe-scripts.js.map +1 -0
- package/dist/core/repo/validation.d.ts +46 -0
- package/dist/core/repo/validation.d.ts.map +1 -0
- package/dist/core/repo/validation.js +154 -0
- package/dist/core/repo/validation.js.map +1 -0
- package/dist/core/runner.d.ts +38 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +124 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/send.d.ts +83 -0
- package/dist/core/send.d.ts.map +1 -0
- package/dist/core/send.js +565 -0
- package/dist/core/send.js.map +1 -0
- package/dist/core/status.d.ts +76 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +430 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/sync/aggregator.d.ts +22 -0
- package/dist/core/sync/aggregator.d.ts.map +1 -0
- package/dist/core/sync/aggregator.js +278 -0
- package/dist/core/sync/aggregator.js.map +1 -0
- package/dist/core/sync/completion.d.ts +37 -0
- package/dist/core/sync/completion.d.ts.map +1 -0
- package/dist/core/sync/completion.js +264 -0
- package/dist/core/sync/completion.js.map +1 -0
- package/dist/core/sync/index.d.ts +51 -0
- package/dist/core/sync/index.d.ts.map +1 -0
- package/dist/core/sync/index.js +200 -0
- package/dist/core/sync/index.js.map +1 -0
- package/dist/core/sync/scanner.d.ts +39 -0
- package/dist/core/sync/scanner.d.ts.map +1 -0
- package/dist/core/sync/scanner.js +364 -0
- package/dist/core/sync/scanner.js.map +1 -0
- package/dist/types/config.d.ts +157 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +58 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/coverage.d.ts +100 -0
- package/dist/types/coverage.d.ts.map +1 -0
- package/dist/types/coverage.js +8 -0
- package/dist/types/coverage.js.map +1 -0
- package/dist/types/doctor.d.ts +68 -0
- package/dist/types/doctor.d.ts.map +1 -0
- package/dist/types/doctor.js +5 -0
- package/dist/types/doctor.js.map +1 -0
- package/dist/types/gaps.d.ts +129 -0
- package/dist/types/gaps.d.ts.map +1 -0
- package/dist/types/gaps.js +8 -0
- package/dist/types/gaps.js.map +1 -0
- package/dist/types/prompts.d.ts +99 -0
- package/dist/types/prompts.d.ts.map +1 -0
- package/dist/types/prompts.js +5 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/types/runner.d.ts +156 -0
- package/dist/types/runner.d.ts.map +1 -0
- package/dist/types/runner.js +41 -0
- package/dist/types/runner.js.map +1 -0
- package/dist/types/send.d.ts +157 -0
- package/dist/types/send.d.ts.map +1 -0
- package/dist/types/send.js +18 -0
- package/dist/types/send.js.map +1 -0
- package/dist/types/status.d.ts +150 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +15 -0
- package/dist/types/status.js.map +1 -0
- package/dist/types/sync.d.ts +259 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +38 -0
- package/dist/types/sync.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core send logic for pushing scopes to dev repositories
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, writeFile, rename, mkdir, access } from 'fs/promises';
|
|
5
|
+
import { constants } from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { validateDependencies, checkSendability } from './dependencies.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse scope metadata from markdown content
|
|
10
|
+
*/
|
|
11
|
+
export function parseScopeMetadata(content) {
|
|
12
|
+
const metadata = {};
|
|
13
|
+
// Parse ID from title
|
|
14
|
+
const titleMatch = content.match(/^#\s+SCOPE-(\d{3}):\s*(.+)$/m);
|
|
15
|
+
if (titleMatch) {
|
|
16
|
+
metadata.id = `SCOPE-${titleMatch[1]}`;
|
|
17
|
+
}
|
|
18
|
+
// Parse metadata table
|
|
19
|
+
const idMatch = content.match(/\*\*ID\*\*\s*\|\s*`?(SCOPE-\d{3})`?/);
|
|
20
|
+
if (idMatch) {
|
|
21
|
+
metadata.id = idMatch[1];
|
|
22
|
+
}
|
|
23
|
+
const statusMatch = content.match(/\*\*Status\*\*\s*\|\s*`?(\w+)`?/);
|
|
24
|
+
if (statusMatch && statusMatch[1]) {
|
|
25
|
+
metadata.status = statusMatch[1].toLowerCase();
|
|
26
|
+
}
|
|
27
|
+
const targetMatch = content.match(/\*\*Target\*\*\s*\|\s*`?(\w+)`?/);
|
|
28
|
+
if (targetMatch && targetMatch[1]) {
|
|
29
|
+
metadata.target = targetMatch[1].toLowerCase();
|
|
30
|
+
}
|
|
31
|
+
const complexityMatch = content.match(/\*\*Complexity\*\*\s*\|\s*`?([SMLX]+)`?/);
|
|
32
|
+
if (complexityMatch && complexityMatch[1]) {
|
|
33
|
+
metadata.complexity = complexityMatch[1];
|
|
34
|
+
}
|
|
35
|
+
const priorityMatch = content.match(/\*\*Priority\*\*\s*\|\s*`?(P\d)`?/);
|
|
36
|
+
if (priorityMatch && priorityMatch[1]) {
|
|
37
|
+
metadata.priority = priorityMatch[1];
|
|
38
|
+
}
|
|
39
|
+
const moduleMatch = content.match(/\*\*Module\*\*\s*\|\s*`?([^|`\n]+)`?/);
|
|
40
|
+
if (moduleMatch && moduleMatch[1]) {
|
|
41
|
+
metadata.module = moduleMatch[1].trim();
|
|
42
|
+
}
|
|
43
|
+
if (!metadata.id || !metadata.status || !metadata.target) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return metadata;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parse scope summary from markdown content
|
|
50
|
+
*/
|
|
51
|
+
export function parseScopeSummary(content) {
|
|
52
|
+
const summaryMatch = content.match(/## Summary\s*\n\n([^\n#]+)/);
|
|
53
|
+
return summaryMatch && summaryMatch[1] ? summaryMatch[1].trim() : '';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Extract scope title from content
|
|
57
|
+
*/
|
|
58
|
+
export function parseScopeTitle(content) {
|
|
59
|
+
const titleMatch = content.match(/^#\s+SCOPE-\d{3}:\s*(.+)$/m);
|
|
60
|
+
return titleMatch && titleMatch[1] ? titleMatch[1].trim() : '';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Parse a scope file
|
|
64
|
+
*/
|
|
65
|
+
export async function parseScope(filePath) {
|
|
66
|
+
try {
|
|
67
|
+
const content = await readFile(filePath, 'utf-8');
|
|
68
|
+
const metadata = parseScopeMetadata(content);
|
|
69
|
+
if (!metadata) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const title = parseScopeTitle(content);
|
|
73
|
+
const summary = parseScopeSummary(content);
|
|
74
|
+
const fileName = path.basename(filePath);
|
|
75
|
+
// Parse tracking metadata if present
|
|
76
|
+
let tracking;
|
|
77
|
+
const trackingMatch = content.match(/## Tracking\s*\n```json\n([\s\S]*?)\n```/);
|
|
78
|
+
if (trackingMatch && trackingMatch[1]) {
|
|
79
|
+
try {
|
|
80
|
+
tracking = JSON.parse(trackingMatch[1]);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Invalid tracking JSON
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
id: metadata.id,
|
|
88
|
+
title,
|
|
89
|
+
metadata,
|
|
90
|
+
summary,
|
|
91
|
+
content,
|
|
92
|
+
filePath,
|
|
93
|
+
fileName,
|
|
94
|
+
tracking,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Find scope in ready directory by ID
|
|
103
|
+
*/
|
|
104
|
+
export async function findReadyScope(projectPath, scopeId) {
|
|
105
|
+
const readyPath = path.join(projectPath, 'docs', 'scopes', 'ready');
|
|
106
|
+
try {
|
|
107
|
+
const { readdir } = await import('fs/promises');
|
|
108
|
+
const files = await readdir(readyPath);
|
|
109
|
+
const scopeFile = files.find((f) => f.startsWith(scopeId) && f.endsWith('.md'));
|
|
110
|
+
if (!scopeFile) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return parseScope(path.join(readyPath, scopeFile));
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get target repos for a scope based on target field
|
|
121
|
+
*/
|
|
122
|
+
export function getTargetRepos(scope, config) {
|
|
123
|
+
const target = scope.metadata.target.toLowerCase();
|
|
124
|
+
if (target === 'both') {
|
|
125
|
+
// Get repos in order specified by repo_order, or alphabetically
|
|
126
|
+
const order = scope.metadata.repo_order || ['backend', 'frontend'];
|
|
127
|
+
const repos = [];
|
|
128
|
+
for (const alias of order) {
|
|
129
|
+
const repo = config.repos.find((r) => r.alias === alias);
|
|
130
|
+
if (repo) {
|
|
131
|
+
repos.push(repo);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Add any remaining repos that weren't in the order
|
|
135
|
+
for (const repo of config.repos) {
|
|
136
|
+
if (!repos.find((r) => r.alias === repo.alias)) {
|
|
137
|
+
repos.push(repo);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return repos;
|
|
141
|
+
}
|
|
142
|
+
// Single target - find repo by alias
|
|
143
|
+
const repo = config.repos.find((r) => r.alias === target);
|
|
144
|
+
return repo ? [repo] : [];
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check the state of a scope in a dev repository
|
|
148
|
+
*/
|
|
149
|
+
export async function checkDevRepoState(octokit, owner, repo, branch, scopeId) {
|
|
150
|
+
const result = {
|
|
151
|
+
exists: false,
|
|
152
|
+
processed: false,
|
|
153
|
+
location: null,
|
|
154
|
+
};
|
|
155
|
+
// Check incoming-scopes
|
|
156
|
+
const incomingPath = `vibe/incoming-scopes`;
|
|
157
|
+
try {
|
|
158
|
+
const { data: contents } = await octokit.rest.repos.getContent({
|
|
159
|
+
owner,
|
|
160
|
+
repo,
|
|
161
|
+
path: incomingPath,
|
|
162
|
+
ref: branch,
|
|
163
|
+
});
|
|
164
|
+
if (Array.isArray(contents)) {
|
|
165
|
+
const scopeFile = contents.find((f) => f.name.startsWith(scopeId) && f.name.endsWith('.md'));
|
|
166
|
+
if (scopeFile) {
|
|
167
|
+
result.exists = true;
|
|
168
|
+
result.location = 'incoming';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Directory doesn't exist or can't be read
|
|
174
|
+
}
|
|
175
|
+
// Check processed folder
|
|
176
|
+
const processedPath = `vibe/incoming-scopes/processed`;
|
|
177
|
+
try {
|
|
178
|
+
const { data: contents } = await octokit.rest.repos.getContent({
|
|
179
|
+
owner,
|
|
180
|
+
repo,
|
|
181
|
+
path: processedPath,
|
|
182
|
+
ref: branch,
|
|
183
|
+
});
|
|
184
|
+
if (Array.isArray(contents)) {
|
|
185
|
+
const scopeFile = contents.find((f) => f.name.startsWith(scopeId) && f.name.endsWith('.md'));
|
|
186
|
+
if (scopeFile) {
|
|
187
|
+
result.exists = true;
|
|
188
|
+
result.processed = true;
|
|
189
|
+
result.location = 'processed';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Directory doesn't exist
|
|
195
|
+
}
|
|
196
|
+
// Check for implementation plan
|
|
197
|
+
const planPaths = [
|
|
198
|
+
`vibe/implementation-plans/active/${scopeId}-plan.md`,
|
|
199
|
+
`vibe/implementation-plans/completed/${scopeId}-plan.md`,
|
|
200
|
+
];
|
|
201
|
+
for (const planPath of planPaths) {
|
|
202
|
+
try {
|
|
203
|
+
await octokit.rest.repos.getContent({
|
|
204
|
+
owner,
|
|
205
|
+
repo,
|
|
206
|
+
path: planPath,
|
|
207
|
+
ref: branch,
|
|
208
|
+
});
|
|
209
|
+
result.plan_path = planPath;
|
|
210
|
+
result.plan_status = planPath.includes('/active/') ? 'active' : 'completed';
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Plan doesn't exist at this path
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Push scope file to dev repository
|
|
221
|
+
*/
|
|
222
|
+
export async function pushScopeToRepo(octokit, owner, repo, branch, scope, tracking) {
|
|
223
|
+
try {
|
|
224
|
+
// Get the current commit SHA
|
|
225
|
+
const { data: ref } = await octokit.rest.git.getRef({
|
|
226
|
+
owner,
|
|
227
|
+
repo,
|
|
228
|
+
ref: `heads/${branch}`,
|
|
229
|
+
});
|
|
230
|
+
const baseSha = ref.object.sha;
|
|
231
|
+
// Prepare scope content with tracking metadata
|
|
232
|
+
let scopeContent = scope.content;
|
|
233
|
+
// Remove existing tracking section if present
|
|
234
|
+
scopeContent = scopeContent.replace(/\n## Tracking\s*\n```json\n[\s\S]*?\n```\n?/, '');
|
|
235
|
+
// Add tracking metadata section
|
|
236
|
+
scopeContent += `\n\n## Tracking\n\n\`\`\`json\n${JSON.stringify(tracking, null, 2)}\n\`\`\`\n`;
|
|
237
|
+
// Create blob for scope file
|
|
238
|
+
const { data: blob } = await octokit.rest.git.createBlob({
|
|
239
|
+
owner,
|
|
240
|
+
repo,
|
|
241
|
+
content: Buffer.from(scopeContent).toString('base64'),
|
|
242
|
+
encoding: 'base64',
|
|
243
|
+
});
|
|
244
|
+
// Create tree with the scope file
|
|
245
|
+
const scopePath = `vibe/incoming-scopes/${scope.fileName}`;
|
|
246
|
+
const { data: newTree } = await octokit.rest.git.createTree({
|
|
247
|
+
owner,
|
|
248
|
+
repo,
|
|
249
|
+
base_tree: baseSha,
|
|
250
|
+
tree: [
|
|
251
|
+
{
|
|
252
|
+
path: scopePath,
|
|
253
|
+
mode: '100644',
|
|
254
|
+
type: 'blob',
|
|
255
|
+
sha: blob.sha,
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
});
|
|
259
|
+
// Create commit
|
|
260
|
+
const isUpdate = tracking.version > 1;
|
|
261
|
+
const commitMessage = isUpdate
|
|
262
|
+
? `[vibe-fabric] Update ${scope.id} (v${tracking.version})`
|
|
263
|
+
: `[vibe-fabric] Add ${scope.id}: ${scope.title}`;
|
|
264
|
+
const { data: commit } = await octokit.rest.git.createCommit({
|
|
265
|
+
owner,
|
|
266
|
+
repo,
|
|
267
|
+
message: commitMessage,
|
|
268
|
+
tree: newTree.sha,
|
|
269
|
+
parents: [baseSha],
|
|
270
|
+
});
|
|
271
|
+
// Update branch reference
|
|
272
|
+
await octokit.rest.git.updateRef({
|
|
273
|
+
owner,
|
|
274
|
+
repo,
|
|
275
|
+
ref: `heads/${branch}`,
|
|
276
|
+
sha: commit.sha,
|
|
277
|
+
});
|
|
278
|
+
return {
|
|
279
|
+
success: true,
|
|
280
|
+
commit_sha: commit.sha,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
return {
|
|
285
|
+
success: false,
|
|
286
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Create GitHub Issue for scope notification
|
|
292
|
+
*/
|
|
293
|
+
export async function createGitHubIssue(octokit, owner, repo, scope) {
|
|
294
|
+
try {
|
|
295
|
+
const body = `## New Scope: ${scope.id}
|
|
296
|
+
|
|
297
|
+
**${scope.title}**
|
|
298
|
+
|
|
299
|
+
### Summary
|
|
300
|
+
|
|
301
|
+
${scope.summary}
|
|
302
|
+
|
|
303
|
+
### Metadata
|
|
304
|
+
|
|
305
|
+
| Field | Value |
|
|
306
|
+
|-------|-------|
|
|
307
|
+
| Priority | ${scope.metadata.priority} |
|
|
308
|
+
| Complexity | ${scope.metadata.complexity} |
|
|
309
|
+
| Target | ${scope.metadata.target} |
|
|
310
|
+
${scope.metadata.module ? `| Module | ${scope.metadata.module} |` : ''}
|
|
311
|
+
|
|
312
|
+
### Next Steps
|
|
313
|
+
|
|
314
|
+
1. Review the scope document in \`vibe/incoming-scopes/${scope.fileName}\`
|
|
315
|
+
2. Create an implementation plan in \`vibe/implementation-plans/active/\`
|
|
316
|
+
3. Begin implementation
|
|
317
|
+
4. Move completed plan to \`vibe/implementation-plans/completed/\`
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
*This issue was created automatically by [vibe-fabric](https://github.com/jneaimi/vibe-fabric)*
|
|
321
|
+
`;
|
|
322
|
+
const labels = ['vibe-scope', `priority:${scope.metadata.priority.toLowerCase()}`];
|
|
323
|
+
const { data: issue } = await octokit.rest.issues.create({
|
|
324
|
+
owner,
|
|
325
|
+
repo,
|
|
326
|
+
title: `[${scope.id}] ${scope.title}`,
|
|
327
|
+
body,
|
|
328
|
+
labels,
|
|
329
|
+
});
|
|
330
|
+
return {
|
|
331
|
+
success: true,
|
|
332
|
+
issue_number: issue.number,
|
|
333
|
+
issue_url: issue.html_url,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
return {
|
|
338
|
+
success: false,
|
|
339
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Add comment to existing GitHub Issue
|
|
345
|
+
*/
|
|
346
|
+
export async function addIssueComment(octokit, owner, repo, issueNumber, scope, version) {
|
|
347
|
+
try {
|
|
348
|
+
const body = `## Scope Updated (v${version})
|
|
349
|
+
|
|
350
|
+
The scope document has been updated. Please review the changes in \`vibe/incoming-scopes/${scope.fileName}\`.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
*Updated by [vibe-fabric](https://github.com/jneaimi/vibe-fabric)*
|
|
354
|
+
`;
|
|
355
|
+
await octokit.rest.issues.createComment({
|
|
356
|
+
owner,
|
|
357
|
+
repo,
|
|
358
|
+
issue_number: issueNumber,
|
|
359
|
+
body,
|
|
360
|
+
});
|
|
361
|
+
return { success: true };
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
return {
|
|
365
|
+
success: false,
|
|
366
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Move scope from ready to sent
|
|
372
|
+
*/
|
|
373
|
+
export async function moveScopeToSent(projectPath, scope) {
|
|
374
|
+
const sentPath = path.join(projectPath, 'docs', 'scopes', 'sent');
|
|
375
|
+
// Ensure sent directory exists
|
|
376
|
+
try {
|
|
377
|
+
await access(sentPath, constants.W_OK);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
await mkdir(sentPath, { recursive: true });
|
|
381
|
+
}
|
|
382
|
+
const newPath = path.join(sentPath, scope.fileName);
|
|
383
|
+
await rename(scope.filePath, newPath);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Update scope file with tracking metadata and new status
|
|
387
|
+
*/
|
|
388
|
+
export async function updateScopeWithTracking(scope, tracking, _results) {
|
|
389
|
+
let content = scope.content;
|
|
390
|
+
// Update status to 'sent'
|
|
391
|
+
content = content.replace(/(\*\*Status\*\*\s*\|\s*)`?\w+`?/, '$1`sent`');
|
|
392
|
+
// Remove existing tracking section if present
|
|
393
|
+
content = content.replace(/\n## Tracking\s*\n```json\n[\s\S]*?\n```\n?/, '');
|
|
394
|
+
// Add tracking metadata section
|
|
395
|
+
content += `\n\n## Tracking\n\n\`\`\`json\n${JSON.stringify(tracking, null, 2)}\n\`\`\`\n`;
|
|
396
|
+
await writeFile(scope.filePath, content, 'utf-8');
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Send a single scope to its target repositories
|
|
400
|
+
*/
|
|
401
|
+
export async function sendScope(octokit, projectPath, scope, config, options = {}) {
|
|
402
|
+
const results = [];
|
|
403
|
+
const targetRepos = getTargetRepos(scope, config);
|
|
404
|
+
if (targetRepos.length === 0) {
|
|
405
|
+
return [
|
|
406
|
+
{
|
|
407
|
+
repo: scope.metadata.target,
|
|
408
|
+
alias: scope.metadata.target,
|
|
409
|
+
success: false,
|
|
410
|
+
error: `No repository found with alias '${scope.metadata.target}'`,
|
|
411
|
+
},
|
|
412
|
+
];
|
|
413
|
+
}
|
|
414
|
+
// Validate dependencies
|
|
415
|
+
const depValidation = await validateDependencies(projectPath, scope);
|
|
416
|
+
if (!depValidation.valid && !options.force) {
|
|
417
|
+
const blockingMsg = depValidation.blocking
|
|
418
|
+
.map((b) => `${b.scopeId} (${b.status})`)
|
|
419
|
+
.join(', ');
|
|
420
|
+
const firstRepo = targetRepos[0];
|
|
421
|
+
return [
|
|
422
|
+
{
|
|
423
|
+
repo: firstRepo?.name || scope.metadata.target,
|
|
424
|
+
alias: firstRepo?.alias || scope.metadata.target,
|
|
425
|
+
success: false,
|
|
426
|
+
error: `Blocking dependencies not completed: ${blockingMsg}`,
|
|
427
|
+
},
|
|
428
|
+
];
|
|
429
|
+
}
|
|
430
|
+
// Prepare tracking metadata
|
|
431
|
+
const existingVersion = scope.tracking?.version || 0;
|
|
432
|
+
const newVersion = existingVersion + 1;
|
|
433
|
+
const tracking = {
|
|
434
|
+
version: newVersion,
|
|
435
|
+
sent_at: new Date().toISOString(),
|
|
436
|
+
sent_from: projectPath,
|
|
437
|
+
source_path: scope.filePath,
|
|
438
|
+
target_repos: targetRepos.map((r) => r.alias),
|
|
439
|
+
github_issues: scope.tracking?.github_issues || {},
|
|
440
|
+
version_history: [
|
|
441
|
+
...(scope.tracking?.version_history || []),
|
|
442
|
+
{
|
|
443
|
+
version: newVersion,
|
|
444
|
+
sent_at: new Date().toISOString(),
|
|
445
|
+
},
|
|
446
|
+
],
|
|
447
|
+
};
|
|
448
|
+
// Send to each target repo
|
|
449
|
+
for (const repo of targetRepos) {
|
|
450
|
+
// Check dev repo state
|
|
451
|
+
const devState = await checkDevRepoState(octokit, repo.owner, repo.name, repo.branch, scope.id);
|
|
452
|
+
// Handle re-send scenarios
|
|
453
|
+
if (devState.processed || devState.plan_status) {
|
|
454
|
+
if (!options.force) {
|
|
455
|
+
results.push({
|
|
456
|
+
repo: repo.name,
|
|
457
|
+
alias: repo.alias,
|
|
458
|
+
success: false,
|
|
459
|
+
skipped: true,
|
|
460
|
+
skip_reason: devState.plan_status
|
|
461
|
+
? `Scope has ${devState.plan_status} implementation plan`
|
|
462
|
+
: 'Scope already processed',
|
|
463
|
+
});
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
if (options.dryRun) {
|
|
468
|
+
results.push({
|
|
469
|
+
repo: repo.name,
|
|
470
|
+
alias: repo.alias,
|
|
471
|
+
success: true,
|
|
472
|
+
skipped: true,
|
|
473
|
+
skip_reason: 'Dry run - no changes made',
|
|
474
|
+
});
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
// Push scope to repo
|
|
478
|
+
const pushResult = await pushScopeToRepo(octokit, repo.owner, repo.name, repo.branch, scope, tracking);
|
|
479
|
+
if (!pushResult.success) {
|
|
480
|
+
results.push({
|
|
481
|
+
repo: repo.name,
|
|
482
|
+
alias: repo.alias,
|
|
483
|
+
success: false,
|
|
484
|
+
error: pushResult.error,
|
|
485
|
+
});
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
// Handle GitHub Issue
|
|
489
|
+
let issueNumber;
|
|
490
|
+
let issueUrl;
|
|
491
|
+
if (!options.noNotify) {
|
|
492
|
+
const existingIssue = tracking.github_issues[repo.alias];
|
|
493
|
+
if (existingIssue) {
|
|
494
|
+
// Add comment to existing issue
|
|
495
|
+
await addIssueComment(octokit, repo.owner, repo.name, existingIssue, scope, newVersion);
|
|
496
|
+
issueNumber = existingIssue;
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
// Create new issue
|
|
500
|
+
const issueResult = await createGitHubIssue(octokit, repo.owner, repo.name, scope);
|
|
501
|
+
if (issueResult.success) {
|
|
502
|
+
issueNumber = issueResult.issue_number;
|
|
503
|
+
issueUrl = issueResult.issue_url;
|
|
504
|
+
tracking.github_issues[repo.alias] = issueNumber;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
results.push({
|
|
509
|
+
repo: repo.name,
|
|
510
|
+
alias: repo.alias,
|
|
511
|
+
success: true,
|
|
512
|
+
commit_sha: pushResult.commit_sha,
|
|
513
|
+
issue_number: issueNumber,
|
|
514
|
+
issue_url: issueUrl,
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
// Update local scope with tracking if any sends succeeded
|
|
518
|
+
const anySuccess = results.some((r) => r.success && !r.skipped);
|
|
519
|
+
if (anySuccess && !options.dryRun) {
|
|
520
|
+
await updateScopeWithTracking(scope, tracking, results);
|
|
521
|
+
await moveScopeToSent(projectPath, scope);
|
|
522
|
+
}
|
|
523
|
+
return results;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Send all sendable scopes (batch mode)
|
|
527
|
+
*/
|
|
528
|
+
export async function sendAllScopes(octokit, projectPath, config, options = {}) {
|
|
529
|
+
const result = {
|
|
530
|
+
sent: [],
|
|
531
|
+
skipped: [],
|
|
532
|
+
failed: [],
|
|
533
|
+
};
|
|
534
|
+
// Get sendability status for all ready scopes
|
|
535
|
+
const sendabilityResults = await checkSendability(projectPath);
|
|
536
|
+
for (const { scope, canSend, reasons } of sendabilityResults) {
|
|
537
|
+
if (!canSend && !options.force) {
|
|
538
|
+
result.skipped.push({
|
|
539
|
+
scopeId: scope.id,
|
|
540
|
+
reason: reasons.join(', '),
|
|
541
|
+
});
|
|
542
|
+
continue;
|
|
543
|
+
}
|
|
544
|
+
const sendResults = await sendScope(octokit, projectPath, scope, config, options);
|
|
545
|
+
for (const sendResult of sendResults) {
|
|
546
|
+
if (sendResult.success) {
|
|
547
|
+
result.sent.push(sendResult);
|
|
548
|
+
}
|
|
549
|
+
else if (sendResult.skipped) {
|
|
550
|
+
result.skipped.push({
|
|
551
|
+
scopeId: scope.id,
|
|
552
|
+
reason: sendResult.skip_reason || 'Unknown',
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
result.failed.push({
|
|
557
|
+
scopeId: scope.id,
|
|
558
|
+
error: sendResult.error || 'Unknown error',
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return result;
|
|
564
|
+
}
|
|
565
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/core/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core status module - loads and aggregates project status data
|
|
3
|
+
*
|
|
4
|
+
* Reads from cached files only (no network calls) to provide
|
|
5
|
+
* instant project health overview.
|
|
6
|
+
*/
|
|
7
|
+
import { Config } from '../types/config.js';
|
|
8
|
+
import { ProjectStatus, RepoStatus, CoverageData, ScopeCounts, GapSummary, GapDetail, FreshnessInfo, HealthLevel, StatusJsonOutput } from '../types/status.js';
|
|
9
|
+
import { LastSyncData, AggregatedProgress } from '../types/sync.js';
|
|
10
|
+
/**
|
|
11
|
+
* Load last sync data from cache
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadLastSyncData(projectPath: string): Promise<LastSyncData | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Load aggregated progress data from cache
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadAggregatedData(projectPath: string): Promise<AggregatedProgress | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Get human-readable time since last sync
|
|
20
|
+
*/
|
|
21
|
+
export declare function getTimeSinceSync(lastSyncTimestamp: string | null): string;
|
|
22
|
+
/**
|
|
23
|
+
* Check if data is stale
|
|
24
|
+
*/
|
|
25
|
+
export declare function isStale(lastSyncTimestamp: string | null, thresholdMinutes?: number): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get freshness info from last sync data
|
|
28
|
+
*/
|
|
29
|
+
export declare function getFreshnessInfo(lastSync: LastSyncData | null, thresholdMinutes?: number): FreshnessInfo;
|
|
30
|
+
/**
|
|
31
|
+
* Build repo status from last sync and config
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildRepoStatus(config: Config, lastSync: LastSyncData | null): RepoStatus[];
|
|
34
|
+
/**
|
|
35
|
+
* Count scopes by directory
|
|
36
|
+
*/
|
|
37
|
+
export declare function countScopesByDir(projectPath: string): Promise<ScopeCounts>;
|
|
38
|
+
/**
|
|
39
|
+
* Get scope counts from aggregated data (includes in_progress and blocked)
|
|
40
|
+
*/
|
|
41
|
+
export declare function getScopeCountsFromAggregated(aggregated: AggregatedProgress | null, fsCounts: ScopeCounts): ScopeCounts;
|
|
42
|
+
/**
|
|
43
|
+
* Parse gaps from PRD modules
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseGapsFromPrd(projectPath: string): Promise<{
|
|
46
|
+
summary: GapSummary;
|
|
47
|
+
details: GapDetail[];
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Calculate PRD coverage from modules
|
|
51
|
+
*/
|
|
52
|
+
export declare function calculateCoverage(projectPath: string): Promise<CoverageData>;
|
|
53
|
+
/**
|
|
54
|
+
* Determine health level and reasons
|
|
55
|
+
*/
|
|
56
|
+
export declare function evaluateHealth(freshness: FreshnessInfo, repos: RepoStatus[], gaps: GapSummary): {
|
|
57
|
+
health: HealthLevel;
|
|
58
|
+
reasons: string[];
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Load complete project status
|
|
62
|
+
*/
|
|
63
|
+
export declare function loadProjectStatus(projectPath: string, config: Config): Promise<ProjectStatus>;
|
|
64
|
+
/**
|
|
65
|
+
* Generate progress bar string
|
|
66
|
+
*/
|
|
67
|
+
export declare function progressBar(percent: number, width?: number): string;
|
|
68
|
+
/**
|
|
69
|
+
* Convert status to JSON output format
|
|
70
|
+
*/
|
|
71
|
+
export declare function toJsonOutput(status: ProjectStatus): StatusJsonOutput;
|
|
72
|
+
/**
|
|
73
|
+
* Get exit code for health level
|
|
74
|
+
*/
|
|
75
|
+
export declare function getExitCode(health: HealthLevel): number;
|
|
76
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,gBAAgB,EAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAOpE;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAS9B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CASpC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAgBzE;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,gBAAgB,GAAE,MAAgC,GACjD,OAAO,CAQT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,GAAG,IAAI,EAC7B,gBAAgB,GAAE,MAAgC,GACjD,aAAa,CASf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,GAAG,IAAI,GAC5B,UAAU,EAAE,CAmCd;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4ChF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,kBAAkB,GAAG,IAAI,EACrC,QAAQ,EAAE,WAAW,GACpB,WAAW,CAab;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC,CA6ExD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAsEvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,UAAU,EAAE,EACnB,IAAI,EAAE,UAAU,GACf;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA+B5C;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAmCxB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAIvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,CA2CpE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEvD"}
|