@brad-frost-web/eddie-brain 0.32.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 +109 -0
- package/dist/analyze/drift-detector.d.ts +30 -0
- package/dist/analyze/drift-detector.d.ts.map +1 -0
- package/dist/analyze/drift-detector.js +310 -0
- package/dist/analyze/drift-detector.js.map +1 -0
- package/dist/analyze/health-scorer.d.ts +71 -0
- package/dist/analyze/health-scorer.d.ts.map +1 -0
- package/dist/analyze/health-scorer.js +420 -0
- package/dist/analyze/health-scorer.js.map +1 -0
- package/dist/analyze/index.d.ts +11 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +11 -0
- package/dist/analyze/index.js.map +1 -0
- package/dist/analyze/naming-validator.d.ts +99 -0
- package/dist/analyze/naming-validator.d.ts.map +1 -0
- package/dist/analyze/naming-validator.js +430 -0
- package/dist/analyze/naming-validator.js.map +1 -0
- package/dist/analyze/slot-contract-validator.d.ts +68 -0
- package/dist/analyze/slot-contract-validator.d.ts.map +1 -0
- package/dist/analyze/slot-contract-validator.js +232 -0
- package/dist/analyze/slot-contract-validator.js.map +1 -0
- package/dist/analyze/token-validator.d.ts +62 -0
- package/dist/analyze/token-validator.d.ts.map +1 -0
- package/dist/analyze/token-validator.js +348 -0
- package/dist/analyze/token-validator.js.map +1 -0
- package/dist/cli/brain.d.ts +12 -0
- package/dist/cli/brain.d.ts.map +1 -0
- package/dist/cli/brain.js +641 -0
- package/dist/cli/brain.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +15 -0
- package/dist/cli/formatters/json.d.ts.map +1 -0
- package/dist/cli/formatters/json.js +18 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/terminal.d.ts +19 -0
- package/dist/cli/formatters/terminal.d.ts.map +1 -0
- package/dist/cli/formatters/terminal.js +125 -0
- package/dist/cli/formatters/terminal.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/data/governance-rules.json +94 -0
- package/dist/governance/audit-log.d.ts +17 -0
- package/dist/governance/audit-log.d.ts.map +1 -0
- package/dist/governance/audit-log.js +44 -0
- package/dist/governance/audit-log.js.map +1 -0
- package/dist/governance/index.d.ts +8 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +8 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/permissions.d.ts +26 -0
- package/dist/governance/permissions.d.ts.map +1 -0
- package/dist/governance/permissions.js +75 -0
- package/dist/governance/permissions.js.map +1 -0
- package/dist/governance/rules-engine.d.ts +24 -0
- package/dist/governance/rules-engine.d.ts.map +1 -0
- package/dist/governance/rules-engine.js +111 -0
- package/dist/governance/rules-engine.js.map +1 -0
- package/dist/governance/trust-manager.d.ts +34 -0
- package/dist/governance/trust-manager.d.ts.map +1 -0
- package/dist/governance/trust-manager.js +148 -0
- package/dist/governance/trust-manager.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge-graph/component-index.d.ts +320 -0
- package/dist/knowledge-graph/component-index.d.ts.map +1 -0
- package/dist/knowledge-graph/component-index.js +1033 -0
- package/dist/knowledge-graph/component-index.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +134 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +249 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/learning-history.d.ts +77 -0
- package/dist/knowledge-graph/learning-history.d.ts.map +1 -0
- package/dist/knowledge-graph/learning-history.js +187 -0
- package/dist/knowledge-graph/learning-history.js.map +1 -0
- package/dist/knowledge-graph/relationship-map.d.ts +55 -0
- package/dist/knowledge-graph/relationship-map.d.ts.map +1 -0
- package/dist/knowledge-graph/relationship-map.js +238 -0
- package/dist/knowledge-graph/relationship-map.js.map +1 -0
- package/dist/knowledge-graph/token-taxonomy.d.ts +127 -0
- package/dist/knowledge-graph/token-taxonomy.d.ts.map +1 -0
- package/dist/knowledge-graph/token-taxonomy.js +357 -0
- package/dist/knowledge-graph/token-taxonomy.js.map +1 -0
- package/dist/loop/fix-agent.d.ts +55 -0
- package/dist/loop/fix-agent.d.ts.map +1 -0
- package/dist/loop/fix-agent.js +344 -0
- package/dist/loop/fix-agent.js.map +1 -0
- package/dist/loop/index.d.ts +8 -0
- package/dist/loop/index.d.ts.map +1 -0
- package/dist/loop/index.js +8 -0
- package/dist/loop/index.js.map +1 -0
- package/dist/loop/issue-fetcher.d.ts +51 -0
- package/dist/loop/issue-fetcher.d.ts.map +1 -0
- package/dist/loop/issue-fetcher.js +188 -0
- package/dist/loop/issue-fetcher.js.map +1 -0
- package/dist/loop/observer.d.ts +42 -0
- package/dist/loop/observer.d.ts.map +1 -0
- package/dist/loop/observer.js +220 -0
- package/dist/loop/observer.js.map +1 -0
- package/dist/loop/pacer.d.ts +44 -0
- package/dist/loop/pacer.d.ts.map +1 -0
- package/dist/loop/pacer.js +90 -0
- package/dist/loop/pacer.js.map +1 -0
- package/dist/loop/reporter.d.ts +9 -0
- package/dist/loop/reporter.d.ts.map +1 -0
- package/dist/loop/reporter.js +119 -0
- package/dist/loop/reporter.js.map +1 -0
- package/dist/loop/runner.d.ts +57 -0
- package/dist/loop/runner.d.ts.map +1 -0
- package/dist/loop/runner.js +390 -0
- package/dist/loop/runner.js.map +1 -0
- package/dist/loop/types.d.ts +151 -0
- package/dist/loop/types.d.ts.map +1 -0
- package/dist/loop/types.js +22 -0
- package/dist/loop/types.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +618 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/pipeline/agent-runner.d.ts +34 -0
- package/dist/pipeline/agent-runner.d.ts.map +1 -0
- package/dist/pipeline/agent-runner.js +323 -0
- package/dist/pipeline/agent-runner.js.map +1 -0
- package/dist/pipeline/agents/accessibility-auditor.d.ts +10 -0
- package/dist/pipeline/agents/accessibility-auditor.d.ts.map +1 -0
- package/dist/pipeline/agents/accessibility-auditor.js +69 -0
- package/dist/pipeline/agents/accessibility-auditor.js.map +1 -0
- package/dist/pipeline/agents/code-reviewer.d.ts +10 -0
- package/dist/pipeline/agents/code-reviewer.d.ts.map +1 -0
- package/dist/pipeline/agents/code-reviewer.js +75 -0
- package/dist/pipeline/agents/code-reviewer.js.map +1 -0
- package/dist/pipeline/agents/code-writer.d.ts +10 -0
- package/dist/pipeline/agents/code-writer.d.ts.map +1 -0
- package/dist/pipeline/agents/code-writer.js +103 -0
- package/dist/pipeline/agents/code-writer.js.map +1 -0
- package/dist/pipeline/agents/component-architect.d.ts +13 -0
- package/dist/pipeline/agents/component-architect.d.ts.map +1 -0
- package/dist/pipeline/agents/component-architect.js +81 -0
- package/dist/pipeline/agents/component-architect.js.map +1 -0
- package/dist/pipeline/agents/index.d.ts +16 -0
- package/dist/pipeline/agents/index.d.ts.map +1 -0
- package/dist/pipeline/agents/index.js +24 -0
- package/dist/pipeline/agents/index.js.map +1 -0
- package/dist/pipeline/agents/library-researcher.d.ts +12 -0
- package/dist/pipeline/agents/library-researcher.d.ts.map +1 -0
- package/dist/pipeline/agents/library-researcher.js +85 -0
- package/dist/pipeline/agents/library-researcher.js.map +1 -0
- package/dist/pipeline/agents/quality-gate.d.ts +9 -0
- package/dist/pipeline/agents/quality-gate.d.ts.map +1 -0
- package/dist/pipeline/agents/quality-gate.js +71 -0
- package/dist/pipeline/agents/quality-gate.js.map +1 -0
- package/dist/pipeline/agents/spec-analyst.d.ts +10 -0
- package/dist/pipeline/agents/spec-analyst.d.ts.map +1 -0
- package/dist/pipeline/agents/spec-analyst.js +72 -0
- package/dist/pipeline/agents/spec-analyst.js.map +1 -0
- package/dist/pipeline/agents/story-author.d.ts +9 -0
- package/dist/pipeline/agents/story-author.d.ts.map +1 -0
- package/dist/pipeline/agents/story-author.js +65 -0
- package/dist/pipeline/agents/story-author.js.map +1 -0
- package/dist/pipeline/artifact-store.d.ts +27 -0
- package/dist/pipeline/artifact-store.d.ts.map +1 -0
- package/dist/pipeline/artifact-store.js +77 -0
- package/dist/pipeline/artifact-store.js.map +1 -0
- package/dist/pipeline/conversational-gate.d.ts +26 -0
- package/dist/pipeline/conversational-gate.d.ts.map +1 -0
- package/dist/pipeline/conversational-gate.js +122 -0
- package/dist/pipeline/conversational-gate.js.map +1 -0
- package/dist/pipeline/index.d.ts +14 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +17 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/iteration-tracker.d.ts +29 -0
- package/dist/pipeline/iteration-tracker.d.ts.map +1 -0
- package/dist/pipeline/iteration-tracker.js +102 -0
- package/dist/pipeline/iteration-tracker.js.map +1 -0
- package/dist/pipeline/learning-bridge.d.ts +37 -0
- package/dist/pipeline/learning-bridge.d.ts.map +1 -0
- package/dist/pipeline/learning-bridge.js +118 -0
- package/dist/pipeline/learning-bridge.js.map +1 -0
- package/dist/pipeline/orchestrator.d.ts +45 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +473 -0
- package/dist/pipeline/orchestrator.js.map +1 -0
- package/dist/pipeline/templates/architecture.d.ts +27 -0
- package/dist/pipeline/templates/architecture.d.ts.map +1 -0
- package/dist/pipeline/templates/architecture.js +111 -0
- package/dist/pipeline/templates/architecture.js.map +1 -0
- package/dist/pipeline/templates/brief.d.ts +22 -0
- package/dist/pipeline/templates/brief.d.ts.map +1 -0
- package/dist/pipeline/templates/brief.js +121 -0
- package/dist/pipeline/templates/brief.js.map +1 -0
- package/dist/pipeline/templates/component-rules.d.ts +25 -0
- package/dist/pipeline/templates/component-rules.d.ts.map +1 -0
- package/dist/pipeline/templates/component-rules.js +93 -0
- package/dist/pipeline/templates/component-rules.js.map +1 -0
- package/dist/pipeline/templates/index.d.ts +9 -0
- package/dist/pipeline/templates/index.d.ts.map +1 -0
- package/dist/pipeline/templates/index.js +7 -0
- package/dist/pipeline/templates/index.js.map +1 -0
- package/dist/pipeline/tool-handler.d.ts +25 -0
- package/dist/pipeline/tool-handler.d.ts.map +1 -0
- package/dist/pipeline/tool-handler.js +392 -0
- package/dist/pipeline/tool-handler.js.map +1 -0
- package/dist/pipeline/types.d.ts +146 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +27 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/plan/action-types.d.ts +31 -0
- package/dist/plan/action-types.d.ts.map +1 -0
- package/dist/plan/action-types.js +83 -0
- package/dist/plan/action-types.js.map +1 -0
- package/dist/plan/decision-engine.d.ts +57 -0
- package/dist/plan/decision-engine.d.ts.map +1 -0
- package/dist/plan/decision-engine.js +162 -0
- package/dist/plan/decision-engine.js.map +1 -0
- package/dist/plan/index.d.ts +6 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +6 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/types.d.ts +351 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +26 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/anthropic.d.ts +15 -0
- package/dist/utils/anthropic.d.ts.map +1 -0
- package/dist/utils/anthropic.js +40 -0
- package/dist/utils/anthropic.js.map +1 -0
- package/dist/utils/id.d.ts +8 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +14 -0
- package/dist/utils/id.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PipelineOrchestrator — Sequential pipeline runner
|
|
3
|
+
*
|
|
4
|
+
* Sequences 8 agents through three phases (UNDERSTAND → BUILD → VERIFY),
|
|
5
|
+
* manages artifact handoffs, enforces iteration budgets, handles the
|
|
6
|
+
* conversational gate, and persists state to disk for resumability.
|
|
7
|
+
*/
|
|
8
|
+
import type { KnowledgeGraph } from '../knowledge-graph/index.js';
|
|
9
|
+
import type { PipelineConfig, PipelineState } from './types.js';
|
|
10
|
+
export declare class PipelineOrchestrator {
|
|
11
|
+
private config;
|
|
12
|
+
private knowledgeGraph;
|
|
13
|
+
private store;
|
|
14
|
+
private learningBridge;
|
|
15
|
+
constructor(config: PipelineConfig, knowledgeGraph: KnowledgeGraph);
|
|
16
|
+
/**
|
|
17
|
+
* Load code guidelines and docs into the artifact store as context.
|
|
18
|
+
*/
|
|
19
|
+
private loadCodeContext;
|
|
20
|
+
/**
|
|
21
|
+
* If an existing component matches componentName, load its source files
|
|
22
|
+
* as input artifacts so agents can modify rather than rewrite.
|
|
23
|
+
*/
|
|
24
|
+
private loadExistingComponent;
|
|
25
|
+
/**
|
|
26
|
+
* Run the full pipeline from a text brief.
|
|
27
|
+
*/
|
|
28
|
+
run(brief: string, componentName: string): Promise<PipelineState>;
|
|
29
|
+
/**
|
|
30
|
+
* Resume a pipeline paused at a conversational gate.
|
|
31
|
+
*/
|
|
32
|
+
resume(stateId: string, gateDecision?: {
|
|
33
|
+
approved: boolean;
|
|
34
|
+
modifications?: string;
|
|
35
|
+
}): Promise<PipelineState>;
|
|
36
|
+
/** Create the initial pipeline state */
|
|
37
|
+
private createInitialState;
|
|
38
|
+
/** Save pipeline state to disk */
|
|
39
|
+
private saveState;
|
|
40
|
+
/** Load pipeline state from disk */
|
|
41
|
+
private loadState;
|
|
42
|
+
/** Write final output files to the output directory */
|
|
43
|
+
private writeOutputFiles;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAIV,cAAc,EACd,aAAa,EAEd,MAAM,YAAY,CAAC;AAYpB,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IALxB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,cAAc,CAAiB;gBAG7B,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,cAAc;IAMxC;;OAEG;YACW,eAAe;IAgC7B;;;OAGG;YACW,qBAAqB;IAuFnC;;OAEG;IACG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA0MvE;;OAEG;IACG,MAAM,CACV,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,OAAO,CAAC,aAAa,CAAC;IAgGzB,wCAAwC;IACxC,OAAO,CAAC,kBAAkB;IA8B1B,kCAAkC;YACpB,SAAS;IAWvB,oCAAoC;YACtB,SAAS;IAWvB,uDAAuD;YACzC,gBAAgB;CA0B/B"}
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PipelineOrchestrator — Sequential pipeline runner
|
|
3
|
+
*
|
|
4
|
+
* Sequences 8 agents through three phases (UNDERSTAND → BUILD → VERIFY),
|
|
5
|
+
* manages artifact handoffs, enforces iteration budgets, handles the
|
|
6
|
+
* conversational gate, and persists state to disk for resumability.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from 'crypto';
|
|
9
|
+
import { writeFile, readFile, mkdir } from 'fs/promises';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { existsSync, readFileSync } from 'fs';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import fg from 'fast-glob';
|
|
14
|
+
const { glob } = fg;
|
|
15
|
+
import { PIPELINE_AGENT_ORDER } from './types.js';
|
|
16
|
+
import { ArtifactStore } from './artifact-store.js';
|
|
17
|
+
import { IterationTracker } from './iteration-tracker.js';
|
|
18
|
+
import { presentGate, parsePushBacks } from './conversational-gate.js';
|
|
19
|
+
import { LearningBridge } from './learning-bridge.js';
|
|
20
|
+
import { AGENT_CONFIGS } from './agents/index.js';
|
|
21
|
+
import { runAgent } from './agent-runner.js';
|
|
22
|
+
/** Directory for pipeline state persistence */
|
|
23
|
+
const PIPELINES_DIR = 'pipelines';
|
|
24
|
+
export class PipelineOrchestrator {
|
|
25
|
+
config;
|
|
26
|
+
knowledgeGraph;
|
|
27
|
+
store;
|
|
28
|
+
learningBridge;
|
|
29
|
+
constructor(config, knowledgeGraph) {
|
|
30
|
+
this.config = config;
|
|
31
|
+
this.knowledgeGraph = knowledgeGraph;
|
|
32
|
+
this.store = new ArtifactStore();
|
|
33
|
+
this.learningBridge = new LearningBridge(knowledgeGraph.learningHistory);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load code guidelines and docs into the artifact store as context.
|
|
37
|
+
*/
|
|
38
|
+
async loadCodeContext() {
|
|
39
|
+
const rootDir = this.config.rootDir;
|
|
40
|
+
// Load CODE_GUIDELINES.md
|
|
41
|
+
const guidelinesPath = join(rootDir, 'docs/CODE_GUIDELINES.md');
|
|
42
|
+
if (existsSync(guidelinesPath)) {
|
|
43
|
+
const content = readFileSync(guidelinesPath, 'utf-8');
|
|
44
|
+
this.store.set({
|
|
45
|
+
name: 'code-guidelines.md',
|
|
46
|
+
content,
|
|
47
|
+
producedBy: 'spec-analyst', // placeholder
|
|
48
|
+
timestamp: new Date().toISOString(),
|
|
49
|
+
version: 1,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Load other docs
|
|
53
|
+
for (const docFile of ['TOKENS.md', 'THEMING.md']) {
|
|
54
|
+
const docPath = join(rootDir, 'docs', docFile);
|
|
55
|
+
if (existsSync(docPath)) {
|
|
56
|
+
const content = readFileSync(docPath, 'utf-8');
|
|
57
|
+
this.store.set({
|
|
58
|
+
name: `docs-${docFile.toLowerCase()}`,
|
|
59
|
+
content,
|
|
60
|
+
producedBy: 'spec-analyst',
|
|
61
|
+
timestamp: new Date().toISOString(),
|
|
62
|
+
version: 1,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* If an existing component matches componentName, load its source files
|
|
69
|
+
* as input artifacts so agents can modify rather than rewrite.
|
|
70
|
+
*/
|
|
71
|
+
async loadExistingComponent(componentName) {
|
|
72
|
+
const rootDir = this.config.rootDir;
|
|
73
|
+
const shortName = componentName.replace(/^ed-/, '');
|
|
74
|
+
// Search in eddie-web-components and eddie-recipes
|
|
75
|
+
const searchPaths = [
|
|
76
|
+
join(rootDir, 'packages/eddie-web-components/components', shortName),
|
|
77
|
+
join(rootDir, 'packages/eddie-recipes/recipes'),
|
|
78
|
+
];
|
|
79
|
+
for (const searchPath of searchPaths) {
|
|
80
|
+
const tsPath = join(searchPath, `${shortName}.ts`);
|
|
81
|
+
if (existsSync(tsPath)) {
|
|
82
|
+
console.log(chalk.cyan(` Loading existing component from ${searchPath}`));
|
|
83
|
+
// Load .ts
|
|
84
|
+
this.store.set({
|
|
85
|
+
name: 'existing-component.ts',
|
|
86
|
+
content: readFileSync(tsPath, 'utf-8'),
|
|
87
|
+
producedBy: 'spec-analyst',
|
|
88
|
+
timestamp: new Date().toISOString(),
|
|
89
|
+
version: 1,
|
|
90
|
+
});
|
|
91
|
+
// Load .scss
|
|
92
|
+
const scssPath = join(searchPath, `${shortName}.scss`);
|
|
93
|
+
if (existsSync(scssPath)) {
|
|
94
|
+
this.store.set({
|
|
95
|
+
name: 'existing-component.scss',
|
|
96
|
+
content: readFileSync(scssPath, 'utf-8'),
|
|
97
|
+
producedBy: 'spec-analyst',
|
|
98
|
+
timestamp: new Date().toISOString(),
|
|
99
|
+
version: 1,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Load .stories.ts
|
|
103
|
+
const storiesPath = join(searchPath, `${shortName}.stories.ts`);
|
|
104
|
+
if (existsSync(storiesPath)) {
|
|
105
|
+
this.store.set({
|
|
106
|
+
name: 'existing-component.stories.ts',
|
|
107
|
+
content: readFileSync(storiesPath, 'utf-8'),
|
|
108
|
+
producedBy: 'spec-analyst',
|
|
109
|
+
timestamp: new Date().toISOString(),
|
|
110
|
+
version: 1,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Also load a reference component (button) for new components to follow as an example
|
|
117
|
+
const buttonPath = join(rootDir, 'packages/eddie-web-components/components/button/button.ts');
|
|
118
|
+
if (existsSync(buttonPath)) {
|
|
119
|
+
this.store.set({
|
|
120
|
+
name: 'reference-component.ts',
|
|
121
|
+
content: readFileSync(buttonPath, 'utf-8'),
|
|
122
|
+
producedBy: 'spec-analyst',
|
|
123
|
+
timestamp: new Date().toISOString(),
|
|
124
|
+
version: 1,
|
|
125
|
+
});
|
|
126
|
+
const buttonScss = join(rootDir, 'packages/eddie-web-components/components/button/button.scss');
|
|
127
|
+
if (existsSync(buttonScss)) {
|
|
128
|
+
this.store.set({
|
|
129
|
+
name: 'reference-component.scss',
|
|
130
|
+
content: readFileSync(buttonScss, 'utf-8'),
|
|
131
|
+
producedBy: 'spec-analyst',
|
|
132
|
+
timestamp: new Date().toISOString(),
|
|
133
|
+
version: 1,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const buttonStories = join(rootDir, 'packages/eddie-web-components/components/button/button.stories.ts');
|
|
137
|
+
if (existsSync(buttonStories)) {
|
|
138
|
+
this.store.set({
|
|
139
|
+
name: 'reference-component.stories.ts',
|
|
140
|
+
content: readFileSync(buttonStories, 'utf-8'),
|
|
141
|
+
producedBy: 'spec-analyst',
|
|
142
|
+
timestamp: new Date().toISOString(),
|
|
143
|
+
version: 1,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Run the full pipeline from a text brief.
|
|
151
|
+
*/
|
|
152
|
+
async run(brief, componentName) {
|
|
153
|
+
const state = this.createInitialState(brief, componentName);
|
|
154
|
+
console.log(chalk.magenta.bold('\n🧠 Eddie Component Pipeline\n'));
|
|
155
|
+
console.log(chalk.gray(` Component: ${componentName}`));
|
|
156
|
+
console.log(chalk.gray(` Pipeline ID: ${state.id}`));
|
|
157
|
+
console.log(chalk.gray(` Model: ${this.config.model}\n`));
|
|
158
|
+
// Pre-load code guidelines and docs
|
|
159
|
+
await this.loadCodeContext();
|
|
160
|
+
// Check if this is a modification to an existing component
|
|
161
|
+
const isModification = await this.loadExistingComponent(componentName);
|
|
162
|
+
if (isModification) {
|
|
163
|
+
console.log(chalk.cyan(` Mode: Modify existing component\n`));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.log(chalk.cyan(` Mode: Create new component\n`));
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
for (const agentId of PIPELINE_AGENT_ORDER) {
|
|
170
|
+
const agentConfig = AGENT_CONFIGS[agentId];
|
|
171
|
+
const agentState = state.agents[agentId];
|
|
172
|
+
// Update state
|
|
173
|
+
state.currentAgent = agentId;
|
|
174
|
+
state.currentPhase = agentConfig.phase;
|
|
175
|
+
agentState.status = 'running';
|
|
176
|
+
agentState.startedAt = new Date().toISOString();
|
|
177
|
+
const phaseName = agentConfig.phase.toUpperCase();
|
|
178
|
+
console.log(chalk.bold(`\n[${phaseName}] ${agentConfig.name}`));
|
|
179
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
180
|
+
// Determine the user message for this agent
|
|
181
|
+
const isExisting = this.store.has('existing-component.ts');
|
|
182
|
+
const userMessage = agentId === 'spec-analyst'
|
|
183
|
+
? `Create a component brief for: ${brief}\n\nComponent name: ${componentName}` +
|
|
184
|
+
(isExisting ? '\n\nIMPORTANT: This is a MODIFICATION to an existing component. The existing source code is provided. Make targeted changes only — do not rewrite from scratch.' : '')
|
|
185
|
+
: `Process the component: ${componentName}` +
|
|
186
|
+
(isExisting ? '\n\nIMPORTANT: This is a MODIFICATION to an existing component. The existing source code is provided. Preserve the existing code structure, imports, patterns, and conventions. Make only the minimal changes needed.' : '');
|
|
187
|
+
// Run with iteration support
|
|
188
|
+
const maxIterations = this.config.iterationBudgets?.[agentId] ?? agentConfig.maxIterations;
|
|
189
|
+
const tracker = new IterationTracker(maxIterations, this.config.diminishingReturnsThreshold);
|
|
190
|
+
let lastResult = await runAgent(agentConfig, this.store, this.knowledgeGraph, this.config, userMessage);
|
|
191
|
+
if (lastResult.error) {
|
|
192
|
+
agentState.status = 'failed';
|
|
193
|
+
agentState.error = lastResult.error;
|
|
194
|
+
agentState.completedAt = new Date().toISOString();
|
|
195
|
+
state.status = 'failed';
|
|
196
|
+
await this.saveState(state);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
// Store artifacts from this run
|
|
200
|
+
for (const artifact of lastResult.artifacts) {
|
|
201
|
+
this.store.set(artifact);
|
|
202
|
+
}
|
|
203
|
+
// Fallback: if code-writer produced no code artifacts but existing source exists,
|
|
204
|
+
// seed the code artifacts from existing source so downstream agents can work
|
|
205
|
+
if (agentId === 'code-writer' && lastResult.artifacts.length === 0) {
|
|
206
|
+
console.log(chalk.yellow(` Warning: Code writer produced no artifact output.`));
|
|
207
|
+
const existingTs = this.store.get('existing-component.ts');
|
|
208
|
+
const existingScss = this.store.get('existing-component.scss');
|
|
209
|
+
const existingStories = this.store.get('existing-component.stories.ts');
|
|
210
|
+
if (existingTs) {
|
|
211
|
+
console.log(chalk.yellow(` Seeding component artifacts from existing source.`));
|
|
212
|
+
this.store.set({ name: 'component.ts', content: existingTs.content, producedBy: 'code-writer', timestamp: new Date().toISOString(), version: 1 });
|
|
213
|
+
}
|
|
214
|
+
if (existingScss) {
|
|
215
|
+
this.store.set({ name: 'component.scss', content: existingScss.content, producedBy: 'code-writer', timestamp: new Date().toISOString(), version: 1 });
|
|
216
|
+
}
|
|
217
|
+
if (existingStories) {
|
|
218
|
+
this.store.set({ name: 'component.stories.ts', content: existingStories.content, producedBy: 'code-writer', timestamp: new Date().toISOString(), version: 1 });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Handle iteration loops for agents with maxIterations > 1
|
|
222
|
+
if (maxIterations > 1 && lastResult.artifacts.length > 0) {
|
|
223
|
+
const issueCount = 0; // First iteration baseline
|
|
224
|
+
tracker.recordIteration(100 - issueCount, []);
|
|
225
|
+
// Additional iterations if warranted
|
|
226
|
+
for (let i = 1; i < maxIterations; i++) {
|
|
227
|
+
if (!tracker.shouldContinue()) {
|
|
228
|
+
console.log(chalk.yellow(` Stopping early (diminishing returns or budget exhausted)`));
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
// Quality gate: bail if same error twice
|
|
232
|
+
if (agentId === 'quality-gate' && tracker.hasSameErrorTwice()) {
|
|
233
|
+
console.log(chalk.red(` Same error twice — bailing.`));
|
|
234
|
+
agentState.error = 'Same error appeared in consecutive iterations';
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
console.log(chalk.gray(` Iteration ${i + 1}/${maxIterations}...`));
|
|
238
|
+
const iterResult = await runAgent(agentConfig, this.store, this.knowledgeGraph, this.config, userMessage);
|
|
239
|
+
if (iterResult.error) {
|
|
240
|
+
agentState.error = iterResult.error;
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
for (const artifact of iterResult.artifacts) {
|
|
244
|
+
this.store.set(artifact);
|
|
245
|
+
}
|
|
246
|
+
tracker.recordIteration(100, []);
|
|
247
|
+
}
|
|
248
|
+
agentState.iterations = tracker.getSummary(agentId);
|
|
249
|
+
}
|
|
250
|
+
// Handle conversational gate
|
|
251
|
+
if (agentConfig.hasConversationalGate) {
|
|
252
|
+
const architectureArtifact = this.store.get('architecture.md');
|
|
253
|
+
if (architectureArtifact) {
|
|
254
|
+
const pushBacks = parsePushBacks(architectureArtifact.content);
|
|
255
|
+
agentState.pushBacks = pushBacks;
|
|
256
|
+
const decision = await presentGate(architectureArtifact.content, pushBacks, this.config.interactive);
|
|
257
|
+
if (decision.saveForLater) {
|
|
258
|
+
agentState.status = 'gated';
|
|
259
|
+
state.status = 'gated';
|
|
260
|
+
await this.saveState(state);
|
|
261
|
+
console.log(chalk.yellow(`\n Pipeline paused. Resume with: eddie-brain pipeline resume ${state.id}\n`));
|
|
262
|
+
return state;
|
|
263
|
+
}
|
|
264
|
+
if (!decision.approved) {
|
|
265
|
+
agentState.status = 'failed';
|
|
266
|
+
agentState.error = 'Architecture rejected at conversational gate';
|
|
267
|
+
state.status = 'failed';
|
|
268
|
+
await this.saveState(state);
|
|
269
|
+
return state;
|
|
270
|
+
}
|
|
271
|
+
if (decision.modifications) {
|
|
272
|
+
// Apply modifications to the architecture artifact
|
|
273
|
+
this.store.set({
|
|
274
|
+
name: 'architecture.md',
|
|
275
|
+
content: decision.modifications,
|
|
276
|
+
producedBy: 'component-architect',
|
|
277
|
+
timestamp: new Date().toISOString(),
|
|
278
|
+
version: (architectureArtifact.version ?? 1) + 1,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Mark agent complete
|
|
284
|
+
agentState.status = agentState.error ? 'failed' : 'completed';
|
|
285
|
+
agentState.completedAt = new Date().toISOString();
|
|
286
|
+
// Save artifacts to pipeline state
|
|
287
|
+
state.artifacts = this.store.toJSON();
|
|
288
|
+
await this.saveState(state);
|
|
289
|
+
// If agent failed, stop the pipeline
|
|
290
|
+
if (agentState.status === 'failed') {
|
|
291
|
+
state.status = 'failed';
|
|
292
|
+
await this.saveState(state);
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Pipeline complete
|
|
297
|
+
if (state.status !== 'failed' && state.status !== 'gated') {
|
|
298
|
+
state.status = 'completed';
|
|
299
|
+
state.completedAt = new Date().toISOString();
|
|
300
|
+
// Write output files
|
|
301
|
+
await this.writeOutputFiles(state);
|
|
302
|
+
// Record learnings
|
|
303
|
+
this.learningBridge.recordPipelineOutcome(state);
|
|
304
|
+
console.log(chalk.green.bold(`\n✓ Pipeline complete! Output written to ${this.config.outputDir}\n`));
|
|
305
|
+
}
|
|
306
|
+
await this.saveState(state);
|
|
307
|
+
return state;
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
state.status = 'failed';
|
|
311
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
312
|
+
console.error(chalk.red(`\n✗ Pipeline failed: ${errorMsg}\n`));
|
|
313
|
+
await this.saveState(state);
|
|
314
|
+
return state;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Resume a pipeline paused at a conversational gate.
|
|
319
|
+
*/
|
|
320
|
+
async resume(stateId, gateDecision) {
|
|
321
|
+
const state = await this.loadState(stateId);
|
|
322
|
+
if (state.status !== 'gated') {
|
|
323
|
+
throw new Error(`Pipeline ${stateId} is not gated (status: ${state.status})`);
|
|
324
|
+
}
|
|
325
|
+
// Restore the artifact store
|
|
326
|
+
this.store = ArtifactStore.fromJSON(state.artifacts);
|
|
327
|
+
// Apply gate decision
|
|
328
|
+
if (gateDecision) {
|
|
329
|
+
const architectState = state.agents['component-architect'];
|
|
330
|
+
if (gateDecision.approved) {
|
|
331
|
+
architectState.status = 'completed';
|
|
332
|
+
architectState.completedAt = new Date().toISOString();
|
|
333
|
+
if (gateDecision.modifications) {
|
|
334
|
+
this.store.set({
|
|
335
|
+
name: 'architecture.md',
|
|
336
|
+
content: gateDecision.modifications,
|
|
337
|
+
producedBy: 'component-architect',
|
|
338
|
+
timestamp: new Date().toISOString(),
|
|
339
|
+
version: 2,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
architectState.status = 'failed';
|
|
345
|
+
architectState.error = 'Architecture rejected on resume';
|
|
346
|
+
state.status = 'failed';
|
|
347
|
+
await this.saveState(state);
|
|
348
|
+
return state;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Find where to resume (first non-completed agent after the gated one)
|
|
352
|
+
state.status = 'running';
|
|
353
|
+
let resumeFrom = false;
|
|
354
|
+
for (const agentId of PIPELINE_AGENT_ORDER) {
|
|
355
|
+
const agentState = state.agents[agentId];
|
|
356
|
+
if (agentState.status === 'gated') {
|
|
357
|
+
agentState.status = 'completed';
|
|
358
|
+
agentState.completedAt = new Date().toISOString();
|
|
359
|
+
resumeFrom = true;
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
if (!resumeFrom)
|
|
363
|
+
continue;
|
|
364
|
+
if (agentState.status === 'completed')
|
|
365
|
+
continue;
|
|
366
|
+
// Run this agent
|
|
367
|
+
const agentConfig = AGENT_CONFIGS[agentId];
|
|
368
|
+
state.currentAgent = agentId;
|
|
369
|
+
state.currentPhase = agentConfig.phase;
|
|
370
|
+
agentState.status = 'running';
|
|
371
|
+
agentState.startedAt = new Date().toISOString();
|
|
372
|
+
const phaseName = agentConfig.phase.toUpperCase();
|
|
373
|
+
console.log(chalk.bold(`\n[${phaseName}] ${agentConfig.name}`));
|
|
374
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
375
|
+
const userMessage = `Process the component: ${state.componentName}`;
|
|
376
|
+
const result = await runAgent(agentConfig, this.store, this.knowledgeGraph, this.config, userMessage);
|
|
377
|
+
if (result.error) {
|
|
378
|
+
agentState.status = 'failed';
|
|
379
|
+
agentState.error = result.error;
|
|
380
|
+
state.status = 'failed';
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
for (const artifact of result.artifacts) {
|
|
384
|
+
this.store.set(artifact);
|
|
385
|
+
}
|
|
386
|
+
agentState.status = 'completed';
|
|
387
|
+
agentState.completedAt = new Date().toISOString();
|
|
388
|
+
state.artifacts = this.store.toJSON();
|
|
389
|
+
await this.saveState(state);
|
|
390
|
+
}
|
|
391
|
+
if (state.status !== 'failed') {
|
|
392
|
+
state.status = 'completed';
|
|
393
|
+
state.completedAt = new Date().toISOString();
|
|
394
|
+
await this.writeOutputFiles(state);
|
|
395
|
+
this.learningBridge.recordPipelineOutcome(state);
|
|
396
|
+
console.log(chalk.green.bold(`\n✓ Pipeline complete! Output written to ${this.config.outputDir}\n`));
|
|
397
|
+
}
|
|
398
|
+
await this.saveState(state);
|
|
399
|
+
return state;
|
|
400
|
+
}
|
|
401
|
+
/** Create the initial pipeline state */
|
|
402
|
+
createInitialState(brief, componentName) {
|
|
403
|
+
const agents = {};
|
|
404
|
+
for (const agentId of PIPELINE_AGENT_ORDER) {
|
|
405
|
+
agents[agentId] = {
|
|
406
|
+
agentId,
|
|
407
|
+
status: 'pending',
|
|
408
|
+
startedAt: null,
|
|
409
|
+
completedAt: null,
|
|
410
|
+
iterations: null,
|
|
411
|
+
pushBacks: [],
|
|
412
|
+
error: null,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
return {
|
|
416
|
+
id: randomUUID(),
|
|
417
|
+
status: 'running',
|
|
418
|
+
brief,
|
|
419
|
+
componentName,
|
|
420
|
+
currentPhase: 'understand',
|
|
421
|
+
currentAgent: null,
|
|
422
|
+
agents,
|
|
423
|
+
artifacts: {},
|
|
424
|
+
startedAt: new Date().toISOString(),
|
|
425
|
+
completedAt: null,
|
|
426
|
+
learnings: [],
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
/** Save pipeline state to disk */
|
|
430
|
+
async saveState(state) {
|
|
431
|
+
const dir = join(this.config.rootDir, '.eddie-brain', PIPELINES_DIR, state.id);
|
|
432
|
+
if (!existsSync(dir)) {
|
|
433
|
+
await mkdir(dir, { recursive: true });
|
|
434
|
+
}
|
|
435
|
+
await writeFile(join(dir, 'state.json'), JSON.stringify(state, null, 2), 'utf-8');
|
|
436
|
+
// Also save artifacts to disk for easy browsing
|
|
437
|
+
await this.store.saveToDisk(join(dir, 'artifacts'));
|
|
438
|
+
}
|
|
439
|
+
/** Load pipeline state from disk */
|
|
440
|
+
async loadState(stateId) {
|
|
441
|
+
const statePath = join(this.config.rootDir, '.eddie-brain', PIPELINES_DIR, stateId, 'state.json');
|
|
442
|
+
if (!existsSync(statePath)) {
|
|
443
|
+
throw new Error(`Pipeline state not found: ${stateId}`);
|
|
444
|
+
}
|
|
445
|
+
const data = await readFile(statePath, 'utf-8');
|
|
446
|
+
return JSON.parse(data);
|
|
447
|
+
}
|
|
448
|
+
/** Write final output files to the output directory */
|
|
449
|
+
async writeOutputFiles(state) {
|
|
450
|
+
const outputDir = this.config.outputDir;
|
|
451
|
+
if (!existsSync(outputDir)) {
|
|
452
|
+
await mkdir(outputDir, { recursive: true });
|
|
453
|
+
}
|
|
454
|
+
// Derive the short name from the component name (e.g., "ed-progress-bar" → "progress-bar")
|
|
455
|
+
const shortName = state.componentName.replace(/^ed-/, '');
|
|
456
|
+
// Map artifact names to actual file names
|
|
457
|
+
const fileMap = {
|
|
458
|
+
'component.ts': `${shortName}.ts`,
|
|
459
|
+
'component.scss': `${shortName}.scss`,
|
|
460
|
+
'component.stories.ts': `${shortName}.stories.ts`,
|
|
461
|
+
'brief.md': 'brief.md',
|
|
462
|
+
'component-rules.md': 'component-rules.md',
|
|
463
|
+
'architecture.md': 'architecture.md',
|
|
464
|
+
};
|
|
465
|
+
for (const [artifactName, fileName] of Object.entries(fileMap)) {
|
|
466
|
+
const artifact = this.store.get(artifactName);
|
|
467
|
+
if (artifact) {
|
|
468
|
+
await writeFile(join(outputDir, fileName), artifact.content, 'utf-8');
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architecture Template — Structured template for the component architect's output
|
|
3
|
+
*
|
|
4
|
+
* The architecture.md artifact is the blueprint for the code writer.
|
|
5
|
+
* It includes a push-back section with [BLOCKING]/[OVERRIDE]/[SUGGESTION] markers.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ARCHITECTURE_TEMPLATE = "# Architecture: {{componentName}}\n\n## Class Hierarchy\n<!-- Which base class, what it extends, why. -->\n```\n{{componentName}} extends EdElement (LitElement)\n```\n\n## TypeScript Interface\n<!-- All @property decorators with types and defaults. -->\n```typescript\n@property({ type: String }) variant: string = 'default';\n@property({ type: String }) size: string = 'md';\n```\n\n## Slots\n<!-- Named slots with descriptions. -->\n| Slot | Description | Required |\n|------|-------------|----------|\n| (default) | Main content | Yes |\n\n## Events\n<!-- Custom events dispatched by this component. -->\n| Event | Detail | When |\n|-------|--------|------|\n<!-- None by default -->\n\n## Internal State\n<!-- @state() properties for internal rendering logic. -->\n\n## Render Structure\n<!-- Shadow DOM template outline in pseudocode/HTML. -->\n```html\n<div class=\"ed-c-{{shortName}}\">\n <slot></slot>\n</div>\n```\n\n## SCSS Structure\n<!-- BEM class map and token usage plan. -->\n```scss\n.ed-c-{{shortName}} {\n // Token usage plan:\n // background: var(--ed-theme-color-background-default);\n // padding: var(--ed-spacing-md);\n}\n```\n\n## Compound Component Split\n<!-- If this needs child components, list them here. -->\n<!-- e.g., ed-{{shortName}}-item, ed-{{shortName}}-header -->\n\n## Accessibility Plan\n<!-- ARIA roles, keyboard navigation, focus management. -->\n- Role:\n- Keyboard:\n- Focus management:\n- Screen reader:\n\n## Handoff Notes\n<!-- Anything the code writer needs to know that isn't obvious from the structure. -->\n\n## Push-Backs\n<!-- Issues found during architecture design. -->\n<!-- Format: [BLOCKING|OVERRIDE|SUGGESTION] Category: Message. Recommendation: ... -->\n";
|
|
8
|
+
/** Parsed architecture property */
|
|
9
|
+
export interface ArchitectureProperty {
|
|
10
|
+
name: string;
|
|
11
|
+
type: string;
|
|
12
|
+
default: string;
|
|
13
|
+
decorator: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Extract the TypeScript interface from architecture.md.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractProperties(content: string): ArchitectureProperty[];
|
|
19
|
+
/**
|
|
20
|
+
* Extract the render structure HTML from architecture.md.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractRenderStructure(content: string): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Extract the SCSS structure from architecture.md.
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractScssStructure(content: string): string | null;
|
|
27
|
+
//# sourceMappingURL=architecture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../../src/pipeline/templates/architecture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,qBAAqB,yrDAiEjC,CAAC;AAEF,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAqBzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAInE"}
|