@projitive/mcp 1.0.4 → 1.0.6
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 +4 -4
- package/output/package.json +4 -5
- package/output/source/design-context.js +515 -0
- package/output/source/index.js +50 -41
- package/output/source/projitive.js +8 -9
- package/output/source/roadmap.js +2 -2
- package/output/source/tasks.js +5 -6
- package/package.json +4 -5
- package/output/designs.js +0 -38
- package/output/helpers/artifacts/artifacts.js +0 -10
- package/output/helpers/artifacts/artifacts.test.js +0 -18
- package/output/helpers/artifacts/index.js +0 -1
- package/output/helpers/catch/catch.js +0 -48
- package/output/helpers/catch/catch.test.js +0 -43
- package/output/helpers/catch/index.js +0 -1
- package/output/helpers/files/files.js +0 -62
- package/output/helpers/files/files.test.js +0 -32
- package/output/helpers/files/index.js +0 -1
- package/output/helpers/index.js +0 -6
- package/output/helpers/linter/codes.js +0 -25
- package/output/helpers/linter/index.js +0 -2
- package/output/helpers/linter/linter.js +0 -6
- package/output/helpers/linter/linter.test.js +0 -16
- package/output/helpers/markdown/index.js +0 -1
- package/output/helpers/markdown/markdown.js +0 -33
- package/output/helpers/markdown/markdown.test.js +0 -36
- package/output/helpers/response/index.js +0 -1
- package/output/helpers/response/response.js +0 -73
- package/output/helpers/response/response.test.js +0 -50
- package/output/hooks.js +0 -49
- package/output/hooks.test.js +0 -40
- package/output/index.js +0 -227
- package/output/projitive.js +0 -488
- package/output/projitive.test.js +0 -75
- package/output/prompts.js +0 -87
- package/output/readme.js +0 -26
- package/output/rendering-input-guard.test.js +0 -20
- package/output/reports.js +0 -36
- package/output/resources.js +0 -95
- package/output/roadmap.js +0 -165
- package/output/roadmap.test.js +0 -11
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectContext.md +0 -48
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectInit.md +0 -40
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectLocate.md +0 -22
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectNext.md +0 -31
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/projectScan.md +0 -28
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/roadmapContext.md +0 -33
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/roadmapList.md +0 -25
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/summary.json +0 -90
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/summary.md +0 -17
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskContext.md +0 -47
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskList.md +0 -27
- package/output/smoke-reports/2026-02-18T13-18-19-740Z/taskNext.md +0 -64
- package/output/tasks.js +0 -762
- package/output/tasks.test.js +0 -152
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { describe, expect, it } from "vitest";
|
|
4
|
-
const MODULE_FILES = [
|
|
5
|
-
"tasks.ts",
|
|
6
|
-
"roadmap.ts",
|
|
7
|
-
"projitive.ts",
|
|
8
|
-
];
|
|
9
|
-
const INVALID_LITERAL_PATTERN = /["'`]\s*-\s+(#{1,6}\s|>\s*|```)/g;
|
|
10
|
-
describe("rendering input guard", () => {
|
|
11
|
-
it("does not contain accidental bullet-prefixed markdown literals in module outputs", async () => {
|
|
12
|
-
const sourceDir = path.resolve(import.meta.dirname);
|
|
13
|
-
for (const file of MODULE_FILES) {
|
|
14
|
-
const filePath = path.join(sourceDir, file);
|
|
15
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
16
|
-
const matches = content.match(INVALID_LITERAL_PATTERN) ?? [];
|
|
17
|
-
expect(matches, `invalid literals in ${filePath}`).toHaveLength(0);
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
});
|
package/output/reports.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { isValidRoadmapId } from "./roadmap.js";
|
|
2
|
-
import { isValidTaskId } from "./tasks.js";
|
|
3
|
-
export function parseReportMetadata(markdown) {
|
|
4
|
-
const lines = markdown.split(/\r?\n/);
|
|
5
|
-
const metadata = {};
|
|
6
|
-
for (const line of lines) {
|
|
7
|
-
const [rawKey, ...rawValue] = line.split(":");
|
|
8
|
-
if (!rawKey || rawValue.length === 0) {
|
|
9
|
-
continue;
|
|
10
|
-
}
|
|
11
|
-
const key = rawKey.trim().toLowerCase();
|
|
12
|
-
const value = rawValue.join(":").trim();
|
|
13
|
-
if (key === "task")
|
|
14
|
-
metadata.task = value;
|
|
15
|
-
if (key === "roadmap")
|
|
16
|
-
metadata.roadmap = value;
|
|
17
|
-
if (key === "owner")
|
|
18
|
-
metadata.owner = value;
|
|
19
|
-
if (key === "date")
|
|
20
|
-
metadata.date = value;
|
|
21
|
-
}
|
|
22
|
-
return metadata;
|
|
23
|
-
}
|
|
24
|
-
export function validateReportMetadata(metadata) {
|
|
25
|
-
const errors = [];
|
|
26
|
-
if (!metadata.task) {
|
|
27
|
-
errors.push("Missing Task metadata");
|
|
28
|
-
}
|
|
29
|
-
else if (!isValidTaskId(metadata.task)) {
|
|
30
|
-
errors.push(`Invalid Task metadata format: ${metadata.task}`);
|
|
31
|
-
}
|
|
32
|
-
if (metadata.roadmap && !isValidRoadmapId(metadata.roadmap)) {
|
|
33
|
-
errors.push(`Invalid Roadmap metadata format: ${metadata.roadmap}`);
|
|
34
|
-
}
|
|
35
|
-
return { ok: errors.length === 0, errors };
|
|
36
|
-
}
|
package/output/resources.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
const currentFilePath = fileURLToPath(import.meta.url);
|
|
5
|
-
const sourceDir = path.dirname(currentFilePath);
|
|
6
|
-
const repoRoot = path.resolve(sourceDir, "..", "..", "..");
|
|
7
|
-
function resolveRepoFile(relativePath) {
|
|
8
|
-
return path.join(repoRoot, relativePath);
|
|
9
|
-
}
|
|
10
|
-
async function readMarkdownOrFallback(relativePath, fallbackTitle) {
|
|
11
|
-
const absolutePath = resolveRepoFile(relativePath);
|
|
12
|
-
const content = await fs.readFile(absolutePath, "utf-8").catch(() => undefined);
|
|
13
|
-
if (typeof content === "string" && content.trim().length > 0) {
|
|
14
|
-
return content;
|
|
15
|
-
}
|
|
16
|
-
return [
|
|
17
|
-
`# ${fallbackTitle}`,
|
|
18
|
-
"",
|
|
19
|
-
`- file: ${relativePath}`,
|
|
20
|
-
"- status: missing-or-empty",
|
|
21
|
-
"- next: create this file or ensure it has readable markdown content",
|
|
22
|
-
].join("\n");
|
|
23
|
-
}
|
|
24
|
-
function renderMethodCatalogMarkdown() {
|
|
25
|
-
return [
|
|
26
|
-
"# MCP Method Catalog",
|
|
27
|
-
"",
|
|
28
|
-
"## Core Pattern",
|
|
29
|
-
"- Prefer List/Context for primary discovery/detail flows.",
|
|
30
|
-
"- Use Next/Scan/Locate for acceleration and bootstrapping.",
|
|
31
|
-
"",
|
|
32
|
-
"## Methods",
|
|
33
|
-
"| Group | Method | Role |",
|
|
34
|
-
"|---|---|---|",
|
|
35
|
-
"| Project | projectScan | discover governance projects by marker |",
|
|
36
|
-
"| Project | projectNext | rank actionable projects |",
|
|
37
|
-
"| Project | projectLocate | resolve nearest governance root |",
|
|
38
|
-
"| Project | projectContext | summarize project governance context |",
|
|
39
|
-
"| Task | taskList | list tasks with optional filters |",
|
|
40
|
-
"| Task | taskNext | select top actionable task |",
|
|
41
|
-
"| Task | taskContext | inspect one task with references |",
|
|
42
|
-
"| Roadmap | roadmapList | list roadmap IDs and linked tasks |",
|
|
43
|
-
"| Roadmap | roadmapContext | inspect one roadmap with references |",
|
|
44
|
-
].join("\n");
|
|
45
|
-
}
|
|
46
|
-
export function registerGovernanceResources(server) {
|
|
47
|
-
server.registerResource("governanceWorkspace", "projitive://governance/workspace", {
|
|
48
|
-
title: "Governance Workspace",
|
|
49
|
-
description: "Primary governance README under .projitive",
|
|
50
|
-
mimeType: "text/markdown",
|
|
51
|
-
}, async () => ({
|
|
52
|
-
contents: [
|
|
53
|
-
{
|
|
54
|
-
uri: "projitive://governance/workspace",
|
|
55
|
-
text: await readMarkdownOrFallback(".projitive/README.md", "Governance Workspace"),
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
}));
|
|
59
|
-
server.registerResource("governanceTasks", "projitive://governance/tasks", {
|
|
60
|
-
title: "Governance Tasks",
|
|
61
|
-
description: "Current task pool and status under .projitive/tasks.md",
|
|
62
|
-
mimeType: "text/markdown",
|
|
63
|
-
}, async () => ({
|
|
64
|
-
contents: [
|
|
65
|
-
{
|
|
66
|
-
uri: "projitive://governance/tasks",
|
|
67
|
-
text: await readMarkdownOrFallback(".projitive/tasks.md", "Governance Tasks"),
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
}));
|
|
71
|
-
server.registerResource("governanceRoadmap", "projitive://governance/roadmap", {
|
|
72
|
-
title: "Governance Roadmap",
|
|
73
|
-
description: "Current roadmap under .projitive/roadmap.md",
|
|
74
|
-
mimeType: "text/markdown",
|
|
75
|
-
}, async () => ({
|
|
76
|
-
contents: [
|
|
77
|
-
{
|
|
78
|
-
uri: "projitive://governance/roadmap",
|
|
79
|
-
text: await readMarkdownOrFallback(".projitive/roadmap.md", "Governance Roadmap"),
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
}));
|
|
83
|
-
server.registerResource("mcpMethodCatalog", "projitive://mcp/method-catalog", {
|
|
84
|
-
title: "MCP Method Catalog",
|
|
85
|
-
description: "Method naming and purpose map for agent routing",
|
|
86
|
-
mimeType: "text/markdown",
|
|
87
|
-
}, async () => ({
|
|
88
|
-
contents: [
|
|
89
|
-
{
|
|
90
|
-
uri: "projitive://mcp/method-catalog",
|
|
91
|
-
text: renderMethodCatalogMarkdown(),
|
|
92
|
-
},
|
|
93
|
-
],
|
|
94
|
-
}));
|
|
95
|
-
}
|
package/output/roadmap.js
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
import { candidateFilesFromArtifacts } from "./helpers/artifacts/index.js";
|
|
5
|
-
import { discoverGovernanceArtifacts } from "./helpers/files/index.js";
|
|
6
|
-
import { ROADMAP_LINT_CODES, renderLintSuggestions } from "./helpers/linter/index.js";
|
|
7
|
-
import { findTextReferences } from "./helpers/markdown/index.js";
|
|
8
|
-
import { asText, evidenceSection, guidanceSection, lintSection, nextCallSection, renderErrorMarkdown, renderToolResponseMarkdown, summarySection, } from "./helpers/response/index.js";
|
|
9
|
-
import { resolveGovernanceDir } from "./projitive.js";
|
|
10
|
-
import { loadTasks } from "./tasks.js";
|
|
11
|
-
export const ROADMAP_ID_REGEX = /^ROADMAP-\d{4}$/;
|
|
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;
|
|
55
|
-
}
|
|
56
|
-
export function collectRoadmapLintSuggestions(roadmapIds, tasks) {
|
|
57
|
-
return renderLintSuggestions(collectRoadmapLintSuggestionItems(roadmapIds, tasks));
|
|
58
|
-
}
|
|
59
|
-
export function isValidRoadmapId(id) {
|
|
60
|
-
return ROADMAP_ID_REGEX.test(id);
|
|
61
|
-
}
|
|
62
|
-
async function readRoadmapIds(governanceDir) {
|
|
63
|
-
const roadmapPath = path.join(governanceDir, "roadmap.md");
|
|
64
|
-
try {
|
|
65
|
-
const markdown = await fs.readFile(roadmapPath, "utf-8");
|
|
66
|
-
const matches = markdown.match(/ROADMAP-\d{4}/g) ?? [];
|
|
67
|
-
return Array.from(new Set(matches));
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
export function registerRoadmapTools(server) {
|
|
74
|
-
server.registerTool("roadmapList", {
|
|
75
|
-
title: "Roadmap List",
|
|
76
|
-
description: "List roadmap IDs and related tasks for project planning",
|
|
77
|
-
inputSchema: {
|
|
78
|
-
projectPath: z.string(),
|
|
79
|
-
},
|
|
80
|
-
}, async ({ projectPath }) => {
|
|
81
|
-
const governanceDir = await resolveGovernanceDir(projectPath);
|
|
82
|
-
const roadmapIds = await readRoadmapIds(governanceDir);
|
|
83
|
-
const { tasks } = await loadTasks(governanceDir);
|
|
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
|
-
});
|
|
106
|
-
return asText(markdown);
|
|
107
|
-
});
|
|
108
|
-
server.registerTool("roadmapContext", {
|
|
109
|
-
title: "Roadmap Context",
|
|
110
|
-
description: "Get one roadmap with related tasks, references, and execution context",
|
|
111
|
-
inputSchema: {
|
|
112
|
-
projectPath: z.string(),
|
|
113
|
-
roadmapId: z.string(),
|
|
114
|
-
},
|
|
115
|
-
}, async ({ projectPath, roadmapId }) => {
|
|
116
|
-
if (!isValidRoadmapId(roadmapId)) {
|
|
117
|
-
return {
|
|
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\")`)),
|
|
119
|
-
isError: true,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
const governanceDir = await resolveGovernanceDir(projectPath);
|
|
123
|
-
const artifacts = await discoverGovernanceArtifacts(governanceDir);
|
|
124
|
-
const fileCandidates = candidateFilesFromArtifacts(artifacts);
|
|
125
|
-
const referenceLocations = (await Promise.all(fileCandidates.map((file) => findTextReferences(file, roadmapId)))).flat();
|
|
126
|
-
const { tasks } = await loadTasks(governanceDir);
|
|
127
|
-
const relatedTasks = tasks.filter((task) => task.roadmapRefs.includes(roadmapId));
|
|
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
|
-
});
|
|
163
|
-
return asText(markdown);
|
|
164
|
-
});
|
|
165
|
-
}
|
package/output/roadmap.test.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
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
|
-
});
|
|
@@ -1,48 +0,0 @@
|
|
|
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")
|
|
@@ -1,40 +0,0 @@
|
|
|
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")
|
|
@@ -1,22 +0,0 @@
|
|
|
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")
|
|
@@ -1,31 +0,0 @@
|
|
|
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")
|
|
@@ -1,28 +0,0 @@
|
|
|
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")
|
|
@@ -1,33 +0,0 @@
|
|
|
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")
|
|
@@ -1,25 +0,0 @@
|
|
|
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")
|
|
@@ -1,90 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
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
|