@projitive/mcp 1.0.8 → 1.1.2

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 (53) hide show
  1. package/output/package.json +4 -1
  2. package/output/source/{helpers/catch → common}/catch.js +6 -6
  3. package/output/source/{helpers/catch → common}/catch.test.js +6 -6
  4. package/output/source/common/errors.js +120 -0
  5. package/output/source/{helpers/files → common}/files.js +1 -1
  6. package/output/source/{helpers/files → common}/files.test.js +1 -1
  7. package/output/source/common/index.js +9 -0
  8. package/output/source/{helpers/linter/codes.js → common/linter.js} +13 -0
  9. package/output/source/{helpers/markdown → common}/markdown.test.js +1 -1
  10. package/output/source/{helpers/response → common}/response.test.js +1 -1
  11. package/output/source/common/types.js +7 -0
  12. package/output/source/common/utils.js +39 -0
  13. package/output/source/index.js +8 -196
  14. package/output/source/index.test.js +110 -0
  15. package/output/source/prompts/index.js +9 -0
  16. package/output/source/prompts/quickStart.js +94 -0
  17. package/output/source/prompts/taskDiscovery.js +190 -0
  18. package/output/source/prompts/taskExecution.js +161 -0
  19. package/output/source/resources/designs.js +108 -0
  20. package/output/source/resources/designs.test.js +154 -0
  21. package/output/source/resources/governance.js +40 -0
  22. package/output/source/resources/index.js +6 -0
  23. package/output/source/resources/readme.test.js +167 -0
  24. package/output/source/{reports.js → resources/reports.js} +5 -3
  25. package/output/source/resources/reports.test.js +149 -0
  26. package/output/source/tools/index.js +8 -0
  27. package/output/source/{projitive.js → tools/project.js} +4 -6
  28. package/output/source/tools/project.test.js +322 -0
  29. package/output/source/{roadmap.js → tools/roadmap.js} +4 -7
  30. package/output/source/tools/roadmap.test.js +103 -0
  31. package/output/source/{tasks.js → tools/task.js} +470 -23
  32. package/output/source/tools/task.test.js +473 -0
  33. package/output/source/types.js +56 -0
  34. package/package.json +4 -1
  35. package/output/source/design-context.js +0 -515
  36. package/output/source/designs.js +0 -38
  37. package/output/source/helpers/artifacts/index.js +0 -1
  38. package/output/source/helpers/catch/index.js +0 -1
  39. package/output/source/helpers/files/index.js +0 -1
  40. package/output/source/helpers/index.js +0 -6
  41. package/output/source/helpers/linter/index.js +0 -2
  42. package/output/source/helpers/linter/linter.js +0 -6
  43. package/output/source/helpers/markdown/index.js +0 -1
  44. package/output/source/helpers/response/index.js +0 -1
  45. package/output/source/projitive.test.js +0 -111
  46. package/output/source/roadmap.test.js +0 -11
  47. package/output/source/tasks.test.js +0 -152
  48. /package/output/source/{helpers/artifacts → common}/artifacts.js +0 -0
  49. /package/output/source/{helpers/artifacts → common}/artifacts.test.js +0 -0
  50. /package/output/source/{helpers/linter → common}/linter.test.js +0 -0
  51. /package/output/source/{helpers/markdown → common}/markdown.js +0 -0
  52. /package/output/source/{helpers/response → common}/response.js +0 -0
  53. /package/output/source/{readme.js → resources/readme.js} +0 -0
