codeloop-mcp-server 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.
Files changed (101) hide show
  1. package/dist/auth/api_key.d.ts +6 -0
  2. package/dist/auth/api_key.d.ts.map +1 -0
  3. package/dist/auth/api_key.js +87 -0
  4. package/dist/auth/api_key.js.map +1 -0
  5. package/dist/auth/usage_tracker.d.ts +7 -0
  6. package/dist/auth/usage_tracker.d.ts.map +1 -0
  7. package/dist/auth/usage_tracker.js +71 -0
  8. package/dist/auth/usage_tracker.js.map +1 -0
  9. package/dist/config.d.ts +4 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +41 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/diagnosis/vision_reviewer.d.ts +27 -0
  14. package/dist/diagnosis/vision_reviewer.d.ts.map +1 -0
  15. package/dist/diagnosis/vision_reviewer.js +345 -0
  16. package/dist/diagnosis/vision_reviewer.js.map +1 -0
  17. package/dist/evidence/artifacts.d.ts +12 -0
  18. package/dist/evidence/artifacts.d.ts.map +1 -0
  19. package/dist/evidence/artifacts.js +60 -0
  20. package/dist/evidence/artifacts.js.map +1 -0
  21. package/dist/evidence/screenshot_diff.d.ts +30 -0
  22. package/dist/evidence/screenshot_diff.d.ts.map +1 -0
  23. package/dist/evidence/screenshot_diff.js +144 -0
  24. package/dist/evidence/screenshot_diff.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +276 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/recommendations/knowledge_base.d.ts +21 -0
  30. package/dist/recommendations/knowledge_base.d.ts.map +1 -0
  31. package/dist/recommendations/knowledge_base.js +839 -0
  32. package/dist/recommendations/knowledge_base.js.map +1 -0
  33. package/dist/recommendations/selector.d.ts +3 -0
  34. package/dist/recommendations/selector.d.ts.map +1 -0
  35. package/dist/recommendations/selector.js +305 -0
  36. package/dist/recommendations/selector.js.map +1 -0
  37. package/dist/runners/base.d.ts +21 -0
  38. package/dist/runners/base.d.ts.map +1 -0
  39. package/dist/runners/base.js +70 -0
  40. package/dist/runners/base.js.map +1 -0
  41. package/dist/runners/flutter.d.ts +4 -0
  42. package/dist/runners/flutter.d.ts.map +1 -0
  43. package/dist/runners/flutter.js +72 -0
  44. package/dist/runners/flutter.js.map +1 -0
  45. package/dist/runners/generic.d.ts +3 -0
  46. package/dist/runners/generic.d.ts.map +1 -0
  47. package/dist/runners/generic.js +65 -0
  48. package/dist/runners/generic.js.map +1 -0
  49. package/dist/runners/maestro.d.ts +12 -0
  50. package/dist/runners/maestro.d.ts.map +1 -0
  51. package/dist/runners/maestro.js +133 -0
  52. package/dist/runners/maestro.js.map +1 -0
  53. package/dist/runners/playwright.d.ts +3 -0
  54. package/dist/runners/playwright.d.ts.map +1 -0
  55. package/dist/runners/playwright.js +76 -0
  56. package/dist/runners/playwright.js.map +1 -0
  57. package/dist/state/section_registry.d.ts +27 -0
  58. package/dist/state/section_registry.d.ts.map +1 -0
  59. package/dist/state/section_registry.js +219 -0
  60. package/dist/state/section_registry.js.map +1 -0
  61. package/dist/tools/design_compare.d.ts +4 -0
  62. package/dist/tools/design_compare.d.ts.map +1 -0
  63. package/dist/tools/design_compare.js +73 -0
  64. package/dist/tools/design_compare.js.map +1 -0
  65. package/dist/tools/diagnose.d.ts +3 -0
  66. package/dist/tools/diagnose.d.ts.map +1 -0
  67. package/dist/tools/diagnose.js +236 -0
  68. package/dist/tools/diagnose.js.map +1 -0
  69. package/dist/tools/gate_check.d.ts +3 -0
  70. package/dist/tools/gate_check.d.ts.map +1 -0
  71. package/dist/tools/gate_check.js +201 -0
  72. package/dist/tools/gate_check.js.map +1 -0
  73. package/dist/tools/integration_check.d.ts +13 -0
  74. package/dist/tools/integration_check.d.ts.map +1 -0
  75. package/dist/tools/integration_check.js +70 -0
  76. package/dist/tools/integration_check.js.map +1 -0
  77. package/dist/tools/release_readiness.d.ts +3 -0
  78. package/dist/tools/release_readiness.d.ts.map +1 -0
  79. package/dist/tools/release_readiness.js +153 -0
  80. package/dist/tools/release_readiness.js.map +1 -0
  81. package/dist/tools/replan.d.ts +12 -0
  82. package/dist/tools/replan.d.ts.map +1 -0
  83. package/dist/tools/replan.js +118 -0
  84. package/dist/tools/replan.js.map +1 -0
  85. package/dist/tools/section_status.d.ts +24 -0
  86. package/dist/tools/section_status.d.ts.map +1 -0
  87. package/dist/tools/section_status.js +61 -0
  88. package/dist/tools/section_status.js.map +1 -0
  89. package/dist/tools/update_baseline.d.ts +11 -0
  90. package/dist/tools/update_baseline.d.ts.map +1 -0
  91. package/dist/tools/update_baseline.js +19 -0
  92. package/dist/tools/update_baseline.js.map +1 -0
  93. package/dist/tools/verify.d.ts +4 -0
  94. package/dist/tools/verify.d.ts.map +1 -0
  95. package/dist/tools/verify.js +136 -0
  96. package/dist/tools/verify.js.map +1 -0
  97. package/dist/tools/visual_review.d.ts +4 -0
  98. package/dist/tools/visual_review.d.ts.map +1 -0
  99. package/dist/tools/visual_review.js +142 -0
  100. package/dist/tools/visual_review.js.map +1 -0
  101. package/package.json +44 -0
