decocms 0.16.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/README.md +95 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +373 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add/add.d.ts +7 -0
- package/dist/commands/add/add.d.ts.map +1 -0
- package/dist/commands/add/add.js +90 -0
- package/dist/commands/add/add.js.map +1 -0
- package/dist/commands/auth/login.d.ts +2 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +125 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/whoami.d.ts +2 -0
- package/dist/commands/auth/whoami.d.ts.map +1 -0
- package/dist/commands/auth/whoami.js +51 -0
- package/dist/commands/auth/whoami.js.map +1 -0
- package/dist/commands/config/configure.d.ts +2 -0
- package/dist/commands/config/configure.d.ts.map +1 -0
- package/dist/commands/config/configure.js +51 -0
- package/dist/commands/config/configure.js.map +1 -0
- package/dist/commands/create/create.d.ts +3 -0
- package/dist/commands/create/create.d.ts.map +1 -0
- package/dist/commands/create/create.js +238 -0
- package/dist/commands/create/create.js.map +1 -0
- package/dist/commands/dev/dev.d.ts +8 -0
- package/dist/commands/dev/dev.d.ts.map +1 -0
- package/dist/commands/dev/dev.js +64 -0
- package/dist/commands/dev/dev.js.map +1 -0
- package/dist/commands/dev/link.d.ts +8 -0
- package/dist/commands/dev/link.d.ts.map +1 -0
- package/dist/commands/dev/link.js +124 -0
- package/dist/commands/dev/link.js.map +1 -0
- package/dist/commands/gen/gen.d.ts +11 -0
- package/dist/commands/gen/gen.d.ts.map +1 -0
- package/dist/commands/gen/gen.js +341 -0
- package/dist/commands/gen/gen.js.map +1 -0
- package/dist/commands/hosting/deploy.d.ts +19 -0
- package/dist/commands/hosting/deploy.d.ts.map +1 -0
- package/dist/commands/hosting/deploy.js +194 -0
- package/dist/commands/hosting/deploy.js.map +1 -0
- package/dist/commands/hosting/list.d.ts +6 -0
- package/dist/commands/hosting/list.d.ts.map +1 -0
- package/dist/commands/hosting/list.js +26 -0
- package/dist/commands/hosting/list.js.map +1 -0
- package/dist/commands/hosting/promote.d.ts +11 -0
- package/dist/commands/hosting/promote.d.ts.map +1 -0
- package/dist/commands/hosting/promote.js +153 -0
- package/dist/commands/hosting/promote.js.map +1 -0
- package/dist/commands/update/update.d.ts +4 -0
- package/dist/commands/update/update.d.ts.map +1 -0
- package/dist/commands/update/update.js +242 -0
- package/dist/commands/update/update.js.map +1 -0
- package/dist/commands/update/upgrade.d.ts +4 -0
- package/dist/commands/update/upgrade.d.ts.map +1 -0
- package/dist/commands/update/upgrade.js +157 -0
- package/dist/commands/update/upgrade.js.map +1 -0
- package/dist/lib/config.d.ts +309 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +262 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +10 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +16 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/fs.d.ts +40 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +162 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/mcp.d.ts +34 -0
- package/dist/lib/mcp.d.ts.map +1 -0
- package/dist/lib/mcp.js +19 -0
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/parse-binding-tool.d.ts +12 -0
- package/dist/lib/parse-binding-tool.d.ts.map +1 -0
- package/dist/lib/parse-binding-tool.js +15 -0
- package/dist/lib/parse-binding-tool.js.map +1 -0
- package/dist/lib/prompt-ide-setup.d.ts +27 -0
- package/dist/lib/prompt-ide-setup.d.ts.map +1 -0
- package/dist/lib/prompt-ide-setup.js +158 -0
- package/dist/lib/prompt-ide-setup.js.map +1 -0
- package/dist/lib/prompt-integrations.d.ts +7 -0
- package/dist/lib/prompt-integrations.d.ts.map +1 -0
- package/dist/lib/prompt-integrations.js +84 -0
- package/dist/lib/prompt-integrations.js.map +1 -0
- package/dist/lib/prompt-workspace.d.ts +2 -0
- package/dist/lib/prompt-workspace.d.ts.map +1 -0
- package/dist/lib/prompt-workspace.js +93 -0
- package/dist/lib/prompt-workspace.js.map +1 -0
- package/dist/lib/runtime.d.ts +5 -0
- package/dist/lib/runtime.d.ts.map +1 -0
- package/dist/lib/runtime.js +15 -0
- package/dist/lib/runtime.js.map +1 -0
- package/dist/lib/session.d.ts +39 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +124 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/slugify.d.ts +13 -0
- package/dist/lib/slugify.d.ts.map +1 -0
- package/dist/lib/slugify.js +27 -0
- package/dist/lib/slugify.js.map +1 -0
- package/dist/lib/supabase.d.ts +5 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +19 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/lib/wrangler.d.ts +9 -0
- package/dist/lib/wrangler.d.ts.map +1 -0
- package/dist/lib/wrangler.js +118 -0
- package/dist/lib/wrangler.js.map +1 -0
- package/dist/rules/deco-chat.mdc +902 -0
- package/package.json +79 -0
package/dist/lib/fs.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { promises as fs } from "fs";
|
|
2
|
+
import { dirname, join, relative } from "path";
|
|
3
|
+
import { createReadStream, createWriteStream } from "fs";
|
|
4
|
+
import { pipeline } from "stream/promises";
|
|
5
|
+
/**
|
|
6
|
+
* Ensure that a directory exists, creating it if necessary (recursive)
|
|
7
|
+
* Node.js equivalent of Deno's ensureDir
|
|
8
|
+
*/
|
|
9
|
+
export async function ensureDir(dirPath) {
|
|
10
|
+
try {
|
|
11
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
// If directory already exists, that's fine
|
|
15
|
+
if (error.code !== "EEXIST") {
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Copy a file from source to destination, creating directories as needed
|
|
22
|
+
*/
|
|
23
|
+
async function copyFile(src, dest) {
|
|
24
|
+
await ensureDir(dirname(dest));
|
|
25
|
+
await pipeline(createReadStream(src), createWriteStream(dest));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Copy a directory recursively from source to destination
|
|
29
|
+
*/
|
|
30
|
+
async function copyDir(src, dest, options = {}) {
|
|
31
|
+
await ensureDir(dest);
|
|
32
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
const srcPath = join(src, entry.name);
|
|
35
|
+
const destPath = join(dest, entry.name);
|
|
36
|
+
if (entry.isDirectory()) {
|
|
37
|
+
await copyDir(srcPath, destPath, options);
|
|
38
|
+
}
|
|
39
|
+
else if (entry.isFile()) {
|
|
40
|
+
if (!options.overwrite) {
|
|
41
|
+
try {
|
|
42
|
+
await fs.access(destPath);
|
|
43
|
+
continue; // File exists and overwrite is false, skip
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// File doesn't exist, proceed with copy
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
await copyFile(srcPath, destPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Copy a file or directory from source to destination
|
|
55
|
+
* Node.js equivalent of Deno's copy
|
|
56
|
+
*/
|
|
57
|
+
export async function copy(src, dest, options = {}) {
|
|
58
|
+
const srcStat = await fs.stat(src);
|
|
59
|
+
if (srcStat.isDirectory()) {
|
|
60
|
+
await copyDir(src, dest, options);
|
|
61
|
+
}
|
|
62
|
+
else if (srcStat.isFile()) {
|
|
63
|
+
if (!options.overwrite) {
|
|
64
|
+
try {
|
|
65
|
+
await fs.access(dest);
|
|
66
|
+
return; // File exists and overwrite is false, skip
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// File doesn't exist, proceed with copy
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
await copyFile(src, dest);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
throw new Error(`Source ${src} is neither a file nor a directory`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Recursively walk a directory tree and yield entries
|
|
80
|
+
* Node.js equivalent of Deno's walk
|
|
81
|
+
*/
|
|
82
|
+
export async function* walk(root, options = {}) {
|
|
83
|
+
const { maxDepth = Infinity, includeFiles = true, includeDirs = false, followSymlinks = false, exts, match, skip, } = options;
|
|
84
|
+
async function* walkRecursive(dir, depth) {
|
|
85
|
+
if (depth > maxDepth)
|
|
86
|
+
return;
|
|
87
|
+
let entries;
|
|
88
|
+
try {
|
|
89
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
90
|
+
}
|
|
91
|
+
catch (_error) {
|
|
92
|
+
// Skip directories we can't read
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const entry of entries) {
|
|
96
|
+
const entryPath = join(dir, entry.name);
|
|
97
|
+
const relativePath = relative(root, entryPath);
|
|
98
|
+
let isFile = entry.isFile();
|
|
99
|
+
let isDirectory = entry.isDirectory();
|
|
100
|
+
const isSymlink = entry.isSymbolicLink();
|
|
101
|
+
// Handle symlinks
|
|
102
|
+
if (isSymlink && followSymlinks) {
|
|
103
|
+
try {
|
|
104
|
+
const stat = await fs.stat(entryPath);
|
|
105
|
+
isFile = stat.isFile();
|
|
106
|
+
isDirectory = stat.isDirectory();
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
continue; // Skip broken symlinks
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (isSymlink && !followSymlinks) {
|
|
113
|
+
continue; // Skip symlinks when not following them
|
|
114
|
+
}
|
|
115
|
+
const walkEntry = {
|
|
116
|
+
path: entryPath,
|
|
117
|
+
name: entry.name,
|
|
118
|
+
isFile,
|
|
119
|
+
isDirectory,
|
|
120
|
+
isSymlink,
|
|
121
|
+
};
|
|
122
|
+
// Apply filters
|
|
123
|
+
if (skip && skip.some((pattern) => pattern.test(relativePath))) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (match && !match.some((pattern) => pattern.test(relativePath))) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (exts && isFile) {
|
|
130
|
+
const ext = entryPath.substring(entryPath.lastIndexOf(".") + 1);
|
|
131
|
+
if (!exts.includes(ext)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Yield files if requested
|
|
136
|
+
if (isFile && includeFiles) {
|
|
137
|
+
yield walkEntry;
|
|
138
|
+
}
|
|
139
|
+
// Yield directories if requested
|
|
140
|
+
if (isDirectory && includeDirs) {
|
|
141
|
+
yield walkEntry;
|
|
142
|
+
}
|
|
143
|
+
// Recurse into directories
|
|
144
|
+
if (isDirectory) {
|
|
145
|
+
yield* walkRecursive(entryPath, depth + 1);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
yield* walkRecursive(root, 0);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Collect all walk entries into an array
|
|
153
|
+
* Convenience function for when you need all entries at once
|
|
154
|
+
*/
|
|
155
|
+
export async function walkArray(root, options = {}) {
|
|
156
|
+
const entries = [];
|
|
157
|
+
for await (const entry of walk(root, options)) {
|
|
158
|
+
entries.push(entry);
|
|
159
|
+
}
|
|
160
|
+
return entries;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
interface Options {
|
|
3
|
+
workspace?: string;
|
|
4
|
+
local?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const workspaceClientParams: ({ workspace, local }: Options) => Promise<{
|
|
7
|
+
headers: Record<string, string>;
|
|
8
|
+
url: URL;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const createWorkspaceClient: ({ workspace, local }: Options) => Promise<Client<{
|
|
11
|
+
method: string;
|
|
12
|
+
params?: {
|
|
13
|
+
[x: string]: unknown;
|
|
14
|
+
_meta?: {
|
|
15
|
+
[x: string]: unknown;
|
|
16
|
+
progressToken?: string | number | undefined;
|
|
17
|
+
} | undefined;
|
|
18
|
+
} | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
method: string;
|
|
21
|
+
params?: {
|
|
22
|
+
[x: string]: unknown;
|
|
23
|
+
_meta?: {
|
|
24
|
+
[x: string]: unknown;
|
|
25
|
+
} | undefined;
|
|
26
|
+
} | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
[x: string]: unknown;
|
|
29
|
+
_meta?: {
|
|
30
|
+
[x: string]: unknown;
|
|
31
|
+
} | undefined;
|
|
32
|
+
}>>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/lib/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,UAAU,OAAO;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,eAAO,MAAM,qBAAqB,GAAU,sBAAsB,OAAO;;;EAWxE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,sBAAsB,OAAO;;;;;;;;;;;;;;;;;;;;;;GASxE,CAAC"}
|
package/dist/lib/mcp.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
3
|
+
import { DECO_CHAT_API_LOCAL, DECO_CHAT_API_PROD } from "./constants.js";
|
|
4
|
+
import { getRequestAuthHeaders } from "./session.js";
|
|
5
|
+
export const workspaceClientParams = async ({ workspace, local }) => {
|
|
6
|
+
const headers = await getRequestAuthHeaders();
|
|
7
|
+
const api = local ? DECO_CHAT_API_LOCAL : DECO_CHAT_API_PROD;
|
|
8
|
+
const url = new URL(!workspace || workspace.startsWith("/")
|
|
9
|
+
? `${workspace ?? ""}/mcp`
|
|
10
|
+
: `/shared/${workspace}/mcp`, api);
|
|
11
|
+
return { headers, url };
|
|
12
|
+
};
|
|
13
|
+
export const createWorkspaceClient = async ({ workspace, local }) => {
|
|
14
|
+
const client = new Client({ name: "deco-chat-cli", version: "1.0.0" });
|
|
15
|
+
const { headers, url } = await workspaceClientParams({ workspace, local });
|
|
16
|
+
await client.connect(new StreamableHTTPClientTransport(url, { requestInit: { headers } }));
|
|
17
|
+
return client;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/lib/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAMrD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAW,EAAE,EAAE;IAC3E,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAE7D,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACrC,CAAC,CAAC,GAAG,SAAS,IAAI,EAAE,MAAM;QAC1B,CAAC,CAAC,WAAW,SAAS,MAAM,EAC9B,GAAG,CACJ,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAW,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACvE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,qBAAqB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,6BAA6B,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CACrE,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type BindingToolScope = `${string}${typeof SEPARATOR}${string}`;
|
|
2
|
+
export interface BindingTool {
|
|
3
|
+
bindingName: string;
|
|
4
|
+
toolName: string;
|
|
5
|
+
}
|
|
6
|
+
declare const SEPARATOR = "::";
|
|
7
|
+
export declare const parser: {
|
|
8
|
+
fromBindingToolToScope: ({ bindingName, toolName, }: BindingTool) => BindingToolScope;
|
|
9
|
+
fromScopeToBindingTool: (scope: BindingToolScope) => BindingTool;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=parse-binding-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-binding-tool.d.ts","sourceRoot":"","sources":["../../src/lib/parse-binding-tool.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,GAAG,MAAM,GAAG,OAAO,SAAS,GAAG,MAAM,EAAE,CAAC;AAEvE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,QAAA,MAAM,SAAS,OAAO,CAAC;AACvB,eAAO,MAAM,MAAM;yDAId,WAAW,KAAG,gBAAgB;oCASD,gBAAgB,KAAG,WAAW;CAK/D,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const SEPARATOR = "::";
|
|
2
|
+
export const parser = {
|
|
3
|
+
fromBindingToolToScope: ({ bindingName, toolName, }) => {
|
|
4
|
+
const parts = [bindingName, toolName];
|
|
5
|
+
if (parts.some((part) => part.includes(SEPARATOR))) {
|
|
6
|
+
throw new Error(`binding name or tool name includes ${SEPARATOR} is not allowed`);
|
|
7
|
+
}
|
|
8
|
+
return parts.join(SEPARATOR);
|
|
9
|
+
},
|
|
10
|
+
fromScopeToBindingTool: (scope) => {
|
|
11
|
+
const [bindingName, toolName] = scope.split(SEPARATOR);
|
|
12
|
+
return { bindingName, toolName };
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=parse-binding-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-binding-tool.js","sourceRoot":"","sources":["../../src/lib/parse-binding-tool.ts"],"names":[],"mappings":"AAOA,MAAM,SAAS,GAAG,IAAI,CAAC;AACvB,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,sBAAsB,EAAE,CAAC,EACvB,WAAW,EACX,QAAQ,GACI,EAAoB,EAAE;QAClC,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,iBAAiB,CACjE,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAqB,CAAC;IACnD,CAAC;IACD,sBAAsB,EAAE,CAAC,KAAuB,EAAe,EAAE;QAC/D,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAEvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type MCPServerConfig = {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
} | {
|
|
5
|
+
url: string;
|
|
6
|
+
type: "http" | "sse";
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
};
|
|
9
|
+
export interface MCPConfig {
|
|
10
|
+
mcpServers: Record<string, MCPServerConfig>;
|
|
11
|
+
}
|
|
12
|
+
interface IDEConfig {
|
|
13
|
+
content: string;
|
|
14
|
+
path: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function writeIDEConfig(configs: IDEConfig[]): Promise<void>;
|
|
17
|
+
export declare const hasMCPPreferences: (workspace: string, app: string) => Promise<boolean>;
|
|
18
|
+
export declare const setMCPPreferences: (workspace: string, app: string) => Promise<void>;
|
|
19
|
+
export declare function promptIDESetup(cfg: {
|
|
20
|
+
workspace: string;
|
|
21
|
+
app: string;
|
|
22
|
+
}, projectRoot?: string): Promise<Array<{
|
|
23
|
+
content: string;
|
|
24
|
+
path: string;
|
|
25
|
+
}> | null>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=prompt-ide-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-ide-setup.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-ide-setup.ts"],"names":[],"mappings":"AAwBA,KAAK,eAAe,GAChB;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GACD;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEN,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC7C;AAED,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAiFD,wBAAsB,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE;AAED,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,EAAE,KAAK,MAAM,qBAmBrE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,EAAE,KAAK,MAAM,kBA0BrE,CAAC;AAEF,wBAAsB,cAAc,CAClC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACvC,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAAC,CA2C1D"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompts the user to make their IDE sentient about the project by installing MCP configurations.
|
|
3
|
+
*
|
|
4
|
+
* This function:
|
|
5
|
+
* 1. Asks the user if they want to make their IDE sentient
|
|
6
|
+
* 2. If yes, prompts them to select their IDE (Cursor, VSCode, or Windsurf)
|
|
7
|
+
* 3. Returns the appropriate MCP configuration and target path for the selected IDE
|
|
8
|
+
*
|
|
9
|
+
* @param mcpConfig - The MCP configuration object
|
|
10
|
+
* @param projectRoot - The root path of the project where the config should be written
|
|
11
|
+
* @returns Promise<{ config: any; targetPath: string } | null> - The MCP config and target path, or null if user declines
|
|
12
|
+
*/
|
|
13
|
+
import inquirer from "inquirer";
|
|
14
|
+
import { promises as fs } from "fs";
|
|
15
|
+
import { dirname, join } from "path";
|
|
16
|
+
import { ensureDir } from "./fs.js";
|
|
17
|
+
import { getAppUUID, getMCPConfig, getMCPConfigVersion, getRulesConfig, } from "./config.js";
|
|
18
|
+
import process from "node:process";
|
|
19
|
+
const IDE_SUPPORT = {
|
|
20
|
+
cursor: {
|
|
21
|
+
name: "Cursor",
|
|
22
|
+
createConfig: async (mcpConfig, projectRoot) => {
|
|
23
|
+
const outDir = join(projectRoot, ".cursor");
|
|
24
|
+
const configs = [];
|
|
25
|
+
const configPath = join(outDir, "mcp.json");
|
|
26
|
+
const existingConfig = await fs
|
|
27
|
+
.readFile(configPath, "utf-8")
|
|
28
|
+
.then(JSON.parse)
|
|
29
|
+
.catch(() => ({ mcpServers: {} }));
|
|
30
|
+
const config = {
|
|
31
|
+
mcpServers: {
|
|
32
|
+
...(existingConfig.mcpServers || {}),
|
|
33
|
+
...mcpConfig.mcpServers,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
configs.push({
|
|
37
|
+
content: JSON.stringify(config, null, 2),
|
|
38
|
+
path: join(outDir, "mcp.json"),
|
|
39
|
+
});
|
|
40
|
+
const rules = Object.entries(await getRulesConfig());
|
|
41
|
+
for (const [path, content] of rules) {
|
|
42
|
+
configs.push({ content, path: join(outDir, "rules", path) });
|
|
43
|
+
}
|
|
44
|
+
return configs;
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
vscode: {
|
|
48
|
+
name: "VS Code",
|
|
49
|
+
createConfig: async (mcpConfig, projectRoot) => {
|
|
50
|
+
const outDir = join(projectRoot, ".vscode");
|
|
51
|
+
const configs = [];
|
|
52
|
+
const configPath = join(outDir, "mcp.json");
|
|
53
|
+
const existingConfig = await fs
|
|
54
|
+
.readFile(configPath, "utf-8")
|
|
55
|
+
.then(JSON.parse)
|
|
56
|
+
.catch(() => ({ mcpServers: {} }));
|
|
57
|
+
const config = {
|
|
58
|
+
mcpServers: {
|
|
59
|
+
...(existingConfig.mcpServers || {}),
|
|
60
|
+
...mcpConfig.mcpServers,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
configs.push({
|
|
64
|
+
content: JSON.stringify(config, null, 2),
|
|
65
|
+
path: join(outDir, "mcp.json"),
|
|
66
|
+
});
|
|
67
|
+
const rules = Object.entries(await getRulesConfig());
|
|
68
|
+
for (const [path, content] of rules) {
|
|
69
|
+
configs.push({ content, path: join(outDir, "rules", path) });
|
|
70
|
+
}
|
|
71
|
+
return configs;
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
export async function writeIDEConfig(configs) {
|
|
76
|
+
const targetDir = dirname(configs[0]?.path ?? "");
|
|
77
|
+
// Write all configuration files in parallel
|
|
78
|
+
await Promise.all(configs.map(async ({ content, path }) => {
|
|
79
|
+
await ensureDir(dirname(path));
|
|
80
|
+
await fs.writeFile(path, content);
|
|
81
|
+
}));
|
|
82
|
+
console.log(`✅ IDE configuration written to: ${targetDir}`);
|
|
83
|
+
}
|
|
84
|
+
export const hasMCPPreferences = async (workspace, app) => {
|
|
85
|
+
const [appUUID, currentVersion] = await Promise.all([
|
|
86
|
+
getAppUUID(workspace, app),
|
|
87
|
+
getMCPConfigVersion(),
|
|
88
|
+
]);
|
|
89
|
+
// Use a simple file-based storage instead of localStorage for Node.js
|
|
90
|
+
const prefsPath = join(process.cwd(), ".deco", "preferences.json");
|
|
91
|
+
try {
|
|
92
|
+
const prefs = JSON.parse(await fs.readFile(prefsPath, "utf-8"));
|
|
93
|
+
const storedVersion = prefs[`mcp-install-version-${appUUID}`];
|
|
94
|
+
return storedVersion === currentVersion;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
export const setMCPPreferences = async (workspace, app) => {
|
|
101
|
+
const [appUUID, currentVersion] = await Promise.all([
|
|
102
|
+
getAppUUID(workspace, app),
|
|
103
|
+
getMCPConfigVersion(),
|
|
104
|
+
]);
|
|
105
|
+
const prefsPath = join(process.cwd(), ".deco", "preferences.json");
|
|
106
|
+
try {
|
|
107
|
+
await ensureDir(dirname(prefsPath));
|
|
108
|
+
let prefs = {};
|
|
109
|
+
try {
|
|
110
|
+
prefs = JSON.parse(await fs.readFile(prefsPath, "utf-8"));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// File doesn't exist, start with empty prefs
|
|
114
|
+
}
|
|
115
|
+
prefs[`mcp-install-version-${appUUID}`] = currentVersion;
|
|
116
|
+
await fs.writeFile(prefsPath, JSON.stringify(prefs, null, 2));
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.warn("Failed to save MCP preferences:", error);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
export async function promptIDESetup(cfg, projectRoot = process.cwd()) {
|
|
123
|
+
await setMCPPreferences(cfg.workspace, cfg.app);
|
|
124
|
+
const mcpConfig = getMCPConfig(cfg.workspace, cfg.app);
|
|
125
|
+
// Ask if user wants to make IDE sentient
|
|
126
|
+
const { wantsSentientIDE } = await inquirer.prompt([
|
|
127
|
+
{
|
|
128
|
+
type: "confirm",
|
|
129
|
+
name: "wantsSentientIDE",
|
|
130
|
+
message: "Would you like to configure your IDE to use this project?",
|
|
131
|
+
default: true,
|
|
132
|
+
},
|
|
133
|
+
]);
|
|
134
|
+
if (!wantsSentientIDE) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
// Prompt user to select their IDE
|
|
138
|
+
const { selectedIDE } = await inquirer.prompt([
|
|
139
|
+
{
|
|
140
|
+
type: "list",
|
|
141
|
+
name: "selectedIDE",
|
|
142
|
+
message: "Select your preferred IDE:",
|
|
143
|
+
choices: [
|
|
144
|
+
{ name: "Cursor", value: "cursor" },
|
|
145
|
+
{ name: "VS Code", value: "vscode" },
|
|
146
|
+
{ name: "None", value: "none" },
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
const ideSupport = IDE_SUPPORT[selectedIDE];
|
|
151
|
+
if (selectedIDE === "none") {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
// Create the IDE-specific configuration
|
|
155
|
+
const configs = await ideSupport.createConfig(mcpConfig, projectRoot);
|
|
156
|
+
return configs;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=prompt-ide-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-ide-setup.js","sourceRoot":"","sources":["../../src/lib/prompt-ide-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-integrations.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-integrations.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,UAAQ,EACb,SAAS,SAAK,GACb,OAAO,CAAC,WAAW,EAAE,CAAC,CA0ExB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompts the user to select multiple integrations from the available integrations list.
|
|
3
|
+
*
|
|
4
|
+
* This function:
|
|
5
|
+
* 1. Checks if the user has a valid session
|
|
6
|
+
* 2. Creates a workspace client to access global tools
|
|
7
|
+
* 3. Uses the INTEGRATIONS_LIST tool to fetch available integrations
|
|
8
|
+
* 4. Presents a multiple select prompt to the user with search functionality
|
|
9
|
+
* 5. Returns the selected integration bindings as an array
|
|
10
|
+
*
|
|
11
|
+
* @param local - Whether to use local deco.chat instance
|
|
12
|
+
* @param workspace - The workspace to fetch integrations from
|
|
13
|
+
* @returns Promise<DecoBinding[]> - The selected integration bindings
|
|
14
|
+
* @throws Error if no session is found or no integrations are available
|
|
15
|
+
*/
|
|
16
|
+
import inquirer from "inquirer";
|
|
17
|
+
// @ts-ignore - does not have types
|
|
18
|
+
import inquirerSearchCheckbox from "inquirer-search-checkbox";
|
|
19
|
+
import { createWorkspaceClient } from "./mcp.js";
|
|
20
|
+
import { readSession } from "./session.js";
|
|
21
|
+
import { sanitizeConstantName } from "./slugify.js";
|
|
22
|
+
import { z } from "zod";
|
|
23
|
+
// Register the search checkbox plugin
|
|
24
|
+
inquirer.registerPrompt("search-checkbox", inquirerSearchCheckbox);
|
|
25
|
+
export async function promptIntegrations(local = false, workspace = "") {
|
|
26
|
+
// Check if user has a session
|
|
27
|
+
const session = await readSession();
|
|
28
|
+
if (!session) {
|
|
29
|
+
throw new Error("No session found. Please run 'deco login' first.");
|
|
30
|
+
}
|
|
31
|
+
// Create workspace client
|
|
32
|
+
const client = await createWorkspaceClient({ workspace, local });
|
|
33
|
+
try {
|
|
34
|
+
// Use INTEGRATIONS_LIST tool to get available integrations
|
|
35
|
+
const response = await client.callTool({
|
|
36
|
+
name: "INTEGRATIONS_LIST",
|
|
37
|
+
arguments: {},
|
|
38
|
+
},
|
|
39
|
+
// @ts-expect-error We need to refactor INTEGRATIONS_LIST to stop returning array and use a proper object
|
|
40
|
+
z.any());
|
|
41
|
+
if (response.isError) {
|
|
42
|
+
throw new Error("Failed to fetch integrations");
|
|
43
|
+
}
|
|
44
|
+
const integrationsResponse = response.structuredContent?.items;
|
|
45
|
+
const integrations = (integrationsResponse || [])
|
|
46
|
+
.filter((c) => c.connection.type !== "INNATE")
|
|
47
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
48
|
+
if (!integrations || integrations.length === 0) {
|
|
49
|
+
throw new Error("No integrations found.");
|
|
50
|
+
}
|
|
51
|
+
// Create options for the search checkbox component
|
|
52
|
+
const options = integrations.map((integration) => ({
|
|
53
|
+
name: `${integration.name} - ${integration.description}`,
|
|
54
|
+
value: integration.id,
|
|
55
|
+
short: integration.name,
|
|
56
|
+
}));
|
|
57
|
+
// Use inquirer search checkbox to allow multiple selection with search
|
|
58
|
+
const { selectedIntegrationIds } = await inquirer.prompt([
|
|
59
|
+
{
|
|
60
|
+
type: "search-checkbox",
|
|
61
|
+
name: "selectedIntegrationIds",
|
|
62
|
+
message: "Select integrations (use space to select, enter to confirm):",
|
|
63
|
+
choices: options,
|
|
64
|
+
searchable: true,
|
|
65
|
+
highlight: true,
|
|
66
|
+
searchText: "Type to search integrations:",
|
|
67
|
+
emptyText: "No integrations found matching your search.",
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
70
|
+
// Convert selected IDs back to integration objects
|
|
71
|
+
const selectedIntegrations = integrations.filter((integration) => selectedIntegrationIds.includes(integration.id));
|
|
72
|
+
// Return the selected integration bindings
|
|
73
|
+
return selectedIntegrations.map(({ name, id }) => ({
|
|
74
|
+
name: sanitizeConstantName(name),
|
|
75
|
+
type: "mcp",
|
|
76
|
+
integration_id: id,
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
// Clean up the client connection
|
|
81
|
+
await client.close();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=prompt-integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-integrations.js","sourceRoot":"","sources":["../../src/lib/prompt-integrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-workspace.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-workspace.ts"],"names":[],"mappings":"AAkCA,wBAAsB,eAAe,CACnC,KAAK,UAAQ,EACb,OAAO,SAAK,GACX,OAAO,CAAC,MAAM,CAAC,CAiFjB"}
|