@projitive/mcp 1.0.1 → 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.
- package/README.md +1 -1
- package/output/helpers/artifacts/artifacts.js +10 -0
- package/output/helpers/artifacts/artifacts.test.js +18 -0
- package/output/helpers/artifacts/index.js +1 -0
- package/output/helpers/index.js +3 -0
- package/output/helpers/linter/codes.js +25 -0
- package/output/helpers/linter/index.js +2 -0
- package/output/helpers/linter/linter.js +6 -0
- package/output/helpers/linter/linter.test.js +16 -0
- package/output/helpers/response/index.js +1 -0
- package/output/helpers/response/response.js +73 -0
- package/output/helpers/response/response.test.js +50 -0
- package/output/projitive.js +137 -122
- package/output/rendering-input-guard.test.js +20 -0
- package/output/roadmap.js +106 -80
- package/output/roadmap.test.js +11 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectContext.md +48 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectInit.md +40 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectLocate.md +22 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectNext.md +31 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectScan.md +28 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/roadmapContext.md +33 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/roadmapList.md +25 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/summary.json +90 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/summary.md +17 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskContext.md +47 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskList.md +27 -0
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskNext.md +64 -0
- package/output/tasks.js +341 -162
- package/output/tasks.test.js +51 -1
- 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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
29
|
-
return
|
|
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
|
|
64
|
-
|
|
65
|
-
"",
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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}`, ["
|
|
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
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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")
|