@projitive/mcp 1.0.0 → 1.0.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 (33) hide show
  1. package/README.md +29 -1
  2. package/output/helpers/artifacts/artifacts.js +10 -0
  3. package/output/helpers/artifacts/artifacts.test.js +18 -0
  4. package/output/helpers/artifacts/index.js +1 -0
  5. package/output/helpers/index.js +3 -0
  6. package/output/helpers/linter/codes.js +25 -0
  7. package/output/helpers/linter/index.js +2 -0
  8. package/output/helpers/linter/linter.js +6 -0
  9. package/output/helpers/linter/linter.test.js +16 -0
  10. package/output/helpers/response/index.js +1 -0
  11. package/output/helpers/response/response.js +73 -0
  12. package/output/helpers/response/response.test.js +50 -0
  13. package/output/index.js +1 -0
  14. package/output/projitive.js +252 -97
  15. package/output/projitive.test.js +29 -1
  16. package/output/rendering-input-guard.test.js +20 -0
  17. package/output/roadmap.js +106 -80
  18. package/output/roadmap.test.js +11 -0
  19. package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectContext.md +48 -0
  20. package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectInit.md +40 -0
  21. package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectLocate.md +22 -0
  22. package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectNext.md +31 -0
  23. package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectScan.md +28 -0
  24. package/output/smoke-reports/2026-02-18T13-18-19-740Z/roadmapContext.md +33 -0
  25. package/output/smoke-reports/2026-02-18T13-18-19-740Z/roadmapList.md +25 -0
  26. package/output/smoke-reports/2026-02-18T13-18-19-740Z/summary.json +90 -0
  27. package/output/smoke-reports/2026-02-18T13-18-19-740Z/summary.md +17 -0
  28. package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskContext.md +47 -0
  29. package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskList.md +27 -0
  30. package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskNext.md +64 -0
  31. package/output/tasks.js +341 -162
  32. package/output/tasks.test.js +51 -1
  33. package/package.json +1 -1
package/output/roadmap.js CHANGED
@@ -1,39 +1,60 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { z } from "zod";
4
+ import { candidateFilesFromArtifacts } from "./helpers/artifacts/index.js";
4
5
  import { discoverGovernanceArtifacts } from "./helpers/files/index.js";
6
+ import { ROADMAP_LINT_CODES, renderLintSuggestions } from "./helpers/linter/index.js";
5
7
  import { findTextReferences } from "./helpers/markdown/index.js";
8
+ import { asText, evidenceSection, guidanceSection, lintSection, nextCallSection, renderErrorMarkdown, renderToolResponseMarkdown, summarySection, } from "./helpers/response/index.js";
6
9
  import { resolveGovernanceDir } from "./projitive.js";
7
10
  import { loadTasks } from "./tasks.js";
8
11
  export const ROADMAP_ID_REGEX = /^ROADMAP-\d{4}$/;
