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,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency validation utilities for scope sending
|
|
3
|
+
*/
|
|
4
|
+
import { DependencyValidationResult, ParsedScope } from '../types/send.js';
|
|
5
|
+
/**
|
|
6
|
+
* Get the status of a scope by its ID
|
|
7
|
+
* Searches all scope directories to find the scope
|
|
8
|
+
*/
|
|
9
|
+
export declare function getScopeStatus(projectPath: string, scopeId: string): Promise<{
|
|
10
|
+
status: string;
|
|
11
|
+
location: string;
|
|
12
|
+
} | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Parse dependencies from scope content
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseDependencies(content: string): Array<{
|
|
17
|
+
scope: string;
|
|
18
|
+
reason: string;
|
|
19
|
+
blocking: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Validate dependencies for a scope
|
|
23
|
+
* Returns information about blocking and non-blocking dependencies
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateDependencies(projectPath: string, scope: ParsedScope): Promise<DependencyValidationResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Get all scopes in the ready directory
|
|
28
|
+
*/
|
|
29
|
+
export declare function getReadyScopes(projectPath: string): Promise<ParsedScope[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Check sendability of all ready scopes
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkSendability(projectPath: string): Promise<Array<{
|
|
34
|
+
scope: ParsedScope;
|
|
35
|
+
canSend: boolean;
|
|
36
|
+
reasons: string[];
|
|
37
|
+
dependencyStatus: DependencyValidationResult;
|
|
38
|
+
}>>;
|
|
39
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/core/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG3E;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA0BtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAiC7D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,0BAA0B,CAAC,CA2CrC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsBhF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CACR,KAAK,CAAC;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,0BAA0B,CAAC;CAC9C,CAAC,CACH,CA8BA"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency validation utilities for scope sending
|
|
3
|
+
*/
|
|
4
|
+
import { readdir } from 'fs/promises';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { parseScope } from './send.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get the status of a scope by its ID
|
|
9
|
+
* Searches all scope directories to find the scope
|
|
10
|
+
*/
|
|
11
|
+
export async function getScopeStatus(projectPath, scopeId) {
|
|
12
|
+
const scopeDirs = ['drafts', 'ready', 'sent', 'completed'];
|
|
13
|
+
for (const dir of scopeDirs) {
|
|
14
|
+
const dirPath = path.join(projectPath, 'docs', 'scopes', dir);
|
|
15
|
+
try {
|
|
16
|
+
const files = await readdir(dirPath);
|
|
17
|
+
const scopeFile = files.find((f) => f.startsWith(scopeId) && f.endsWith('.md'));
|
|
18
|
+
if (scopeFile) {
|
|
19
|
+
const filePath = path.join(dirPath, scopeFile);
|
|
20
|
+
const scope = await parseScope(filePath);
|
|
21
|
+
if (scope) {
|
|
22
|
+
return {
|
|
23
|
+
status: scope.metadata.status,
|
|
24
|
+
location: dir,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Directory doesn't exist, continue
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse dependencies from scope content
|
|
37
|
+
*/
|
|
38
|
+
export function parseDependencies(content) {
|
|
39
|
+
const dependencies = [];
|
|
40
|
+
// Find the Dependencies section
|
|
41
|
+
const depsMatch = content.match(/## Dependencies\s*\n([\s\S]*?)(?=\n## |\n---|\n$)/);
|
|
42
|
+
if (!depsMatch) {
|
|
43
|
+
return dependencies;
|
|
44
|
+
}
|
|
45
|
+
const depsSection = depsMatch[1];
|
|
46
|
+
if (!depsSection) {
|
|
47
|
+
return dependencies;
|
|
48
|
+
}
|
|
49
|
+
// Parse markdown table rows
|
|
50
|
+
// Format: | SCOPE-XXX | reason | Yes/No |
|
|
51
|
+
const tableRowRegex = /\|\s*(SCOPE-\d{3})\s*\|\s*([^|]+)\|\s*(Yes|No)\s*\|/gi;
|
|
52
|
+
let match;
|
|
53
|
+
while ((match = tableRowRegex.exec(depsSection)) !== null) {
|
|
54
|
+
const scopeId = match[1];
|
|
55
|
+
const reason = match[2];
|
|
56
|
+
const blockingStr = match[3];
|
|
57
|
+
if (scopeId && reason && blockingStr) {
|
|
58
|
+
dependencies.push({
|
|
59
|
+
scope: scopeId,
|
|
60
|
+
reason: reason.trim(),
|
|
61
|
+
blocking: blockingStr.toLowerCase() === 'yes',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return dependencies;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validate dependencies for a scope
|
|
69
|
+
* Returns information about blocking and non-blocking dependencies
|
|
70
|
+
*/
|
|
71
|
+
export async function validateDependencies(projectPath, scope) {
|
|
72
|
+
const result = {
|
|
73
|
+
valid: true,
|
|
74
|
+
blocking: [],
|
|
75
|
+
nonBlocking: [],
|
|
76
|
+
};
|
|
77
|
+
const dependencies = parseDependencies(scope.content);
|
|
78
|
+
for (const dep of dependencies) {
|
|
79
|
+
const depStatus = await getScopeStatus(projectPath, dep.scope);
|
|
80
|
+
if (dep.blocking) {
|
|
81
|
+
if (!depStatus) {
|
|
82
|
+
// Blocking dependency doesn't exist
|
|
83
|
+
result.valid = false;
|
|
84
|
+
result.blocking.push({
|
|
85
|
+
scopeId: dep.scope,
|
|
86
|
+
reason: dep.reason,
|
|
87
|
+
status: 'not_found',
|
|
88
|
+
required_status: 'completed',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else if (depStatus.status !== 'completed' && depStatus.location !== 'completed') {
|
|
92
|
+
// Blocking dependency exists but not completed
|
|
93
|
+
result.valid = false;
|
|
94
|
+
result.blocking.push({
|
|
95
|
+
scopeId: dep.scope,
|
|
96
|
+
reason: dep.reason,
|
|
97
|
+
status: depStatus.status,
|
|
98
|
+
required_status: 'completed',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Non-blocking dependency - just record the status
|
|
104
|
+
result.nonBlocking.push({
|
|
105
|
+
scopeId: dep.scope,
|
|
106
|
+
reason: dep.reason,
|
|
107
|
+
status: depStatus?.status || 'not_found',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get all scopes in the ready directory
|
|
115
|
+
*/
|
|
116
|
+
export async function getReadyScopes(projectPath) {
|
|
117
|
+
const readyPath = path.join(projectPath, 'docs', 'scopes', 'ready');
|
|
118
|
+
const scopes = [];
|
|
119
|
+
try {
|
|
120
|
+
const files = await readdir(readyPath);
|
|
121
|
+
const scopeFiles = files.filter((f) => f.startsWith('SCOPE-') && f.endsWith('.md'));
|
|
122
|
+
for (const file of scopeFiles) {
|
|
123
|
+
const filePath = path.join(readyPath, file);
|
|
124
|
+
const scope = await parseScope(filePath);
|
|
125
|
+
if (scope) {
|
|
126
|
+
scopes.push(scope);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Directory doesn't exist
|
|
132
|
+
}
|
|
133
|
+
return scopes;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check sendability of all ready scopes
|
|
137
|
+
*/
|
|
138
|
+
export async function checkSendability(projectPath) {
|
|
139
|
+
const readyScopes = await getReadyScopes(projectPath);
|
|
140
|
+
const results = [];
|
|
141
|
+
for (const scope of readyScopes) {
|
|
142
|
+
const depStatus = await validateDependencies(projectPath, scope);
|
|
143
|
+
const reasons = [];
|
|
144
|
+
let canSend = true;
|
|
145
|
+
if (!depStatus.valid) {
|
|
146
|
+
canSend = false;
|
|
147
|
+
for (const blocking of depStatus.blocking) {
|
|
148
|
+
reasons.push(`Blocked by ${blocking.scopeId} (${blocking.status})`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
results.push({
|
|
152
|
+
scope,
|
|
153
|
+
canSend,
|
|
154
|
+
reasons,
|
|
155
|
+
dependencyStatus: depStatus,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return results;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/core/dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication health checks
|
|
3
|
+
* Validates GitHub token and permissions
|
|
4
|
+
*/
|
|
5
|
+
import type { HealthCheck } from '../../types/doctor.js';
|
|
6
|
+
/**
|
|
7
|
+
* GitHub token presence check
|
|
8
|
+
*/
|
|
9
|
+
export declare const tokenPresentCheck: HealthCheck;
|
|
10
|
+
/**
|
|
11
|
+
* GitHub token validity check
|
|
12
|
+
*/
|
|
13
|
+
export declare const tokenValidCheck: HealthCheck;
|
|
14
|
+
/**
|
|
15
|
+
* GitHub token scope check
|
|
16
|
+
*/
|
|
17
|
+
export declare const tokenScopeCheck: HealthCheck;
|
|
18
|
+
/**
|
|
19
|
+
* All auth checks
|
|
20
|
+
*/
|
|
21
|
+
export declare const authChecks: HealthCheck[];
|
|
22
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAUtE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAyB/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAsC7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WA4D7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAAW,EAInC,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication health checks
|
|
3
|
+
* Validates GitHub token and permissions
|
|
4
|
+
*/
|
|
5
|
+
import { Octokit } from 'octokit';
|
|
6
|
+
import { getTokenFromEnv, getTokenFromGhCli } from '../github.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get GitHub token from any available source
|
|
9
|
+
*/
|
|
10
|
+
function getGitHubToken() {
|
|
11
|
+
return getTokenFromEnv() || getTokenFromGhCli();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* GitHub token presence check
|
|
15
|
+
*/
|
|
16
|
+
export const tokenPresentCheck = {
|
|
17
|
+
name: 'GitHub token present',
|
|
18
|
+
category: 'auth',
|
|
19
|
+
critical: true,
|
|
20
|
+
run: async () => {
|
|
21
|
+
const token = getGitHubToken();
|
|
22
|
+
if (token) {
|
|
23
|
+
const source = getTokenFromEnv() ? 'environment variable' : 'GitHub CLI';
|
|
24
|
+
return {
|
|
25
|
+
name: 'GitHub token present',
|
|
26
|
+
category: 'auth',
|
|
27
|
+
status: 'passed',
|
|
28
|
+
details: `Found from ${source}`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
name: 'GitHub token present',
|
|
33
|
+
category: 'auth',
|
|
34
|
+
status: 'failed',
|
|
35
|
+
details: 'No token found in GITHUB_TOKEN, GH_TOKEN, or gh CLI',
|
|
36
|
+
fix: 'Set GITHUB_TOKEN environment variable or run `gh auth login`',
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* GitHub token validity check
|
|
42
|
+
*/
|
|
43
|
+
export const tokenValidCheck = {
|
|
44
|
+
name: 'GitHub token valid',
|
|
45
|
+
category: 'auth',
|
|
46
|
+
critical: true,
|
|
47
|
+
run: async () => {
|
|
48
|
+
const token = getGitHubToken();
|
|
49
|
+
if (!token) {
|
|
50
|
+
return {
|
|
51
|
+
name: 'GitHub token valid',
|
|
52
|
+
category: 'auth',
|
|
53
|
+
status: 'failed',
|
|
54
|
+
details: 'No token to validate',
|
|
55
|
+
fix: 'Set GITHUB_TOKEN environment variable',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const octokit = new Octokit({ auth: token });
|
|
60
|
+
const { data } = await octokit.rest.users.getAuthenticated();
|
|
61
|
+
return {
|
|
62
|
+
name: 'GitHub token valid',
|
|
63
|
+
category: 'auth',
|
|
64
|
+
status: 'passed',
|
|
65
|
+
details: `Authenticated as ${data.login}`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
70
|
+
return {
|
|
71
|
+
name: 'GitHub token valid',
|
|
72
|
+
category: 'auth',
|
|
73
|
+
status: 'failed',
|
|
74
|
+
details: `Authentication failed: ${message}`,
|
|
75
|
+
fix: 'Token is invalid or expired. Create new token at https://github.com/settings/tokens',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* GitHub token scope check
|
|
82
|
+
*/
|
|
83
|
+
export const tokenScopeCheck = {
|
|
84
|
+
name: 'Token has repo scope',
|
|
85
|
+
category: 'auth',
|
|
86
|
+
critical: false,
|
|
87
|
+
run: async () => {
|
|
88
|
+
const token = getGitHubToken();
|
|
89
|
+
if (!token) {
|
|
90
|
+
return {
|
|
91
|
+
name: 'Token has repo scope',
|
|
92
|
+
category: 'auth',
|
|
93
|
+
status: 'failed',
|
|
94
|
+
details: 'No token to check',
|
|
95
|
+
fix: 'Set GITHUB_TOKEN environment variable',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const octokit = new Octokit({ auth: token });
|
|
100
|
+
const response = await octokit.rest.users.getAuthenticated();
|
|
101
|
+
// Check OAuth scopes from response headers
|
|
102
|
+
const scopes = response.headers['x-oauth-scopes']?.split(', ') ?? [];
|
|
103
|
+
// Fine-grained tokens don't have x-oauth-scopes header
|
|
104
|
+
if (scopes.length === 0) {
|
|
105
|
+
return {
|
|
106
|
+
name: 'Token has repo scope',
|
|
107
|
+
category: 'auth',
|
|
108
|
+
status: 'passed',
|
|
109
|
+
details: 'Using fine-grained token (scopes managed per-repo)',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (scopes.includes('repo')) {
|
|
113
|
+
return {
|
|
114
|
+
name: 'Token has repo scope',
|
|
115
|
+
category: 'auth',
|
|
116
|
+
status: 'passed',
|
|
117
|
+
details: `Scopes: ${scopes.join(', ')}`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
name: 'Token has repo scope',
|
|
122
|
+
category: 'auth',
|
|
123
|
+
status: 'warning',
|
|
124
|
+
details: `Missing "repo" scope. Current: ${scopes.join(', ')}`,
|
|
125
|
+
fix: 'Update token to include "repo" scope at https://github.com/settings/tokens',
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return {
|
|
130
|
+
name: 'Token has repo scope',
|
|
131
|
+
category: 'auth',
|
|
132
|
+
status: 'failed',
|
|
133
|
+
details: 'Could not check token scopes',
|
|
134
|
+
fix: 'Ensure token is valid',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* All auth checks
|
|
141
|
+
*/
|
|
142
|
+
export const authChecks = [
|
|
143
|
+
tokenPresentCheck,
|
|
144
|
+
tokenValidCheck,
|
|
145
|
+
tokenScopeCheck,
|
|
146
|
+
];
|
|
147
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/core/doctor/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration health checks
|
|
3
|
+
* Validates config file existence and schema
|
|
4
|
+
*/
|
|
5
|
+
import type { HealthCheck } from '../../types/doctor.js';
|
|
6
|
+
/**
|
|
7
|
+
* Config file existence check
|
|
8
|
+
*/
|
|
9
|
+
export declare const configFileCheck: HealthCheck;
|
|
10
|
+
/**
|
|
11
|
+
* Config schema validation check
|
|
12
|
+
*/
|
|
13
|
+
export declare const configSchemaCheck: HealthCheck;
|
|
14
|
+
/**
|
|
15
|
+
* Directory structure check
|
|
16
|
+
*/
|
|
17
|
+
export declare const directoryStructureCheck: HealthCheck;
|
|
18
|
+
/**
|
|
19
|
+
* .env file check
|
|
20
|
+
*/
|
|
21
|
+
export declare const envFileCheck: HealthCheck;
|
|
22
|
+
/**
|
|
23
|
+
* All config checks
|
|
24
|
+
*/
|
|
25
|
+
export declare const configChecks: HealthCheck[];
|
|
26
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAyB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAgD/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAmDrC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,WA0B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,EAKrC,CAAC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration health checks
|
|
3
|
+
* Validates config file existence and schema
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { loadConfig } from '../config.js';
|
|
8
|
+
import { findProjectRoot } from '../project.js';
|
|
9
|
+
/**
|
|
10
|
+
* Config file existence check
|
|
11
|
+
*/
|
|
12
|
+
export const configFileCheck = {
|
|
13
|
+
name: 'Config file exists',
|
|
14
|
+
category: 'config',
|
|
15
|
+
critical: true,
|
|
16
|
+
run: async () => {
|
|
17
|
+
const cwd = process.cwd();
|
|
18
|
+
const projectRoot = findProjectRoot(cwd);
|
|
19
|
+
if (projectRoot && existsSync(path.join(projectRoot, 'vibe-fabric.toml'))) {
|
|
20
|
+
return {
|
|
21
|
+
name: 'Config file exists',
|
|
22
|
+
category: 'config',
|
|
23
|
+
status: 'passed',
|
|
24
|
+
details: 'vibe-fabric.toml found',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
name: 'Config file exists',
|
|
29
|
+
category: 'config',
|
|
30
|
+
status: 'failed',
|
|
31
|
+
details: 'vibe-fabric.toml not found',
|
|
32
|
+
fix: 'Run `vibe init` to create a new project',
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Config schema validation check
|
|
38
|
+
*/
|
|
39
|
+
export const configSchemaCheck = {
|
|
40
|
+
name: 'Config schema valid',
|
|
41
|
+
category: 'config',
|
|
42
|
+
critical: true,
|
|
43
|
+
run: async () => {
|
|
44
|
+
const cwd = process.cwd();
|
|
45
|
+
const projectRoot = findProjectRoot(cwd);
|
|
46
|
+
if (!projectRoot) {
|
|
47
|
+
return {
|
|
48
|
+
name: 'Config schema valid',
|
|
49
|
+
category: 'config',
|
|
50
|
+
status: 'failed',
|
|
51
|
+
details: 'No project found',
|
|
52
|
+
fix: 'Run `vibe init` to create a new project',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const config = await loadConfig(projectRoot);
|
|
57
|
+
if (config) {
|
|
58
|
+
return {
|
|
59
|
+
name: 'Config schema valid',
|
|
60
|
+
category: 'config',
|
|
61
|
+
status: 'passed',
|
|
62
|
+
details: `Project: ${config.project.name}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
name: 'Config schema valid',
|
|
67
|
+
category: 'config',
|
|
68
|
+
status: 'failed',
|
|
69
|
+
details: 'Config file is empty or invalid',
|
|
70
|
+
fix: 'Check vibe-fabric.toml for syntax errors',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
75
|
+
return {
|
|
76
|
+
name: 'Config schema valid',
|
|
77
|
+
category: 'config',
|
|
78
|
+
status: 'failed',
|
|
79
|
+
details: message,
|
|
80
|
+
fix: 'Fix the configuration errors shown above',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Directory structure check
|
|
87
|
+
*/
|
|
88
|
+
export const directoryStructureCheck = {
|
|
89
|
+
name: 'Directory structure valid',
|
|
90
|
+
category: 'config',
|
|
91
|
+
critical: false,
|
|
92
|
+
run: async () => {
|
|
93
|
+
const cwd = process.cwd();
|
|
94
|
+
const projectRoot = findProjectRoot(cwd);
|
|
95
|
+
if (!projectRoot) {
|
|
96
|
+
return {
|
|
97
|
+
name: 'Directory structure valid',
|
|
98
|
+
category: 'config',
|
|
99
|
+
status: 'failed',
|
|
100
|
+
details: 'No project found',
|
|
101
|
+
fix: 'Run `vibe init` to create a new project',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const requiredDirs = [
|
|
105
|
+
'docs/prd',
|
|
106
|
+
'docs/scopes/drafts',
|
|
107
|
+
'docs/scopes/sent',
|
|
108
|
+
'docs/scopes/completed',
|
|
109
|
+
'.claude',
|
|
110
|
+
];
|
|
111
|
+
const missingDirs = [];
|
|
112
|
+
for (const dir of requiredDirs) {
|
|
113
|
+
if (!existsSync(path.join(projectRoot, dir))) {
|
|
114
|
+
missingDirs.push(dir);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (missingDirs.length === 0) {
|
|
118
|
+
return {
|
|
119
|
+
name: 'Directory structure valid',
|
|
120
|
+
category: 'config',
|
|
121
|
+
status: 'passed',
|
|
122
|
+
details: 'All required directories present',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
name: 'Directory structure valid',
|
|
127
|
+
category: 'config',
|
|
128
|
+
status: 'warning',
|
|
129
|
+
details: `Missing: ${missingDirs.join(', ')}`,
|
|
130
|
+
fix: 'Run `vibe init` to recreate missing directories',
|
|
131
|
+
fixable: true,
|
|
132
|
+
};
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* .env file check
|
|
137
|
+
*/
|
|
138
|
+
export const envFileCheck = {
|
|
139
|
+
name: '.env file exists',
|
|
140
|
+
category: 'config',
|
|
141
|
+
critical: false,
|
|
142
|
+
run: async () => {
|
|
143
|
+
const cwd = process.cwd();
|
|
144
|
+
const projectRoot = findProjectRoot(cwd);
|
|
145
|
+
const envPath = projectRoot ? path.join(projectRoot, '.env') : path.join(cwd, '.env');
|
|
146
|
+
if (existsSync(envPath)) {
|
|
147
|
+
return {
|
|
148
|
+
name: '.env file exists',
|
|
149
|
+
category: 'config',
|
|
150
|
+
status: 'passed',
|
|
151
|
+
details: '.env found',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
name: '.env file exists',
|
|
156
|
+
category: 'config',
|
|
157
|
+
status: 'warning',
|
|
158
|
+
details: 'Not found (optional, can use environment variables)',
|
|
159
|
+
fix: 'Create .env with GITHUB_TOKEN=your_token',
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* All config checks
|
|
165
|
+
*/
|
|
166
|
+
export const configChecks = [
|
|
167
|
+
configFileCheck,
|
|
168
|
+
configSchemaCheck,
|
|
169
|
+
directoryStructureCheck,
|
|
170
|
+
envFileCheck,
|
|
171
|
+
];
|
|
172
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/doctor/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment health checks
|
|
3
|
+
* Checks Node.js version, UV, and Claude Code installation
|
|
4
|
+
*/
|
|
5
|
+
import type { HealthCheck } from '../../types/doctor.js';
|
|
6
|
+
/**
|
|
7
|
+
* Node.js version check
|
|
8
|
+
*/
|
|
9
|
+
export declare const nodeVersionCheck: HealthCheck;
|
|
10
|
+
/**
|
|
11
|
+
* UV installation check
|
|
12
|
+
*/
|
|
13
|
+
export declare const uvInstalledCheck: HealthCheck;
|
|
14
|
+
/**
|
|
15
|
+
* Claude Code installation check (critical)
|
|
16
|
+
*/
|
|
17
|
+
export declare const claudeCodeCheck: HealthCheck;
|
|
18
|
+
/**
|
|
19
|
+
* GitHub CLI check (optional, helpful for auth)
|
|
20
|
+
*/
|
|
21
|
+
export declare const ghCliCheck: HealthCheck;
|
|
22
|
+
/**
|
|
23
|
+
* All environment checks
|
|
24
|
+
*/
|
|
25
|
+
export declare const environmentChecks: HealthCheck[];
|
|
26
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/core/doctor/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,uBAAuB,CAAC;AA4BtE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAyB9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAwB9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAwB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAwBxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAK1C,CAAC"}
|