@zq-silk/yui 0.0.0

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.
Files changed (95) hide show
  1. package/ARCHITECTURE.md +141 -0
  2. package/LICENSE +21 -0
  3. package/README.md +211 -0
  4. package/dist/agent/adapterCatalog.js +10 -0
  5. package/dist/agent/agent.js +89 -0
  6. package/dist/agent/agentRegistry.js +10 -0
  7. package/dist/agent/argumentPolicy.js +80 -0
  8. package/dist/brief/taskBrief.js +37 -0
  9. package/dist/cli/commandCatalog.js +647 -0
  10. package/dist/cli/completion.js +111 -0
  11. package/dist/cli/completionWizard.js +143 -0
  12. package/dist/cli/dynamicCompletion.js +48 -0
  13. package/dist/cli/helpRenderer.js +32 -0
  14. package/dist/cli/interactionCandidates.js +139 -0
  15. package/dist/cli/interactionPolicy.js +389 -0
  16. package/dist/cli/interactiveSelection.js +185 -0
  17. package/dist/cli/invocationRouter.js +51 -0
  18. package/dist/cli/roleOptionCatalog.js +67 -0
  19. package/dist/cli/roleWizard.js +546 -0
  20. package/dist/cli/selectionPorts.js +1 -0
  21. package/dist/cli/updateCommand.js +22 -0
  22. package/dist/cli.js +402 -0
  23. package/dist/commands/agentCommands.js +196 -0
  24. package/dist/commands/globalRoleCommands.js +367 -0
  25. package/dist/commands/jobCommands.js +100 -0
  26. package/dist/commands/operatorCommands.js +38 -0
  27. package/dist/commands/repositoryCommands.js +86 -0
  28. package/dist/commands/roleConfiguration.js +201 -0
  29. package/dist/commands/taskCommands.js +1344 -0
  30. package/dist/commands/taskContextCommand.js +215 -0
  31. package/dist/commands/taskInputCommands.js +423 -0
  32. package/dist/commands/taskRoleRuntimeStatus.js +152 -0
  33. package/dist/completion/completionInstaller.js +168 -0
  34. package/dist/completion/completionPort.js +1 -0
  35. package/dist/completion/completionState.js +137 -0
  36. package/dist/completion/completionWizard.js +125 -0
  37. package/dist/completion/fileCompletionManager.js +51 -0
  38. package/dist/config/yuiConfig.js +17 -0
  39. package/dist/context/dispatchContext.js +74 -0
  40. package/dist/controller/clientRuntime.js +215 -0
  41. package/dist/controller/controller.js +158 -0
  42. package/dist/controller/controllerMain.js +37 -0
  43. package/dist/controller/fileSchedulerStoreAdapter.js +322 -0
  44. package/dist/controller/runtime.js +31 -0
  45. package/dist/controller/sessionNotify.js +136 -0
  46. package/dist/core/controllerClient.js +127 -0
  47. package/dist/core/controllerServer.js +269 -0
  48. package/dist/core/protocol.js +169 -0
  49. package/dist/decision/decision.js +42 -0
  50. package/dist/doctor/doctor.js +229 -0
  51. package/dist/errors/cliError.js +38 -0
  52. package/dist/event/taskEvent.js +44 -0
  53. package/dist/executor/agentAdapter.js +338 -0
  54. package/dist/executor/agentExecutor.js +144 -0
  55. package/dist/executor/executorRegistry.js +101 -0
  56. package/dist/executor/fileRoleLaunchPlanner.js +156 -0
  57. package/dist/executor/launchPlan.js +16 -0
  58. package/dist/input/inputRequest.js +326 -0
  59. package/dist/message/message.js +69 -0
  60. package/dist/milestone/milestone.js +27 -0
  61. package/dist/operator/operatorContext.js +66 -0
  62. package/dist/output/rolePresentation.js +82 -0
  63. package/dist/output/table.js +77 -0
  64. package/dist/output/terminal.js +198 -0
  65. package/dist/repository/gitWorkspace.js +210 -0
  66. package/dist/repository/repository.js +55 -0
  67. package/dist/repository/taskWorkspacePreparer.js +256 -0
  68. package/dist/role/role.js +246 -0
  69. package/dist/role/systemRoles.js +20 -0
  70. package/dist/run/agentRun.js +102 -0
  71. package/dist/scheduler/activeRoleRunDelivery.js +94 -0
  72. package/dist/scheduler/archivedTaskRuntime.js +12 -0
  73. package/dist/scheduler/leaderFailure.js +18 -0
  74. package/dist/scheduler/leaderWakeupProcessor.js +143 -0
  75. package/dist/scheduler/operatorInputNotificationProcessor.js +85 -0
  76. package/dist/scheduler/operatorNotification.js +17 -0
  77. package/dist/scheduler/pendingWakeup.js +33 -0
  78. package/dist/scheduler/ports.js +1 -0
  79. package/dist/scheduler/roleRunLiveness.js +41 -0
  80. package/dist/scheduler/wakeupQueue.js +13 -0
  81. package/dist/setup/setupCommand.js +317 -0
  82. package/dist/storage/durableFile.js +38 -0
  83. package/dist/storage/storageSchema.js +259 -0
  84. package/dist/storage/taskStore.js +1032 -0
  85. package/dist/task/task.js +216 -0
  86. package/dist/tmux/commandExecutor.js +69 -0
  87. package/dist/tmux/terminalHandoff.js +17 -0
  88. package/dist/tmux/tmuxManager.js +408 -0
  89. package/dist/workItem/workItem.js +45 -0
  90. package/dist/worktree/roleWorkspace.js +62 -0
  91. package/i18n/README.zh-CN.md +205 -0
  92. package/package.json +47 -0
  93. package/skills/yui-leader/SKILL.md +72 -0
  94. package/skills/yui-operator/SKILL.md +57 -0
  95. package/skills/yui-worker/SKILL.md +31 -0