9
- function asText(markdown) {
10
- return {
11
- content: [{ type: "text", text: markdown }],
12
- };
13
- }
14
- function renderErrorMarkdown(toolName, cause, nextSteps, retryExample) {
15
- return [
16
- `# ${toolName}`,
17
- "",
18
- "## Error",
19
- `- cause: ${cause}`,
20
- "",
21
- "## Next Step",
22
- ...(nextSteps.length > 0 ? nextSteps : ["- (none)"]),
23
- "",
24
- "## Retry Example",
25
- `- ${retryExample ?? "(none)"}`,
26
- ].join("\n");
12
+ function collectRoadmapLintSuggestionItems(roadmapIds, tasks) {
13
+ const suggestions = [];
14
+ if (roadmapIds.length === 0) {
15
+ suggestions.push({
16
+ code: ROADMAP_LINT_CODES.IDS_EMPTY,
17
+ message: "No roadmap IDs found in roadmap.md.",
18
+ fixHint: "Add at least one ROADMAP-xxxx milestone.",
19
+ });
20
+ }
21
+ if (tasks.length === 0) {
22
+ suggestions.push({
23
+ code: ROADMAP_LINT_CODES.TASKS_EMPTY,
24
+ message: "No tasks found in tasks.md.",
25
+ fixHint: "Add task cards and bind roadmapRefs for traceability.",
26
+ });
27
+ return suggestions;
28
+ }
29
+ const roadmapSet = new Set(roadmapIds);
30
+ const unboundTasks = tasks.filter((task) => task.roadmapRefs.length === 0);
31
+ if (unboundTasks.length > 0) {
32
+ suggestions.push({
33
+ code: ROADMAP_LINT_CODES.TASK_REFS_EMPTY,
34
+ message: `${unboundTasks.length} task(s) have empty roadmapRefs.`,
35
+ fixHint: "Bind ROADMAP-xxxx where applicable.",
36
+ });
37
+ }
38
+ const unknownRefs = Array.from(new Set(tasks.flatMap((task) => task.roadmapRefs).filter((id) => !roadmapSet.has(id))));
39
+ if (unknownRefs.length > 0) {
40
+ suggestions.push({
41
+ code: ROADMAP_LINT_CODES.UNKNOWN_REFS,
42
+ message: `Unknown roadmapRefs detected: ${unknownRefs.join(", ")}.`,
43
+ fixHint: "Add missing roadmap IDs or fix task references.",
44
+ });
45
+ }
46
+ const noLinkedRoadmaps = roadmapIds.filter((id) => !tasks.some((task) => task.roadmapRefs.includes(id)));
47
+ if (noLinkedRoadmaps.length > 0) {
48
+ suggestions.push({
49
+ code: ROADMAP_LINT_CODES.ZERO_LINKED_TASKS,
50
+ message: `${noLinkedRoadmaps.length} roadmap ID(s) have zero linked tasks.`,
51
+ fixHint: `Consider binding tasks to: ${noLinkedRoadmaps.slice(0, 3).join(", ")}${noLinkedRoadmaps.length > 3 ? ", ..." : ""}.`,
52
+ });
53
+ }
54
+ return suggestions;
27
55
  }
28
- function candidateFilesFromArtifacts(artifacts) {
29
- return artifacts
30
- .filter((item) => item.exists)
31
- .flatMap((item) => {
32
- if (item.kind === "file") {
33
- return [item.path];
34
- }
35
- return (item.markdownFiles ?? []).map((entry) => entry.path);
36
- });
56
+ export function collectRoadmapLintSuggestions(roadmapIds, tasks) {
57
+ return renderLintSuggestions(collectRoadmapLintSuggestionItems(roadmapIds, tasks));
37
58
  }
38
59
  export function isValidRoadmapId(id) {
39
60
  return ROADMAP_ID_REGEX.test(id);
@@ -60,30 +81,28 @@ export function registerRoadmapTools(server) {
60
81
  const governanceDir = await resolveGovernanceDir(projectPath);
61
82
  const roadmapIds = await readRoadmapIds(governanceDir);
62
83
  const { tasks } = await loadTasks(governanceDir);
63
- const markdown = [
64
- "# roadmapList",
65
- "",
66
- "## Summary",
67
- `- governanceDir: ${governanceDir}`,
68
- `- roadmapCount: ${roadmapIds.length}`,
69
- "",
70
- "## Evidence",
71
- "- roadmaps:",
72
- ...(roadmapIds.length > 0
73
- ? roadmapIds.map((id) => {
74
- const linkedTasks = tasks.filter((task) => task.roadmapRefs.includes(id));
75
- return `- ${id} | linkedTasks=${linkedTasks.length}`;
76
- })
77
- : ["- (none)"]),
78
- "",
79
- "## Agent Guidance",
80
- "- Pick one roadmap ID and call `roadmapContext`.",
81
- "",
82
- "## Next Call",
83
- ...(roadmapIds.length > 0
84
- ? [`- roadmapContext(projectPath=\"${governanceDir}\", roadmapId=\"${roadmapIds[0]}\")`]
85
- : ["- (none)"]),
86
- ].join("\n");
84
+ const lintSuggestions = collectRoadmapLintSuggestions(roadmapIds, tasks);
85
+ const markdown = renderToolResponseMarkdown({
86
+ toolName: "roadmapList",
87
+ sections: [
88
+ summarySection([
89
+ `- governanceDir: ${governanceDir}`,
90
+ `- roadmapCount: ${roadmapIds.length}`,
91
+ ]),
92
+ evidenceSection([
93
+ "- roadmaps:",
94
+ ...roadmapIds.map((id) => {
95
+ const linkedTasks = tasks.filter((task) => task.roadmapRefs.includes(id));
96
+ return `- ${id} | linkedTasks=${linkedTasks.length}`;
97
+ }),
98
+ ]),
99
+ guidanceSection(["- Pick one roadmap ID and call `roadmapContext`."]),
100
+ lintSection(lintSuggestions),
101
+ nextCallSection(roadmapIds[0]
102
+ ? `roadmapContext(projectPath=\"${governanceDir}\", roadmapId=\"${roadmapIds[0]}\")`
103
+ : undefined),
104
+ ],
105
+ });
87
106
  return asText(markdown);
88
107
  });
89
108
  server.registerTool("roadmapContext", {
@@ -96,7 +115,7 @@ export function registerRoadmapTools(server) {
96
115
  }, async ({ projectPath, roadmapId }) => {
97
116
  if (!isValidRoadmapId(roadmapId)) {
98
117
  return {
99
- ...asText(renderErrorMarkdown("roadmapContext", `Invalid roadmap ID format: ${roadmapId}`, ["- expected format: ROADMAP-0001", "- retry with a valid roadmap ID"], `roadmapContext(projectPath=\"${projectPath}\", roadmapId=\"ROADMAP-0001\")`)),
118
+ ...asText(renderErrorMarkdown("roadmapContext", `Invalid roadmap ID format: ${roadmapId}`, ["expected format: ROADMAP-0001", "retry with a valid roadmap ID"], `roadmapContext(projectPath=\"${projectPath}\", roadmapId=\"ROADMAP-0001\")`)),
100
119
  isError: true,
101
120
  };
102
121
  }
@@ -106,34 +125,41 @@ export function registerRoadmapTools(server) {
106
125
  const referenceLocations = (await Promise.all(fileCandidates.map((file) => findTextReferences(file, roadmapId)))).flat();
107
126
  const { tasks } = await loadTasks(governanceDir);
108
127
  const relatedTasks = tasks.filter((task) => task.roadmapRefs.includes(roadmapId));
109
- const markdown = [
110
- "# roadmapContext",
111
- "",
112
- "## Summary",
113
- `- governanceDir: ${governanceDir}`,
114
- `- roadmapId: ${roadmapId}`,
115
- `- relatedTasks: ${relatedTasks.length}`,
116
- `- references: ${referenceLocations.length}`,
117
- "",
118
- "## Evidence",
119
- "### Related Tasks",
120
- ...(relatedTasks.length > 0
121
- ? relatedTasks.map((task) => `- ${task.id} | ${task.status} | ${task.title}`)
122
- : ["- (none)"]),
123
- "",
124
- "### Reference Locations",
125
- ...(referenceLocations.length > 0
126
- ? referenceLocations.map((item) => `- ${item.filePath}#L${item.line}: ${item.text}`)
127
- : ["- (none)"]),
128
- "",
129
- "## Agent Guidance",
130
- "- Read roadmap references first, then related tasks.",
131
- "- Keep ROADMAP/TASK IDs unchanged while updating markdown files.",
132
- "- Re-run `roadmapContext` after edits to confirm references remain consistent.",
133
- "",
134
- "## Next Call",
135
- `- roadmapContext(projectPath=\"${governanceDir}\", roadmapId=\"${roadmapId}\")`,
136
- ].join("\n");
128
+ const roadmapIds = await readRoadmapIds(governanceDir);
129
+ const lintSuggestionItems = collectRoadmapLintSuggestionItems(roadmapIds, tasks);
130
+ if (relatedTasks.length === 0) {
131
+ lintSuggestionItems.push({
132
+ code: ROADMAP_LINT_CODES.CONTEXT_RELATED_TASKS_EMPTY,
133
+ message: `relatedTasks=0 for ${roadmapId}.`,
134
+ fixHint: "Batch bind task roadmapRefs to improve execution traceability.",
135
+ });
136
+ }
137
+ const lintSuggestions = renderLintSuggestions(lintSuggestionItems);
138
+ const markdown = renderToolResponseMarkdown({
139
+ toolName: "roadmapContext",
140
+ sections: [
141
+ summarySection([
142
+ `- governanceDir: ${governanceDir}`,
143
+ `- roadmapId: ${roadmapId}`,
144
+ `- relatedTasks: ${relatedTasks.length}`,
145
+ `- references: ${referenceLocations.length}`,
146
+ ]),
147
+ evidenceSection([
148
+ "### Related Tasks",
149
+ ...relatedTasks.map((task) => `- ${task.id} | ${task.status} | ${task.title}`),
150
+ "",
151
+ "### Reference Locations",
152
+ ...referenceLocations.map((item) => `- ${item.filePath}#L${item.line}: ${item.text}`),
153
+ ]),
154
+ guidanceSection([
155
+ "- Read roadmap references first, then related tasks.",
156
+ "- Keep ROADMAP/TASK IDs unchanged while updating markdown files.",
157
+ "- Re-run `roadmapContext` after edits to confirm references remain consistent.",
158
+ ]),
159
+ lintSection(lintSuggestions),
160
+ nextCallSection(`roadmapContext(projectPath=\"${governanceDir}\", roadmapId=\"${roadmapId}\")`),
161
+ ],
162
+ });
137
163
  return asText(markdown);
138
164
  });
139
165
  }
@@ -0,0 +1,11 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { collectRoadmapLintSuggestions } from "./roadmap.js";
3
+ import { normalizeTask } from "./tasks.js";
4
+ describe("roadmap lint rendering alignment", () => {
5
+ it("renders roadmap lint in code-prefixed markdown lines", () => {
6
+ const lint = collectRoadmapLintSuggestions(["ROADMAP-0001"], [
7
+ normalizeTask({ id: "TASK-0001", title: "x", status: "TODO", roadmapRefs: [] }),
8
+ ]);
9
+ expect(lint.some((line) => line.startsWith("- [ROADMAP_TASK_REFS_EMPTY]"))).toBe(true);
10
+ });
11
+ });
@@ -0,0 +1,48 @@
1
+ # projectContext
2
+
3
+ - passed: true
4
+ - args: {"projectPath":"/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive"}
5
+
6
+ ## Output
7
+
8
+ # projectContext
9
+
10
+ ## Summary
11
+ - governanceDir: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
12
+ - tasksFile: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md
13
+ - roadmapIds: 1
14
+
15
+ ## Evidence
16
+ ### Task Summary
17
+ - total: 1
18
+ - TODO: 1
19
+ - IN_PROGRESS: 0
20
+ - BLOCKED: 0
21
+ - DONE: 0
22
+
23
+ ### Artifacts
24
+ - ✅ README.md
25
+ path: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/README.md
26
+ lineCount: 8
27
+ - ✅ roadmap.md
28
+ path: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/roadmap.md
29
+ lineCount: 4
30
+ - ✅ tasks.md
31
+ path: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md
32
+ lineCount: 11
33
+ - ✅ designs/
34
+ path: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/designs
35
+ - ✅ reports/
36
+ path: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/reports
37
+ - ✅ hooks/
38
+ path: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/hooks
39
+
40
+ ## Agent Guidance
41
+ - Start from `taskList` to choose a target task.
42
+ - Then call `taskContext` with a task ID to retrieve evidence locations and reading order.
43
+
44
+ ## Lint Suggestions
45
+ - (none)
46
+
47
+ ## Next Call
48
+ - taskList(projectPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive")
@@ -0,0 +1,40 @@
1
+ # projectInit
2
+
3
+ - passed: true
4
+ - args: {"rootPath":"/Users/yinxulai/Documents/Github/projitive-mcp-smoke","governanceDir":".projitive","force":true}
5
+
6
+ ## Output
7
+
8
+ # projectInit
9
+
10
+ ## Summary
11
+ - rootPath: /Users/yinxulai/Documents/Github/projitive-mcp-smoke
12
+ - governanceDir: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
13
+ - markerPath: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/.projitive
14
+ - force: true
15
+
16
+ ## Evidence
17
+ - createdFiles: 4
18
+ - updatedFiles: 0
19
+ - skippedFiles: 0
20
+ - directories:
21
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
22
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/designs
23
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/reports
24
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/hooks
25
+ - files:
26
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/.projitive
27
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/README.md
28
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/roadmap.md
29
+ - created: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md
30
+
31
+ ## Agent Guidance
32
+ - If files were skipped and you want to overwrite templates, rerun with force=true.
33
+ - Continue with projectContext and taskList for execution.
34
+
35
+ ## Lint Suggestions
36
+ - After init, fill owner/roadmapRefs/links in tasks.md before marking DONE.
37
+ - Keep task source-of-truth inside marker block only.
38
+
39
+ ## Next Call
40
+ - projectContext(projectPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive")
@@ -0,0 +1,22 @@
1
+ # projectLocate
2
+
3
+ - passed: true
4
+ - args: {"inputPath":"/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/designs"}
5
+
6
+ ## Output
7
+
8
+ # projectLocate
9
+
10
+ ## Summary
11
+ - resolvedFrom: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/designs
12
+ - governanceDir: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
13
+ - markerPath: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/.projitive
14
+
15
+ ## Agent Guidance
16
+ - Call `projectContext` with this governanceDir to get task and roadmap summaries.
17
+
18
+ ## Lint Suggestions
19
+ - Run `projectContext` to get governance/module lint suggestions for this project.
20
+
21
+ ## Next Call
22
+ - projectContext(projectPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive")
@@ -0,0 +1,31 @@
1
+ # projectNext
2
+
3
+ - passed: true
4
+ - args: {"rootPath":"/Users/yinxulai/Documents/Github","maxDepth":2,"limit":5}
5
+
6
+ ## Output
7
+
8
+ # projectNext
9
+
10
+ ## Summary
11
+ - rootPath: /Users/yinxulai/Documents/Github
12
+ - maxDepth: 2
13
+ - matchedProjects: 2
14
+ - actionableProjects: 2
15
+ - limit: 5
16
+
17
+ ## Evidence
18
+ - rankedProjects:
19
+ 1. /Users/yinxulai/Documents/Github/projitive/.projitive | actionable=3 | in_progress=1 | todo=2 | blocked=0 | done=0 | latest=2026-02-17T23:50:00.000Z | tasksPath=/Users/yinxulai/Documents/Github/projitive/.projitive/tasks.md
20
+ 2. /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive | actionable=1 | in_progress=0 | todo=1 | blocked=0 | done=0 | latest=2026-02-18T13:18:19.890Z | tasksPath=/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md
21
+
22
+ ## Agent Guidance
23
+ - Pick top 1 project and call `projectContext` with its governanceDir.
24
+ - Then call `taskList` and `taskContext` to continue execution.
25
+ - If `tasksPath` is missing, create tasks.md using project convention before task-level operations.
26
+
27
+ ## Lint Suggestions
28
+ - (none)
29
+
30
+ ## Next Call
31
+ - projectContext(projectPath="/Users/yinxulai/Documents/Github/projitive/.projitive")
@@ -0,0 +1,28 @@
1
+ # projectScan
2
+
3
+ - passed: true
4
+ - args: {"rootPath":"/Users/yinxulai/Documents/Github","maxDepth":2}
5
+
6
+ ## Output
7
+
8
+ # projectScan
9
+
10
+ ## Summary
11
+ - rootPath: /Users/yinxulai/Documents/Github
12
+ - maxDepth: 2
13
+ - discoveredCount: 2
14
+
15
+ ## Evidence
16
+ - projects:
17
+ 1. /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
18
+ 2. /Users/yinxulai/Documents/Github/projitive/.projitive
19
+
20
+ ## Agent Guidance
21
+ - Use one discovered project path and call `projectLocate` to lock governance root.
22
+ - Then call `projectContext` to inspect current governance state.
23
+
24
+ ## Lint Suggestions
25
+ - Run `projectContext` on a discovered project to receive module-level lint suggestions.
26
+
27
+ ## Next Call
28
+ - projectLocate(inputPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive")
@@ -0,0 +1,33 @@
1
+ # roadmapContext
2
+
3
+ - passed: true
4
+ - args: {"projectPath":"/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive","roadmapId":"ROADMAP-0001"}
5
+
6
+ ## Output
7
+
8
+ # roadmapContext
9
+
10
+ ## Summary
11
+ - governanceDir: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
12
+ - roadmapId: ROADMAP-0001
13
+ - relatedTasks: 1
14
+ - references: 2
15
+
16
+ ## Evidence
17
+ ### Related Tasks
18
+ - TASK-0001 | TODO | Bootstrap governance workspace
19
+
20
+ ### Reference Locations
21
+ - /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/roadmap.md#L4: - [ ] ROADMAP-0001: Bootstrap governance baseline (time: 2026-Q1)
22
+ - /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md#L9: - roadmapRefs: ROADMAP-0001
23
+
24
+ ## Agent Guidance
25
+ - Read roadmap references first, then related tasks.
26
+ - Keep ROADMAP/TASK IDs unchanged while updating markdown files.
27
+ - Re-run `roadmapContext` after edits to confirm references remain consistent.
28
+
29
+ ## Lint Suggestions
30
+ - (none)
31
+
32
+ ## Next Call
33
+ - roadmapContext(projectPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive", roadmapId="ROADMAP-0001")
@@ -0,0 +1,25 @@
1
+ # roadmapList
2
+
3
+ - passed: true
4
+ - args: {"projectPath":"/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive","limit":5}
5
+
6
+ ## Output
7
+
8
+ # roadmapList
9
+
10
+ ## Summary
11
+ - governanceDir: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
12
+ - roadmapCount: 1
13
+
14
+ ## Evidence
15
+ - roadmaps:
16
+ - ROADMAP-0001 | linkedTasks=1
17
+
18
+ ## Agent Guidance
19
+ - Pick one roadmap ID and call `roadmapContext`.
20
+
21
+ ## Lint Suggestions
22
+ - (none)
23
+
24
+ ## Next Call
25
+ - roadmapContext(projectPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive", roadmapId="ROADMAP-0001")
@@ -0,0 +1,90 @@
1
+ {
2
+ "root": "/Users/yinxulai/Documents/Github",
3
+ "workspace": "/Users/yinxulai/Documents/Github/projitive",
4
+ "sandbox": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke",
5
+ "reportDir": "/Users/yinxulai/Documents/Github/projitive/packages/mcp/output/smoke-reports/2026-02-18T13-18-19-740Z",
6
+ "generatedAt": "2026-02-18T13:18:20.412Z",
7
+ "results": [
8
+ {
9
+ "methodName": "projectInit",
10
+ "passed": true,
11
+ "args": {
12
+ "rootPath": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke",
13
+ "governanceDir": ".projitive",
14
+ "force": true
15
+ }
16
+ },
17
+ {
18
+ "methodName": "projectScan",
19
+ "passed": true,
20
+ "args": {
21
+ "rootPath": "/Users/yinxulai/Documents/Github",
22
+ "maxDepth": 2
23
+ }
24
+ },
25
+ {
26
+ "methodName": "projectNext",
27
+ "passed": true,
28
+ "args": {
29
+ "rootPath": "/Users/yinxulai/Documents/Github",
30
+ "maxDepth": 2,
31
+ "limit": 5
32
+ }
33
+ },
34
+ {
35
+ "methodName": "projectLocate",
36
+ "passed": true,
37
+ "args": {
38
+ "inputPath": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/designs"
39
+ }
40
+ },
41
+ {
42
+ "methodName": "projectContext",
43
+ "passed": true,
44
+ "args": {
45
+ "projectPath": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive"
46
+ }
47
+ },
48
+ {
49
+ "methodName": "taskList",
50
+ "passed": true,
51
+ "args": {
52
+ "projectPath": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive",
53
+ "limit": 5
54
+ }
55
+ },
56
+ {
57
+ "methodName": "taskNext",
58
+ "passed": true,
59
+ "args": {
60
+ "rootPath": "/Users/yinxulai/Documents/Github",
61
+ "maxDepth": 2,
62
+ "topCandidates": 5
63
+ }
64
+ },
65
+ {
66
+ "methodName": "taskContext",
67
+ "passed": true,
68
+ "args": {
69
+ "projectPath": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive",
70
+ "taskId": "TASK-0001"
71
+ }
72
+ },
73
+ {
74
+ "methodName": "roadmapList",
75
+ "passed": true,
76
+ "args": {
77
+ "projectPath": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive",
78
+ "limit": 5
79
+ }
80
+ },
81
+ {
82
+ "methodName": "roadmapContext",
83
+ "passed": true,
84
+ "args": {
85
+ "projectPath": "/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive",
86
+ "roadmapId": "ROADMAP-0001"
87
+ }
88
+ }
89
+ ]
90
+ }
@@ -0,0 +1,17 @@
1
+ # MCP Smoke Summary
2
+
3
+ - root: /Users/yinxulai/Documents/Github
4
+ - workspace: /Users/yinxulai/Documents/Github/projitive
5
+ - sandbox: /Users/yinxulai/Documents/Github/projitive-mcp-smoke
6
+
7
+ ## Results
8
+ - PASS | projectInit
9
+ - PASS | projectScan
10
+ - PASS | projectNext
11
+ - PASS | projectLocate
12
+ - PASS | projectContext
13
+ - PASS | taskList
14
+ - PASS | taskNext
15
+ - PASS | taskContext
16
+ - PASS | roadmapList
17
+ - PASS | roadmapContext
@@ -0,0 +1,47 @@
1
+ # taskContext
2
+
3
+ - passed: true
4
+ - args: {"projectPath":"/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive","taskId":"TASK-0001"}
5
+
6
+ ## Output
7
+
8
+ # taskContext
9
+
10
+ ## Summary
11
+ - governanceDir: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
12
+ - taskId: TASK-0001
13
+ - title: Bootstrap governance workspace
14
+ - status: TODO
15
+ - owner: unassigned
16
+ - updatedAt: 2026-02-18T13:18:19.890Z
17
+ - roadmapRefs: ROADMAP-0001
18
+ - taskLocation: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md#L4
19
+ - hookStatus: head=missing, footer=missing
20
+
21
+ ## Evidence
22
+ ### Related Artifacts
23
+ - /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md
24
+
25
+ ### Reference Locations
26
+ - /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md#L4: ## TASK-0001 | TODO | Bootstrap governance workspace
27
+
28
+ ### Hook Paths
29
+ - (none)
30
+
31
+ ### Suggested Read Order
32
+ 1. /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md
33
+
34
+ ## Agent Guidance
35
+ - Read the files in Suggested Read Order.
36
+ - Verify whether current status and evidence are consistent.
37
+ - This task is TODO: confirm scope and set execution plan before edits.
38
+ - Move to IN_PROGRESS only after owner and initial evidence are ready.
39
+ - If updates are needed, edit tasks/designs/reports markdown directly and keep TASK IDs unchanged.
40
+ - After editing, re-run `taskContext` to verify references and context consistency.
41
+
42
+ ## Lint Suggestions
43
+ - [TASK_CONTEXT_HOOK_HEAD_MISSING] Missing /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/hooks/task_get_head.md. Add a task context head hook template if you need standardized preface.
44
+ - [TASK_CONTEXT_HOOK_FOOTER_MISSING] Missing /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/hooks/task_get_footer.md. Add a task context footer hook template for standardized close-out checks.
45
+
46
+ ## Next Call
47
+ - taskContext(projectPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive", taskId="TASK-0001")
@@ -0,0 +1,27 @@
1
+ # taskList
2
+
3
+ - passed: true
4
+ - args: {"projectPath":"/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive","limit":5}
5
+
6
+ ## Output
7
+
8
+ # taskList
9
+
10
+ ## Summary
11
+ - governanceDir: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive
12
+ - tasksPath: /Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive/tasks.md
13
+ - filter.status: (none)
14
+ - returned: 1
15
+
16
+ ## Evidence
17
+ - tasks:
18
+ - TASK-0001 | TODO | Bootstrap governance workspace | owner=unassigned | updatedAt=2026-02-18T13:18:19.890Z
19
+
20
+ ## Agent Guidance
21
+ - Pick one task ID and call `taskContext`.
22
+
23
+ ## Lint Suggestions
24
+ - (none)
25
+
26
+ ## Next Call
27
+ - taskContext(projectPath="/Users/yinxulai/Documents/Github/projitive-mcp-smoke/.projitive", taskId="TASK-0001")