@@ -0,0 +1,153 @@
1
+ import { existsSync, writeFileSync } from "fs";
2
+ import { join } from "path";
3
+ import { getArtifactsBaseDir, getRunDir, loadRunMeta } from "../evidence/artifacts.js";
4
+ function buildAccessibilitySummary(meta) {
5
+ const ma = meta.model_assisted_results;
6
+ if (!ma)
7
+ return {};
8
+ const a11y = ma.accessibility ?? ma.a11y;
9
+ if (a11y && typeof a11y === "object" && !Array.isArray(a11y)) {
10
+ return { ...a11y };
11
+ }
12
+ return {};
13
+ }
14
+ function buildVisualSummary(meta, config) {
15
+ const screenshotPaths = meta.screenshot_paths ?? [];
16
+ const visual = meta.visual_deterministic_results;
17
+ const diffScore = visual && typeof visual.diff_score === "number" ? visual.diff_score : undefined;
18
+ const maxDiff = 1 - config.design_match_threshold;
19
+ let diffWithinThreshold = null;
20
+ let visualBlocker = null;
21
+ if (diffScore !== undefined) {
22
+ diffWithinThreshold = diffScore <= maxDiff;
23
+ if (!diffWithinThreshold) {
24
+ visualBlocker = `Visual diff ${(diffScore * 100).toFixed(1)}% exceeds allowed ${(maxDiff * 100).toFixed(1)}% (design_match_threshold ${config.design_match_threshold})`;
25
+ }
26
+ }
27
+ return {
28
+ summary: {
29
+ screenshot_paths: screenshotPaths,
30
+ screenshot_count: screenshotPaths.length,
31
+ diff_score: diffScore ?? null,
32
+ diff_within_threshold: diffWithinThreshold,
33
+ max_allowed_diff: diffScore !== undefined ? maxDiff : null,
34
+ raw_visual_deterministic_results: visual ?? {},
35
+ },
36
+ visualBlocker,
37
+ };
38
+ }
39
+ function noEvidenceOutput(runId, baseDir) {
40
+ const reportPath = join(baseDir, runId, "report.json");
41
+ const recommendation = "No run evidence is available. Run codeloop_verify to produce a run, then codeloop_gate_check, and re-run release readiness.";
42
+ return {
43
+ ready: false,
44
+ report_path: reportPath,
45
+ overall_score: 0,
46
+ blockers: [`No evidence found for run "${runId}" (meta.json is missing or unreadable).`],
47
+ warnings: [],
48
+ test_summary: {},
49
+ visual_summary: {},
50
+ accessibility_summary: {},
51
+ recommendation,
52
+ };
53
+ }
54
+ export async function runReleaseReadiness(input, config, cwd = process.cwd()) {
55
+ const baseDir = getArtifactsBaseDir(cwd);
56
+ const meta = loadRunMeta(input.run_id, baseDir);
57
+ const runDir = existsSync(join(input.run_id, "meta.json"))
58
+ ? input.run_id
59
+ : getRunDir(input.run_id, baseDir);
60
+ const reportPath = join(runDir, "report.json");
61
+ if (!meta) {
62
+ return noEvidenceOutput(input.run_id, baseDir);
63
+ }
64
+ const blockers = [];
65
+ const warnings = [];
66
+ const tests = meta.test_summary;
67
+ if (tests && tests.failed > 0) {
68
+ blockers.push(`${tests.failed} test(s) failed (${tests.passed}/${tests.total} passed).`);
69
+ }
70
+ const issues = meta.issue_summary;
71
+ const critical = issues?.critical ?? 0;
72
+ const high = issues?.high ?? 0;
73
+ const medium = issues?.medium ?? 0;
74
+ if (critical > 0) {
75
+ blockers.push(`${critical} critical issue(s) in issue summary.`);
76
+ }
77
+ if (high > 0) {
78
+ warnings.push(`${high} high-severity issue(s) in issue summary.`);
79
+ }
80
+ if (meta.gate_result !== "passed") {
81
+ blockers.push(meta.gate_result === "failed"
82
+ ? "Gate check result is failed."
83
+ : "Gate check has not completed successfully (gate_result is not passed).");
84
+ }
85
+ const { summary: visualSummary, visualBlocker } = buildVisualSummary(meta, config);
86
+ if (visualBlocker) {
87
+ blockers.push(visualBlocker);
88
+ }
89
+ const accessibilitySummary = buildAccessibilitySummary(meta);
90
+ let overallScore = 100;
91
+ if (blockers.length > 0) {
92
+ overallScore -= 30;
93
+ }
94
+ overallScore -= 10 * high;
95
+ overallScore -= 5 * medium;
96
+ overallScore = Math.max(0, Math.min(100, overallScore));
97
+ const testSummaryRecord = tests
98
+ ? {
99
+ total: tests.total,
100
+ passed: tests.passed,
101
+ failed: tests.failed,
102
+ skipped: tests.skipped,
103
+ flaky: tests.flaky,
104
+ }
105
+ : {};
106
+ const ready = blockers.length === 0;
107
+ let recommendation;
108
+ if (!ready) {
109
+ recommendation =
110
+ "Not ready for release: resolve all blockers (failed tests, critical issues, gate failure, or visual regression), then re-verify and re-run gate check.";
111
+ }
112
+ else if (warnings.length > 0 || medium > 0) {
113
+ recommendation =
114
+ "Release candidate with cautions: address high-severity warnings and medium issues before shipping, or accept documented risk.";
115
+ }
116
+ else {
117
+ recommendation =
118
+ "Release readiness looks strong: evidence, tests, gates, and visual checks are within policy.";
119
+ }
120
+ const reportPayload = {
121
+ run_id: input.run_id,
122
+ spec_path: input.spec_path,
123
+ generated_at: new Date().toISOString(),
124
+ overall_score: overallScore,
125
+ ready,
126
+ blockers,
127
+ warnings,
128
+ test_summary: testSummaryRecord,
129
+ visual_summary: visualSummary,
130
+ accessibility_summary: accessibilitySummary,
131
+ recommendation,
132
+ gate_result: meta.gate_result ?? null,
133
+ issue_summary: issues ?? null,
134
+ };
135
+ if (input.include && input.include.length > 0) {
136
+ reportPayload.included_sections = input.include;
137
+ }
138
+ if (existsSync(runDir)) {
139
+ writeFileSync(reportPath, JSON.stringify(reportPayload, null, 2), "utf-8");
140
+ }
141
+ return {
142
+ ready,
143
+ report_path: reportPath,
144
+ overall_score: overallScore,
145
+ blockers,
146
+ warnings,
147
+ test_summary: testSummaryRecord,
148
+ visual_summary: visualSummary,
149
+ accessibility_summary: accessibilitySummary,
150
+ recommendation,
151
+ };
152
+ }
153
+ //# sourceMappingURL=release_readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release_readiness.js","sourceRoot":"","sources":["../../src/tools/release_readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CodeLoopConfig } from "@codelooptech/shared";
2
+ export interface ReplanInput {
3
+ master_spec_path: string;
4
+ change_summary?: string;
5
+ }
6
+ export interface ReplanOutput {
7
+ affected_sections: string[];
8
+ new_states: Record<string, string>;
9
+ recommendation: string;
10
+ }
11
+ export declare function runReplan(input: ReplanInput, _config: CodeLoopConfig, cwd?: string): ReplanOutput;
12
+ //# sourceMappingURL=replan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replan.d.ts","sourceRoot":"","sources":["../../src/tools/replan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa3D,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;CACxB;AAUD,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,MAAsB,GAC1B,YAAY,CAuId"}
@@ -0,0 +1,118 @@
1
+ import { isSectionTransitionValid } from "@codelooptech/shared";
2
+ import { existsSync, readFileSync } from "fs";
3
+ import { loadRegistry, saveRegistry, updateSectionState, initRegistryFromSpec, parseMasterSpecMarkdown, resolveProjectPath, } from "../state/section_registry.js";
4
+ function specById(parsed) {
5
+ const m = new Map();
6
+ for (const p of parsed) {
7
+ m.set(p.section_id, p);
8
+ }
9
+ return m;
10
+ }
11
+ export function runReplan(input, _config, cwd = process.cwd()) {
12
+ const masterAbs = resolveProjectPath(cwd, input.master_spec_path);
13
+ if (!existsSync(masterAbs)) {
14
+ throw new Error(`Master spec not found: ${masterAbs}`);
15
+ }
16
+ const markdown = readFileSync(masterAbs, "utf-8");
17
+ const parsed = parseMasterSpecMarkdown(markdown);
18
+ const fresh = specById(parsed);
19
+ const freshIds = new Set(parsed.map((p) => p.section_id));
20
+ let registry = loadRegistry(cwd);
21
+ if (registry.sections.length === 0) {
22
+ registry = initRegistryFromSpec(cwd, input.master_spec_path);
23
+ saveRegistry(cwd, registry);
24
+ return {
25
+ affected_sections: parsed.map((p) => p.section_id),
26
+ new_states: Object.fromEntries(parsed.map((p) => [p.section_id, "planned"])),
27
+ recommendation: "Initialized section registry from the master spec. Use codeloop_section_status to track progress.",
28
+ };
29
+ }
30
+ const affected = [];
31
+ const newStates = {};
32
+ for (const s of [...registry.sections]) {
33
+ if (freshIds.has(s.section_id)) {
34
+ continue;
35
+ }
36
+ affected.push(s.section_id);
37
+ if (isSectionTransitionValid(s.state, "blocked")) {
38
+ registry = updateSectionState(registry, s.section_id, "blocked", "section removed from master spec");
39
+ newStates[s.section_id] = "blocked";
40
+ }
41
+ else {
42
+ newStates[s.section_id] = `${s.state} (removed from spec — manual review)`;
43
+ }
44
+ }
45
+ const existingIds = new Set(registry.sections.map((x) => x.section_id));
46
+ const fullFromSpec = initRegistryFromSpec(cwd, input.master_spec_path);
47
+ const toAppend = fullFromSpec.sections.filter((s) => !existingIds.has(s.section_id));
48
+ if (toAppend.length > 0) {
49
+ for (const s of toAppend) {
50
+ affected.push(s.section_id);
51
+ newStates[s.section_id] = s.state;
52
+ }
53
+ registry = {
54
+ ...registry,
55
+ sections: [...registry.sections, ...toAppend],
56
+ updated_at: new Date().toISOString(),
57
+ };
58
+ }
59
+ for (const sectionId of freshIds) {
60
+ const specSec = fresh.get(sectionId);
61
+ if (!specSec) {
62
+ continue;
63
+ }
64
+ const cur = registry.sections.find((x) => x.section_id === sectionId);
65
+ if (!cur) {
66
+ continue;
67
+ }
68
+ if (specSec.section_name !== cur.section_name) {
69
+ affected.push(sectionId);
70
+ const reason = input.change_summary?.length
71
+ ? `spec changed: ${input.change_summary}`
72
+ : "section title or scope changed in master spec";
73
+ if (isSectionTransitionValid(cur.state, "needs_repair")) {
74
+ registry = updateSectionState(registry, sectionId, "needs_repair", reason);
75
+ newStates[sectionId] = "needs_repair";
76
+ }
77
+ else {
78
+ newStates[sectionId] = `${cur.state} (heading changed — manual review)`;
79
+ }
80
+ const idx = registry.sections.findIndex((x) => x.section_id === sectionId);
81
+ if (idx >= 0) {
82
+ registry.sections[idx] = {
83
+ ...registry.sections[idx],
84
+ section_name: specSec.section_name,
85
+ updated_at: new Date().toISOString(),
86
+ };
87
+ }
88
+ }
89
+ const latest = registry.sections.find((x) => x.section_id === sectionId);
90
+ if (!latest) {
91
+ continue;
92
+ }
93
+ if (specSec.dependencies.join(",") !== latest.dependencies.join(",")) {
94
+ affected.push(sectionId);
95
+ const idx = registry.sections.findIndex((x) => x.section_id === sectionId);
96
+ if (idx >= 0) {
97
+ registry.sections[idx] = {
98
+ ...registry.sections[idx],
99
+ dependencies: specSec.dependencies,
100
+ updated_at: new Date().toISOString(),
101
+ };
102
+ newStates[sectionId] =
103
+ newStates[sectionId] ??
104
+ `${registry.sections[idx].state} (dependencies synced from spec)`;
105
+ }
106
+ }
107
+ }
108
+ saveRegistry(cwd, registry);
109
+ const recommendation = affected.length === 0
110
+ ? "No spec drift detected relative to the registry."
111
+ : `Updated registry for ${affected.length} section(s). Re-run codeloop_section_status and adjust any sections flagged for review.`;
112
+ return {
113
+ affected_sections: [...new Set(affected)],
114
+ new_states: newStates,
115
+ recommendation,
116
+ };
117
+ }
118
+ //# sourceMappingURL=replan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replan.js","sourceRoot":"","sources":["../../src/tools/replan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { CodeLoopConfig } from "@codelooptech/shared";
2
+ export interface SectionStatusInput {
3
+ master_spec_path: string;
4
+ }
5
+ export interface SectionStatusOutput {
6
+ total_sections: number;
7
+ completed: number;
8
+ in_progress: string | null;
9
+ next_section: {
10
+ id: string;
11
+ name: string;
12
+ spec_path: string;
13
+ } | null;
14
+ integration_due: boolean;
15
+ sections: Array<{
16
+ id: string;
17
+ name: string;
18
+ state: string;
19
+ confidence: number;
20
+ }>;
21
+ recommendation: string;
22
+ }
23
+ export declare function getSectionStatus(input: SectionStatusInput, _config: CodeLoopConfig, cwd?: string): SectionStatusOutput;
24
+ //# sourceMappingURL=section_status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section_status.d.ts","sourceRoot":"","sources":["../../src/tools/section_status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAU3D,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACrE,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,cAAc,EAAE,MAAM,CAAC;CACxB;AAkCD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,MAAsB,GAC1B,mBAAmB,CAmDrB"}
@@ -0,0 +1,61 @@
1
+ import { loadRegistry, saveRegistry, getNextSection, isIntegrationDue, initRegistryFromSpec, resolveProjectPath, } from "../state/section_registry.js";
2
+ const DEFAULT_CHECKPOINT_INTERVAL = 3;
3
+ function buildRecommendation(next, integrationDue, total, completed) {
4
+ const parts = [];
5
+ if (total === 0) {
6
+ return "No sections are registered. Initialize from the master spec or add sections to the registry.";
7
+ }
8
+ if (integrationDue) {
9
+ parts.push("Enough sections are internally verified; run codeloop_integration_check before proceeding.");
10
+ }
11
+ if (next) {
12
+ parts.push(`Next work: section "${next.section_name}" (${next.section_id}). Open ${next.spec_path} and move the section to building when ready.`);
13
+ }
14
+ else if (completed < total && !integrationDue) {
15
+ parts.push("No section is ready to build yet; ensure dependencies are done or promote a section to ready_to_build.");
16
+ }
17
+ if (completed === total && total > 0) {
18
+ parts.push("All sections are marked done.");
19
+ }
20
+ return parts.length > 0 ? parts.join(" ") : "Continue with the current plan.";
21
+ }
22
+ export function getSectionStatus(input, _config, cwd = process.cwd()) {
23
+ const masterAbs = resolveProjectPath(cwd, input.master_spec_path);
24
+ let registry = loadRegistry(cwd);
25
+ if (registry.sections.length === 0) {
26
+ try {
27
+ registry = initRegistryFromSpec(cwd, input.master_spec_path);
28
+ saveRegistry(cwd, registry);
29
+ }
30
+ catch {
31
+ // keep empty registry if spec missing
32
+ }
33
+ }
34
+ const next = getNextSection(registry);
35
+ const integrationDue = isIntegrationDue(registry, DEFAULT_CHECKPOINT_INTERVAL);
36
+ const completed = registry.sections.filter((s) => s.state === "done").length;
37
+ const inProgress = registry.sections.find((s) => s.state === "building" || s.state === "verifying")?.section_id ?? null;
38
+ const sections = registry.sections.map((s) => ({
39
+ id: s.section_id,
40
+ name: s.section_name,
41
+ state: s.state,
42
+ confidence: s.confidence,
43
+ }));
44
+ const recommendation = buildRecommendation(next, integrationDue, registry.sections.length, completed);
45
+ return {
46
+ total_sections: registry.sections.length,
47
+ completed,
48
+ in_progress: inProgress,
49
+ next_section: next
50
+ ? {
51
+ id: next.section_id,
52
+ name: next.section_name,
53
+ spec_path: next.spec_path,
54
+ }
55
+ : null,
56
+ integration_due: integrationDue,
57
+ sections,
58
+ recommendation,
59
+ };
60
+ }
61
+ //# sourceMappingURL=section_status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section_status.js","sourceRoot":"","sources":["../../src/tools/section_status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CodeLoopConfig } from "@codelooptech/shared";
2
+ export interface UpdateBaselineInput {
3
+ run_id: string;
4
+ screens?: string[];
5
+ }
6
+ export interface UpdateBaselineOutput {
7
+ updated: string[];
8
+ run_id: string;
9
+ }
10
+ export declare function runUpdateBaseline(input: UpdateBaselineInput, _config: CodeLoopConfig, cwd?: string): UpdateBaselineOutput;
11
+ //# sourceMappingURL=update_baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_baseline.d.ts","sourceRoot":"","sources":["../../src/tools/update_baseline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,MAAsB,GAC1B,oBAAoB,CAetB"}
@@ -0,0 +1,19 @@
1
+ import { join } from "path";
2
+ import { existsSync } from "fs";
3
+ import { updateBaselines } from "../evidence/screenshot_diff.js";
4
+ import { getArtifactsBaseDir } from "../evidence/artifacts.js";
5
+ export function runUpdateBaseline(input, _config, cwd = process.cwd()) {
6
+ const base = getArtifactsBaseDir(cwd);
7
+ const runDir = join(base, input.run_id);
8
+ const screenshotsDir = join(runDir, "screenshots");
9
+ const baselinesDir = join(runDir, "baselines");
10
+ if (!existsSync(screenshotsDir)) {
11
+ return { updated: [], run_id: input.run_id };
12
+ }
13
+ const updated = updateBaselines(screenshotsDir, baselinesDir, input.screens);
14
+ return {
15
+ updated,
16
+ run_id: input.run_id,
17
+ };
18
+ }
19
+ //# sourceMappingURL=update_baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_baseline.js","sourceRoot":"","sources":["../../src/tools/update_baseline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAY/D,MAAM,UAAU,iBAAiB,CAC/B,KAA0B,EAC1B,OAAuB,EACvB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAE/C,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7E,OAAO;QACL,OAAO;QACP,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { VerifyInput, VerifyOutput, CodeLoopConfig } from "@codelooptech/shared";
2
+ export declare function detectPlatform(cwd: string): string;
3
+ export declare function runVerify(input: VerifyInput, config: CodeLoopConfig, cwd?: string): Promise<VerifyOutput>;
4
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAOtF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAwHvB"}
@@ -0,0 +1,136 @@
1
+ import { existsSync } from "fs";
2
+ import { join } from "path";
3
+ import { createRunDir, saveRunMeta } from "../evidence/artifacts.js";
4
+ import { runGenericTests } from "../runners/generic.js";
5
+ import { runFlutterAnalyze, runFlutterTest } from "../runners/flutter.js";
6
+ import { runPlaywrightTests } from "../runners/playwright.js";
7
+ export function detectPlatform(cwd) {
8
+ if (existsSync(join(cwd, "pubspec.yaml")))
9
+ return "flutter";
10
+ if (existsSync(join(cwd, "playwright.config.ts")) ||
11
+ existsSync(join(cwd, "playwright.config.js")))
12
+ return "web";
13
+ if (existsSync(join(cwd, "package.json")))
14
+ return "node";
15
+ return "unknown";
16
+ }
17
+ export async function runVerify(input, config, cwd = process.cwd()) {
18
+ const start = Date.now();
19
+ const platform = input.platform === "auto" ? detectPlatform(cwd) : input.platform;
20
+ const { runId, runDir } = createRunDir(undefined, join(cwd, "artifacts", "runs"));
21
+ const logDir = join(runDir, "logs");
22
+ const results = [];
23
+ // Run platform-appropriate runners
24
+ if (platform === "flutter" || input.scope === "full") {
25
+ results.push(await runFlutterAnalyze(cwd, join(logDir, "flutter_analyze.log")));
26
+ results.push(await runFlutterTest(cwd, join(logDir, "flutter_test.log")));
27
+ }
28
+ if (platform === "web" || platform === "node" || input.scope === "full") {
29
+ results.push(await runGenericTests(cwd, join(logDir, "generic_test.log")));
30
+ }
31
+ if (platform === "web" || input.scope === "full") {
32
+ results.push(await runPlaywrightTests(cwd, join(logDir, "playwright.log")));
33
+ }
34
+ // Aggregate results
35
+ const availableResults = results.filter((r) => r.available);
36
+ const totalPassed = availableResults.reduce((s, r) => s + r.passed, 0);
37
+ const totalFailed = availableResults.reduce((s, r) => s + r.failed, 0);
38
+ const totalSkipped = availableResults.reduce((s, r) => s + r.skipped, 0);
39
+ const checksRun = availableResults.map((r) => r.runner_name);
40
+ const checksSkipped = results
41
+ .filter((r) => !r.available)
42
+ .map((r) => r.runner_name);
43
+ const logPaths = availableResults
44
+ .map((r) => r.log_path)
45
+ .filter((p) => p.length > 0);
46
+ const warningCount = results.filter((r) => r.available && r.exit_code !== 0 && r.failed === 0).length;
47
+ const allPassed = totalFailed === 0 && availableResults.length > 0;
48
+ const summary = buildSummary(availableResults, checksSkipped, platform);
49
+ const suggestion = buildSuggestion(allPassed, totalFailed, runId);
50
+ const duration_ms = Date.now() - start;
51
+ // Save run metadata
52
+ const meta = {
53
+ run_id: runId,
54
+ platform,
55
+ adapter: "cli",
56
+ started_at: new Date(start).toISOString(),
57
+ finished_at: new Date().toISOString(),
58
+ test_summary: {
59
+ total: totalPassed + totalFailed + totalSkipped,
60
+ passed: totalPassed,
61
+ failed: totalFailed,
62
+ skipped: totalSkipped,
63
+ flaky: 0,
64
+ },
65
+ checks_run: checksRun,
66
+ checks_skipped: checksSkipped.map((name) => ({
67
+ check: name,
68
+ reason: results.find((r) => r.runner_name === name)?.stderr || "unavailable",
69
+ })),
70
+ log_paths: logPaths,
71
+ issue_summary: {
72
+ critical: 0,
73
+ high: totalFailed,
74
+ medium: warningCount,
75
+ low: 0,
76
+ },
77
+ gate_result: null,
78
+ confidence: allPassed ? 85 : Math.max(0, 85 - totalFailed * 15),
79
+ deterministic_results: {
80
+ build: availableResults.some((r) => r.runner_name === "flutter_analyze")
81
+ ? availableResults.find((r) => r.runner_name === "flutter_analyze").exit_code === 0
82
+ ? "passed"
83
+ : "failed"
84
+ : "not_run",
85
+ tests: {
86
+ total: totalPassed + totalFailed + totalSkipped,
87
+ passed: totalPassed,
88
+ failed: totalFailed,
89
+ skipped: totalSkipped,
90
+ flaky: 0,
91
+ },
92
+ },
93
+ next_recommended_action: suggestion || "No action needed.",
94
+ };
95
+ saveRunMeta(runDir, meta);
96
+ const output = {
97
+ run_id: runId,
98
+ pass_count: totalPassed,
99
+ fail_count: totalFailed,
100
+ warning_count: warningCount,
101
+ artifact_paths: [runDir],
102
+ summary,
103
+ duration_ms,
104
+ checks_run: checksRun,
105
+ suggestion,
106
+ notes: checksSkipped.length > 0
107
+ ? [`Skipped checks: ${checksSkipped.join(", ")}`]
108
+ : undefined,
109
+ };
110
+ return output;
111
+ }
112
+ function buildSummary(results, skipped, platform) {
113
+ if (results.length === 0) {
114
+ return `No verification checks could run for platform "${platform}". ` +
115
+ "Ensure the relevant tools are installed.";
116
+ }
117
+ const totalPassed = results.reduce((s, r) => s + r.passed, 0);
118
+ const totalFailed = results.reduce((s, r) => s + r.failed, 0);
119
+ const names = results.map((r) => r.runner_name).join(", ");
120
+ let msg = `Ran ${results.length} check(s) [${names}]: ` +
121
+ `${totalPassed} passed, ${totalFailed} failed.`;
122
+ if (skipped.length > 0) {
123
+ msg += ` Skipped: ${skipped.join(", ")}.`;
124
+ }
125
+ return msg;
126
+ }
127
+ function buildSuggestion(allPassed, failCount, runId) {
128
+ if (allPassed) {
129
+ return `All checks passed. Call codeloop_gate_check with run_id "${runId}" to evaluate completion gates.`;
130
+ }
131
+ if (failCount > 0) {
132
+ return `${failCount} failure(s) detected. Call codeloop_diagnose with run_id "${runId}" to classify failures and get repair tasks.`;
133
+ }
134
+ return undefined;
135
+ }
136
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { VisualReviewInput, VisualReviewOutput } from "@codelooptech/shared";
2
+ import type { CodeLoopConfig } from "@codelooptech/shared";
3
+ export declare function runVisualReview(input: VisualReviewInput, config: CodeLoopConfig): Promise<VisualReviewOutput>;
4
+ //# sourceMappingURL=visual_review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual_review.d.ts","sourceRoot":"","sources":["../../src/tools/visual_review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAc3D,wBAAsB,eAAe,CACnC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAsJ7B"}