@kamkom/awb-mcp 0.0.5 → 0.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 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/planBootstrap.d.ts +15 -1
- package/dist/tools/planBootstrap.d.ts.map +1 -1
- package/dist/tools/planBootstrap.js +28 -2
- package/dist/tools/planBootstrap.js.map +1 -1
- package/package.json +1 -1
- package/src/tools/index.ts +4 -1
- package/src/tools/planBootstrap.ts +48 -7
package/README.md
CHANGED
|
@@ -58,6 +58,10 @@ The server exposes AWB tools over stdio, including:
|
|
|
58
58
|
- `awb_plan_bootstrap` — compute a plan of file operations (create/update/skip) for bootstrapping an agentic-ready repo.
|
|
59
59
|
- `awb_apply_bootstrap` — apply a previously returned plan to disk (atomic writes, idempotent behavior).
|
|
60
60
|
|
|
61
|
+
### Copilot instructions and sampling
|
|
62
|
+
|
|
63
|
+
The plan can generate `.github/copilot-instructions.md` from a prompt file in the server templates (`copilot-instructions-prompt.md`). When the MCP client supports **sampling** (e.g. Cursor, VS Code with a sampling-capable host), the prompt file content is run on the **client’s LLM** and the generated output is used for that file; otherwise the prompt file content is used literally. No API keys are required on the server.
|
|
64
|
+
|
|
61
65
|
## Overwrite and managed blocks
|
|
62
66
|
|
|
63
67
|
The server never overwrites your content unless a file is under AWB management or you explicitly allow overwrite.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiDxD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -19,7 +19,9 @@ export function registerAwbTools(server) {
|
|
|
19
19
|
.optional()
|
|
20
20
|
.describe("Optional: mode, includeReadmeProposal, overwritePolicy, files allowlist, overwritePaths"),
|
|
21
21
|
},
|
|
22
|
-
}, async (args) => handlePlanBootstrap(args
|
|
22
|
+
}, async (args, _extra) => handlePlanBootstrap(args, {
|
|
23
|
+
serverForSampling: server.server,
|
|
24
|
+
}));
|
|
23
25
|
server.registerTool("awb_apply_bootstrap", {
|
|
24
26
|
description: "Apply a previously returned bootstrap plan to disk (atomic writes, idempotent behavior). Requires the operations array from a prior plan_bootstrap call.",
|
|
25
27
|
inputSchema: {
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAA0B,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAA2B,MAAM,qBAAqB,CAAC;AAEpF,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EACT,+GAA+G;QACjH,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC/D,OAAO,EAAE,CAAC;iBACP,MAAM,CAAC;gBACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC7C,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAC7C,eAAe,EAAE,CAAC;qBACf,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;qBAC3C,QAAQ,EAAE;gBACb,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;gBACrC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC/C,CAAC;iBACD,QAAQ,EAAE;iBACV,QAAQ,CAAC,yFAAyF,CAAC;SACvG;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAA0B,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAA2B,MAAM,qBAAqB,CAAC;AAEpF,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EACT,+GAA+G;QACjH,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC/D,OAAO,EAAE,CAAC;iBACP,MAAM,CAAC;gBACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC7C,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAC7C,eAAe,EAAE,CAAC;qBACf,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;qBAC3C,QAAQ,EAAE;gBACb,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;gBACrC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC/C,CAAC;iBACD,QAAQ,EAAE;iBACV,QAAQ,CAAC,yFAAyF,CAAC;SACvG;KACF,EACD,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CACrB,mBAAmB,CAAC,IAAyB,EAAE;QAC7C,iBAAiB,EAAE,MAAM,CAAC,MAAM;KACjC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EACT,0JAA0J;QAC5J,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC/D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACrE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC3E,YAAY,EAAE,CAAC;iBACZ,MAAM,CAAC;gBACN,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAC9B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACxC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aACvC,CAAC;iBACD,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;SACpE;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAA0B,CAAC,CACjE,CAAC;AACJ,CAAC"}
|
|
@@ -9,6 +9,20 @@ export type PlanBootstrapArgs = {
|
|
|
9
9
|
rootPath: string;
|
|
10
10
|
options?: unknown;
|
|
11
11
|
};
|
|
12
|
+
/** Optional context for LLM sampling (client's model via MCP). When present, prompt file content can be run as a prompt. */
|
|
13
|
+
export type PlanBootstrapContext = {
|
|
14
|
+
serverForSampling: {
|
|
15
|
+
createMessage(params: unknown): Promise<{
|
|
16
|
+
content?: {
|
|
17
|
+
type?: string;
|
|
18
|
+
text?: string;
|
|
19
|
+
} | Array<{
|
|
20
|
+
type?: string;
|
|
21
|
+
text?: string;
|
|
22
|
+
}>;
|
|
23
|
+
}>;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
12
26
|
export type BootstrapAction = "CREATE" | "UPDATE_MANAGED" | "SKIP";
|
|
13
27
|
export type PlanOperation = {
|
|
14
28
|
path: string;
|
|
@@ -30,5 +44,5 @@ export type PlanBootstrapSuccess = {
|
|
|
30
44
|
repoHints?: Record<string, unknown>;
|
|
31
45
|
readmeProposal?: string | null;
|
|
32
46
|
};
|
|
33
|
-
export declare function handlePlanBootstrap(args: PlanBootstrapArgs): Promise<PlanBootstrapResult>;
|
|
47
|
+
export declare function handlePlanBootstrap(args: PlanBootstrapArgs, context?: PlanBootstrapContext): Promise<PlanBootstrapResult>;
|
|
34
48
|
//# sourceMappingURL=planBootstrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planBootstrap.d.ts","sourceRoot":"","sources":["../../src/tools/planBootstrap.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,cAAc,GAAG,WAAW,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEnE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;
|
|
1
|
+
{"version":3,"file":"planBootstrap.d.ts","sourceRoot":"","sources":["../../src/tools/planBootstrap.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,cAAc,GAAG,WAAW,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,4HAA4H;AAC5H,MAAM,MAAM,oBAAoB,GAAG;IACjC,iBAAiB,EAAE;QACjB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;YACtC,OAAO,CAAC,EACJ;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,GAChC,KAAK,CAAC;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SAC7C,CAAC,CAAC;KACJ,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEnE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAqJF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA0F9B"}
|
|
@@ -133,7 +133,8 @@ function buildOperation(relPath, fullPath, options, templateContent) {
|
|
|
133
133
|
warnings: ["File exists and is not being overwritten."],
|
|
134
134
|
};
|
|
135
135
|
}
|
|
136
|
-
|
|
136
|
+
const COPILOT_SAMPLING_SYSTEM_PROMPT = "Write a few jokes in polish";
|
|
137
|
+
export async function handlePlanBootstrap(args, context) {
|
|
137
138
|
try {
|
|
138
139
|
const error = validateRootPath(args?.rootPath);
|
|
139
140
|
if (error) {
|
|
@@ -157,7 +158,32 @@ export async function handlePlanBootstrap(args) {
|
|
|
157
158
|
let templateContent = getTemplateContent(relPath);
|
|
158
159
|
if (relPath === COPILOT_INSTRUCTIONS_PATH) {
|
|
159
160
|
const promptContent = getTemplateContent(COPILOT_PROMPT_FILE).trim();
|
|
160
|
-
|
|
161
|
+
let value = promptContent;
|
|
162
|
+
if (promptContent && context?.serverForSampling) {
|
|
163
|
+
try {
|
|
164
|
+
const res = await context.serverForSampling.createMessage({
|
|
165
|
+
messages: [
|
|
166
|
+
{
|
|
167
|
+
role: "user",
|
|
168
|
+
content: { type: "text", text: promptContent },
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
systemPrompt: COPILOT_SAMPLING_SYSTEM_PROMPT,
|
|
172
|
+
maxTokens: 2000,
|
|
173
|
+
});
|
|
174
|
+
const block = Array.isArray(res.content)
|
|
175
|
+
? res.content[0]
|
|
176
|
+
: res.content;
|
|
177
|
+
const text = block?.type === "text"
|
|
178
|
+
? (block.text ?? "")
|
|
179
|
+
: "";
|
|
180
|
+
value = (text ?? "").trim() || promptContent;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
value = promptContent;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
templateContent = templateContent.replace(COPILOT_INSTRUCTIONS_PLACEHOLDER, value);
|
|
161
187
|
}
|
|
162
188
|
operations.push(buildOperation(relPath, fullPath, options, templateContent));
|
|
163
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planBootstrap.js","sourceRoot":"","sources":["../../src/tools/planBootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACpD,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjD,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;SAC3C,OAAO,CAAC,cAAc,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"planBootstrap.js","sourceRoot":"","sources":["../../src/tools/planBootstrap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/tools/index.ts
CHANGED
|
@@ -25,7 +25,10 @@ export function registerAwbTools(server: McpServer): void {
|
|
|
25
25
|
.describe("Optional: mode, includeReadmeProposal, overwritePolicy, files allowlist, overwritePaths"),
|
|
26
26
|
},
|
|
27
27
|
},
|
|
28
|
-
async (args) =>
|
|
28
|
+
async (args, _extra) =>
|
|
29
|
+
handlePlanBootstrap(args as PlanBootstrapArgs, {
|
|
30
|
+
serverForSampling: server.server,
|
|
31
|
+
})
|
|
29
32
|
);
|
|
30
33
|
|
|
31
34
|
server.registerTool(
|
|
@@ -29,6 +29,17 @@ export type PlanBootstrapArgs = {
|
|
|
29
29
|
options?: unknown;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
+
/** Optional context for LLM sampling (client's model via MCP). When present, prompt file content can be run as a prompt. */
|
|
33
|
+
export type PlanBootstrapContext = {
|
|
34
|
+
serverForSampling: {
|
|
35
|
+
createMessage(params: unknown): Promise<{
|
|
36
|
+
content?:
|
|
37
|
+
| { type?: string; text?: string }
|
|
38
|
+
| Array<{ type?: string; text?: string }>;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
32
43
|
export type BootstrapAction = "CREATE" | "UPDATE_MANAGED" | "SKIP";
|
|
33
44
|
|
|
34
45
|
export type PlanOperation = {
|
|
@@ -83,7 +94,7 @@ function isUnderRoot(fullPath: string, resolvedRoot: string): boolean {
|
|
|
83
94
|
*/
|
|
84
95
|
function normalizeUnderRoot(
|
|
85
96
|
resolvedRoot: string,
|
|
86
|
-
rawPath: string
|
|
97
|
+
rawPath: string,
|
|
87
98
|
): string | null {
|
|
88
99
|
const resolved = path.resolve(resolvedRoot, rawPath);
|
|
89
100
|
if (!isUnderRoot(resolved, resolvedRoot)) return null;
|
|
@@ -93,7 +104,7 @@ function normalizeUnderRoot(
|
|
|
93
104
|
|
|
94
105
|
function getPathsToConsider(
|
|
95
106
|
options: PlanBootstrapOptions,
|
|
96
|
-
resolvedRoot: string
|
|
107
|
+
resolvedRoot: string,
|
|
97
108
|
): string[] {
|
|
98
109
|
let candidates = [...BASELINE_PATHS];
|
|
99
110
|
if (options.files && options.files.length > 0) {
|
|
@@ -114,7 +125,7 @@ function buildOperation(
|
|
|
114
125
|
relPath: string,
|
|
115
126
|
fullPath: string,
|
|
116
127
|
options: PlanBootstrapOptions,
|
|
117
|
-
templateContent: string
|
|
128
|
+
templateContent: string,
|
|
118
129
|
): PlanOperation {
|
|
119
130
|
const exists = fs.existsSync(fullPath);
|
|
120
131
|
|
|
@@ -131,7 +142,9 @@ function buildOperation(
|
|
|
131
142
|
const overwriteSet =
|
|
132
143
|
options.overwritePaths && options.overwritePaths.length > 0
|
|
133
144
|
? new Set(
|
|
134
|
-
options.overwritePaths.map((p) =>
|
|
145
|
+
options.overwritePaths.map((p) =>
|
|
146
|
+
path.normalize(p).replace(/\\/g, "/"),
|
|
147
|
+
),
|
|
135
148
|
)
|
|
136
149
|
: null;
|
|
137
150
|
const normalizedRelPath = path.normalize(relPath).replace(/\\/g, "/");
|
|
@@ -194,8 +207,11 @@ function buildOperation(
|
|
|
194
207
|
};
|
|
195
208
|
}
|
|
196
209
|
|
|
210
|
+
const COPILOT_SAMPLING_SYSTEM_PROMPT = "Write a few jokes in polish";
|
|
211
|
+
|
|
197
212
|
export async function handlePlanBootstrap(
|
|
198
|
-
args: PlanBootstrapArgs
|
|
213
|
+
args: PlanBootstrapArgs,
|
|
214
|
+
context?: PlanBootstrapContext,
|
|
199
215
|
): Promise<PlanBootstrapResult> {
|
|
200
216
|
try {
|
|
201
217
|
const error = validateRootPath(args?.rootPath);
|
|
@@ -223,13 +239,38 @@ export async function handlePlanBootstrap(
|
|
|
223
239
|
let templateContent = getTemplateContent(relPath);
|
|
224
240
|
if (relPath === COPILOT_INSTRUCTIONS_PATH) {
|
|
225
241
|
const promptContent = getTemplateContent(COPILOT_PROMPT_FILE).trim();
|
|
242
|
+
let value = promptContent;
|
|
243
|
+
if (promptContent && context?.serverForSampling) {
|
|
244
|
+
try {
|
|
245
|
+
const res = await context.serverForSampling.createMessage({
|
|
246
|
+
messages: [
|
|
247
|
+
{
|
|
248
|
+
role: "user",
|
|
249
|
+
content: { type: "text", text: promptContent },
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
systemPrompt: COPILOT_SAMPLING_SYSTEM_PROMPT,
|
|
253
|
+
maxTokens: 2000,
|
|
254
|
+
});
|
|
255
|
+
const block = Array.isArray(res.content)
|
|
256
|
+
? res.content[0]
|
|
257
|
+
: res.content;
|
|
258
|
+
const text =
|
|
259
|
+
block?.type === "text"
|
|
260
|
+
? ((block as { text?: string }).text ?? "")
|
|
261
|
+
: "";
|
|
262
|
+
value = (text ?? "").trim() || promptContent;
|
|
263
|
+
} catch {
|
|
264
|
+
value = promptContent;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
226
267
|
templateContent = templateContent.replace(
|
|
227
268
|
COPILOT_INSTRUCTIONS_PLACEHOLDER,
|
|
228
|
-
|
|
269
|
+
value,
|
|
229
270
|
);
|
|
230
271
|
}
|
|
231
272
|
operations.push(
|
|
232
|
-
buildOperation(relPath, fullPath, options, templateContent)
|
|
273
|
+
buildOperation(relPath, fullPath, options, templateContent),
|
|
233
274
|
);
|
|
234
275
|
}
|
|
235
276
|
|