@nowline/mcp 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capabilities.d.ts +9 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +17 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/generated/resources.d.ts +2 -0
- package/dist/generated/resources.d.ts.map +1 -1
- package/dist/generated/resources.js +6 -1
- package/dist/generated/resources.js.map +1 -1
- package/dist/generated/ui-bundle.d.ts +3 -0
- package/dist/generated/ui-bundle.d.ts.map +1 -0
- package/dist/generated/ui-bundle.js +10 -0
- package/dist/generated/ui-bundle.js.map +1 -0
- package/dist/index.js +63 -12
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +143 -0
- package/dist/prompts.js.map +1 -0
- package/dist/schemas.d.ts +96 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +65 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +304 -41
- package/dist/server.js.map +1 -1
- package/dist/ui/entry.d.ts +2 -0
- package/dist/ui/entry.d.ts.map +1 -0
- package/dist/ui/entry.js +149 -0
- package/dist/ui/entry.js.map +1 -0
- package/package.json +11 -6
- package/src/capabilities.ts +25 -0
- package/src/generated/resources.ts +7 -1
- package/src/generated/ui-bundle.ts +10 -0
- package/src/index.ts +75 -13
- package/src/prompts.ts +172 -0
- package/src/schemas.ts +79 -0
- package/src/server.ts +406 -39
- package/src/ui/entry.ts +169 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-bundle.js","sourceRoot":"","sources":["../../src/generated/ui-bundle.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,qEAAqE;AACrE,8CAA8C;AAC9C,EAAE;AACF,sEAAsE;AACtE,wEAAwE;AAExE,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAW,295rBAA295rB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,25 +1,53 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// @nowline/mcp — entry point for `npx @nowline/mcp`.
|
|
3
3
|
//
|
|
4
|
-
// Parses
|
|
5
|
-
//
|
|
6
|
-
//
|
|
4
|
+
// Parses --root, --port, and --version flags, creates the MCP server, and
|
|
5
|
+
// connects it to the appropriate transport:
|
|
6
|
+
// stdio (default) standard MCP stdio transport
|
|
7
|
+
// http (--port <N>) Streamable HTTP transport on localhost:<N>
|
|
7
8
|
//
|
|
8
9
|
// Usage:
|
|
9
|
-
// npx @nowline/mcp [--root <path>] [--version]
|
|
10
|
+
// npx @nowline/mcp [--root <path>] [--port <N>] [--version]
|
|
10
11
|
//
|
|
11
|
-
// Spec: specs/mcp.md.
|
|
12
|
+
// Spec: specs/mcp.md.
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
import { createServer } from 'node:http';
|
|
15
|
+
import { dirname, resolve } from 'node:path';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
12
17
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
18
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
13
19
|
import { createMcpServer } from './server.js';
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
const __dirname = dirname(__filename);
|
|
22
|
+
function readPkgVersion() {
|
|
23
|
+
try {
|
|
24
|
+
const raw = readFileSync(resolve(__dirname, '../package.json'), 'utf-8');
|
|
25
|
+
const pkg = JSON.parse(raw);
|
|
26
|
+
return pkg.version ?? '0.0.0';
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return '0.0.0';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const PKG_VERSION = readPkgVersion();
|
|
14
33
|
function parseArgs(argv) {
|
|
15
34
|
const args = argv.slice(2);
|
|
16
35
|
let root;
|
|
36
|
+
let port;
|
|
17
37
|
let help = false;
|
|
18
38
|
let version = false;
|
|
19
39
|
for (let i = 0; i < args.length; i++) {
|
|
20
40
|
if (args[i] === '--root' && i + 1 < args.length) {
|
|
21
41
|
root = args[++i];
|
|
22
42
|
}
|
|
43
|
+
else if (args[i] === '--port' && i + 1 < args.length) {
|
|
44
|
+
const n = parseInt(args[++i], 10);
|
|
45
|
+
if (!Number.isFinite(n) || n < 1 || n > 65535) {
|
|
46
|
+
process.stderr.write(`nowline-mcp: --port must be a number between 1 and 65535\n`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
port = n;
|
|
50
|
+
}
|
|
23
51
|
else if (args[i] === '-h' || args[i] === '--help') {
|
|
24
52
|
help = true;
|
|
25
53
|
}
|
|
@@ -27,28 +55,51 @@ function parseArgs(argv) {
|
|
|
27
55
|
version = true;
|
|
28
56
|
}
|
|
29
57
|
}
|
|
30
|
-
return { root, help, version };
|
|
58
|
+
return { root, port, help, version };
|
|
31
59
|
}
|
|
32
|
-
const { root, help, version } = parseArgs(process.argv);
|
|
60
|
+
const { root, port, help, version } = parseArgs(process.argv);
|
|
33
61
|
if (version) {
|
|
34
|
-
process.stdout.write(
|
|
62
|
+
process.stdout.write(`${PKG_VERSION}\n`);
|
|
35
63
|
process.exit(0);
|
|
36
64
|
}
|
|
37
65
|
if (help) {
|
|
38
66
|
process.stdout.write([
|
|
39
67
|
'Usage: npx @nowline/mcp [options]',
|
|
40
68
|
'',
|
|
41
|
-
'Start the Nowline MCP server
|
|
69
|
+
'Start the Nowline MCP server.',
|
|
42
70
|
'',
|
|
43
71
|
'Options:',
|
|
44
72
|
' --root <path> Allowed root for file operations. Defaults to cwd.',
|
|
73
|
+
' --port <N> Listen on localhost:<N> using Streamable HTTP transport.',
|
|
74
|
+
' When omitted, uses stdio transport (default).',
|
|
45
75
|
' --version, -v Print version and exit.',
|
|
46
76
|
' --help, -h Show this help.',
|
|
47
77
|
'',
|
|
48
78
|
].join('\n'));
|
|
49
79
|
process.exit(0);
|
|
50
80
|
}
|
|
51
|
-
const server = createMcpServer({ allowedRoot: root });
|
|
52
|
-
|
|
53
|
-
|
|
81
|
+
const server = createMcpServer({ allowedRoot: root, version: PKG_VERSION });
|
|
82
|
+
if (port !== undefined) {
|
|
83
|
+
// Streamable HTTP transport — stateless (no session management).
|
|
84
|
+
const transport = new StreamableHTTPServerTransport({
|
|
85
|
+
sessionIdGenerator: undefined,
|
|
86
|
+
});
|
|
87
|
+
await server.connect(transport);
|
|
88
|
+
const httpServer = createServer(async (req, res) => {
|
|
89
|
+
await transport.handleRequest(req, res);
|
|
90
|
+
});
|
|
91
|
+
httpServer.listen(port, '127.0.0.1', () => {
|
|
92
|
+
process.stderr.write(`nowline-mcp: Streamable HTTP listening on http://127.0.0.1:${port}\n`);
|
|
93
|
+
});
|
|
94
|
+
await new Promise((resolve) => {
|
|
95
|
+
httpServer.on('close', resolve);
|
|
96
|
+
process.on('SIGINT', () => httpServer.close());
|
|
97
|
+
process.on('SIGTERM', () => httpServer.close());
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Default: stdio transport.
|
|
102
|
+
const transport = new StdioServerTransport();
|
|
103
|
+
await server.connect(transport);
|
|
104
|
+
}
|
|
54
105
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,qDAAqD;AACrD,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqKvD"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// MCP prompt registrations for @nowline/mcp.
|
|
2
|
+
// Wired into the server via registerPrompts(server).
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export function registerPrompts(server) {
|
|
5
|
+
// ---- create-roadmap ----------------------------------------------------
|
|
6
|
+
server.registerPrompt('create-roadmap', {
|
|
7
|
+
description: 'Generate a new .nowline roadmap from a plain-English description. Composes the DSL reference and example files so the LLM has full context.',
|
|
8
|
+
argsSchema: {
|
|
9
|
+
description: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe('Plain-English description of the roadmap you want to create (teams, timeline, key milestones, etc.).'),
|
|
12
|
+
},
|
|
13
|
+
}, ({ description }) => ({
|
|
14
|
+
messages: [
|
|
15
|
+
{
|
|
16
|
+
role: 'user',
|
|
17
|
+
content: {
|
|
18
|
+
type: 'resource',
|
|
19
|
+
resource: {
|
|
20
|
+
uri: 'nowline://reference',
|
|
21
|
+
mimeType: 'text/plain',
|
|
22
|
+
text: '',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
role: 'user',
|
|
28
|
+
content: {
|
|
29
|
+
type: 'resource',
|
|
30
|
+
resource: {
|
|
31
|
+
uri: 'nowline://examples',
|
|
32
|
+
mimeType: 'text/plain',
|
|
33
|
+
text: '',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
role: 'user',
|
|
39
|
+
content: {
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: `Using the Nowline DSL reference and examples above, generate a complete, valid .nowline roadmap file for the following description:\n\n${description}\n\nReturn only the .nowline source text with no additional explanation.`,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
}));
|
|
46
|
+
// ---- fix-diagnostics ----------------------------------------------------
|
|
47
|
+
server.registerPrompt('fix-diagnostics', {
|
|
48
|
+
description: 'Fix validation errors in a .nowline file. Describe the validate→fix→re-validate loop keyed on NL.E#### diagnostic codes.',
|
|
49
|
+
argsSchema: {
|
|
50
|
+
source: z
|
|
51
|
+
.string()
|
|
52
|
+
.describe('The .nowline source text that contains validation errors.'),
|
|
53
|
+
diagnostics: z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('JSON array of diagnostic objects from the validate tool. Omit to let the LLM call validate itself.'),
|
|
57
|
+
},
|
|
58
|
+
}, ({ source, diagnostics }) => {
|
|
59
|
+
const diagSection = diagnostics
|
|
60
|
+
? `\n\nDiagnostics (JSON):\n\`\`\`json\n${diagnostics}\n\`\`\``
|
|
61
|
+
: '\n\nFirst call the `validate` tool on the source to get the current diagnostics.';
|
|
62
|
+
return {
|
|
63
|
+
messages: [
|
|
64
|
+
{
|
|
65
|
+
role: 'user',
|
|
66
|
+
content: {
|
|
67
|
+
type: 'resource',
|
|
68
|
+
resource: {
|
|
69
|
+
uri: 'nowline://reference',
|
|
70
|
+
mimeType: 'text/plain',
|
|
71
|
+
text: '',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
role: 'user',
|
|
77
|
+
content: {
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: `Fix all validation errors in the following .nowline source. Each diagnostic code (NL.E####) identifies the exact rule violation — consult the DSL reference above to understand the rule and apply the correct fix. After fixing, call the \`validate\` tool to confirm there are no remaining errors.${diagSection}\n\nSource:\n\`\`\`nowline\n${source}\n\`\`\`\n\nReturn the corrected .nowline source text.`,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
// ---- convert-to-nowline -------------------------------------------------
|
|
86
|
+
server.registerPrompt('convert-to-nowline', {
|
|
87
|
+
description: 'Convert a gantt/timeline from another format (Mermaid gantt, MS Project, Excel, Google Sheets, CSV) into Nowline DSL. Uses the conversion guide resource for format-specific rules.',
|
|
88
|
+
argsSchema: {
|
|
89
|
+
source: z
|
|
90
|
+
.string()
|
|
91
|
+
.describe('The source content to convert (paste the raw text/CSV/XML here).'),
|
|
92
|
+
from: z
|
|
93
|
+
.enum([
|
|
94
|
+
'mermaid-gantt',
|
|
95
|
+
'ms-project',
|
|
96
|
+
'xlsx',
|
|
97
|
+
'gsheets-timeline',
|
|
98
|
+
'csv',
|
|
99
|
+
'auto',
|
|
100
|
+
])
|
|
101
|
+
.optional()
|
|
102
|
+
.describe('Source format hint. Use "auto" (default) to let the LLM detect the format.'),
|
|
103
|
+
},
|
|
104
|
+
}, ({ source, from }) => {
|
|
105
|
+
const formatHint = from && from !== 'auto'
|
|
106
|
+
? `The source format is: **${from}**.`
|
|
107
|
+
: 'Detect the source format automatically from the content.';
|
|
108
|
+
return {
|
|
109
|
+
messages: [
|
|
110
|
+
{
|
|
111
|
+
role: 'user',
|
|
112
|
+
content: {
|
|
113
|
+
type: 'resource',
|
|
114
|
+
resource: {
|
|
115
|
+
uri: 'nowline://conversions',
|
|
116
|
+
mimeType: 'text/plain',
|
|
117
|
+
text: '',
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
role: 'user',
|
|
123
|
+
content: {
|
|
124
|
+
type: 'resource',
|
|
125
|
+
resource: {
|
|
126
|
+
uri: 'nowline://reference',
|
|
127
|
+
mimeType: 'text/plain',
|
|
128
|
+
text: '',
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
role: 'user',
|
|
134
|
+
content: {
|
|
135
|
+
type: 'text',
|
|
136
|
+
text: `Using the conversion guide and the Nowline DSL reference above, convert the following source content into a valid .nowline roadmap.\n\n${formatHint}\n\nSource content:\n\`\`\`\n${source}\n\`\`\`\n\nReturn only the .nowline source text. After generating it, call the \`validate\` tool to confirm there are no errors.`,
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const DiagnosticSchema: z.ZodObject<{
|
|
3
|
+
file: z.ZodString;
|
|
4
|
+
line: z.ZodNumber;
|
|
5
|
+
column: z.ZodNumber;
|
|
6
|
+
severity: z.ZodEnum<{
|
|
7
|
+
error: "error";
|
|
8
|
+
warning: "warning";
|
|
9
|
+
}>;
|
|
10
|
+
code: z.ZodString;
|
|
11
|
+
message: z.ZodString;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export declare const ValidateOutputSchema: z.ZodObject<{
|
|
14
|
+
ok: z.ZodBoolean;
|
|
15
|
+
diagnostics: z.ZodArray<z.ZodObject<{
|
|
16
|
+
file: z.ZodString;
|
|
17
|
+
line: z.ZodNumber;
|
|
18
|
+
column: z.ZodNumber;
|
|
19
|
+
severity: z.ZodEnum<{
|
|
20
|
+
error: "error";
|
|
21
|
+
warning: "warning";
|
|
22
|
+
}>;
|
|
23
|
+
code: z.ZodString;
|
|
24
|
+
message: z.ZodString;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
export declare const ReadOutputSchema: z.ZodObject<{
|
|
28
|
+
path: z.ZodString;
|
|
29
|
+
source: z.ZodString;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export declare const CreateOutputSchema: z.ZodObject<{
|
|
32
|
+
ok: z.ZodBoolean;
|
|
33
|
+
path: z.ZodString;
|
|
34
|
+
diagnostics: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
35
|
+
file: z.ZodString;
|
|
36
|
+
line: z.ZodNumber;
|
|
37
|
+
column: z.ZodNumber;
|
|
38
|
+
severity: z.ZodEnum<{
|
|
39
|
+
error: "error";
|
|
40
|
+
warning: "warning";
|
|
41
|
+
}>;
|
|
42
|
+
code: z.ZodString;
|
|
43
|
+
message: z.ZodString;
|
|
44
|
+
}, z.core.$strip>>>;
|
|
45
|
+
}, z.core.$strip>;
|
|
46
|
+
export declare const UpdateOutputSchema: z.ZodObject<{
|
|
47
|
+
ok: z.ZodBoolean;
|
|
48
|
+
path: z.ZodString;
|
|
49
|
+
diagnostics: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
50
|
+
file: z.ZodString;
|
|
51
|
+
line: z.ZodNumber;
|
|
52
|
+
column: z.ZodNumber;
|
|
53
|
+
severity: z.ZodEnum<{
|
|
54
|
+
error: "error";
|
|
55
|
+
warning: "warning";
|
|
56
|
+
}>;
|
|
57
|
+
code: z.ZodString;
|
|
58
|
+
message: z.ZodString;
|
|
59
|
+
}, z.core.$strip>>>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
export declare const DeleteOutputSchema: z.ZodObject<{
|
|
62
|
+
path: z.ZodString;
|
|
63
|
+
}, z.core.$strip>;
|
|
64
|
+
export declare const ListOutputSchema: z.ZodObject<{
|
|
65
|
+
paths: z.ZodArray<z.ZodString>;
|
|
66
|
+
}, z.core.$strip>;
|
|
67
|
+
export declare const RenderOutputSchema: z.ZodObject<{
|
|
68
|
+
format: z.ZodString;
|
|
69
|
+
path: z.ZodOptional<z.ZodString>;
|
|
70
|
+
bytes: z.ZodOptional<z.ZodNumber>;
|
|
71
|
+
shareUrl: z.ZodOptional<z.ZodString>;
|
|
72
|
+
}, z.core.$strip>;
|
|
73
|
+
export declare const ExportOutputSchema: z.ZodObject<{
|
|
74
|
+
format: z.ZodString;
|
|
75
|
+
path: z.ZodOptional<z.ZodString>;
|
|
76
|
+
bytes: z.ZodOptional<z.ZodNumber>;
|
|
77
|
+
shareUrl: z.ZodOptional<z.ZodString>;
|
|
78
|
+
}, z.core.$strip>;
|
|
79
|
+
export declare const ConvertOutputSchema: z.ZodObject<{
|
|
80
|
+
to: z.ZodEnum<{
|
|
81
|
+
json: "json";
|
|
82
|
+
nowline: "nowline";
|
|
83
|
+
}>;
|
|
84
|
+
result: z.ZodString;
|
|
85
|
+
}, z.core.$strip>;
|
|
86
|
+
export declare const CapabilitiesOutputSchema: z.ZodObject<{
|
|
87
|
+
themes: z.ZodArray<z.ZodString>;
|
|
88
|
+
icons: z.ZodArray<z.ZodString>;
|
|
89
|
+
locales: z.ZodArray<z.ZodString>;
|
|
90
|
+
formats: z.ZodArray<z.ZodString>;
|
|
91
|
+
templates: z.ZodArray<z.ZodString>;
|
|
92
|
+
}, z.core.$strip>;
|
|
93
|
+
export declare const ListItemsOutputSchema: z.ZodObject<{
|
|
94
|
+
items: z.ZodArray<z.ZodString>;
|
|
95
|
+
}, z.core.$strip>;
|
|
96
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;iBAO3B,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAG/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;iBAE3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;iBAM7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC"}
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Shared Zod output schemas for @nowline/mcp tools.
|
|
2
|
+
// Each tool's outputSchema is defined here so server.ts stays readable.
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
// ---- Shared building blocks ------------------------------------------------
|
|
5
|
+
export const DiagnosticSchema = z.object({
|
|
6
|
+
file: z.string(),
|
|
7
|
+
line: z.number(),
|
|
8
|
+
column: z.number(),
|
|
9
|
+
severity: z.enum(['error', 'warning']),
|
|
10
|
+
code: z.string(),
|
|
11
|
+
message: z.string(),
|
|
12
|
+
});
|
|
13
|
+
// ---- Tool output schemas ---------------------------------------------------
|
|
14
|
+
export const ValidateOutputSchema = z.object({
|
|
15
|
+
ok: z.boolean(),
|
|
16
|
+
diagnostics: z.array(DiagnosticSchema),
|
|
17
|
+
});
|
|
18
|
+
export const ReadOutputSchema = z.object({
|
|
19
|
+
path: z.string(),
|
|
20
|
+
source: z.string(),
|
|
21
|
+
});
|
|
22
|
+
export const CreateOutputSchema = z.object({
|
|
23
|
+
ok: z.boolean(),
|
|
24
|
+
path: z.string(),
|
|
25
|
+
diagnostics: z.array(DiagnosticSchema).optional(),
|
|
26
|
+
});
|
|
27
|
+
export const UpdateOutputSchema = z.object({
|
|
28
|
+
ok: z.boolean(),
|
|
29
|
+
path: z.string(),
|
|
30
|
+
diagnostics: z.array(DiagnosticSchema).optional(),
|
|
31
|
+
});
|
|
32
|
+
export const DeleteOutputSchema = z.object({
|
|
33
|
+
path: z.string(),
|
|
34
|
+
});
|
|
35
|
+
export const ListOutputSchema = z.object({
|
|
36
|
+
paths: z.array(z.string()),
|
|
37
|
+
});
|
|
38
|
+
export const RenderOutputSchema = z.object({
|
|
39
|
+
format: z.string(),
|
|
40
|
+
/** Set when the output was written to disk. */
|
|
41
|
+
path: z.string().optional(),
|
|
42
|
+
bytes: z.number().optional(),
|
|
43
|
+
shareUrl: z.string().optional(),
|
|
44
|
+
});
|
|
45
|
+
export const ExportOutputSchema = z.object({
|
|
46
|
+
format: z.string(),
|
|
47
|
+
path: z.string().optional(),
|
|
48
|
+
bytes: z.number().optional(),
|
|
49
|
+
shareUrl: z.string().optional(),
|
|
50
|
+
});
|
|
51
|
+
export const ConvertOutputSchema = z.object({
|
|
52
|
+
to: z.enum(['json', 'nowline']),
|
|
53
|
+
result: z.string(),
|
|
54
|
+
});
|
|
55
|
+
export const CapabilitiesOutputSchema = z.object({
|
|
56
|
+
themes: z.array(z.string()),
|
|
57
|
+
icons: z.array(z.string()),
|
|
58
|
+
locales: z.array(z.string()),
|
|
59
|
+
formats: z.array(z.string()),
|
|
60
|
+
templates: z.array(z.string()),
|
|
61
|
+
});
|
|
62
|
+
export const ListItemsOutputSchema = z.object({
|
|
63
|
+
items: z.array(z.string()),
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8OpE,MAAM,WAAW,gBAAgB;IAC7B,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,SAAS,CAoqBtE"}
|