@cydm/pie 1.0.1 → 1.0.3
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/builtin/extensions/ask-user/index.js +2924 -0
- package/dist/builtin/extensions/changelog/index.js +200 -0
- package/dist/builtin/extensions/deploy/index.js +11 -0
- package/dist/builtin/extensions/document-attachments/index.js +144 -0
- package/dist/builtin/extensions/files/index.js +10 -0
- package/dist/builtin/extensions/init/index.js +144 -0
- package/dist/builtin/extensions/kimi-attachments/index.js +46 -0
- package/dist/builtin/extensions/plan-mode/index.js +209 -0
- package/dist/builtin/extensions/questionnaire/index.js +2753 -0
- package/dist/builtin/extensions/subagent/index.js +11041 -0
- package/dist/builtin/extensions/todo/index.js +162 -0
- package/dist/builtin/skills/browser-tools/CHANGELOG.md +47 -0
- package/dist/builtin/skills/browser-tools/browser-cookies.js +35 -0
- package/dist/builtin/skills/browser-tools/browser-screenshot.js +34 -0
- package/dist/builtin/skills/browser-tools/browser-start.js +86 -0
- package/dist/builtin/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/builtin/skills/skill-creator/SKILL.md +485 -0
- package/dist/builtin/skills/skill-creator/agents/analyzer.md +274 -0
- package/dist/builtin/skills/skill-creator/agents/comparator.md +202 -0
- package/dist/builtin/skills/skill-creator/agents/grader.md +223 -0
- package/dist/builtin/skills/skill-creator/assets/eval_review.html +146 -0
- package/dist/builtin/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/dist/builtin/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/dist/builtin/skills/skill-creator/references/schemas.md +430 -0
- package/dist/builtin/skills/skill-creator/scripts/__init__.py +0 -0
- package/dist/builtin/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/dist/builtin/skills/skill-creator/scripts/generate_report.py +326 -0
- package/dist/builtin/skills/skill-creator/scripts/improve_description.py +247 -0
- package/dist/builtin/skills/skill-creator/scripts/package_skill.py +136 -0
- package/dist/builtin/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/dist/builtin/skills/skill-creator/scripts/run_eval.py +310 -0
- package/dist/builtin/skills/skill-creator/scripts/run_loop.py +328 -0
- package/dist/builtin/skills/skill-creator/scripts/utils.py +47 -0
- package/dist/cli.js +79003 -0
- package/dist/theme/dark.json +85 -0
- package/dist/theme/light.json +84 -0
- package/package.json +1 -1
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// builtin/extensions/plan-mode/index.ts
|
|
4
|
+
function extractTodoItems(text) {
|
|
5
|
+
const items = [];
|
|
6
|
+
const planMatch = text.match(/Plan:\s*\n?([\s\S]*?)(?=\n\n|\n[A-Z]|$)/i);
|
|
7
|
+
if (!planMatch) return items;
|
|
8
|
+
const planSection = planMatch[1];
|
|
9
|
+
const lines = planSection.split("\n");
|
|
10
|
+
for (const line of lines) {
|
|
11
|
+
const trimmed = line.trim();
|
|
12
|
+
const match = trimmed.match(/^(?:\d+[.):\s]+|[\-*]\s+)(.+)$/);
|
|
13
|
+
if (match) {
|
|
14
|
+
items.push({
|
|
15
|
+
step: items.length + 1,
|
|
16
|
+
text: match[1].trim(),
|
|
17
|
+
completed: false
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return items;
|
|
22
|
+
}
|
|
23
|
+
function isSafeCommand(command) {
|
|
24
|
+
const trimmed = command.trim();
|
|
25
|
+
const safePrefixes = [
|
|
26
|
+
"cat ",
|
|
27
|
+
"ls ",
|
|
28
|
+
"find ",
|
|
29
|
+
"grep ",
|
|
30
|
+
"head ",
|
|
31
|
+
"tail ",
|
|
32
|
+
"echo ",
|
|
33
|
+
"pwd",
|
|
34
|
+
"cd ",
|
|
35
|
+
"which ",
|
|
36
|
+
"git status",
|
|
37
|
+
"git log",
|
|
38
|
+
"git diff",
|
|
39
|
+
"git show",
|
|
40
|
+
"git branch -a",
|
|
41
|
+
"git remote -v",
|
|
42
|
+
"git config --list",
|
|
43
|
+
"npm list",
|
|
44
|
+
"npm view"
|
|
45
|
+
];
|
|
46
|
+
const dangerousPatterns = [
|
|
47
|
+
/\brm\s+-[rf]*/i,
|
|
48
|
+
/>[\s]*\/dev\//,
|
|
49
|
+
/\|.*\brm\b/,
|
|
50
|
+
/git\s+push/i,
|
|
51
|
+
/git\s+reset/i,
|
|
52
|
+
/git\s+checkout\s+-/,
|
|
53
|
+
/git\s+revert/i,
|
|
54
|
+
/npm\s+publish/i,
|
|
55
|
+
/npm\s+uninstall/i,
|
|
56
|
+
/npm\s+rm/i
|
|
57
|
+
];
|
|
58
|
+
for (const pattern of dangerousPatterns) {
|
|
59
|
+
if (pattern.test(trimmed)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const prefix of safePrefixes) {
|
|
64
|
+
if (trimmed.startsWith(prefix)) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (/^[a-z]+$/.test(trimmed)) {
|
|
69
|
+
return ["pwd", "ls", "clear", "whoami"].includes(trimmed);
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
function markCompletedSteps(text, todoItems2) {
|
|
74
|
+
let markedCount = 0;
|
|
75
|
+
const doneMatches = text.matchAll(/\[DONE:\s*(\d+)\]/gi);
|
|
76
|
+
for (const match of doneMatches) {
|
|
77
|
+
const stepNum = parseInt(match[1], 10);
|
|
78
|
+
const item = todoItems2.find((t) => t.step === stepNum);
|
|
79
|
+
if (item && !item.completed) {
|
|
80
|
+
item.completed = true;
|
|
81
|
+
markedCount++;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return markedCount;
|
|
85
|
+
}
|
|
86
|
+
var PLAN_MODE_TOOLS = ["read", "bash", "grep", "find", "ls", "questionnaire"];
|
|
87
|
+
var NORMAL_MODE_TOOLS = ["read", "bash", "edit", "write", "grep", "find", "ls", "questionnaire"];
|
|
88
|
+
var planModeEnabled = false;
|
|
89
|
+
var executionMode = false;
|
|
90
|
+
var todoItems = [];
|
|
91
|
+
function planModeExtension(ctx) {
|
|
92
|
+
ctx.log("Plan mode extension loaded");
|
|
93
|
+
function updateStatus() {
|
|
94
|
+
if (executionMode && todoItems.length > 0) {
|
|
95
|
+
const completed = todoItems.filter((t) => t.completed).length;
|
|
96
|
+
ctx.ui.notify(`\u{1F4CB} Plan: ${completed}/${todoItems.length} completed`, "info");
|
|
97
|
+
} else if (planModeEnabled) {
|
|
98
|
+
ctx.ui.notify("\u23F8\uFE0F Plan mode active (read-only)", "info");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function togglePlanMode() {
|
|
102
|
+
planModeEnabled = !planModeEnabled;
|
|
103
|
+
executionMode = false;
|
|
104
|
+
todoItems = [];
|
|
105
|
+
ctx.setPlanMode(planModeEnabled);
|
|
106
|
+
if (planModeEnabled) {
|
|
107
|
+
ctx.setActiveTools(PLAN_MODE_TOOLS);
|
|
108
|
+
ctx.ui.notify(`Plan mode enabled. Available tools: ${PLAN_MODE_TOOLS.join(", ")}`);
|
|
109
|
+
} else {
|
|
110
|
+
ctx.setActiveTools(NORMAL_MODE_TOOLS);
|
|
111
|
+
ctx.ui.notify("Plan mode disabled. Full access restored.");
|
|
112
|
+
}
|
|
113
|
+
updateStatus();
|
|
114
|
+
}
|
|
115
|
+
ctx.registerCommand({
|
|
116
|
+
path: ["tools", "plan"],
|
|
117
|
+
description: "Toggle plan mode (read-only exploration)",
|
|
118
|
+
handler: async (_ctx) => {
|
|
119
|
+
togglePlanMode();
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
ctx.registerShortcut("ctrl+alt+p", {
|
|
123
|
+
description: "Toggle plan mode",
|
|
124
|
+
handler: async () => {
|
|
125
|
+
togglePlanMode();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
ctx.on("tool:call", async (event) => {
|
|
129
|
+
if (!planModeEnabled || event.toolName !== "bash") return;
|
|
130
|
+
const command = event.args?.command;
|
|
131
|
+
if (command && !isSafeCommand(command)) {
|
|
132
|
+
ctx.ui.notify(
|
|
133
|
+
`Plan mode: Command blocked (not allowlisted). Use /plan to disable plan mode first.
|
|
134
|
+
Command: ${command}`,
|
|
135
|
+
"error"
|
|
136
|
+
);
|
|
137
|
+
return { block: true, reason: `Plan mode: command "${command}" is not in the allowlist. Disable plan mode with /plan to run this command.` };
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
ctx.on("agent:start", async () => {
|
|
141
|
+
if (planModeEnabled) {
|
|
142
|
+
ctx.log("[plan-mode] Injecting plan mode context");
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
ctx.on("turn:end", async (event) => {
|
|
146
|
+
if (!executionMode || todoItems.length === 0) return;
|
|
147
|
+
const message = event.message;
|
|
148
|
+
if (message?.role === "assistant" && Array.isArray(message.content)) {
|
|
149
|
+
const text = message.content.filter((c) => c.type === "text").map((c) => c.text).join("\n");
|
|
150
|
+
if (markCompletedSteps(text, todoItems) > 0) {
|
|
151
|
+
updateStatus();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
ctx.on("agent:end", async (event) => {
|
|
156
|
+
if (executionMode && todoItems.length > 0) {
|
|
157
|
+
if (todoItems.every((t) => t.completed)) {
|
|
158
|
+
const completedList = todoItems.map((t) => `\u2713 ${t.text}`).join("\n");
|
|
159
|
+
ctx.ui.notify(`**Plan Complete!** \u2713
|
|
160
|
+
|
|
161
|
+
${completedList}`, "info");
|
|
162
|
+
executionMode = false;
|
|
163
|
+
todoItems = [];
|
|
164
|
+
ctx.setActiveTools(NORMAL_MODE_TOOLS);
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (!planModeEnabled || !ctx.hasUI) return;
|
|
169
|
+
const messages = event.messages || [];
|
|
170
|
+
const lastAssistant = [...messages].reverse().find(
|
|
171
|
+
(m) => m.role === "assistant" && Array.isArray(m.content)
|
|
172
|
+
);
|
|
173
|
+
if (lastAssistant) {
|
|
174
|
+
const text = lastAssistant.content.filter((c) => c.type === "text").map((c) => c.text).join("\n");
|
|
175
|
+
const extracted = extractTodoItems(text);
|
|
176
|
+
if (extracted.length > 0) {
|
|
177
|
+
todoItems = extracted;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (todoItems.length > 0) {
|
|
181
|
+
const todoListText = todoItems.map((t) => `${t.step}. \u2610 ${t.text}`).join("\n");
|
|
182
|
+
ctx.ui.notify(`**Plan Steps (${todoItems.length}):**
|
|
183
|
+
${todoListText}`, "info");
|
|
184
|
+
const choice = await ctx.ui.select("Plan mode - what next?", [
|
|
185
|
+
todoItems.length > 0 ? "Execute the plan (track progress)" : "Execute the plan",
|
|
186
|
+
"Stay in plan mode",
|
|
187
|
+
"Refine the plan"
|
|
188
|
+
]);
|
|
189
|
+
if (choice?.startsWith("Execute")) {
|
|
190
|
+
planModeEnabled = false;
|
|
191
|
+
executionMode = todoItems.length > 0;
|
|
192
|
+
ctx.setPlanMode(false);
|
|
193
|
+
ctx.setActiveTools(NORMAL_MODE_TOOLS);
|
|
194
|
+
updateStatus();
|
|
195
|
+
const execMessage = todoItems.length > 0 ? `Execute the plan. Start with: ${todoItems[0].text}. Mark completed steps with [DONE:n] in your response.` : "Execute the plan you just created.";
|
|
196
|
+
ctx.sendUserMessage(execMessage);
|
|
197
|
+
} else if (choice === "Refine the plan") {
|
|
198
|
+
const refinement = await ctx.ui.editor("Refine the plan:", "");
|
|
199
|
+
if (refinement?.trim()) {
|
|
200
|
+
ctx.sendUserMessage(refinement.trim());
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
ctx.ui.notify("\u23F8\uFE0F Plan mode extension loaded", "info");
|
|
206
|
+
}
|
|
207
|
+
export {
|
|
208
|
+
planModeExtension as default
|
|
209
|
+
};
|