@@ -0,0 +1,154 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseDesignMetadata, validateDesignMetadata } from "./designs.js";
3
+ describe("designs module", () => {
4
+ describe("parseDesignMetadata", () => {
5
+ it("parses task metadata from markdown", () => {
6
+ const markdown = [
7
+ "# Design Document",
8
+ "",
9
+ "**Task:** TASK-0001",
10
+ "**Owner:** ai-copilot",
11
+ "**Status:** Draft",
12
+ "**Last Updated:** 2026-02-22",
13
+ "",
14
+ "Some content here",
15
+ ].join("\n");
16
+ const metadata = parseDesignMetadata(markdown);
17
+ expect(metadata.task).toBe("TASK-0001");
18
+ expect(metadata.owner).toBe("ai-copilot");
19
+ expect(metadata.status).toBe("Draft");
20
+ expect(metadata.lastUpdated).toBe("2026-02-22");
21
+ });
22
+ it("parses roadmap metadata from markdown", () => {
23
+ const markdown = [
24
+ "# Design Document",
25
+ "",
26
+ "**Roadmap:** ROADMAP-0001",
27
+ "",
28
+ "Some content here",
29
+ ].join("\n");
30
+ const metadata = parseDesignMetadata(markdown);
31
+ expect(metadata.roadmap).toBe("ROADMAP-0001");
32
+ });
33
+ it("returns empty object for markdown without metadata", () => {
34
+ const markdown = [
35
+ "# Simple Design",
36
+ "",
37
+ "No metadata here",
38
+ ].join("\n");
39
+ const metadata = parseDesignMetadata(markdown);
40
+ expect(metadata).toEqual({});
41
+ });
42
+ it("handles empty string", () => {
43
+ const metadata = parseDesignMetadata("");
44
+ expect(metadata).toEqual({});
45
+ });
46
+ it("handles malformed metadata lines", () => {
47
+ const markdown = [
48
+ "# Report",
49
+ "",
50
+ "Task without colon",
51
+ "Not a metadata line",
52
+ ":",
53
+ "Task:",
54
+ ].join("\n");
55
+ const metadata = parseDesignMetadata(markdown);
56
+ expect(metadata).toBeDefined();
57
+ });
58
+ it("parses metadata in different formats", () => {
59
+ const markdown = [
60
+ "Task: TASK-0001",
61
+ "task: TASK-0002",
62
+ "TASK: TASK-0003",
63
+ " task : TASK-0004 ",
64
+ ].join("\n");
65
+ const metadata = parseDesignMetadata(markdown);
66
+ expect(metadata.task).toBeDefined();
67
+ });
68
+ });
69
+ describe("validateDesignMetadata", () => {
70
+ it("validates correct task metadata", () => {
71
+ const metadata = {
72
+ task: "TASK-0001",
73
+ owner: "ai-copilot",
74
+ status: "Draft",
75
+ lastUpdated: "2026-02-22",
76
+ };
77
+ const result = validateDesignMetadata(metadata);
78
+ expect(result.ok).toBe(true);
79
+ expect(result.errors).toEqual([]);
80
+ });
81
+ it("rejects missing task metadata", () => {
82
+ const metadata = {
83
+ owner: "ai-copilot",
84
+ };
85
+ const result = validateDesignMetadata(metadata);
86
+ expect(result.ok).toBe(false);
87
+ expect(result.errors).toContain("Missing Task metadata");
88
+ });
89
+ it("rejects invalid task ID format", () => {
90
+ const metadata = {
91
+ task: "invalid-format",
92
+ };
93
+ const result = validateDesignMetadata(metadata);
94
+ expect(result.ok).toBe(false);
95
+ expect(result.errors.some((e) => e.includes("Invalid Task"))).toBe(true);
96
+ });
97
+ it("validates optional roadmap metadata", () => {
98
+ const metadata = {
99
+ task: "TASK-0001",
100
+ roadmap: "ROADMAP-0001",
101
+ };
102
+ const result = validateDesignMetadata(metadata);
103
+ expect(result.ok).toBe(true);
104
+ });
105
+ it("rejects invalid roadmap ID format", () => {
106
+ const metadata = {
107
+ task: "TASK-0001",
108
+ roadmap: "invalid-roadmap",
109
+ };
110
+ const result = validateDesignMetadata(metadata);
111
+ expect(result.ok).toBe(false);
112
+ expect(result.errors.some((e) => e.includes("Invalid Roadmap"))).toBe(true);
113
+ });
114
+ it("handles empty metadata object", () => {
115
+ const metadata = {};
116
+ const result = validateDesignMetadata(metadata);
117
+ expect(result.ok).toBe(false);
118
+ expect(result.errors.length).toBeGreaterThan(0);
119
+ });
120
+ it("collects multiple validation errors", () => {
121
+ const metadata = {
122
+ task: "invalid-task",
123
+ roadmap: "invalid-roadmap",
124
+ };
125
+ const result = validateDesignMetadata(metadata);
126
+ expect(result.ok).toBe(false);
127
+ expect(result.errors.length).toBeGreaterThan(1);
128
+ });
129
+ });
130
+ describe("integration", () => {
131
+ it("parses and validates complete design metadata", () => {
132
+ const markdown = [
133
+ "# Design Completion Report",
134
+ "",
135
+ "**Task:** TASK-0001",
136
+ "**Roadmap:** ROADMAP-0002",
137
+ "**Owner:** ai-copilot",
138
+ "**Status:** Completed",
139
+ "**Last Updated:** 2026-02-22",
140
+ "",
141
+ "## Summary",
142
+ "Design completed successfully",
143
+ ].join("\n");
144
+ const metadata = parseDesignMetadata(markdown);
145
+ const validation = validateDesignMetadata(metadata);
146
+ expect(metadata.task).toBe("TASK-0001");
147
+ expect(metadata.roadmap).toBe("ROADMAP-0002");
148
+ expect(metadata.owner).toBe("ai-copilot");
149
+ expect(metadata.status).toBe("Completed");
150
+ expect(metadata.lastUpdated).toBe("2026-02-22");
151
+ expect(validation.ok).toBe(true);
152
+ });
153
+ });
154
+ });
@@ -0,0 +1,40 @@
1
+ // Governance resource management
2
+ import { readMarkdownOrFallback } from "../common/utils.js";
3
+ export function registerGovernanceResources(server, repoRoot) {
4
+ server.registerResource("governanceWorkspace", "projitive://governance/workspace", {
5
+ title: "Governance Workspace",
6
+ description: "Primary governance README under .projitive",
7
+ mimeType: "text/markdown",
8
+ }, async () => ({
9
+ contents: [
10
+ {
11
+ uri: "projitive://governance/workspace",
12
+ text: await readMarkdownOrFallback(".projitive/README.md", "Governance Workspace", repoRoot),
13
+ },
14
+ ],
15
+ }));
16
+ server.registerResource("governanceTasks", "projitive://governance/tasks", {
17
+ title: "Governance Tasks",
18
+ description: "Current task pool and status under .projitive/tasks.md",
19
+ mimeType: "text/markdown",
20
+ }, async () => ({
21
+ contents: [
22
+ {
23
+ uri: "projitive://governance/tasks",
24
+ text: await readMarkdownOrFallback(".projitive/tasks.md", "Governance Tasks", repoRoot),
25
+ },
26
+ ],
27
+ }));
28
+ server.registerResource("governanceRoadmap", "projitive://governance/roadmap", {
29
+ title: "Governance Roadmap",
30
+ description: "Current roadmap under .projitive/roadmap.md",
31
+ mimeType: "text/markdown",
32
+ }, async () => ({
33
+ contents: [
34
+ {
35
+ uri: "projitive://governance/roadmap",
36
+ text: await readMarkdownOrFallback(".projitive/roadmap.md", "Governance Roadmap", repoRoot),
37
+ },
38
+ ],
39
+ }));
40
+ }
@@ -0,0 +1,6 @@
1
+ import { registerGovernanceResources } from "./governance.js";
2
+ import { registerDesignFilesResources } from "./designs.js";
3
+ export function registerResources(server, repoRoot) {
4
+ registerGovernanceResources(server, repoRoot);
5
+ registerDesignFilesResources(server, repoRoot);
6
+ }
@@ -0,0 +1,167 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseRequiredReading, } from "./readme.js";
3
+ describe("readme module", () => {
4
+ describe("parseRequiredReading", () => {
5
+ it("parses local and external required reading items", () => {
6
+ const markdown = [
7
+ "# Project README",
8
+ "",
9
+ "Some intro content",
10
+ "",
11
+ "## Required Reading for Agents",
12
+ "",
13
+ "- Local: ./design/README.md",
14
+ "- Local: .projitive/tasks.md",
15
+ "- External: https://example.com/docs",
16
+ "",
17
+ "## Other Section",
18
+ "",
19
+ "More content here",
20
+ ].join("\n");
21
+ const result = parseRequiredReading(markdown);
22
+ expect(result.length).toBe(3);
23
+ expect(result[0]).toEqual({
24
+ source: "Local",
25
+ value: "./design/README.md",
26
+ });
27
+ expect(result[1]).toEqual({
28
+ source: "Local",
29
+ value: ".projitive/tasks.md",
30
+ });
31
+ expect(result[2]).toEqual({
32
+ source: "External",
33
+ value: "https://example.com/docs",
34
+ });
35
+ });
36
+ it("parses Chinese section header", () => {
37
+ const markdown = [
38
+ "# 项目 README",
39
+ "",
40
+ "## Agent 必读",
41
+ "",
42
+ "- Local: ./docs/guide.md",
43
+ "",
44
+ "## 其他部分",
45
+ ].join("\n");
46
+ const result = parseRequiredReading(markdown);
47
+ expect(result.length).toBe(1);
48
+ expect(result[0].source).toBe("Local");
49
+ expect(result[0].value).toBe("./docs/guide.md");
50
+ });
51
+ it("returns empty array when no required reading section", () => {
52
+ const markdown = [
53
+ "# Simple README",
54
+ "",
55
+ "No required reading here",
56
+ "",
57
+ "## Other Section",
58
+ ].join("\n");
59
+ const result = parseRequiredReading(markdown);
60
+ expect(result).toEqual([]);
61
+ });
62
+ it("returns empty array for empty string", () => {
63
+ const result = parseRequiredReading("");
64
+ expect(result).toEqual([]);
65
+ });
66
+ it("ignores non-list items in required reading section", () => {
67
+ const markdown = [
68
+ "## Required Reading for Agents",
69
+ "",
70
+ "Some paragraph text here",
71
+ "- Local: valid-item.md",
72
+ "Another paragraph",
73
+ "- External: https://valid.com",
74
+ "",
75
+ "## Next Section",
76
+ ].join("\n");
77
+ const result = parseRequiredReading(markdown);
78
+ expect(result.length).toBe(2);
79
+ expect(result[0].value).toBe("valid-item.md");
80
+ expect(result[1].value).toBe("https://valid.com");
81
+ });
82
+ it("handles items with whitespace variations", () => {
83
+ const markdown = [
84
+ "## Required Reading for Agents",
85
+ "",
86
+ "- Local: ./path/with/spaces.md ",
87
+ "- External: https://example.com ",
88
+ ].join("\n");
89
+ const result = parseRequiredReading(markdown);
90
+ expect(result.length).toBe(2);
91
+ expect(result[0].value).toBe("./path/with/spaces.md");
92
+ expect(result[1].value).toBe("https://example.com");
93
+ });
94
+ it("ignores items without Local: or External: prefix", () => {
95
+ const markdown = [
96
+ "## Required Reading for Agents",
97
+ "",
98
+ "- Local: valid.md",
99
+ "- Invalid: this is ignored",
100
+ "- Just a plain list item",
101
+ "- External: https://valid.com",
102
+ ].join("\n");
103
+ const result = parseRequiredReading(markdown);
104
+ expect(result.length).toBe(2);
105
+ expect(result.every((item) => item.source === "Local" || item.source === "External")).toBe(true);
106
+ });
107
+ it("stops at next section header", () => {
108
+ const markdown = [
109
+ "## Required Reading for Agents",
110
+ "",
111
+ "- Local: before.md",
112
+ "",
113
+ "## Another Section",
114
+ "",
115
+ "- Local: after.md",
116
+ ].join("\n");
117
+ const result = parseRequiredReading(markdown);
118
+ expect(result.length).toBe(1);
119
+ expect(result[0].value).toBe("before.md");
120
+ });
121
+ it("handles multiple required reading sections (takes first one)", () => {
122
+ const markdown = [
123
+ "## Required Reading for Agents",
124
+ "",
125
+ "- Local: first.md",
126
+ "",
127
+ "## Other Section",
128
+ "",
129
+ "## Required Reading for Agents",
130
+ "",
131
+ "- Local: second.md",
132
+ ].join("\n");
133
+ const result = parseRequiredReading(markdown);
134
+ expect(result.length).toBe(1);
135
+ expect(result[0].value).toBe("first.md");
136
+ });
137
+ });
138
+ describe("edge cases", () => {
139
+ it("handles markdown with just the section", () => {
140
+ const markdown = "## Required Reading for Agents";
141
+ const result = parseRequiredReading(markdown);
142
+ expect(result).toEqual([]);
143
+ });
144
+ it("handles section with empty lines", () => {
145
+ const markdown = [
146
+ "## Required Reading for Agents",
147
+ "",
148
+ "",
149
+ "- Local: item.md",
150
+ "",
151
+ "",
152
+ ].join("\n");
153
+ const result = parseRequiredReading(markdown);
154
+ expect(result.length).toBe(1);
155
+ expect(result[0].value).toBe("item.md");
156
+ });
157
+ it("handles mixed case section headers", () => {
158
+ const markdown = [
159
+ "## required reading for agents",
160
+ "",
161
+ "- Local: lowercase.md",
162
+ ].join("\n");
163
+ const result = parseRequiredReading(markdown);
164
+ expect(result.length).toBe(1);
165
+ });
166
+ });
167
+ });
@@ -1,10 +1,12 @@
1
- import { isValidRoadmapId } from "./roadmap.js";
2
- import { isValidTaskId } from "./tasks.js";
1
+ import { isValidRoadmapId } from "../tools/roadmap.js";
2
+ import { isValidTaskId } from "../tools/task.js";
3
3
  export function parseReportMetadata(markdown) {
4
4
  const lines = markdown.split(/\r?\n/);
5
5
  const metadata = {};
6
6
  for (const line of lines) {
7
- const [rawKey, ...rawValue] = line.split(":");
7
+ // Remove markdown bold markers (**)
8
+ const cleanLine = line.replace(/\*\*/g, "");
9
+ const [rawKey, ...rawValue] = cleanLine.split(":");
8
10
  if (!rawKey || rawValue.length === 0) {
9
11
  continue;
10
12
  }
@@ -0,0 +1,149 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseReportMetadata, validateReportMetadata, } from "./reports.js";
3
+ describe("reports module", () => {
4
+ describe("parseReportMetadata", () => {
5
+ it("parses task metadata from markdown", () => {
6
+ const markdown = [
7
+ "# Task Report",
8
+ "",
9
+ "**Task:** TASK-0001",
10
+ "**Owner:** ai-copilot",
11
+ "**Date:** 2026-02-22",
12
+ "",
13
+ "Some content here",
14
+ ].join("\n");
15
+ const metadata = parseReportMetadata(markdown);
16
+ expect(metadata.task).toBe("TASK-0001");
17
+ expect(metadata.owner).toBe("ai-copilot");
18
+ expect(metadata.date).toBe("2026-02-22");
19
+ });
20
+ it("parses roadmap metadata from markdown", () => {
21
+ const markdown = [
22
+ "# Roadmap Report",
23
+ "",
24
+ "**Roadmap:** ROADMAP-0001",
25
+ "",
26
+ "Some content here",
27
+ ].join("\n");
28
+ const metadata = parseReportMetadata(markdown);
29
+ expect(metadata.roadmap).toBe("ROADMAP-0001");
30
+ });
31
+ it("returns empty object for markdown without metadata", () => {
32
+ const markdown = [
33
+ "# Simple Report",
34
+ "",
35
+ "No metadata here",
36
+ ].join("\n");
37
+ const metadata = parseReportMetadata(markdown);
38
+ expect(metadata).toEqual({});
39
+ });
40
+ it("handles empty string", () => {
41
+ const metadata = parseReportMetadata("");
42
+ expect(metadata).toEqual({});
43
+ });
44
+ it("handles malformed metadata lines", () => {
45
+ const markdown = [
46
+ "# Report",
47
+ "",
48
+ "Task without colon",
49
+ "Not a metadata line",
50
+ ":",
51
+ "Task:",
52
+ ].join("\n");
53
+ const metadata = parseReportMetadata(markdown);
54
+ expect(metadata).toBeDefined();
55
+ });
56
+ it("parses metadata in different formats", () => {
57
+ const markdown = [
58
+ "Task: TASK-0001",
59
+ "task: TASK-0002",
60
+ "TASK: TASK-0003",
61
+ " task : TASK-0004 ",
62
+ ].join("\n");
63
+ const metadata = parseReportMetadata(markdown);
64
+ expect(metadata.task).toBeDefined();
65
+ });
66
+ });
67
+ describe("validateReportMetadata", () => {
68
+ it("validates correct task metadata", () => {
69
+ const metadata = {
70
+ task: "TASK-0001",
71
+ owner: "ai-copilot",
72
+ date: "2026-02-22",
73
+ };
74
+ const result = validateReportMetadata(metadata);
75
+ expect(result.ok).toBe(true);
76
+ expect(result.errors).toEqual([]);
77
+ });
78
+ it("rejects missing task metadata", () => {
79
+ const metadata = {
80
+ owner: "ai-copilot",
81
+ };
82
+ const result = validateReportMetadata(metadata);
83
+ expect(result.ok).toBe(false);
84
+ expect(result.errors).toContain("Missing Task metadata");
85
+ });
86
+ it("rejects invalid task ID format", () => {
87
+ const metadata = {
88
+ task: "invalid-format",
89
+ };
90
+ const result = validateReportMetadata(metadata);
91
+ expect(result.ok).toBe(false);
92
+ expect(result.errors.some((e) => e.includes("Invalid Task"))).toBe(true);
93
+ });
94
+ it("validates optional roadmap metadata", () => {
95
+ const metadata = {
96
+ task: "TASK-0001",
97
+ roadmap: "ROADMAP-0001",
98
+ };
99
+ const result = validateReportMetadata(metadata);
100
+ expect(result.ok).toBe(true);
101
+ });
102
+ it("rejects invalid roadmap ID format", () => {
103
+ const metadata = {
104
+ task: "TASK-0001",
105
+ roadmap: "invalid-roadmap",
106
+ };
107
+ const result = validateReportMetadata(metadata);
108
+ expect(result.ok).toBe(false);
109
+ expect(result.errors.some((e) => e.includes("Invalid Roadmap"))).toBe(true);
110
+ });
111
+ it("handles empty metadata object", () => {
112
+ const metadata = {};
113
+ const result = validateReportMetadata(metadata);
114
+ expect(result.ok).toBe(false);
115
+ expect(result.errors.length).toBeGreaterThan(0);
116
+ });
117
+ it("collects multiple validation errors", () => {
118
+ const metadata = {
119
+ task: "invalid-task",
120
+ roadmap: "invalid-roadmap",
121
+ };
122
+ const result = validateReportMetadata(metadata);
123
+ expect(result.ok).toBe(false);
124
+ expect(result.errors.length).toBeGreaterThan(1);
125
+ });
126
+ });
127
+ describe("integration", () => {
128
+ it("parses and validates complete report metadata", () => {
129
+ const markdown = [
130
+ "# Task Completion Report",
131
+ "",
132
+ "**Task:** TASK-0001",
133
+ "**Roadmap:** ROADMAP-0002",
134
+ "**Owner:** ai-copilot",
135
+ "**Date:** 2026-02-22",
136
+ "",
137
+ "## Summary",
138
+ "Task completed successfully",
139
+ ].join("\n");
140
+ const metadata = parseReportMetadata(markdown);
141
+ const validation = validateReportMetadata(metadata);
142
+ expect(metadata.task).toBe("TASK-0001");
143
+ expect(metadata.roadmap).toBe("ROADMAP-0002");
144
+ expect(metadata.owner).toBe("ai-copilot");
145
+ expect(metadata.date).toBe("2026-02-22");
146
+ expect(validation.ok).toBe(true);
147
+ });
148
+ });
149
+ });
@@ -0,0 +1,8 @@
1
+ import { registerProjectTools } from "./project.js";
2
+ import { registerTaskTools } from "./task.js";
3
+ import { registerRoadmapTools } from "./roadmap.js";
4
+ export function registerTools(server) {
5
+ registerProjectTools(server);
6
+ registerTaskTools(server);
7
+ registerRoadmapTools(server);
8
+ }
@@ -2,11 +2,9 @@ import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import process from "node:process";
4
4
  import { z } from "zod";
5
- import { discoverGovernanceArtifacts } from "./helpers/files/index.js";
6
- import { catchIt } from "./helpers/catch/index.js";
7
- import { PROJECT_LINT_CODES, renderLintSuggestions } from "./helpers/linter/index.js";
8
- import { asText, evidenceSection, guidanceSection, lintSection, nextCallSection, renderToolResponseMarkdown, summarySection, } from "./helpers/response/index.js";
9
- import { collectTaskLintSuggestions, loadTasksDocument } from "./tasks.js";
5
+ import { discoverGovernanceArtifacts, catchIt, PROJECT_LINT_CODES, renderLintSuggestions } from "../common/index.js";
6
+ import { asText, evidenceSection, guidanceSection, lintSection, nextCallSection, renderToolResponseMarkdown, summarySection, } from "../common/index.js";
7
+ import { collectTaskLintSuggestions, loadTasksDocument } from "./task.js";
10
8
  export const PROJECT_MARKER = ".projitive";
11
9
  const DEFAULT_GOVERNANCE_DIR = ".projitive";
12
10
  const ignoreNames = new Set(["node_modules", ".git", ".next", "dist", "build"]);
@@ -93,7 +91,7 @@ async function readTasksSnapshot(governanceDir) {
93
91
  ]),
94
92
  };
95
93
  }
96
- const { parseTasksBlock } = await import("./tasks.js");
94
+ const { parseTasksBlock } = await import("./task.js");
97
95
  const tasks = await parseTasksBlock(markdown);
98
96
  return { tasksPath, exists: true, tasks, lintSuggestions: collectTaskLintSuggestions(tasks, markdown) };
99
97
  }