@@ -0,0 +1,201 @@
1
+ import { usageError } from "../errors/cliError.js";
2
+ import { resolveAgentAdapter } from "../executor/agentAdapter.js";
3
+ const PROFILE_OPTIONS = [
4
+ ["--description", "value"],
5
+ ["--responsibility", "repeatable"],
6
+ ["--constraint", "repeatable"],
7
+ ["--expected-output", "value"],
8
+ ["--system-prompt", "value"],
9
+ ["--skill", "repeatable"]
10
+ ];
11
+ const PROFILE_CLEAR_OPTIONS = [
12
+ ["--clear-description", "flag"],
13
+ ["--clear-responsibilities", "flag"],
14
+ ["--clear-constraints", "flag"],
15
+ ["--clear-expected-output", "flag"],
16
+ ["--clear-system-prompt", "flag"],
17
+ ["--clear-skills", "flag"]
18
+ ];
19
+ const AGENT_VALUE_OPTIONS = [
20
+ ["--model", "value"],
21
+ ["--effort", "value"],
22
+ ["--sandbox", "value"],
23
+ ["--approval", "value"],
24
+ ["--permission-mode", "value"],
25
+ ["--search", "value"]
26
+ ];
27
+ const AGENT_CLEAR_OPTIONS = [
28
+ ["--clear-model", "flag"],
29
+ ["--clear-effort", "flag"],
30
+ ["--clear-sandbox", "flag"],
31
+ ["--clear-approval", "flag"],
32
+ ["--clear-permission-mode", "flag"],
33
+ ["--clear-search", "flag"],
34
+ ["--clear-agent-config", "flag"]
35
+ ];
36
+ const AGENT_CONFIG_OPTIONS = new Set([
37
+ ...AGENT_VALUE_OPTIONS.map(([option]) => option),
38
+ ...AGENT_CLEAR_OPTIONS.map(([option]) => option)
39
+ ]);
40
+ export function roleOptionSpecs(input) {
41
+ return new Map([
42
+ ...(input.includeAgent === true ? [["--agent", "value"]] : []),
43
+ ...(input.includeWorkspace === true ? [["--workspace", "value"]] : []),
44
+ ...PROFILE_OPTIONS,
45
+ ...AGENT_VALUE_OPTIONS,
46
+ ...(input.update ? [...PROFILE_CLEAR_OPTIONS, ...AGENT_CLEAR_OPTIONS] : [])
47
+ ]);
48
+ }
49
+ export function parseRoleOptions(args, specs, usage) {
50
+ const values = new Map();
51
+ const seen = new Set();
52
+ for (let index = 0; index < args.length; index += 1) {
53
+ const option = args[index] ?? "";
54
+ const kind = specs.get(option);
55
+ if (kind === undefined) {
56
+ throw usageError(option.startsWith("--")
57
+ ? `Unsupported option: ${option}`
58
+ : `Unexpected argument: ${option}`, usage);
59
+ }
60
+ if (kind !== "repeatable" && seen.has(option)) {
61
+ throw usageError(`Option may only be specified once: ${option}`, usage);
62
+ }
63
+ seen.add(option);
64
+ if (kind === "flag")
65
+ continue;
66
+ const value = args[index + 1];
67
+ if (value === undefined || value.startsWith("--")) {
68
+ throw usageError(`${option} is required.`, usage);
69
+ }
70
+ values.set(option, [...(values.get(option) ?? []), value]);
71
+ index += 1;
72
+ }
73
+ return {
74
+ seen,
75
+ has: (option) => seen.has(option),
76
+ one: (option) => values.get(option)?.[0],
77
+ many: (option) => [...(values.get(option) ?? [])]
78
+ };
79
+ }
80
+ export function roleProfileFrom(parsed) {
81
+ return {
82
+ ...(parsed.has("--description") ? { description: requiredText(parsed.one("--description")) } : {}),
83
+ responsibilities: parsed.many("--responsibility").map(requiredText),
84
+ constraints: parsed.many("--constraint").map(requiredText),
85
+ ...(parsed.has("--expected-output")
86
+ ? { expectedOutput: requiredText(parsed.one("--expected-output")) } : {}),
87
+ ...(parsed.has("--system-prompt")
88
+ ? { systemPrompt: requiredText(parsed.one("--system-prompt")) } : {}),
89
+ skills: parsed.many("--skill").map(requiredText)
90
+ };
91
+ }
92
+ export function roleProfilePatch(parsed) {
93
+ assertPairs(parsed, [
94
+ ["--description", "--clear-description"],
95
+ ["--responsibility", "--clear-responsibilities"],
96
+ ["--constraint", "--clear-constraints"],
97
+ ["--expected-output", "--clear-expected-output"],
98
+ ["--system-prompt", "--clear-system-prompt"],
99
+ ["--skill", "--clear-skills"]
100
+ ]);
101
+ return {
102
+ ...(parsed.has("--description") ? { description: requiredText(parsed.one("--description")) } : {}),
103
+ ...(parsed.has("--clear-description") ? { description: undefined } : {}),
104
+ ...(parsed.has("--responsibility")
105
+ ? { responsibilities: parsed.many("--responsibility").map(requiredText) } : {}),
106
+ ...(parsed.has("--clear-responsibilities") ? { responsibilities: [] } : {}),
107
+ ...(parsed.has("--constraint")
108
+ ? { constraints: parsed.many("--constraint").map(requiredText) } : {}),
109
+ ...(parsed.has("--clear-constraints") ? { constraints: [] } : {}),
110
+ ...(parsed.has("--expected-output")
111
+ ? { expectedOutput: requiredText(parsed.one("--expected-output")) } : {}),
112
+ ...(parsed.has("--clear-expected-output") ? { expectedOutput: undefined } : {}),
113
+ ...(parsed.has("--system-prompt")
114
+ ? { systemPrompt: requiredText(parsed.one("--system-prompt")) } : {}),
115
+ ...(parsed.has("--clear-system-prompt") ? { systemPrompt: undefined } : {}),
116
+ ...(parsed.has("--skill") ? { skills: parsed.many("--skill").map(requiredText) } : {}),
117
+ ...(parsed.has("--clear-skills") ? { skills: [] } : {})
118
+ };
119
+ }
120
+ export function hasAgentConfigOptions(parsed) {
121
+ return [...parsed.seen].some((option) => AGENT_CONFIG_OPTIONS.has(option));
122
+ }
123
+ export function patchRoleAgentBinding(binding, parsed) {
124
+ assertAgentOptionConflicts(parsed);
125
+ assertAdapterOptions(binding.adapterId, parsed);
126
+ if (parsed.has("--clear-agent-config")) {
127
+ return { ...binding, config: { adapterId: binding.adapterId } };
128
+ }
129
+ const config = structuredClone(binding.config);
130
+ patchText(config, parsed, "--model", "--clear-model", "model");
131
+ patchText(config, parsed, "--effort", "--clear-effort", "effort");
132
+ const permission = {
133
+ ...(config.permission ?? {})
134
+ };
135
+ patchText(permission, parsed, "--sandbox", "--clear-sandbox", "sandbox");
136
+ patchText(permission, parsed, "--approval", "--clear-approval", "approval");
137
+ patchText(permission, parsed, "--permission-mode", "--clear-permission-mode", "mode");
138
+ if (Object.keys(permission).length === 0)
139
+ delete config.permission;
140
+ else
141
+ config.permission = permission;
142
+ if (parsed.has("--search")) {
143
+ if (parsed.one("--search") !== "true") {
144
+ throw usageError("--search supports true only; use --clear-search to follow the CLI default.");
145
+ }
146
+ config.search = true;
147
+ }
148
+ if (parsed.has("--clear-search"))
149
+ delete config.search;
150
+ try {
151
+ const canonical = resolveAgentAdapter(binding.adapterId).canonicalizeConfig(config);
152
+ return { ...binding, config: canonical };
153
+ }
154
+ catch (error) {
155
+ throw usageError(error instanceof Error ? error.message : String(error));
156
+ }
157
+ }
158
+ function patchText(target, parsed, valueOption, clearOption, key) {
159
+ if (parsed.has(valueOption))
160
+ target[key] = requiredText(parsed.one(valueOption));
161
+ if (parsed.has(clearOption))
162
+ delete target[key];
163
+ }
164
+ function assertAgentOptionConflicts(parsed) {
165
+ assertPairs(parsed, [
166
+ ["--model", "--clear-model"],
167
+ ["--effort", "--clear-effort"],
168
+ ["--sandbox", "--clear-sandbox"],
169
+ ["--approval", "--clear-approval"],
170
+ ["--permission-mode", "--clear-permission-mode"],
171
+ ["--search", "--clear-search"]
172
+ ]);
173
+ if (parsed.has("--clear-agent-config")
174
+ && [...parsed.seen].some((option) => option !== "--clear-agent-config" && AGENT_CONFIG_OPTIONS.has(option))) {
175
+ throw usageError("--clear-agent-config cannot be combined with another Agent setting.");
176
+ }
177
+ }
178
+ function assertAdapterOptions(adapterId, parsed) {
179
+ const codex = ["--sandbox", "--clear-sandbox", "--approval", "--clear-approval",
180
+ "--search", "--clear-search"];
181
+ const claude = ["--permission-mode", "--clear-permission-mode"];
182
+ if (adapterId !== "codex" && codex.some((option) => parsed.has(option))) {
183
+ throw usageError("Sandbox, approval, and search settings are only supported by Codex.");
184
+ }
185
+ if (adapterId !== "claude" && claude.some((option) => parsed.has(option))) {
186
+ throw usageError("Permission mode is only supported by Claude.");
187
+ }
188
+ }
189
+ function assertPairs(parsed, pairs) {
190
+ for (const [valueOption, clearOption] of pairs) {
191
+ if (parsed.has(valueOption) && parsed.has(clearOption)) {
192
+ throw usageError(`${valueOption} and ${clearOption} cannot be used together.`);
193
+ }
194
+ }
195
+ }
196
+ function requiredText(value) {
197
+ const result = value?.trim();
198
+ if (result === undefined || result.length === 0)
199
+ throw usageError("Role option values must not be empty.");
200
+ return result;
201
+ }