@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,177 @@
|
|
|
1
|
+
// cli/src/threadCli.ts — `yome thread <subcommand>` dispatcher.
|
|
2
|
+
//
|
|
3
|
+
// Subcommands:
|
|
4
|
+
// yome thread list
|
|
5
|
+
// yome thread share <session-id> --skill=<slug> [--out=<dir>] [--no-redact]
|
|
6
|
+
// [--submit] [--case-id=<id>] [--dry-run]
|
|
7
|
+
// yome thread submit <bundle-dir> --skill=<slug>
|
|
8
|
+
// [--case-id=<id>] [--dry-run] [--verbose]
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join, resolve } from 'node:path';
|
|
11
|
+
import { buildShareBundle } from './threadShare.js';
|
|
12
|
+
import { submitBundle } from './threadSubmit.js';
|
|
13
|
+
import { listSessions } from './sessions.js';
|
|
14
|
+
export async function runThreadSubcommand(args, flags) {
|
|
15
|
+
const sub = args[0];
|
|
16
|
+
switch (sub) {
|
|
17
|
+
case 'share':
|
|
18
|
+
return doShare(args.slice(1), flags);
|
|
19
|
+
case 'submit':
|
|
20
|
+
return doSubmit(args.slice(1), flags);
|
|
21
|
+
case 'list':
|
|
22
|
+
case 'ls':
|
|
23
|
+
return doList();
|
|
24
|
+
case undefined:
|
|
25
|
+
case 'help':
|
|
26
|
+
case '--help':
|
|
27
|
+
printThreadHelp();
|
|
28
|
+
return 0;
|
|
29
|
+
default:
|
|
30
|
+
console.error(`Unknown subcommand: yome thread ${sub}`);
|
|
31
|
+
printThreadHelp();
|
|
32
|
+
return 2;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function doShare(args, flags) {
|
|
36
|
+
const sessionId = args[0];
|
|
37
|
+
if (!sessionId) {
|
|
38
|
+
console.error('Usage: yome thread share <session-id> --skill=<slug> [--out=<dir>] [--no-redact]');
|
|
39
|
+
return 2;
|
|
40
|
+
}
|
|
41
|
+
if (!flags.skill) {
|
|
42
|
+
console.error('--skill=<slug> is required (e.g. --skill=@yome/ppt)');
|
|
43
|
+
return 2;
|
|
44
|
+
}
|
|
45
|
+
const outDir = flags.out
|
|
46
|
+
? resolve(flags.out)
|
|
47
|
+
: join(homedir(), '.yome', 'shares', `${sessionId}-${Date.now()}`);
|
|
48
|
+
const result = buildShareBundle({
|
|
49
|
+
sessionId,
|
|
50
|
+
skillSlug: flags.skill,
|
|
51
|
+
outDir,
|
|
52
|
+
rules: flags.noRedact ? [] : undefined,
|
|
53
|
+
});
|
|
54
|
+
if (!result.ok) {
|
|
55
|
+
console.error(`✗ share failed: ${result.reason}`);
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
console.log(`✓ wrote bundle → ${result.outDir}`);
|
|
59
|
+
console.log(` messages: ${result.messageCount} tool calls: ${result.toolCallCount}`);
|
|
60
|
+
if (result.hits.length === 0) {
|
|
61
|
+
console.log(' redaction: no hits');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(' redaction:');
|
|
65
|
+
for (const h of result.hits) {
|
|
66
|
+
const samples = h.samples.length === 0 ? '' : ` e.g. ${h.samples.map(s => JSON.stringify(s)).join(', ')}`;
|
|
67
|
+
console.log(` ${h.rule.padEnd(20)} ×${h.count}${samples}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
console.log('');
|
|
71
|
+
if (flags.submit) {
|
|
72
|
+
console.log('Submitting bundle as a PR …');
|
|
73
|
+
const submit = submitBundle({
|
|
74
|
+
bundleDir: result.outDir,
|
|
75
|
+
skillSlug: flags.skill,
|
|
76
|
+
caseId: flags.caseId,
|
|
77
|
+
dryRun: !!flags.dryRun,
|
|
78
|
+
verbose: !!flags.verbose,
|
|
79
|
+
});
|
|
80
|
+
if (!submit.ok) {
|
|
81
|
+
console.error(`✗ submit failed: ${submit.reason}`);
|
|
82
|
+
if (submit.cloneDir)
|
|
83
|
+
console.error(` clone left at: ${submit.cloneDir}`);
|
|
84
|
+
return 1;
|
|
85
|
+
}
|
|
86
|
+
if (submit.prUrl) {
|
|
87
|
+
console.log(`✓ PR opened: ${submit.prUrl}`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log(`✓ dry-run prepared in: ${submit.cloneDir}`);
|
|
91
|
+
console.log(` branch: ${submit.branch} (not pushed)`);
|
|
92
|
+
}
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
console.log('Next: review files in the bundle, fill in fixtures.json,');
|
|
96
|
+
console.log(`then run: yome thread submit ${result.outDir} --skill=${flags.skill}`);
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
function doSubmit(args, flags) {
|
|
100
|
+
const bundleDir = args[0];
|
|
101
|
+
if (!bundleDir) {
|
|
102
|
+
console.error('Usage: yome thread submit <bundle-dir> --skill=<slug> [--case-id=<id>] [--dry-run] [--verbose]');
|
|
103
|
+
return 2;
|
|
104
|
+
}
|
|
105
|
+
if (!flags.skill) {
|
|
106
|
+
console.error('--skill=<slug> is required (e.g. --skill=@yome/ppt)');
|
|
107
|
+
return 2;
|
|
108
|
+
}
|
|
109
|
+
const result = submitBundle({
|
|
110
|
+
bundleDir: resolve(bundleDir),
|
|
111
|
+
skillSlug: flags.skill,
|
|
112
|
+
caseId: flags.caseId,
|
|
113
|
+
dryRun: !!flags.dryRun,
|
|
114
|
+
verbose: !!flags.verbose,
|
|
115
|
+
});
|
|
116
|
+
if (!result.ok) {
|
|
117
|
+
console.error(`✗ submit failed: ${result.reason}`);
|
|
118
|
+
if (result.cloneDir)
|
|
119
|
+
console.error(` clone left at: ${result.cloneDir}`);
|
|
120
|
+
return 1;
|
|
121
|
+
}
|
|
122
|
+
if (result.prUrl) {
|
|
123
|
+
console.log(`✓ PR opened: ${result.prUrl}`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log(`✓ dry-run prepared in: ${result.cloneDir}`);
|
|
127
|
+
console.log(` branch: ${result.branch} (not pushed)`);
|
|
128
|
+
}
|
|
129
|
+
console.log(` upstream: ${result.upstream}`);
|
|
130
|
+
console.log(` case-id : ${result.caseId}`);
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
function doList() {
|
|
134
|
+
const items = listSessions();
|
|
135
|
+
if (items.length === 0) {
|
|
136
|
+
console.log('No sessions found for this cwd.');
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
const idW = Math.max(8, ...items.map(i => i.sessionId.length));
|
|
140
|
+
const titleW = Math.max(5, ...items.map(i => Math.min(60, i.title.length)));
|
|
141
|
+
const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
|
|
142
|
+
const trunc = (s, n) => s.length > n ? s.slice(0, n - 1) + '…' : s;
|
|
143
|
+
console.log(` ${pad('SESSION', idW)} ${pad('TITLE', titleW)} MSGS MODIFIED`);
|
|
144
|
+
for (const i of items) {
|
|
145
|
+
console.log(` ${pad(i.sessionId, idW)} ${pad(trunc(i.title, titleW), titleW)} ${String(i.messageCount).padStart(4)} ${i.lastModified.toISOString().slice(0, 19)}`);
|
|
146
|
+
}
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
function printThreadHelp() {
|
|
150
|
+
console.log(`
|
|
151
|
+
yome thread — manage and share agent threads
|
|
152
|
+
|
|
153
|
+
Subcommands:
|
|
154
|
+
share <session-id> --skill=<slug> Build a redacted case bundle from a session
|
|
155
|
+
[--out=<dir>] (default: ~/.yome/shares/<id>-<ts>/)
|
|
156
|
+
[--no-redact] Disable the default redactor (NOT recommended)
|
|
157
|
+
[--submit] Open a PR to the skill repo right after share
|
|
158
|
+
[--case-id=<id>] Override the cases/<domain>/<id>/ name
|
|
159
|
+
[--dry-run] (with --submit) prepare the commit but don't push
|
|
160
|
+
[--verbose] Print every git/gh shell command
|
|
161
|
+
|
|
162
|
+
submit <bundle-dir> --skill=<slug> Push an existing bundle as a PR
|
|
163
|
+
[--case-id=<id>] [--dry-run] [--verbose]
|
|
164
|
+
|
|
165
|
+
list List sessions in the current cwd
|
|
166
|
+
|
|
167
|
+
Examples:
|
|
168
|
+
yome thread list
|
|
169
|
+
yome thread share 7c1f2e... --skill=@yome/ppt
|
|
170
|
+
yome thread share 7c1f2e... --skill=@yome/ppt --submit
|
|
171
|
+
yome thread submit ~/.yome/shares/7c1f2e-1745... --skill=@yome/ppt --dry-run
|
|
172
|
+
|
|
173
|
+
Requires gh CLI authenticated (gh auth login). The token-less hub-bot relay
|
|
174
|
+
path is planned for Phase 3 and not yet implemented.
|
|
175
|
+
`);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=threadCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threadCli.js","sourceRoot":"","sources":["../src/threadCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type RedactionRule, type RuleHit } from './redact.js';
|
|
2
|
+
export interface BuildBundleOptions {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
/** Skill slug the bundle targets, e.g. "@yome/ppt". Goes into README. */
|
|
5
|
+
skillSlug: string;
|
|
6
|
+
/** Where to write the bundle directory. The dir is created (must not exist). */
|
|
7
|
+
outDir: string;
|
|
8
|
+
/** Override default rules. Pass [] to skip redaction entirely. */
|
|
9
|
+
rules?: RedactionRule[];
|
|
10
|
+
}
|
|
11
|
+
export type BuildBundleResult = {
|
|
12
|
+
ok: true;
|
|
13
|
+
outDir: string;
|
|
14
|
+
messageCount: number;
|
|
15
|
+
toolCallCount: number;
|
|
16
|
+
hits: RuleHit[];
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
reason: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function buildShareBundle(opts: BuildBundleOptions): BuildBundleResult;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// cli/src/threadShare.ts — Build a shareable case bundle from a session.
|
|
2
|
+
//
|
|
3
|
+
// Steps (per spec 9.1):
|
|
4
|
+
// 1. Load all messages for <sessionId>
|
|
5
|
+
// 2. Run ThreadRedactor over messages and trace
|
|
6
|
+
// 3. Emit a directory bundle:
|
|
7
|
+
// thread.json — redacted message timeline
|
|
8
|
+
// trace.json — redacted tool_use/tool_result extracted from messages
|
|
9
|
+
// fixtures.json — sandbox-friendly initial state stub (skill-specific)
|
|
10
|
+
// README.md — human-readable summary + rule-hit table
|
|
11
|
+
//
|
|
12
|
+
// We intentionally do NOT make any network call here. The PR/fork submission
|
|
13
|
+
// step (spec 9.1 step 5) is a follow-up command that consumes this bundle.
|
|
14
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { loadSessionMessages } from './sessions.js';
|
|
17
|
+
import { DEFAULT_RULES, redactValue, totalHits, } from './redact.js';
|
|
18
|
+
/**
|
|
19
|
+
* Walk an AgentMessage list to extract tool calls in order. Each tool_use
|
|
20
|
+
* is matched with its tool_result by id (results may live in the next user
|
|
21
|
+
* message per Anthropic format).
|
|
22
|
+
*/
|
|
23
|
+
function extractTrace(messages) {
|
|
24
|
+
const steps = [];
|
|
25
|
+
const indexById = new Map();
|
|
26
|
+
for (const msg of messages) {
|
|
27
|
+
const blocks = typeof msg.content === 'string'
|
|
28
|
+
? [{ type: 'text', text: msg.content }]
|
|
29
|
+
: msg.content;
|
|
30
|
+
for (const block of blocks) {
|
|
31
|
+
if (block.type === 'tool_use') {
|
|
32
|
+
const tu = block;
|
|
33
|
+
const idx = steps.length;
|
|
34
|
+
indexById.set(tu.id, idx);
|
|
35
|
+
steps.push({ index: idx, toolUseId: tu.id, toolName: tu.name, input: tu.input });
|
|
36
|
+
}
|
|
37
|
+
else if (block.type === 'tool_result') {
|
|
38
|
+
const tr = block;
|
|
39
|
+
const idx = indexById.get(tr.tool_use_id);
|
|
40
|
+
if (idx !== undefined)
|
|
41
|
+
steps[idx].result = tr.content;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return steps;
|
|
46
|
+
}
|
|
47
|
+
function renderReadme(opts) {
|
|
48
|
+
const hitTable = opts.hits.length === 0
|
|
49
|
+
? '_No redactions applied — thread had no detectable PII / secrets / paths._'
|
|
50
|
+
: [
|
|
51
|
+
'| Rule | Count | Samples |',
|
|
52
|
+
'| --- | ---: | --- |',
|
|
53
|
+
...opts.hits.map(h => `| \`${h.rule}\` | ${h.count} | ${h.samples.map(s => `\`${s.replace(/\|/g, '\\|')}\``).join(', ')} |`),
|
|
54
|
+
].join('\n');
|
|
55
|
+
return `# Case for ${opts.skillSlug}
|
|
56
|
+
|
|
57
|
+
Generated from session \`${opts.sessionId}\` by \`yome thread share\`.
|
|
58
|
+
|
|
59
|
+
- Messages: **${opts.messageCount}**
|
|
60
|
+
- Tool calls: **${opts.toolCallCount}**
|
|
61
|
+
|
|
62
|
+
## Files
|
|
63
|
+
|
|
64
|
+
- \`thread.json\` — full message timeline (redacted)
|
|
65
|
+
- \`trace.json\` — flattened tool_use → tool_result steps (redacted)
|
|
66
|
+
- \`fixtures.json\` — placeholder for sandbox-replay initial state; **fill in** the skill-specific world before opening a PR
|
|
67
|
+
|
|
68
|
+
## Redaction summary
|
|
69
|
+
|
|
70
|
+
${hitTable}
|
|
71
|
+
|
|
72
|
+
## How this bundle is used
|
|
73
|
+
|
|
74
|
+
The skill's GitHub repo \`cases/<slug>/\` accepts directories like this one
|
|
75
|
+
as new replayable cases. Sandbox runs the skill against \`fixtures.json\`
|
|
76
|
+
and compares the actual trace against \`trace.json\`.
|
|
77
|
+
|
|
78
|
+
> Always re-read the redacted files yourself before opening a PR — the
|
|
79
|
+
> redactor is a best-effort safety net, not a guarantee.
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
export function buildShareBundle(opts) {
|
|
83
|
+
const messages = loadSessionMessages(opts.sessionId);
|
|
84
|
+
if (messages.length === 0) {
|
|
85
|
+
return { ok: false, reason: `session ${opts.sessionId} has no messages (or does not exist for this cwd)` };
|
|
86
|
+
}
|
|
87
|
+
const rules = opts.rules ?? DEFAULT_RULES;
|
|
88
|
+
const trace = extractTrace(messages);
|
|
89
|
+
const redactedMessagesResult = redactValue(messages, rules);
|
|
90
|
+
const redactedTraceResult = redactValue(trace, rules);
|
|
91
|
+
// Aggregate hits across both walks for the README.
|
|
92
|
+
const hits = totalHits([redactedMessagesResult.hits, redactedTraceResult.hits]);
|
|
93
|
+
try {
|
|
94
|
+
mkdirSync(opts.outDir, { recursive: false });
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
return { ok: false, reason: `outDir ${opts.outDir}: ${e.message}` };
|
|
98
|
+
}
|
|
99
|
+
writeFileSync(join(opts.outDir, 'thread.json'), JSON.stringify({ sessionId: opts.sessionId, skill: opts.skillSlug, messages: redactedMessagesResult.redacted }, null, 2));
|
|
100
|
+
writeFileSync(join(opts.outDir, 'trace.json'), JSON.stringify({ sessionId: opts.sessionId, skill: opts.skillSlug, steps: redactedTraceResult.redacted }, null, 2));
|
|
101
|
+
writeFileSync(join(opts.outDir, 'fixtures.json'), JSON.stringify({
|
|
102
|
+
$note: 'Fill in the sandbox-replay initial world for this skill before opening a PR.',
|
|
103
|
+
skill: opts.skillSlug,
|
|
104
|
+
skillStates: {},
|
|
105
|
+
}, null, 2));
|
|
106
|
+
writeFileSync(join(opts.outDir, 'README.md'), renderReadme({
|
|
107
|
+
skillSlug: opts.skillSlug,
|
|
108
|
+
sessionId: opts.sessionId,
|
|
109
|
+
messageCount: messages.length,
|
|
110
|
+
toolCallCount: trace.length,
|
|
111
|
+
hits,
|
|
112
|
+
}));
|
|
113
|
+
return {
|
|
114
|
+
ok: true,
|
|
115
|
+
outDir: opts.outDir,
|
|
116
|
+
messageCount: messages.length,
|
|
117
|
+
toolCallCount: trace.length,
|
|
118
|
+
hits,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=threadShare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threadShare.js","sourceRoot":"","sources":["../src/threadShare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface SubmitOptions {
|
|
2
|
+
/** Path to a bundle directory produced by `yome thread share`. */
|
|
3
|
+
bundleDir: string;
|
|
4
|
+
/** Skill slug (e.g. "@yome/ppt") — used to discover repo from manifest. */
|
|
5
|
+
skillSlug: string;
|
|
6
|
+
/** Case id; will be the name of the cases/<slug>/<caseId>/ directory. */
|
|
7
|
+
caseId?: string;
|
|
8
|
+
/** Override commit/PR title. Default: "case: add <caseId> for <skillSlug>". */
|
|
9
|
+
title?: string;
|
|
10
|
+
/** Override PR body. Default: a generated summary referencing the bundle README. */
|
|
11
|
+
body?: string;
|
|
12
|
+
/**
|
|
13
|
+
* If true, do everything **except** `git push` and `gh pr create` —
|
|
14
|
+
* useful for local diagnostics.
|
|
15
|
+
*/
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
/** Verbose: print every shelled command + its stdout. */
|
|
18
|
+
verbose?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export type SubmitResult = {
|
|
21
|
+
ok: true;
|
|
22
|
+
prUrl?: string;
|
|
23
|
+
branch: string;
|
|
24
|
+
caseId: string;
|
|
25
|
+
cloneDir: string;
|
|
26
|
+
upstream: string;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
reason: string;
|
|
30
|
+
cloneDir?: string;
|
|
31
|
+
};
|
|
32
|
+
export declare function submitBundle(opts: SubmitOptions): SubmitResult;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// cli/src/threadSubmit.ts — push a redacted bundle as a PR to a skill's repo.
|
|
2
|
+
//
|
|
3
|
+
// Spec 9.1 step 5 (token-bound path). The "no GitHub token / hub-bot relay"
|
|
4
|
+
// path is deferred to Phase 3 once the hub backend exists.
|
|
5
|
+
//
|
|
6
|
+
// Pipeline (all done via the locally-installed `gh` CLI; we shell out and
|
|
7
|
+
// never import @octokit/rest, keeping the CLI install tiny):
|
|
8
|
+
//
|
|
9
|
+
// 1. Resolve target repo from skill manifest (slug → installed manifest →
|
|
10
|
+
// `repo` field, e.g. https://github.com/yome-official/yome-skill-ppt).
|
|
11
|
+
// 2. `gh auth status` — fail fast with a clear message if not signed in.
|
|
12
|
+
// 3. `gh repo fork <upstream> --clone --remote=false` into a tmp dir.
|
|
13
|
+
// 4. `git checkout -b case/<slug>-<caseId>`
|
|
14
|
+
// 5. Copy bundle/* → cases/<slugBase>/<caseId>/
|
|
15
|
+
// 6. `git add -A && git commit -m "<title>"` (signed-off optional)
|
|
16
|
+
// 7. `git push --set-upstream origin case/<slug>-<caseId>`
|
|
17
|
+
// 8. `gh pr create --repo <upstream> --title "..." --body "..."`
|
|
18
|
+
// 9. Return PR URL.
|
|
19
|
+
//
|
|
20
|
+
// We do NOT delete the tmp clone — leave it for the user to inspect / amend.
|
|
21
|
+
import { spawnSync } from 'node:child_process';
|
|
22
|
+
import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, statSync, copyFileSync } from 'node:fs';
|
|
23
|
+
import { homedir } from 'node:os';
|
|
24
|
+
import { basename, join, resolve } from 'node:path';
|
|
25
|
+
import { readManifest } from './yomeSkills/manifest.js';
|
|
26
|
+
import { installPathForSlug, parseSlug } from './yomeSkills/paths.js';
|
|
27
|
+
const REPO_URL_RE = /^https?:\/\/github\.com\/([^/]+\/[^/.\s]+?)(?:\.git)?\/?$/;
|
|
28
|
+
/**
|
|
29
|
+
* Look up a skill's upstream GitHub repo from `~/.yome/skills/<owner>/<name>/`.
|
|
30
|
+
* Falls back to the monorepo `skills/yome-skill-<domain>/` if not installed.
|
|
31
|
+
*/
|
|
32
|
+
function lookupUpstream(skillSlug) {
|
|
33
|
+
// 1. Try installed location first
|
|
34
|
+
const installPath = installPathForSlug(skillSlug);
|
|
35
|
+
let manifest = installPath ? readManifest(installPath) : null;
|
|
36
|
+
// 2. Fall back to monorepo
|
|
37
|
+
if (!manifest) {
|
|
38
|
+
const parsed = parseSlug(skillSlug);
|
|
39
|
+
if (parsed) {
|
|
40
|
+
const monorepoPath = resolve(process.cwd(), 'skills', `yome-skill-${parsed.name}`);
|
|
41
|
+
if (existsSync(join(monorepoPath, 'yome-skill.json'))) {
|
|
42
|
+
manifest = readManifest(monorepoPath);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (!manifest) {
|
|
47
|
+
return { ok: false, reason: `skill ${skillSlug} not found locally — install it first or run from monorepo root` };
|
|
48
|
+
}
|
|
49
|
+
if (!manifest.repo) {
|
|
50
|
+
return { ok: false, reason: `skill ${skillSlug} manifest has no "repo" field — cannot determine upstream` };
|
|
51
|
+
}
|
|
52
|
+
const m = REPO_URL_RE.exec(manifest.repo.trim());
|
|
53
|
+
if (!m) {
|
|
54
|
+
return { ok: false, reason: `skill ${skillSlug} manifest "repo" is not a github.com URL: ${manifest.repo}` };
|
|
55
|
+
}
|
|
56
|
+
return { fullName: m[1], manifest };
|
|
57
|
+
}
|
|
58
|
+
/** Run a shell command, capturing stdout/stderr. Throws nothing — caller checks status. */
|
|
59
|
+
function run(cmd, args, cwd, verbose) {
|
|
60
|
+
if (verbose) {
|
|
61
|
+
const inDir = cwd ? ` (in ${cwd})` : '';
|
|
62
|
+
// eslint-disable-next-line no-console
|
|
63
|
+
console.log(`$ ${cmd} ${args.join(' ')}${inDir}`);
|
|
64
|
+
}
|
|
65
|
+
const result = spawnSync(cmd, args, { cwd, encoding: 'utf-8', env: process.env });
|
|
66
|
+
if (verbose && result.stdout)
|
|
67
|
+
console.log(result.stdout.trimEnd());
|
|
68
|
+
if (verbose && result.stderr)
|
|
69
|
+
console.error(result.stderr.trimEnd());
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
function ghIsInstalled() {
|
|
73
|
+
const r = spawnSync('gh', ['--version'], { encoding: 'utf-8' });
|
|
74
|
+
return r.status === 0;
|
|
75
|
+
}
|
|
76
|
+
function ghIsAuthed(verbose) {
|
|
77
|
+
const r = run('gh', ['auth', 'status'], undefined, verbose);
|
|
78
|
+
if (r.status === 0)
|
|
79
|
+
return { ok: true };
|
|
80
|
+
return { ok: false, reason: r.stderr?.trim() || 'gh auth status failed (run: gh auth login)' };
|
|
81
|
+
}
|
|
82
|
+
function copyBundleInto(srcDir, dest) {
|
|
83
|
+
if (!existsSync(dest))
|
|
84
|
+
mkdirSync(dest, { recursive: true });
|
|
85
|
+
let count = 0;
|
|
86
|
+
for (const entry of readdirSync(srcDir)) {
|
|
87
|
+
if (entry === '.git' || entry === 'node_modules' || entry === '.DS_Store')
|
|
88
|
+
continue;
|
|
89
|
+
const s = join(srcDir, entry);
|
|
90
|
+
const d = join(dest, entry);
|
|
91
|
+
const st = statSync(s);
|
|
92
|
+
if (st.isDirectory()) {
|
|
93
|
+
count += copyBundleInto(s, d);
|
|
94
|
+
}
|
|
95
|
+
else if (st.isFile()) {
|
|
96
|
+
copyFileSync(s, d);
|
|
97
|
+
count++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return count;
|
|
101
|
+
}
|
|
102
|
+
function defaultCaseId(bundleDir) {
|
|
103
|
+
// Bundles default to <sessionId>-<timestamp>; the basename is already unique.
|
|
104
|
+
return basename(bundleDir).slice(0, 60);
|
|
105
|
+
}
|
|
106
|
+
function defaultTitle(skillSlug, caseId) {
|
|
107
|
+
return `case: add ${caseId} for ${skillSlug}`;
|
|
108
|
+
}
|
|
109
|
+
function defaultBody(skillSlug, caseId, bundleDir) {
|
|
110
|
+
let bundleReadme = '';
|
|
111
|
+
try {
|
|
112
|
+
bundleReadme = readFileSync(join(bundleDir, 'README.md'), 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* missing README is fine */
|
|
116
|
+
}
|
|
117
|
+
return `Adds a new replayable case for **${skillSlug}** under \`cases/${parseSlug(skillSlug)?.name ?? 'unknown'}/${caseId}/\`.
|
|
118
|
+
|
|
119
|
+
Submitted via \`yome thread share --submit\`. The bundle was redacted on-device using the default ThreadRedactor rules (email / phone / api-key / path / mind).
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
${bundleReadme}`;
|
|
124
|
+
}
|
|
125
|
+
export function submitBundle(opts) {
|
|
126
|
+
if (!existsSync(opts.bundleDir)) {
|
|
127
|
+
return { ok: false, reason: `bundle directory does not exist: ${opts.bundleDir}` };
|
|
128
|
+
}
|
|
129
|
+
if (!existsSync(join(opts.bundleDir, 'thread.json'))) {
|
|
130
|
+
return { ok: false, reason: `${opts.bundleDir} is not a valid bundle (missing thread.json)` };
|
|
131
|
+
}
|
|
132
|
+
if (!ghIsInstalled()) {
|
|
133
|
+
return { ok: false, reason: 'gh CLI is not installed (https://cli.github.com). Install it then run: gh auth login' };
|
|
134
|
+
}
|
|
135
|
+
const auth = ghIsAuthed(!!opts.verbose);
|
|
136
|
+
if (!auth.ok) {
|
|
137
|
+
return { ok: false, reason: `gh CLI not authenticated: ${auth.reason}\nRun: gh auth login\n\n(The token-less hub-bot relay path is planned for Phase 3 and not yet implemented.)` };
|
|
138
|
+
}
|
|
139
|
+
const upstreamLookup = lookupUpstream(opts.skillSlug);
|
|
140
|
+
if ('ok' in upstreamLookup && upstreamLookup.ok === false)
|
|
141
|
+
return upstreamLookup;
|
|
142
|
+
const { fullName: upstream, manifest } = upstreamLookup;
|
|
143
|
+
const caseId = opts.caseId ?? defaultCaseId(opts.bundleDir);
|
|
144
|
+
const branch = `case/${manifest.domain}-${caseId}`;
|
|
145
|
+
const title = opts.title ?? defaultTitle(opts.skillSlug, caseId);
|
|
146
|
+
const body = opts.body ?? defaultBody(opts.skillSlug, caseId, opts.bundleDir);
|
|
147
|
+
// Clone into ~/.yome/shares/.work/<random>/<repo>
|
|
148
|
+
const workRoot = join(homedir(), '.yome', 'shares', '.work');
|
|
149
|
+
if (!existsSync(workRoot))
|
|
150
|
+
mkdirSync(workRoot, { recursive: true });
|
|
151
|
+
const tmpDir = mkdtempSync(join(workRoot, 'submit-'));
|
|
152
|
+
const cloneDir = join(tmpDir, basename(upstream));
|
|
153
|
+
// 1. fork + clone. `gh repo fork ... --clone -- <git-clone-args>` lets us
|
|
154
|
+
// pass `--depth` and the target directory through to git clone.
|
|
155
|
+
const forkResult = run('gh', ['repo', 'fork', upstream, '--clone', '--', '--depth=20', cloneDir], undefined, !!opts.verbose);
|
|
156
|
+
if (forkResult.status !== 0) {
|
|
157
|
+
return { ok: false, reason: `gh repo fork failed: ${forkResult.stderr?.trim()}`, cloneDir };
|
|
158
|
+
}
|
|
159
|
+
// 2. checkout new branch
|
|
160
|
+
const checkout = run('git', ['checkout', '-b', branch], cloneDir, !!opts.verbose);
|
|
161
|
+
if (checkout.status !== 0) {
|
|
162
|
+
return { ok: false, reason: `git checkout -b failed: ${checkout.stderr?.trim()}`, cloneDir };
|
|
163
|
+
}
|
|
164
|
+
// 3. copy bundle into cases/<domain>/<caseId>/
|
|
165
|
+
const targetRel = join('cases', manifest.domain, caseId);
|
|
166
|
+
const targetAbs = join(cloneDir, targetRel);
|
|
167
|
+
if (existsSync(targetAbs)) {
|
|
168
|
+
return { ok: false, reason: `cases/${manifest.domain}/${caseId}/ already exists in fork — pass a different --case-id`, cloneDir };
|
|
169
|
+
}
|
|
170
|
+
const copied = copyBundleInto(opts.bundleDir, targetAbs);
|
|
171
|
+
if (copied === 0) {
|
|
172
|
+
return { ok: false, reason: 'bundle is empty (no files copied)', cloneDir };
|
|
173
|
+
}
|
|
174
|
+
// 4. commit
|
|
175
|
+
const add = run('git', ['add', '-A'], cloneDir, !!opts.verbose);
|
|
176
|
+
if (add.status !== 0) {
|
|
177
|
+
return { ok: false, reason: `git add failed: ${add.stderr?.trim()}`, cloneDir };
|
|
178
|
+
}
|
|
179
|
+
const commit = run('git', ['commit', '-m', title], cloneDir, !!opts.verbose);
|
|
180
|
+
if (commit.status !== 0) {
|
|
181
|
+
return { ok: false, reason: `git commit failed: ${commit.stderr?.trim()}`, cloneDir };
|
|
182
|
+
}
|
|
183
|
+
if (opts.dryRun) {
|
|
184
|
+
return { ok: true, branch, caseId, cloneDir, upstream };
|
|
185
|
+
}
|
|
186
|
+
// 5. push
|
|
187
|
+
const push = run('git', ['push', '--set-upstream', 'origin', branch], cloneDir, !!opts.verbose);
|
|
188
|
+
if (push.status !== 0) {
|
|
189
|
+
return { ok: false, reason: `git push failed: ${push.stderr?.trim()}`, cloneDir };
|
|
190
|
+
}
|
|
191
|
+
// 6. open PR
|
|
192
|
+
const pr = run('gh', ['pr', 'create', '--repo', upstream, '--title', title, '--body', body, '--head', branch], cloneDir, !!opts.verbose);
|
|
193
|
+
if (pr.status !== 0) {
|
|
194
|
+
return { ok: false, reason: `gh pr create failed: ${pr.stderr?.trim()}`, cloneDir };
|
|
195
|
+
}
|
|
196
|
+
const prUrl = pr.stdout?.trim().split('\n').pop() || undefined;
|
|
197
|
+
return { ok: true, prUrl, branch, caseId, cloneDir, upstream };
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=threadSubmit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threadSubmit.js","sourceRoot":"","sources":["../src/threadSubmit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ToolDef } from '../types.js';
|
|
2
|
+
export interface AskUserQuestion {
|
|
3
|
+
/** Full question text shown to the user (should end with `?`). */
|
|
4
|
+
question: string;
|
|
5
|
+
/** Short chip label shown above the option list (≤ 12 chars). */
|
|
6
|
+
header: string;
|
|
7
|
+
/** 2–4 options. Do NOT include "Other" — the UI auto-adds a custom-answer entry. */
|
|
8
|
+
options: {
|
|
9
|
+
label: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
}[];
|
|
12
|
+
}
|
|
13
|
+
export interface AskUserResult {
|
|
14
|
+
/** Map: question text → answer string (the chosen label or the user's free-text). */
|
|
15
|
+
answers: Record<string, string>;
|
|
16
|
+
/** True if the user pressed Esc / cancelled all questions. */
|
|
17
|
+
cancelled?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function setAskUserHandler(fn: (questions: AskUserQuestion[]) => Promise<AskUserResult>): void;
|
|
20
|
+
export declare const askUserTool: ToolDef;
|