mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-18 14:25:51 +00:00
feat: 添加 /goal 命令,支持长时间运行任务的目标管理 (#1222)
* feat: 添加 /goal 命令,支持长时间运行任务的目标管理 从 Codex 项目移植 /goal 命令到 Claude Code,实现: - Goal 状态管理模块(active/paused/budget_limited/complete) - /goal 斜杠命令(set/clear/pause/resume/complete) - Goal 模型工具(get/set/complete) - Continuation prompt 自动注入系统提示 - Token 用量自动追踪 Co-Authored-By: mimo-v2.5-pro <XiaomiMiMo@claude-code-best.win> * fix: goal 状态改为 session-scoped,避免多会话泄漏 将 currentGoal 单例替换为 Map<string, GoalState>,按 sessionId 隔离, 遵循 sessionIngress.ts 的模式。所有函数支持可选 sessionId 参数。 Co-Authored-By: mimo-v2.5-pro <XiaomiMiMo@claude-code-best.win> * fix: 对 goal 的 tokenBudget/tokensUsed 添加数值校验 setGoal 中 tokenBudget 非 finite 或负数时归零; updateGoalTokens 中 usage 非 finite 或负数时归零。 Co-Authored-By: mimo-v2.5-pro <XiaomiMiMo@claude-code-best.win> * fix: 暂停期间 goal 时间不再继续计数 新增 pausedAt/accumulatedActiveMs 字段,pauseGoal 累积已活跃时间, resumeGoal 重置 startTime,计时统一使用 getActiveElapsedMs()。 Co-Authored-By: mimo-v2.5-pro <XiaomiMiMo@claude-code-best.win> --------- Co-authored-by: mimo-v2.5-pro <XiaomiMiMo@claude-code-best.win>
This commit is contained in:
66
src/commands/goal/goal.ts
Normal file
66
src/commands/goal/goal.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import type { LocalCommandCall } from '../../types/command.js'
|
||||
import {
|
||||
clearGoal,
|
||||
completeGoal,
|
||||
formatGoalStatus,
|
||||
getGoal,
|
||||
pauseGoal,
|
||||
resumeGoal,
|
||||
setGoal,
|
||||
} from '../../services/goal/goalState.js'
|
||||
|
||||
export const call: LocalCommandCall = async args => {
|
||||
const trimmed = args.trim()
|
||||
|
||||
// No arguments — show current goal status
|
||||
if (!trimmed) {
|
||||
return { type: 'text', value: formatGoalStatus() }
|
||||
}
|
||||
|
||||
const lower = trimmed.toLowerCase()
|
||||
|
||||
// Control subcommands
|
||||
if (lower === 'clear') {
|
||||
const goal = getGoal()
|
||||
if (!goal) {
|
||||
return { type: 'text', value: 'No active goal to clear.' }
|
||||
}
|
||||
clearGoal()
|
||||
return { type: 'text', value: 'Goal cleared.' }
|
||||
}
|
||||
|
||||
if (lower === 'pause') {
|
||||
if (pauseGoal()) {
|
||||
return { type: 'text', value: 'Goal paused.' }
|
||||
}
|
||||
return { type: 'text', value: 'No active goal to pause.' }
|
||||
}
|
||||
|
||||
if (lower === 'resume') {
|
||||
if (resumeGoal()) {
|
||||
return { type: 'text', value: 'Goal resumed.' }
|
||||
}
|
||||
return { type: 'text', value: 'No paused goal to resume.' }
|
||||
}
|
||||
|
||||
if (lower === 'complete') {
|
||||
if (completeGoal()) {
|
||||
return { type: 'text', value: 'Goal marked as complete.' }
|
||||
}
|
||||
return { type: 'text', value: 'No active goal to complete.' }
|
||||
}
|
||||
|
||||
// Set a new goal
|
||||
const existing = getGoal()
|
||||
if (existing && existing.status === 'active') {
|
||||
// Replace existing active goal
|
||||
setGoal(trimmed)
|
||||
return {
|
||||
type: 'text',
|
||||
value: `Goal replaced.\n\n${formatGoalStatus()}`,
|
||||
}
|
||||
}
|
||||
|
||||
setGoal(trimmed)
|
||||
return { type: 'text', value: `Goal set.\n\n${formatGoalStatus()}` }
|
||||
}
|
||||
12
src/commands/goal/index.ts
Normal file
12
src/commands/goal/index.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import type { Command } from '../../commands.js'
|
||||
|
||||
const goal = {
|
||||
type: 'local',
|
||||
name: 'goal',
|
||||
description: 'Set or view the goal for a long-running task',
|
||||
supportsNonInteractive: true,
|
||||
argumentHint: '<objective> | clear | pause | resume',
|
||||
load: () => import('./goal.js'),
|
||||
} satisfies Command
|
||||
|
||||
export default goal
|
||||
Reference in New Issue
Block a user