@poping/yome 0.0.2 → 0.0.4
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/LICENSE +202 -0
- package/NOTICE +11 -0
- package/README.md +306 -27
- package/README.zh-CN.md +333 -0
- package/bin/yome-calwatch +0 -0
- package/dist/agent.d.ts +24 -2
- package/dist/agent.js +34 -2
- package/dist/agent.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.js +121 -13
- package/dist/context.js.map +1 -1
- package/dist/daemon/calendarPermission.d.ts +10 -0
- package/dist/daemon/calendarPermission.js +68 -0
- package/dist/daemon/calendarPermission.js.map +1 -0
- package/dist/daemon/cronCli.d.ts +19 -0
- package/dist/daemon/cronCli.js +403 -0
- package/dist/daemon/cronCli.js.map +1 -0
- package/dist/daemon/envHint.d.ts +5 -0
- package/dist/daemon/envHint.js +139 -0
- package/dist/daemon/envHint.js.map +1 -0
- package/dist/daemon/humanCron.d.ts +1 -0
- package/dist/daemon/humanCron.js +72 -0
- package/dist/daemon/humanCron.js.map +1 -0
- package/dist/daemon/humanOnce.d.ts +1 -0
- package/dist/daemon/humanOnce.js +54 -0
- package/dist/daemon/humanOnce.js.map +1 -0
- package/dist/daemon/index.d.ts +5 -0
- package/dist/daemon/index.js +168 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/launchd.d.ts +7 -0
- package/dist/daemon/launchd.js +93 -0
- package/dist/daemon/launchd.js.map +1 -0
- package/dist/daemon/log.d.ts +17 -0
- package/dist/daemon/log.js +57 -0
- package/dist/daemon/log.js.map +1 -0
- package/dist/daemon/paths.d.ts +11 -0
- package/dist/daemon/paths.js +27 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/runTaskEntry.d.ts +1 -0
- package/dist/daemon/runTaskEntry.js +67 -0
- package/dist/daemon/runTaskEntry.js.map +1 -0
- package/dist/daemon/runner.d.ts +21 -0
- package/dist/daemon/runner.js +175 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/scheduler.d.ts +5 -0
- package/dist/daemon/scheduler.js +162 -0
- package/dist/daemon/scheduler.js.map +1 -0
- package/dist/daemon/taskStore.d.ts +62 -0
- package/dist/daemon/taskStore.js +88 -0
- package/dist/daemon/taskStore.js.map +1 -0
- package/dist/daemon/triggers/calendar.d.ts +8 -0
- package/dist/daemon/triggers/calendar.js +248 -0
- package/dist/daemon/triggers/calendar.js.map +1 -0
- package/dist/daemon/triggers/childRunner.d.ts +14 -0
- package/dist/daemon/triggers/childRunner.js +111 -0
- package/dist/daemon/triggers/childRunner.js.map +1 -0
- package/dist/daemon/triggers/cron.d.ts +14 -0
- package/dist/daemon/triggers/cron.js +91 -0
- package/dist/daemon/triggers/cron.js.map +1 -0
- package/dist/daemon/triggers/file.d.ts +7 -0
- package/dist/daemon/triggers/file.js +123 -0
- package/dist/daemon/triggers/file.js.map +1 -0
- package/dist/daemon/triggers/once.d.ts +10 -0
- package/dist/daemon/triggers/once.js +80 -0
- package/dist/daemon/triggers/once.js.map +1 -0
- package/dist/index.js +240 -15
- package/dist/index.js.map +1 -1
- package/dist/llm.js +45 -2
- package/dist/llm.js.map +1 -1
- package/dist/loops/chain.js +8 -0
- package/dist/loops/chain.js.map +1 -1
- package/dist/loops/evaluator.js +8 -0
- package/dist/loops/evaluator.js.map +1 -1
- package/dist/loops/orchestrator.js +8 -0
- package/dist/loops/orchestrator.js.map +1 -1
- package/dist/loops/parallel.js.map +1 -1
- package/dist/loops/route.js +8 -0
- package/dist/loops/route.js.map +1 -1
- package/dist/loops/simple.js +15 -0
- package/dist/loops/simple.js.map +1 -1
- package/dist/permissions/index.d.ts +1 -1
- package/dist/permissions/index.js +1 -1
- package/dist/permissions/index.js.map +1 -1
- package/dist/permissions/loader.d.ts +20 -1
- package/dist/permissions/loader.js +51 -0
- package/dist/permissions/loader.js.map +1 -1
- package/dist/redact.d.ts +56 -0
- package/dist/redact.js +191 -0
- package/dist/redact.js.map +1 -0
- package/dist/skills/runner/applescript.d.ts +49 -0
- package/dist/skills/runner/applescript.js +100 -0
- package/dist/skills/runner/applescript.js.map +1 -0
- package/dist/skills/runner/dispatcher.d.ts +128 -0
- package/dist/skills/runner/dispatcher.js +617 -0
- package/dist/skills/runner/dispatcher.js.map +1 -0
- package/dist/skills/runner/dispatcher.test.d.ts +1 -0
- package/dist/skills/runner/dispatcher.test.js +141 -0
- package/dist/skills/runner/dispatcher.test.js.map +1 -0
- package/dist/skills/runner/kernel.d.ts +8 -0
- package/dist/skills/runner/kernel.js +731 -0
- package/dist/skills/runner/kernel.js.map +1 -0
- package/dist/skills/runner/nodeBackend.d.ts +32 -0
- package/dist/skills/runner/nodeBackend.js +147 -0
- package/dist/skills/runner/nodeBackend.js.map +1 -0
- package/dist/skills/runner/tokenizer.d.ts +36 -0
- package/dist/skills/runner/tokenizer.js +177 -0
- package/dist/skills/runner/tokenizer.js.map +1 -0
- package/dist/state/todos.d.ts +12 -0
- package/dist/state/todos.js +32 -0
- package/dist/state/todos.js.map +1 -0
- package/dist/threadCli.d.ts +11 -0
- package/dist/threadCli.js +177 -0
- package/dist/threadCli.js.map +1 -0
- package/dist/threadShare.d.ts +21 -0
- package/dist/threadShare.js +121 -0
- package/dist/threadShare.js.map +1 -0
- package/dist/threadSubmit.d.ts +32 -0
- package/dist/threadSubmit.js +199 -0
- package/dist/threadSubmit.js.map +1 -0
- package/dist/tools/askUser.d.ts +20 -0
- package/dist/tools/askUser.js +126 -0
- package/dist/tools/askUser.js.map +1 -0
- package/dist/tools/bash.js +63 -14
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/index.d.ts +24 -2
- package/dist/tools/index.js +54 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/skillCall.d.ts +2 -0
- package/dist/tools/skillCall.js +77 -0
- package/dist/tools/skillCall.js.map +1 -0
- package/dist/tools/todoWrite.d.ts +2 -0
- package/dist/tools/todoWrite.js +141 -0
- package/dist/tools/todoWrite.js.map +1 -0
- package/dist/tools/yome.d.ts +2 -0
- package/dist/tools/yome.js +87 -0
- package/dist/tools/yome.js.map +1 -0
- package/dist/ui/AgentPicker.js +3 -3
- package/dist/ui/AgentPicker.js.map +1 -1
- package/dist/ui/App.js +263 -61
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/AskUserPrompt.d.ts +7 -0
- package/dist/ui/AskUserPrompt.js +78 -0
- package/dist/ui/AskUserPrompt.js.map +1 -0
- package/dist/ui/Banner.d.ts +2 -1
- package/dist/ui/Banner.js +23 -4
- package/dist/ui/Banner.js.map +1 -1
- package/dist/ui/InputBar.js +25 -36
- package/dist/ui/InputBar.js.map +1 -1
- package/dist/ui/Markdown.d.ts +2 -2
- package/dist/ui/Markdown.js +22 -7
- package/dist/ui/Markdown.js.map +1 -1
- package/dist/ui/MarketplacePicker.d.ts +7 -0
- package/dist/ui/MarketplacePicker.js +122 -0
- package/dist/ui/MarketplacePicker.js.map +1 -0
- package/dist/ui/MessageList.d.ts +12 -1
- package/dist/ui/MessageList.js +72 -7
- package/dist/ui/MessageList.js.map +1 -1
- package/dist/ui/ModelPicker.js +4 -4
- package/dist/ui/ModelPicker.js.map +1 -1
- package/dist/ui/MultilineTextInput.d.ts +31 -0
- package/dist/ui/MultilineTextInput.js +393 -0
- package/dist/ui/MultilineTextInput.js.map +1 -0
- package/dist/ui/MultilineTextInput.test.d.ts +1 -0
- package/dist/ui/MultilineTextInput.test.js +30 -0
- package/dist/ui/MultilineTextInput.test.js.map +1 -0
- package/dist/ui/PermissionPrompt.d.ts +16 -4
- package/dist/ui/PermissionPrompt.js +60 -15
- package/dist/ui/PermissionPrompt.js.map +1 -1
- package/dist/ui/SessionPicker.js +2 -2
- package/dist/ui/SessionPicker.js.map +1 -1
- package/dist/ui/ShimmerText.d.ts +8 -0
- package/dist/ui/ShimmerText.js +40 -0
- package/dist/ui/ShimmerText.js.map +1 -0
- package/dist/ui/Spinner.js +3 -9
- package/dist/ui/Spinner.js.map +1 -1
- package/dist/ui/TodoPanel.d.ts +7 -0
- package/dist/ui/TodoPanel.js +36 -0
- package/dist/ui/TodoPanel.js.map +1 -0
- package/dist/ui/TogglePicker.js +4 -4
- package/dist/ui/TogglePicker.js.map +1 -1
- package/dist/ui/ToolResult.js +6 -0
- package/dist/ui/ToolResult.js.map +1 -1
- package/dist/ui/UnifiedSkillsPicker.d.ts +10 -0
- package/dist/ui/UnifiedSkillsPicker.js +63 -0
- package/dist/ui/UnifiedSkillsPicker.js.map +1 -0
- package/dist/ui/animation.d.ts +3 -0
- package/dist/ui/animation.js +48 -0
- package/dist/ui/animation.js.map +1 -0
- package/dist/ui/useThrottledStream.d.ts +7 -0
- package/dist/ui/useThrottledStream.js +63 -0
- package/dist/ui/useThrottledStream.js.map +1 -0
- package/dist/yomeSkills/auth.d.ts +20 -0
- package/dist/yomeSkills/auth.js +70 -0
- package/dist/yomeSkills/auth.js.map +1 -0
- package/dist/yomeSkills/blacklist.d.ts +33 -0
- package/dist/yomeSkills/blacklist.js +101 -0
- package/dist/yomeSkills/blacklist.js.map +1 -0
- package/dist/yomeSkills/capabilities.d.ts +54 -0
- package/dist/yomeSkills/capabilities.js +175 -0
- package/dist/yomeSkills/capabilities.js.map +1 -0
- package/dist/yomeSkills/capabilityGuard.d.ts +31 -0
- package/dist/yomeSkills/capabilityGuard.js +113 -0
- package/dist/yomeSkills/capabilityGuard.js.map +1 -0
- package/dist/yomeSkills/cli.d.ts +25 -0
- package/dist/yomeSkills/cli.js +624 -0
- package/dist/yomeSkills/cli.js.map +1 -0
- package/dist/yomeSkills/deprecate.d.ts +29 -0
- package/dist/yomeSkills/deprecate.js +99 -0
- package/dist/yomeSkills/deprecate.js.map +1 -0
- package/dist/yomeSkills/devLink.d.ts +17 -0
- package/dist/yomeSkills/devLink.js +91 -0
- package/dist/yomeSkills/devLink.js.map +1 -0
- package/dist/yomeSkills/doctor.d.ts +13 -0
- package/dist/yomeSkills/doctor.js +152 -0
- package/dist/yomeSkills/doctor.js.map +1 -0
- package/dist/yomeSkills/enable.d.ts +8 -0
- package/dist/yomeSkills/enable.js +67 -0
- package/dist/yomeSkills/enable.js.map +1 -0
- package/dist/yomeSkills/hubPing.d.ts +1 -0
- package/dist/yomeSkills/hubPing.js +41 -0
- package/dist/yomeSkills/hubPing.js.map +1 -0
- package/dist/yomeSkills/install.d.ts +18 -0
- package/dist/yomeSkills/install.js +143 -0
- package/dist/yomeSkills/install.js.map +1 -0
- package/dist/yomeSkills/installFromHubTarball.d.ts +26 -0
- package/dist/yomeSkills/installFromHubTarball.js +161 -0
- package/dist/yomeSkills/installFromHubTarball.js.map +1 -0
- package/dist/yomeSkills/installGithub.d.ts +33 -0
- package/dist/yomeSkills/installGithub.js +213 -0
- package/dist/yomeSkills/installGithub.js.map +1 -0
- package/dist/yomeSkills/installMeta.d.ts +8 -0
- package/dist/yomeSkills/installMeta.js +76 -0
- package/dist/yomeSkills/installMeta.js.map +1 -0
- package/dist/yomeSkills/integrity.d.ts +26 -0
- package/dist/yomeSkills/integrity.js +107 -0
- package/dist/yomeSkills/integrity.js.map +1 -0
- package/dist/yomeSkills/invoke.d.ts +29 -0
- package/dist/yomeSkills/invoke.js +135 -0
- package/dist/yomeSkills/invoke.js.map +1 -0
- package/dist/yomeSkills/list.d.ts +11 -0
- package/dist/yomeSkills/list.js +55 -0
- package/dist/yomeSkills/list.js.map +1 -0
- package/dist/yomeSkills/login.d.ts +41 -0
- package/dist/yomeSkills/login.js +221 -0
- package/dist/yomeSkills/login.js.map +1 -0
- package/dist/yomeSkills/manifest.d.ts +60 -0
- package/dist/yomeSkills/manifest.js +47 -0
- package/dist/yomeSkills/manifest.js.map +1 -0
- package/dist/yomeSkills/paths.d.ts +13 -0
- package/dist/yomeSkills/paths.js +33 -0
- package/dist/yomeSkills/paths.js.map +1 -0
- package/dist/yomeSkills/publish.d.ts +18 -0
- package/dist/yomeSkills/publish.js +114 -0
- package/dist/yomeSkills/publish.js.map +1 -0
- package/dist/yomeSkills/rollback.d.ts +10 -0
- package/dist/yomeSkills/rollback.js +83 -0
- package/dist/yomeSkills/rollback.js.map +1 -0
- package/dist/yomeSkills/search.d.ts +21 -0
- package/dist/yomeSkills/search.js +31 -0
- package/dist/yomeSkills/search.js.map +1 -0
- package/dist/yomeSkills/skillsIndex.d.ts +36 -0
- package/dist/yomeSkills/skillsIndex.js +111 -0
- package/dist/yomeSkills/skillsIndex.js.map +1 -0
- package/dist/yomeSkills/unified.d.ts +53 -0
- package/dist/yomeSkills/unified.js +187 -0
- package/dist/yomeSkills/unified.js.map +1 -0
- package/dist/yomeSkills/uninstall.d.ts +7 -0
- package/dist/yomeSkills/uninstall.js +22 -0
- package/dist/yomeSkills/uninstall.js.map +1 -0
- package/dist/yomeSkills/update.d.ts +18 -0
- package/dist/yomeSkills/update.js +75 -0
- package/dist/yomeSkills/update.js.map +1 -0
- package/dist/yomeSkills/validate.d.ts +11 -0
- package/dist/yomeSkills/validate.js +99 -0
- package/dist/yomeSkills/validate.js.map +1 -0
- package/package.json +23 -6
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// cli/src/tools/todoWrite.ts
|
|
2
|
+
//
|
|
3
|
+
// `TodoWrite` — agent tool that creates / updates a session-scope task
|
|
4
|
+
// checklist. Mirrors Claude Code's TodoWriteTool semantics:
|
|
5
|
+
// - the agent always submits the FULL list (replacement, not patch)
|
|
6
|
+
// - exactly one item should be in_progress at a time (validated)
|
|
7
|
+
// - each item carries both `content` (imperative) and `activeForm`
|
|
8
|
+
// (present continuous) so the UI can show "Doing X" naturally
|
|
9
|
+
//
|
|
10
|
+
// State lives in cli/src/state/todos.ts; the UI subscribes to it.
|
|
11
|
+
import { setTodos } from '../state/todos.js';
|
|
12
|
+
const VALID_STATUS = new Set(['pending', 'in_progress', 'completed']);
|
|
13
|
+
const PROMPT = `Use this tool to create and maintain a structured checklist for the current task. It helps you organize multi-step work, demonstrate progress to the user, and avoid losing track of follow-ups discovered along the way.
|
|
14
|
+
|
|
15
|
+
## When to use
|
|
16
|
+
1. Multi-step work — 3 or more distinct actions
|
|
17
|
+
2. Non-trivial tasks that need planning or several operations
|
|
18
|
+
3. The user explicitly asks for a todo list, OR provides several tasks at once
|
|
19
|
+
4. Right after receiving a fresh batch of instructions — capture them as todos
|
|
20
|
+
5. The MOMENT you start working on an item — flip it to in_progress BEFORE you begin
|
|
21
|
+
6. The MOMENT you finish an item — flip it to completed; don't batch completions
|
|
22
|
+
7. When new follow-ups appear during implementation — add them
|
|
23
|
+
|
|
24
|
+
## When NOT to use
|
|
25
|
+
1. Single, trivial task
|
|
26
|
+
2. Less than 3 meaningful steps
|
|
27
|
+
3. Pure conversation / Q&A
|
|
28
|
+
If only one obvious step is needed, just do it.
|
|
29
|
+
|
|
30
|
+
## Status discipline
|
|
31
|
+
- pending — not started
|
|
32
|
+
- in_progress — exactly ONE item should be in_progress at any time
|
|
33
|
+
- completed — only when fully verified (tests pass, files saved, command succeeded)
|
|
34
|
+
|
|
35
|
+
If something is blocked, KEEP it in_progress and add a new item describing the blocker. Never mark something completed when there's an unresolved error.
|
|
36
|
+
|
|
37
|
+
## Field shape
|
|
38
|
+
Every item must have:
|
|
39
|
+
- content : imperative form, e.g. "Run the tests"
|
|
40
|
+
- activeForm : present continuous, e.g. "Running the tests"
|
|
41
|
+
- status : "pending" | "in_progress" | "completed"
|
|
42
|
+
|
|
43
|
+
## Submission
|
|
44
|
+
You always send the COMPLETE list, not a patch. The previous list is replaced.
|
|
45
|
+
`;
|
|
46
|
+
const DESCRIPTION = 'Update the todo list for the current session. Use proactively for any task with 3+ steps. ' +
|
|
47
|
+
'Always submit the FULL list (replacement, not patch). Keep exactly one item in_progress at a time. ' +
|
|
48
|
+
'Each item needs `content` (imperative), `activeForm` (present continuous), and `status` ' +
|
|
49
|
+
'("pending" | "in_progress" | "completed").';
|
|
50
|
+
export const todoWriteTool = {
|
|
51
|
+
name: 'TodoWrite',
|
|
52
|
+
description: DESCRIPTION + '\n\n' + PROMPT,
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
todos: {
|
|
57
|
+
type: 'array',
|
|
58
|
+
description: 'The complete updated todo list (replaces the previous list).',
|
|
59
|
+
items: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
content: {
|
|
63
|
+
type: 'string',
|
|
64
|
+
description: 'Imperative form, e.g. "Run the tests".',
|
|
65
|
+
},
|
|
66
|
+
activeForm: {
|
|
67
|
+
type: 'string',
|
|
68
|
+
description: 'Present continuous form, e.g. "Running the tests".',
|
|
69
|
+
},
|
|
70
|
+
status: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
enum: ['pending', 'in_progress', 'completed'],
|
|
73
|
+
description: 'Current state of the todo item.',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
required: ['content', 'activeForm', 'status'],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
required: ['todos'],
|
|
81
|
+
},
|
|
82
|
+
isReadOnly() { return false; },
|
|
83
|
+
// TodoWrite mutates session-scope memory only — no files, no shell, no
|
|
84
|
+
// network. There's nothing to ask the user about; auto-allow so the
|
|
85
|
+
// panel updates instantly without an approval prompt.
|
|
86
|
+
checkPermissions() {
|
|
87
|
+
return { behavior: 'allow' };
|
|
88
|
+
},
|
|
89
|
+
validateInput(input) {
|
|
90
|
+
if (!Array.isArray(input.todos)) {
|
|
91
|
+
return { valid: false, error: 'todos must be an array' };
|
|
92
|
+
}
|
|
93
|
+
let inProgressCount = 0;
|
|
94
|
+
for (let i = 0; i < input.todos.length; i++) {
|
|
95
|
+
const t = input.todos[i];
|
|
96
|
+
if (!t || typeof t !== 'object') {
|
|
97
|
+
return { valid: false, error: `todos[${i}] must be an object` };
|
|
98
|
+
}
|
|
99
|
+
if (typeof t.content !== 'string' || !t.content.trim()) {
|
|
100
|
+
return { valid: false, error: `todos[${i}].content must be a non-empty string` };
|
|
101
|
+
}
|
|
102
|
+
if (typeof t.activeForm !== 'string' || !t.activeForm.trim()) {
|
|
103
|
+
return { valid: false, error: `todos[${i}].activeForm must be a non-empty string` };
|
|
104
|
+
}
|
|
105
|
+
if (typeof t.status !== 'string' || !VALID_STATUS.has(t.status)) {
|
|
106
|
+
return {
|
|
107
|
+
valid: false,
|
|
108
|
+
error: `todos[${i}].status must be one of: pending, in_progress, completed`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (t.status === 'in_progress')
|
|
112
|
+
inProgressCount++;
|
|
113
|
+
}
|
|
114
|
+
if (inProgressCount > 1) {
|
|
115
|
+
return {
|
|
116
|
+
valid: false,
|
|
117
|
+
error: `at most one todo may be in_progress at a time (got ${inProgressCount})`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return { valid: true };
|
|
121
|
+
},
|
|
122
|
+
async execute(input) {
|
|
123
|
+
const todos = input.todos.map((t) => ({
|
|
124
|
+
content: t.content.trim(),
|
|
125
|
+
activeForm: t.activeForm.trim(),
|
|
126
|
+
status: t.status,
|
|
127
|
+
}));
|
|
128
|
+
const allDone = todos.length > 0 && todos.every((t) => t.status === 'completed');
|
|
129
|
+
// When every item is done, drop the panel entirely (mirrors Claude
|
|
130
|
+
// Code's behaviour: a completed list has no further signal value
|
|
131
|
+
// and just adds visual noise above the next prompt). The agent is
|
|
132
|
+
// expected to write its final summary right after — the empty space
|
|
133
|
+
// gets reused immediately.
|
|
134
|
+
setTodos(allDone ? [] : todos);
|
|
135
|
+
if (allDone) {
|
|
136
|
+
return 'All todos completed — the task list has been cleared. Write your final summary now (or add follow-up items if work remains).';
|
|
137
|
+
}
|
|
138
|
+
return 'Todos updated. Keep working through the in_progress item; flip status as soon as it ships or as soon as a new step starts.';
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=todoWrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todoWrite.js","sourceRoot":"","sources":["../../src/tools/todoWrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// cli/src/tools/yome.ts
|
|
2
|
+
//
|
|
3
|
+
// `Yome` — agent tool that runs an installed yome hub-skill command.
|
|
4
|
+
//
|
|
5
|
+
// This tool is the ONLY correct way to invoke installed skills (xl, ppt,
|
|
6
|
+
// cal, fs, rem, …). It accepts the same shorthand a human would type
|
|
7
|
+
// (`xl books`, `ppt new ~/Desktop/x.pptx`, `xl batch <<EOF…EOF`) and
|
|
8
|
+
// dispatches through the yome agentic kernel — same path the macOS app
|
|
9
|
+
// uses, with capability gating, AppleScript template render, argv
|
|
10
|
+
// parsing, and `--help` at three levels (global / domain / action).
|
|
11
|
+
//
|
|
12
|
+
// ── Why this is split from `Bash` ───────────────────────────────────
|
|
13
|
+
//
|
|
14
|
+
// Bash used to call `tryKernel()` *implicitly* before falling back to
|
|
15
|
+
// /bin/sh. That was confusing — the same `Bash(xl books)` call could be
|
|
16
|
+
// running AppleScript templates or shelling out, and when something
|
|
17
|
+
// went wrong (e.g. a stale install in ~/.yome/skills) it was hard for
|
|
18
|
+
// the user to tell which path actually executed.
|
|
19
|
+
//
|
|
20
|
+
// Now the routing is explicit:
|
|
21
|
+
//
|
|
22
|
+
// * `Yome` → only the yome kernel, no shell fallback. If the command
|
|
23
|
+
// is not a recognised hub-skill invocation, the tool returns an
|
|
24
|
+
// error explaining why instead of silently passing it to /bin/sh.
|
|
25
|
+
//
|
|
26
|
+
// * `Bash` → only system shell. No kernel intercept, no surprises.
|
|
27
|
+
//
|
|
28
|
+
// The agent is expected to pick the right tool from the start.
|
|
29
|
+
import { tryKernel } from '../skills/runner/kernel.js';
|
|
30
|
+
const MAX_OUTPUT = 20_000;
|
|
31
|
+
function formatOutput(stdout, stderr, exitCode) {
|
|
32
|
+
if (exitCode === 0) {
|
|
33
|
+
const result = stdout.trim();
|
|
34
|
+
if (result.length > MAX_OUTPUT) {
|
|
35
|
+
return result.slice(0, MAX_OUTPUT) + `\n\n[Output truncated at ${MAX_OUTPUT} chars]`;
|
|
36
|
+
}
|
|
37
|
+
return result || '(no output)';
|
|
38
|
+
}
|
|
39
|
+
const output = [stdout.trim(), stderr.trim()].filter(Boolean).join('\n');
|
|
40
|
+
return `Exit code: ${exitCode}\n${output}`;
|
|
41
|
+
}
|
|
42
|
+
export const yomeTool = {
|
|
43
|
+
name: 'Yome',
|
|
44
|
+
description: 'Invoke an installed yome hub-skill command (xl, ppt, cal, fs, rem, …). ' +
|
|
45
|
+
'Pass the command line exactly as a human would type it: e.g. ' +
|
|
46
|
+
'`xl books`, `xl sheets`, `ppt new ~/Desktop/x.pptx`, `xl find 客户`. ' +
|
|
47
|
+
'Supports `--help` at every level: `yome-skills` (list installed), ' +
|
|
48
|
+
'`<domain> --help` (list actions), `<domain> <action> --help` (action args), ' +
|
|
49
|
+
'plus `<domain> batch` for stdin-fed multi-command runs. ' +
|
|
50
|
+
'This tool ONLY runs hub-skill commands — it does NOT fall back to /bin/sh. ' +
|
|
51
|
+
'For real shell operations (ls, cat, git, mkdir, …) use the Bash tool.',
|
|
52
|
+
inputSchema: {
|
|
53
|
+
type: 'object',
|
|
54
|
+
properties: {
|
|
55
|
+
command: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'The skill command line. First token must be an installed skill domain ' +
|
|
58
|
+
'(see `yome-skills` for the list). Compound shell (pipes, redirects, `;`) ' +
|
|
59
|
+
'is not supported here — use Bash for that.',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
required: ['command'],
|
|
63
|
+
},
|
|
64
|
+
isReadOnly() { return false; },
|
|
65
|
+
validateInput(input) {
|
|
66
|
+
if (typeof input.command !== 'string' || !input.command.trim()) {
|
|
67
|
+
return { valid: false, error: 'command is required' };
|
|
68
|
+
}
|
|
69
|
+
return { valid: true };
|
|
70
|
+
},
|
|
71
|
+
async execute(input) {
|
|
72
|
+
const command = input.command.trim();
|
|
73
|
+
const k = await tryKernel(command);
|
|
74
|
+
if (!k.handled) {
|
|
75
|
+
return (`Exit code: 2\n` +
|
|
76
|
+
`Yome tool: command not recognised as a hub-skill invocation.\n` +
|
|
77
|
+
` command: ${command}\n` +
|
|
78
|
+
`Possible causes:\n` +
|
|
79
|
+
` - first token is not an installed skill domain (run \`yome-skills\` to list)\n` +
|
|
80
|
+
` - first token is a reserved system command (ls, git, …) — use Bash for shell ops\n` +
|
|
81
|
+
` - command is compound (pipes, &&, ;, redirects) — Yome runs single skill calls only\n` +
|
|
82
|
+
`If you intended a real shell command, retry with the Bash tool.`);
|
|
83
|
+
}
|
|
84
|
+
return formatOutput(k.stdout, k.stderr, k.exitCode);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=yome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yome.js","sourceRoot":"","sources":["../../src/tools/yome.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,EAAE;AACF,qEAAqE;AACrE,EAAE;AACF,yEAAyE;AACzE,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,kEAAkE;AAClE,oEAAoE;AACpE,EAAE;AACF,uEAAuE;AACvE,EAAE;AACF,sEAAsE;AACtE,wEAAwE;AACxE,oEAAoE;AACpE,sEAAsE;AACtE,iDAAiD;AACjD,EAAE;AACF,+BAA+B;AAC/B,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,sEAAsE;AACtE,EAAE;AACF,qEAAqE;AACrE,EAAE;AACF,+DAA+D;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,SAAS,YAAY,CAAC,MAAc,EAAE,MAAc,EAAE,QAAgB;IACpE,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,4BAA4B,UAAU,SAAS,CAAC;QACvF,CAAC;QACD,OAAO,MAAM,IAAI,aAAa,CAAC;IACjC,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,OAAO,cAAc,QAAQ,KAAK,MAAM,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAY;IAC/B,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,yEAAyE;QACzE,+DAA+D;QAC/D,qEAAqE;QACrE,oEAAoE;QACpE,8EAA8E;QAC9E,0DAA0D;QAC1D,6EAA6E;QAC7E,uEAAuE;IACzE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wEAAwE;oBACxE,2EAA2E;oBAC3E,4CAA4C;aAC/C;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9B,aAAa,CAAC,KAAK;QACjB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,KAAK;QACjB,MAAM,OAAO,GAAI,KAAK,CAAC,OAAkB,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,CACL,gBAAgB;gBAChB,gEAAgE;gBAChE,cAAc,OAAO,IAAI;gBACzB,oBAAoB;gBACpB,kFAAkF;gBAClF,sFAAsF;gBACtF,yFAAyF;gBACzF,iEAAiE,CAClE,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;CACF,CAAC"}
|
package/dist/ui/AgentPicker.js
CHANGED
|
@@ -21,12 +21,12 @@ export function AgentPicker({ options, onSelect, onCancel }) {
|
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
23
|
const maxNameLen = Math.max(...options.map((o) => o.name.length));
|
|
24
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, paddingY: 0, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "
|
|
24
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, paddingY: 0, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "#E87B35", children: "Agent Loop" }), _jsxs(Text, { dimColor: true, children: [" ", '\u2014', " select with ", '\u2191\u2193', ", confirm with Enter, Esc to cancel"] })] }), options.map((opt, i) => {
|
|
25
25
|
const isFocused = i === cursor;
|
|
26
26
|
const pointer = isFocused ? '\u276F' : ' ';
|
|
27
|
-
const nameColor = opt.active ? '
|
|
27
|
+
const nameColor = opt.active ? '#E87B35' : isFocused ? '#E87B35' : undefined;
|
|
28
28
|
const padded = opt.name.padEnd(maxNameLen + 2);
|
|
29
|
-
return (_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? '
|
|
29
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? '#E87B35' : undefined, children: [pointer, " "] }), _jsx(Text, { bold: true, color: nameColor, children: padded }), opt.active && _jsx(Text, { color: "#E87B35", dimColor: true, children: ' (active) ' }), !opt.active && _jsx(Text, { children: ' ' }), _jsx(Text, { dimColor: !isFocused, children: opt.description })] }, opt.name));
|
|
30
30
|
}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " navigate ", ' ', " Enter select ", ' ', " Esc cancel"] }) })] }));
|
|
31
31
|
}
|
|
32
32
|
//# sourceMappingURL=AgentPicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentPicker.js","sourceRoot":"","sources":["../../src/ui/AgentPicker.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAc1C,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAoB;IAC3E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACzB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;YACrD,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aACzF,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"AgentPicker.js","sourceRoot":"","sources":["../../src/ui/AgentPicker.tsx"],"names":[],"mappings":"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"}
|