@planu/cli 0.94.0 → 0.96.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.
Files changed (111) hide show
  1. package/dist/config/license-plans.json +4 -1
  2. package/dist/config/skill-catalog.json +94 -0
  3. package/dist/engine/browser-validator.d.ts +17 -0
  4. package/dist/engine/browser-validator.d.ts.map +1 -0
  5. package/dist/engine/browser-validator.js +167 -0
  6. package/dist/engine/browser-validator.js.map +1 -0
  7. package/dist/engine/diagram/excalidraw-generator.d.ts +7 -0
  8. package/dist/engine/diagram/excalidraw-generator.d.ts.map +1 -0
  9. package/dist/engine/diagram/excalidraw-generator.js +274 -0
  10. package/dist/engine/diagram/excalidraw-generator.js.map +1 -0
  11. package/dist/engine/github/findings-merger.d.ts +4 -0
  12. package/dist/engine/github/findings-merger.d.ts.map +1 -0
  13. package/dist/engine/github/findings-merger.js +97 -0
  14. package/dist/engine/github/findings-merger.js.map +1 -0
  15. package/dist/engine/github/quality-dimensions.d.ts +7 -0
  16. package/dist/engine/github/quality-dimensions.d.ts.map +1 -0
  17. package/dist/engine/github/quality-dimensions.js +243 -0
  18. package/dist/engine/github/quality-dimensions.js.map +1 -0
  19. package/dist/engine/github/review-analyzer.d.ts.map +1 -1
  20. package/dist/engine/github/review-analyzer.js +1 -0
  21. package/dist/engine/github/review-analyzer.js.map +1 -1
  22. package/dist/engine/github/review-dimensions.d.ts +8 -0
  23. package/dist/engine/github/review-dimensions.d.ts.map +1 -0
  24. package/dist/engine/github/review-dimensions.js +253 -0
  25. package/dist/engine/github/review-dimensions.js.map +1 -0
  26. package/dist/engine/github/review-helpers.d.ts +4 -0
  27. package/dist/engine/github/review-helpers.d.ts.map +1 -0
  28. package/dist/engine/github/review-helpers.js +31 -0
  29. package/dist/engine/github/review-helpers.js.map +1 -0
  30. package/dist/engine/google-workspace-exporter.d.ts +22 -0
  31. package/dist/engine/google-workspace-exporter.d.ts.map +1 -0
  32. package/dist/engine/google-workspace-exporter.js +159 -0
  33. package/dist/engine/google-workspace-exporter.js.map +1 -0
  34. package/dist/engine/skill-registry/builtin-catalog-adapter.d.ts +11 -0
  35. package/dist/engine/skill-registry/builtin-catalog-adapter.d.ts.map +1 -0
  36. package/dist/engine/skill-registry/builtin-catalog-adapter.js +95 -0
  37. package/dist/engine/skill-registry/builtin-catalog-adapter.js.map +1 -0
  38. package/dist/engine/skill-registry/index.d.ts +1 -0
  39. package/dist/engine/skill-registry/index.d.ts.map +1 -1
  40. package/dist/engine/skill-registry/index.js +1 -0
  41. package/dist/engine/skill-registry/index.js.map +1 -1
  42. package/dist/engine/skill-registry/installer.d.ts.map +1 -1
  43. package/dist/engine/skill-registry/installer.js +41 -0
  44. package/dist/engine/skill-registry/installer.js.map +1 -1
  45. package/dist/engine/skill-registry/unified-search.d.ts.map +1 -1
  46. package/dist/engine/skill-registry/unified-search.js +3 -0
  47. package/dist/engine/skill-registry/unified-search.js.map +1 -1
  48. package/dist/index.js +6 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/tools/browser-validate-handler.d.ts +8 -0
  51. package/dist/tools/browser-validate-handler.d.ts.map +1 -0
  52. package/dist/tools/browser-validate-handler.js +111 -0
  53. package/dist/tools/browser-validate-handler.js.map +1 -0
  54. package/dist/tools/diagram-handler.d.ts +4 -0
  55. package/dist/tools/diagram-handler.d.ts.map +1 -0
  56. package/dist/tools/diagram-handler.js +77 -0
  57. package/dist/tools/diagram-handler.js.map +1 -0
  58. package/dist/tools/github-review-handler.d.ts.map +1 -1
  59. package/dist/tools/github-review-handler.js +125 -0
  60. package/dist/tools/github-review-handler.js.map +1 -1
  61. package/dist/tools/google-workspace-handler.d.ts +10 -0
  62. package/dist/tools/google-workspace-handler.d.ts.map +1 -0
  63. package/dist/tools/google-workspace-handler.js +121 -0
  64. package/dist/tools/google-workspace-handler.js.map +1 -0
  65. package/dist/tools/register-browser-validate-tools.d.ts +3 -0
  66. package/dist/tools/register-browser-validate-tools.d.ts.map +1 -0
  67. package/dist/tools/register-browser-validate-tools.js +30 -0
  68. package/dist/tools/register-browser-validate-tools.js.map +1 -0
  69. package/dist/tools/register-diagram-tools.d.ts +3 -0
  70. package/dist/tools/register-diagram-tools.d.ts.map +1 -0
  71. package/dist/tools/register-diagram-tools.js +28 -0
  72. package/dist/tools/register-diagram-tools.js.map +1 -0
  73. package/dist/tools/register-github-tools.d.ts.map +1 -1
  74. package/dist/tools/register-github-tools.js +3 -1
  75. package/dist/tools/register-github-tools.js.map +1 -1
  76. package/dist/tools/register-google-workspace-tools.d.ts +3 -0
  77. package/dist/tools/register-google-workspace-tools.d.ts.map +1 -0
  78. package/dist/tools/register-google-workspace-tools.js +41 -0
  79. package/dist/tools/register-google-workspace-tools.js.map +1 -0
  80. package/dist/tools/schemas/github.d.ts +2 -0
  81. package/dist/tools/schemas/github.d.ts.map +1 -1
  82. package/dist/tools/schemas/github.js +3 -2
  83. package/dist/tools/schemas/github.js.map +1 -1
  84. package/dist/tools/skill-registry/search.d.ts.map +1 -1
  85. package/dist/tools/skill-registry/search.js +8 -0
  86. package/dist/tools/skill-registry/search.js.map +1 -1
  87. package/dist/types/browser-validator.d.ts +40 -0
  88. package/dist/types/browser-validator.d.ts.map +1 -0
  89. package/dist/types/browser-validator.js +3 -0
  90. package/dist/types/browser-validator.js.map +1 -0
  91. package/dist/types/common/tech-enums.d.ts +1 -1
  92. package/dist/types/common/tech-enums.d.ts.map +1 -1
  93. package/dist/types/diagram.d.ts +73 -0
  94. package/dist/types/diagram.d.ts.map +1 -0
  95. package/dist/types/diagram.js +2 -0
  96. package/dist/types/diagram.js.map +1 -0
  97. package/dist/types/github.d.ts +28 -1
  98. package/dist/types/github.d.ts.map +1 -1
  99. package/dist/types/google-workspace.d.ts +39 -0
  100. package/dist/types/google-workspace.d.ts.map +1 -0
  101. package/dist/types/google-workspace.js +3 -0
  102. package/dist/types/google-workspace.js.map +1 -0
  103. package/dist/types/index.d.ts +3 -0
  104. package/dist/types/index.d.ts.map +1 -1
  105. package/dist/types/index.js +3 -0
  106. package/dist/types/index.js.map +1 -1
  107. package/dist/types/skill-registry.d.ts +22 -0
  108. package/dist/types/skill-registry.d.ts.map +1 -1
  109. package/package.json +1 -1
  110. package/src/config/license-plans.json +4 -1
  111. package/src/config/skill-catalog.json +94 -0
@@ -253,7 +253,10 @@
253
253
  "configure_slack",
254
254
  "slack_notify",
255
255
  "remove_slack",
256
- "search_all_projects"
256
+ "search_all_projects",
257
+ "validate_browser",
258
+ "sync_google_workspace",
259
+ "generate_diagram"
257
260
  ],
258
261
  "alwaysAllowed": [
259
262
  "activate_license",
@@ -0,0 +1,94 @@
1
+ {
2
+ "skills": [
3
+ {
4
+ "name": "brainstorming",
5
+ "description": "Structured ideation with trade-off analysis and constraint mapping",
6
+ "category": "planning",
7
+ "tags": ["ideation", "planning", "architecture"],
8
+ "trigger": "When user wants to explore feature options or evaluate approaches",
9
+ "installCommand": "planu skill_install brainstorming",
10
+ "builtIn": true
11
+ },
12
+ {
13
+ "name": "api-design",
14
+ "description": "REST/GraphQL API design: naming conventions, versioning, error responses, OpenAPI spec",
15
+ "category": "backend",
16
+ "tags": ["api", "rest", "graphql", "design"],
17
+ "trigger": "Before designing or reviewing any API endpoint",
18
+ "installCommand": "planu skill_install api-design",
19
+ "builtIn": true
20
+ },
21
+ {
22
+ "name": "security-audit",
23
+ "description": "OWASP Top 10 review, secrets detection, auth/authz checks, input validation",
24
+ "category": "security",
25
+ "tags": ["security", "owasp", "auth", "review"],
26
+ "trigger": "Before any code that handles user input, authentication, or sensitive data",
27
+ "installCommand": "planu skill_install security-audit",
28
+ "builtIn": true
29
+ },
30
+ {
31
+ "name": "debugging-strategy",
32
+ "description": "Systematic debugging: reproduce, isolate, hypothesize, verify, fix",
33
+ "category": "debugging",
34
+ "tags": ["debugging", "troubleshooting", "diagnosis"],
35
+ "trigger": "When investigating a bug or unexpected behavior",
36
+ "installCommand": "planu skill_install debugging-strategy",
37
+ "builtIn": true
38
+ },
39
+ {
40
+ "name": "architecture-review",
41
+ "description": "SOLID principles, dependency analysis, coupling/cohesion, scalability review",
42
+ "category": "architecture",
43
+ "tags": ["architecture", "solid", "design-patterns", "review"],
44
+ "trigger": "Before major refactors or new module design",
45
+ "installCommand": "planu skill_install architecture-review",
46
+ "builtIn": true
47
+ },
48
+ {
49
+ "name": "documentation-writer",
50
+ "description": "Generates README, API docs, runbooks and ADRs from code context",
51
+ "category": "documentation",
52
+ "tags": ["docs", "readme", "adr", "runbook"],
53
+ "trigger": "After implementing a feature or when docs are missing",
54
+ "installCommand": "planu skill_install documentation-writer",
55
+ "builtIn": true
56
+ },
57
+ {
58
+ "name": "pr-description",
59
+ "description": "Generates structured PR descriptions with context, changes, and test plan",
60
+ "category": "git",
61
+ "tags": ["git", "pr", "github", "review"],
62
+ "trigger": "Before creating or updating a pull request",
63
+ "installCommand": "planu skill_install pr-description",
64
+ "builtIn": true
65
+ },
66
+ {
67
+ "name": "test-strategy",
68
+ "description": "Test pyramid planning, coverage strategy, unit/integration/e2e breakdown per feature",
69
+ "category": "testing",
70
+ "tags": ["testing", "tdd", "coverage", "e2e"],
71
+ "trigger": "Before implementing tests for a new feature or module",
72
+ "installCommand": "planu skill_install test-strategy",
73
+ "builtIn": true
74
+ },
75
+ {
76
+ "name": "refactoring-advisor",
77
+ "description": "Identifies code smells and suggests extract-method, decompose-conditional, rename patterns",
78
+ "category": "refactoring",
79
+ "tags": ["refactoring", "clean-code", "smells", "patterns"],
80
+ "trigger": "When code is hard to understand, extend, or test",
81
+ "installCommand": "planu skill_install refactoring-advisor",
82
+ "builtIn": true
83
+ },
84
+ {
85
+ "name": "database-design",
86
+ "description": "Schema normalization, index strategy, migration patterns and query optimization",
87
+ "category": "database",
88
+ "tags": ["database", "sql", "schema", "migrations", "performance"],
89
+ "trigger": "Before designing or modifying database schemas",
90
+ "installCommand": "planu skill_install database-design",
91
+ "builtIn": true
92
+ }
93
+ ]
94
+ }
@@ -0,0 +1,17 @@
1
+ import type { UIAssertion } from '../types/index.js';
2
+ /**
3
+ * Extract UI-testable assertions from spec acceptance criteria markdown.
4
+ * Parses lines matching `- [ ]` or `- [x]` patterns.
5
+ */
6
+ export declare function extractUIAssertions(criteriaMarkdown: string): UIAssertion[];
7
+ /**
8
+ * Generate a complete Playwright test file content from UI assertions.
9
+ * Uses @playwright/test syntax with test.step() per assertion.
10
+ */
11
+ export declare function generatePlaywrightTest(assertions: UIAssertion[], specId: string, baseUrl: string): string;
12
+ /**
13
+ * Check if Playwright is available in the current environment.
14
+ * Returns the version string (e.g. "Version 1.44.0") or null if not found.
15
+ */
16
+ export declare function checkPlaywrightAvailable(): Promise<string | null>;
17
+ //# sourceMappingURL=browser-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-validator.d.ts","sourceRoot":"","sources":["../../src/engine/browser-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA+ErD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,WAAW,EAAE,CAuB3E;AAOD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,WAAW,EAAE,EACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,MAAM,CAwDR;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASvE"}
@@ -0,0 +1,167 @@
1
+ // engine/browser-validator.ts — SPEC-308: Parse spec criteria for UI checkable assertions
2
+ import { execFile } from 'node:child_process';
3
+ import { promisify } from 'node:util';
4
+ const execFileAsync = promisify(execFile);
5
+ /** Patterns that indicate a visibility assertion. */
6
+ const VISIBILITY_KEYWORDS = ['visible', 'shown', 'displayed', 'appear', 'shows', 'see'];
7
+ /** Patterns that indicate a text/content assertion. */
8
+ const TEXT_KEYWORDS = ['text', 'content', 'says', 'reads', 'label', 'message', 'title'];
9
+ /** Patterns that indicate a navigation assertion. */
10
+ const NAV_KEYWORDS = ['navigate', 'redirect', 'url', 'page', 'route', 'goes to', 'opens'];
11
+ /** Patterns that indicate a form assertion. */
12
+ const FORM_KEYWORDS = ['form', 'input', 'submit', 'fill', 'field', 'button', 'click', 'select'];
13
+ /** Criterion line pattern — matches `- [ ]` and `- [x]` checkboxes. */
14
+ const CRITERION_LINE = /^\s*-\s*\[[ xX]\]\s+(.+)$/;
15
+ /** Extract the expected text value from a quoted string in the criterion. */
16
+ function extractQuotedText(text) {
17
+ const match = /"([^"]+)"|'([^']+)'/.exec(text);
18
+ return match?.[1] ?? match?.[2];
19
+ }
20
+ /** Build a Playwright locator hint from a criterion text. */
21
+ function buildLocator(criterion) {
22
+ const lower = criterion.toLowerCase();
23
+ // "Submit button" → button:has-text("Submit")
24
+ const buttonMatch = /(\w+(?:\s+\w+)?)\s+button/i.exec(criterion);
25
+ if (buttonMatch?.[1]) {
26
+ return `button:has-text("${buttonMatch[1]}")`;
27
+ }
28
+ // "error message" → [role="alert"]
29
+ if (lower.includes('error message') || lower.includes('error alert')) {
30
+ return '[role="alert"]';
31
+ }
32
+ // "link X" → a:has-text("X")
33
+ const linkMatch = /link\s+["']?([^"'\s]+)["']?/i.exec(criterion);
34
+ if (linkMatch?.[1]) {
35
+ return `a:has-text("${linkMatch[1]}")`;
36
+ }
37
+ // "heading X" or "title X"
38
+ const headingMatch = /(?:heading|title)\s+["']?([^"'\n]+?)["']?\s*$/i.exec(criterion);
39
+ if (headingMatch?.[1]) {
40
+ return `h1:has-text("${headingMatch[1]}")`;
41
+ }
42
+ // "input X" or "field X"
43
+ const inputMatch = /(?:input|field)\s+["']?([^"'\s]+)["']?/i.exec(criterion);
44
+ if (inputMatch?.[1]) {
45
+ return `input[name="${inputMatch[1]}"], [placeholder*="${inputMatch[1]}"]`;
46
+ }
47
+ return undefined;
48
+ }
49
+ /** Classify a criterion line into a UIAssertion type. */
50
+ function classifyAssertion(criterion) {
51
+ const lower = criterion.toLowerCase();
52
+ if (FORM_KEYWORDS.some((kw) => lower.includes(kw))) {
53
+ return 'form';
54
+ }
55
+ if (NAV_KEYWORDS.some((kw) => lower.includes(kw))) {
56
+ return 'navigation';
57
+ }
58
+ if (TEXT_KEYWORDS.some((kw) => lower.includes(kw))) {
59
+ return 'text';
60
+ }
61
+ if (VISIBILITY_KEYWORDS.some((kw) => lower.includes(kw))) {
62
+ return 'visibility';
63
+ }
64
+ return 'generic';
65
+ }
66
+ /**
67
+ * Extract UI-testable assertions from spec acceptance criteria markdown.
68
+ * Parses lines matching `- [ ]` or `- [x]` patterns.
69
+ */
70
+ export function extractUIAssertions(criteriaMarkdown) {
71
+ const assertions = [];
72
+ for (const line of criteriaMarkdown.split('\n')) {
73
+ const match = CRITERION_LINE.exec(line);
74
+ if (!match?.[1]) {
75
+ continue;
76
+ }
77
+ const criterion = match[1].trim();
78
+ const type = classifyAssertion(criterion);
79
+ const locator = buildLocator(criterion);
80
+ const expected = extractQuotedText(criterion);
81
+ assertions.push({
82
+ criterion,
83
+ type,
84
+ ...(locator !== undefined && { locator }),
85
+ ...(expected !== undefined && { expected }),
86
+ });
87
+ }
88
+ return assertions;
89
+ }
90
+ /** Escape a string for use inside a JS template literal. */
91
+ function escapeTemplateLiteral(str) {
92
+ return str.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
93
+ }
94
+ /**
95
+ * Generate a complete Playwright test file content from UI assertions.
96
+ * Uses @playwright/test syntax with test.step() per assertion.
97
+ */
98
+ export function generatePlaywrightTest(assertions, specId, baseUrl) {
99
+ const steps = assertions.map((a, i) => {
100
+ const stepName = escapeTemplateLiteral(a.criterion);
101
+ const locator = a.locator ? escapeTemplateLiteral(a.locator) : null;
102
+ let body;
103
+ switch (a.type) {
104
+ case 'visibility':
105
+ body = locator
106
+ ? `await expect(page.locator(\`${locator}\`)).toBeVisible();`
107
+ : `// TODO: add locator for: ${a.criterion}`;
108
+ break;
109
+ case 'text':
110
+ body =
111
+ locator && a.expected
112
+ ? `await expect(page.locator(\`${locator}\`)).toContainText(\`${escapeTemplateLiteral(a.expected)}\`);`
113
+ : locator
114
+ ? `await expect(page.locator(\`${locator}\`)).toBeVisible();`
115
+ : `// TODO: verify text for: ${a.criterion}`;
116
+ break;
117
+ case 'navigation':
118
+ body = a.expected
119
+ ? `await expect(page).toHaveURL(/${escapeTemplateLiteral(a.expected)}/);`
120
+ : `// TODO: verify navigation for: ${a.criterion}`;
121
+ break;
122
+ case 'form':
123
+ body = locator
124
+ ? `await expect(page.locator(\`${locator}\`)).toBeVisible();`
125
+ : `// TODO: interact with form for: ${a.criterion}`;
126
+ break;
127
+ case 'generic':
128
+ body = `// TODO: verify: ${a.criterion}`;
129
+ break;
130
+ default: {
131
+ const _exhaustive = a.type;
132
+ body = `// TODO: verify: ${String(_exhaustive)}`;
133
+ }
134
+ }
135
+ return ` await test.step('${String(i + 1)}. ${stepName}', async () => {\n ${body}\n });`;
136
+ });
137
+ return [
138
+ `import { test, expect } from '@playwright/test';`,
139
+ ``,
140
+ `// Generated by Planu — SPEC-308 browser validator`,
141
+ `// Spec: ${specId}`,
142
+ `// Base URL: ${baseUrl}`,
143
+ ``,
144
+ `test('${specId} — UI acceptance criteria', async ({ page }) => {`,
145
+ ` await page.goto('${baseUrl}');`,
146
+ ``,
147
+ ...steps,
148
+ `});`,
149
+ ``,
150
+ ].join('\n');
151
+ }
152
+ /**
153
+ * Check if Playwright is available in the current environment.
154
+ * Returns the version string (e.g. "Version 1.44.0") or null if not found.
155
+ */
156
+ export async function checkPlaywrightAvailable() {
157
+ try {
158
+ const { stdout } = await execFileAsync('npx', ['playwright', '--version'], {
159
+ timeout: 5000,
160
+ });
161
+ return stdout.trim() || null;
162
+ }
163
+ catch {
164
+ return null;
165
+ }
166
+ }
167
+ //# sourceMappingURL=browser-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-validator.js","sourceRoot":"","sources":["../../src/engine/browser-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DiagramType } from '../../types/common.js';
2
+ import type { ExcalidrawFile } from '../../types/diagram.js';
3
+ /** Generate an Excalidraw JSON diagram from a text description and diagram type. */
4
+ export declare function generateExcalidrawDiagram(description: string, diagramType: DiagramType): ExcalidrawFile;
5
+ /** Convert an Excalidraw diagram to a shareable excalidraw.com URL. */
6
+ export declare function toExcalidrawUrl(diagram: ExcalidrawFile): string;
7
+ //# sourceMappingURL=excalidraw-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excalidraw-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/diagram/excalidraw-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAgThF,oFAAoF;AACpF,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,GACvB,cAAc,CAahB;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAI/D"}
@@ -0,0 +1,274 @@
1
+ // engine/diagram/excalidraw-generator.ts — SPEC-311: Generate Excalidraw JSON diagrams
2
+ // ---------------------------------------------------------------------------
3
+ // Internal helpers
4
+ // ---------------------------------------------------------------------------
5
+ function makeId() {
6
+ return Math.random().toString(36).slice(2);
7
+ }
8
+ function baseElement(overrides) {
9
+ return {
10
+ id: makeId(),
11
+ angle: 0,
12
+ strokeColor: '#1e1e2e',
13
+ backgroundColor: 'transparent',
14
+ fillStyle: 'hachure',
15
+ strokeWidth: 1,
16
+ strokeStyle: 'solid',
17
+ roughness: 1,
18
+ opacity: 100,
19
+ groupIds: [],
20
+ roundness: null,
21
+ boundElements: null,
22
+ updated: Date.now(),
23
+ isDeleted: false,
24
+ link: null,
25
+ locked: false,
26
+ ...overrides,
27
+ };
28
+ }
29
+ function makeRect(x, y, width, height, bg, label) {
30
+ const rect = baseElement({
31
+ type: 'rectangle',
32
+ x,
33
+ y,
34
+ width,
35
+ height,
36
+ backgroundColor: bg,
37
+ fillStyle: 'solid',
38
+ roundness: { type: 3 },
39
+ });
40
+ const text = baseElement({
41
+ type: 'text',
42
+ x: x + 8,
43
+ y: y + height / 2 - 10,
44
+ width: width - 16,
45
+ height: 20,
46
+ text: label,
47
+ fontSize: 14,
48
+ fontFamily: 1,
49
+ textAlign: 'center',
50
+ verticalAlign: 'middle',
51
+ strokeColor: '#ffffff',
52
+ backgroundColor: 'transparent',
53
+ });
54
+ return [rect, text];
55
+ }
56
+ function makeDiamond(x, y, w, h, bg, label) {
57
+ const diamond = baseElement({
58
+ type: 'diamond',
59
+ x,
60
+ y,
61
+ width: w,
62
+ height: h,
63
+ backgroundColor: bg,
64
+ fillStyle: 'solid',
65
+ });
66
+ const text = baseElement({
67
+ type: 'text',
68
+ x: x + 8,
69
+ y: y + h / 2 - 10,
70
+ width: w - 16,
71
+ height: 20,
72
+ text: label,
73
+ fontSize: 12,
74
+ fontFamily: 1,
75
+ textAlign: 'center',
76
+ verticalAlign: 'middle',
77
+ strokeColor: '#ffffff',
78
+ backgroundColor: 'transparent',
79
+ });
80
+ return [diamond, text];
81
+ }
82
+ function makeArrow(x1, y1, x2, y2) {
83
+ return baseElement({
84
+ type: 'arrow',
85
+ x: x1,
86
+ y: y1,
87
+ width: x2 - x1,
88
+ height: y2 - y1,
89
+ points: [
90
+ [0, 0],
91
+ [x2 - x1, y2 - y1],
92
+ ],
93
+ startBinding: null,
94
+ endBinding: null,
95
+ strokeColor: '#666666',
96
+ roughness: 0,
97
+ });
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Node parsing
101
+ // ---------------------------------------------------------------------------
102
+ /** Extract node labels from a text description. */
103
+ function parseNodes(description) {
104
+ const separators = /->|→|--|,|\n/;
105
+ const raw = description
106
+ .split(separators)
107
+ .map((s) => s.trim())
108
+ .filter((s) => s.length > 0);
109
+ // Deduplicate while preserving order
110
+ const seen = new Set();
111
+ const unique = [];
112
+ for (const node of raw) {
113
+ if (!seen.has(node)) {
114
+ seen.add(node);
115
+ unique.push(node);
116
+ }
117
+ }
118
+ return unique.length > 0 ? unique : ['Node'];
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // Layout generators per diagram type
122
+ // ---------------------------------------------------------------------------
123
+ const COLOR = {
124
+ architecture: '#4a90d9',
125
+ 'data-flow': '#27ae60',
126
+ sequence: '#8e44ad',
127
+ er: '#e67e22',
128
+ flow: '#2c3e50',
129
+ component: '#1a73e8',
130
+ 'state-machine': '#6c3483',
131
+ dependency: '#117a65',
132
+ deployment: '#1b2631',
133
+ class: '#283747',
134
+ gantt: '#1e8449',
135
+ pie: '#922b21',
136
+ };
137
+ const RECT_W = 150;
138
+ const RECT_H = 50;
139
+ const GAP_X = 200;
140
+ const GAP_Y = 120;
141
+ const COLS = 3;
142
+ function buildArchitecture(nodes) {
143
+ const elements = [];
144
+ const bg = COLOR.architecture;
145
+ const rects = [];
146
+ nodes.forEach((node, i) => {
147
+ const col = i % COLS;
148
+ const row = Math.floor(i / COLS);
149
+ const x = col * GAP_X;
150
+ const y = row * GAP_Y;
151
+ rects.push({ x, y });
152
+ elements.push(...makeRect(x, y, RECT_W, RECT_H, bg, node));
153
+ });
154
+ // Connect sequential pairs with arrows
155
+ for (let i = 0; i < rects.length - 1; i++) {
156
+ const a = rects[i];
157
+ const b = rects[i + 1];
158
+ if (a !== undefined && b !== undefined) {
159
+ elements.push(makeArrow(a.x + RECT_W, a.y + RECT_H / 2, b.x, b.y + RECT_H / 2));
160
+ }
161
+ }
162
+ return elements;
163
+ }
164
+ function buildDataFlow(nodes) {
165
+ const elements = [];
166
+ const bg = COLOR['data-flow'];
167
+ nodes.forEach((node, i) => {
168
+ const x = i * (RECT_W + 60);
169
+ const y = 80;
170
+ elements.push(...makeRect(x, y, RECT_W, RECT_H, bg, node));
171
+ if (i < nodes.length - 1) {
172
+ elements.push(makeArrow(x + RECT_W, y + RECT_H / 2, x + RECT_W + 60, y + RECT_H / 2));
173
+ }
174
+ });
175
+ return elements;
176
+ }
177
+ function buildSequence(nodes) {
178
+ const elements = [];
179
+ const bg = COLOR.sequence;
180
+ const laneW = Math.max(120, RECT_W);
181
+ const laneGap = laneW + 80;
182
+ // Swimlane headers
183
+ nodes.forEach((node, i) => {
184
+ const x = i * laneGap;
185
+ elements.push(...makeRect(x, 0, laneW, 50, bg, node));
186
+ // Vertical line
187
+ elements.push(makeArrow(x + laneW / 2, 50, x + laneW / 2, 50 + nodes.length * GAP_Y));
188
+ });
189
+ // Horizontal arrows between adjacent lanes
190
+ for (let i = 0; i < nodes.length - 1; i++) {
191
+ const y = 100 + i * 80;
192
+ const x1 = i * laneGap + laneW;
193
+ const x2 = (i + 1) * laneGap;
194
+ elements.push(makeArrow(x1, y, x2, y));
195
+ }
196
+ return elements;
197
+ }
198
+ function buildEr(nodes) {
199
+ const elements = [];
200
+ const bg = COLOR.er;
201
+ const dBg = '#d35400';
202
+ nodes.forEach((node, i) => {
203
+ const col = i % COLS;
204
+ const row = Math.floor(i / COLS);
205
+ const x = col * (GAP_X + 20);
206
+ const y = row * (GAP_Y + 40);
207
+ elements.push(...makeRect(x, y, RECT_W, RECT_H, bg, node));
208
+ // Add relationship diamond between consecutive nodes in the same row
209
+ if (i < nodes.length - 1 && (i + 1) % COLS !== 0) {
210
+ const midX = x + RECT_W + 10;
211
+ const midY = y;
212
+ elements.push(...makeDiamond(midX, midY, 60, 40, dBg, 'has'));
213
+ }
214
+ });
215
+ return elements;
216
+ }
217
+ function buildFlow(nodes) {
218
+ const elements = [];
219
+ const rectBg = COLOR.flow;
220
+ const diamondBg = '#576574';
221
+ let currentY = 0;
222
+ nodes.forEach((node, i) => {
223
+ const x = 80;
224
+ const isDecision = i % 3 === 2;
225
+ if (isDecision) {
226
+ elements.push(...makeDiamond(x, currentY, RECT_W, 60, diamondBg, node));
227
+ currentY += 60;
228
+ }
229
+ else {
230
+ elements.push(...makeRect(x, currentY, RECT_W, RECT_H, rectBg, node));
231
+ currentY += RECT_H;
232
+ }
233
+ if (i < nodes.length - 1) {
234
+ elements.push(makeArrow(x + RECT_W / 2, currentY, x + RECT_W / 2, currentY + 30));
235
+ currentY += 30;
236
+ }
237
+ });
238
+ return elements;
239
+ }
240
+ /** Fallback builder for diagram types not supported by excalidraw (uses architecture layout). */
241
+ function buildGeneric(nodes) {
242
+ return buildArchitecture(nodes);
243
+ }
244
+ // ---------------------------------------------------------------------------
245
+ // Public API
246
+ // ---------------------------------------------------------------------------
247
+ const BUILDERS = {
248
+ architecture: buildArchitecture,
249
+ 'data-flow': buildDataFlow,
250
+ sequence: buildSequence,
251
+ er: buildEr,
252
+ flow: buildFlow,
253
+ };
254
+ /** Generate an Excalidraw JSON diagram from a text description and diagram type. */
255
+ export function generateExcalidrawDiagram(description, diagramType) {
256
+ const nodes = parseNodes(description);
257
+ const builder = BUILDERS[diagramType] ?? buildGeneric;
258
+ const elements = builder(nodes);
259
+ return {
260
+ type: 'excalidraw',
261
+ version: 2,
262
+ source: 'https://excalidraw.com',
263
+ elements,
264
+ appState: { viewBackgroundColor: '#ffffff', gridSize: null },
265
+ files: {},
266
+ };
267
+ }
268
+ /** Convert an Excalidraw diagram to a shareable excalidraw.com URL. */
269
+ export function toExcalidrawUrl(diagram) {
270
+ const json = JSON.stringify(diagram);
271
+ const encoded = Buffer.from(json).toString('base64');
272
+ return `https://excalidraw.com/#json=${encoded}`;
273
+ }
274
+ //# sourceMappingURL=excalidraw-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excalidraw-generator.js","sourceRoot":"","sources":["../../../src/engine/diagram/excalidraw-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ReviewDimensionResult, MergedPRReview } from '../../types/github.js';
2
+ export type { MergedPRReview as MergedReview };
3
+ export declare function mergeFindings(results: ReviewDimensionResult[]): MergedPRReview;
4
+ //# sourceMappingURL=findings-merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings-merger.d.ts","sourceRoot":"","sources":["../../../src/engine/github/findings-merger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,qBAAqB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGlG,YAAY,EAAE,cAAc,IAAI,YAAY,EAAE,CAAC;AAgG/C,wBAAgB,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,cAAc,CAmB9E"}