@zq-silk/yui 0.2.0 → 0.4.2

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 (208) hide show
  1. package/ARCHITECTURE.md +603 -133
  2. package/README.md +806 -31
  3. package/dist/agent/agent.js +2 -1
  4. package/dist/agent/argumentPolicy.js +3 -1
  5. package/dist/agent/launchEnvironment.js +106 -0
  6. package/dist/agent/managedRuntimeEnvironment.js +34 -0
  7. package/dist/brief/taskBrief.js +11 -1
  8. package/dist/cli/agentConfigurationPicker.js +287 -0
  9. package/dist/cli/commandCatalog.js +488 -60
  10. package/dist/cli/completion.js +146 -22
  11. package/dist/cli/helpRenderer.js +3 -1
  12. package/dist/cli/interactionCandidates.js +53 -15
  13. package/dist/cli/interactionPolicy.js +267 -30
  14. package/dist/cli/interactiveSelection.js +6 -2
  15. package/dist/cli/invocationRouter.js +5 -1
  16. package/dist/cli/operatorWizard.js +87 -0
  17. package/dist/cli/roleOptionCatalog.js +1 -0
  18. package/dist/cli/roleWizard.js +185 -21
  19. package/dist/cli/updateCommand.js +62 -19
  20. package/dist/cli/updateOrchestrator.js +539 -0
  21. package/dist/cli/updatePorts.js +1119 -0
  22. package/dist/cli/upgradeCommand.js +112 -0
  23. package/dist/cli.js +1420 -86
  24. package/dist/commands/agentCommands.js +146 -3
  25. package/dist/commands/configCommands.js +126 -0
  26. package/dist/commands/controllerCommands.js +365 -0
  27. package/dist/commands/globalRoleCommands.js +168 -126
  28. package/dist/commands/jobCommands.js +18 -8
  29. package/dist/commands/operatorCommands.js +159 -9
  30. package/dist/commands/profileCommands.js +203 -0
  31. package/dist/commands/projectCommands.js +650 -0
  32. package/dist/commands/roleConfiguration.js +85 -24
  33. package/dist/commands/roleRuntimeGuard.js +12 -0
  34. package/dist/commands/roleSkillValidation.js +47 -0
  35. package/dist/commands/taskActor.js +127 -0
  36. package/dist/commands/taskCommands.js +4201 -313
  37. package/dist/commands/taskCompletionGate.js +131 -0
  38. package/dist/commands/taskContextCommand.js +244 -30
  39. package/dist/commands/taskInputCommands.js +177 -59
  40. package/dist/commands/taskIntegrationCommands.js +303 -0
  41. package/dist/commands/taskOverviewCommand.js +363 -0
  42. package/dist/commands/taskRoleRuntimeStatus.js +125 -19
  43. package/dist/commands/textInput.js +15 -0
  44. package/dist/completion/completionInstaller.js +26 -22
  45. package/dist/config/yuiConfig.js +4 -3
  46. package/dist/context/dispatchContext.js +90 -38
  47. package/dist/context/roleSessionContext.js +119 -0
  48. package/dist/controller/claudeLifecycleHook.js +203 -0
  49. package/dist/controller/clientRuntime.js +408 -56
  50. package/dist/controller/codexLifecycleHook.js +108 -0
  51. package/dist/controller/controller.js +1089 -32
  52. package/dist/controller/domainIdentity.js +505 -0
  53. package/dist/controller/ephemeralResourceReaper.js +131 -0
  54. package/dist/controller/fileSchedulerStoreAdapter.js +2153 -103
  55. package/dist/controller/providerHookRunFence.js +127 -0
  56. package/dist/controller/resourceCleanupLinux.js +286 -0
  57. package/dist/controller/resourceInventory.js +531 -0
  58. package/dist/controller/resourceInventoryLinux.js +610 -0
  59. package/dist/controller/runtime.js +629 -10
  60. package/dist/controller/runtimeEventInbox.js +564 -0
  61. package/dist/controller/runtimeEventProcessor.js +248 -0
  62. package/dist/controller/runtimeLaunchCoordinator.js +477 -0
  63. package/dist/controller/sessionNotify.js +121 -78
  64. package/dist/coordination/deadlineScheduler.js +15 -0
  65. package/dist/coordination/mailboxScheduler.js +108 -0
  66. package/dist/coordination/workMailbox.js +329 -0
  67. package/dist/coordination/workMailboxQueue.js +86 -0
  68. package/dist/core/controllerClient.js +19 -5
  69. package/dist/core/controllerEndpoint.js +37 -0
  70. package/dist/core/controllerServer.js +218 -10
  71. package/dist/core/protocol.js +6 -2
  72. package/dist/decision/decision.js +2 -1
  73. package/dist/doctor/doctor.js +681 -32
  74. package/dist/domain/validation.js +53 -0
  75. package/dist/errors/cliError.js +5 -3
  76. package/dist/event/taskEvent.js +7 -3
  77. package/dist/execution/codexThreadNaming.js +160 -0
  78. package/dist/execution/executionGroup.js +579 -0
  79. package/dist/executor/agentAdapter.js +255 -40
  80. package/dist/executor/agentConfigurationCatalog.js +326 -0
  81. package/dist/executor/agentConfigurationProbe.js +506 -0
  82. package/dist/executor/agentExecutor.js +625 -10
  83. package/dist/executor/codexConfigConflict.js +290 -0
  84. package/dist/executor/effectiveLaunch.js +340 -0
  85. package/dist/executor/executorRegistry.js +238 -36
  86. package/dist/executor/fileRoleLaunchPlanner.js +550 -40
  87. package/dist/executor/turnCompletion.js +126 -0
  88. package/dist/input/inputRequest.js +30 -9
  89. package/dist/integration/changeSet.js +36 -0
  90. package/dist/integration/checkResult.js +24 -0
  91. package/dist/integration/gitIntegrationService.js +695 -0
  92. package/dist/integration/integrationAttempt.js +142 -0
  93. package/dist/interaction/operatorPresentation.js +96 -0
  94. package/dist/lifecycle/canonicalLifecycleEvent.js +342 -0
  95. package/dist/lifecycle/exactRunTerminalization.js +572 -0
  96. package/dist/lifecycle/providerLifecycleMapping.js +190 -0
  97. package/dist/lifecycle/taskRoleSessionReset.js +124 -0
  98. package/dist/message/message.js +23 -7
  99. package/dist/milestone/milestone.js +2 -1
  100. package/dist/operator/operatorSessionHistory.js +124 -0
  101. package/dist/output/agentConfigurationPresentation.js +43 -0
  102. package/dist/output/rolePresentation.js +34 -10
  103. package/dist/output/terminal.js +8 -0
  104. package/dist/output/timePresentation.js +55 -0
  105. package/dist/profile/agentProfile.js +128 -0
  106. package/dist/repository/gitWorkspace.js +578 -24
  107. package/dist/repository/project.js +213 -0
  108. package/dist/repository/taskWorkspaceCoordinator.js +392 -0
  109. package/dist/repository/taskWorkspacePreparer.js +1688 -191
  110. package/dist/review/reviewConfig.js +11 -0
  111. package/dist/review/reviewRound.js +399 -0
  112. package/dist/review/taskFinalReviewContract.js +90 -0
  113. package/dist/role/role.js +124 -23
  114. package/dist/run/agentRun.js +155 -12
  115. package/dist/run/runIdentity.js +82 -0
  116. package/dist/runtime/exactControlPlane.js +472 -0
  117. package/dist/runtime/index.js +8 -0
  118. package/dist/runtime/lifecycleReservation.js +38 -0
  119. package/dist/runtime/ports.js +11 -0
  120. package/dist/runtime/preallocatedNativeSession.js +13 -0
  121. package/dist/runtime/promptEnvelope.js +30 -0
  122. package/dist/runtime/runtimeBinding.js +31 -0
  123. package/dist/runtime/runtimeOwner.js +14 -0
  124. package/dist/runtime/sessionLaunchRequest.js +62 -0
  125. package/dist/runtime/sessionTitle.js +54 -0
  126. package/dist/runtime/taskRuntimeIsolation.js +643 -0
  127. package/dist/runtime/tmuxAdapters.js +315 -0
  128. package/dist/runtime/turnCompletion.js +3 -0
  129. package/dist/runtime/validation.js +23 -0
  130. package/dist/scheduler/activeRoleRunDelivery.js +342 -32
  131. package/dist/scheduler/activeTaskProgress.js +63 -0
  132. package/dist/scheduler/leaderFailure.js +2 -1
  133. package/dist/scheduler/leaderWakeupProcessor.js +307 -66
  134. package/dist/scheduler/operatorInputNotificationProcessor.js +109 -46
  135. package/dist/scheduler/operatorNotification.js +44 -2
  136. package/dist/scheduler/ports.js +28 -1
  137. package/dist/scheduler/roleRunLiveness.js +131 -25
  138. package/dist/scheduler/roleRunStall.js +951 -0
  139. package/dist/scheduler/taskExecutionProjection.js +544 -0
  140. package/dist/scheduler/wakeupQueue.js +3 -0
  141. package/dist/setup/setupCommand.js +302 -52
  142. package/dist/storage/compatibleTaskStore.js +102 -0
  143. package/dist/storage/migration/baseline.js +78 -0
  144. package/dist/storage/migration/classifier.js +51 -0
  145. package/dist/storage/migration/compatibleCodec.js +53 -0
  146. package/dist/storage/migration/engine.js +147 -0
  147. package/dist/storage/migration/index.js +33 -0
  148. package/dist/storage/migration/planner.js +154 -0
  149. package/dist/storage/migration/productionRegistry.js +486 -0
  150. package/dist/storage/migration/registry.js +169 -0
  151. package/dist/storage/migration/report.js +54 -0
  152. package/dist/storage/migration/types.js +31 -0
  153. package/dist/storage/storageSchema.js +147 -123
  154. package/dist/storage/storageVersions.js +11 -0
  155. package/dist/storage/taskStore.js +1793 -197
  156. package/dist/storage/upgrade/homeClassification.js +156 -0
  157. package/dist/storage/upgrade/homeMigrationTarget.js +595 -0
  158. package/dist/storage/upgrade/offlineUpgradeInventory.js +315 -0
  159. package/dist/storage/upgrade/productionMigrationRegistry.js +6 -0
  160. package/dist/storage/upgrade/recordVersionScan.js +176 -0
  161. package/dist/storage/upgrade/recordVersions.js +159 -0
  162. package/dist/storage/upgrade/switchProgress.js +80 -0
  163. package/dist/storage/upgrade/upgradeOrchestrator.js +948 -0
  164. package/dist/storage/upgrade/upgradeReceipt.js +161 -0
  165. package/dist/storage/upgradeCoordination.js +186 -0
  166. package/dist/storage/upgradeFence.js +366 -0
  167. package/dist/task/task.js +132 -26
  168. package/dist/task/taskRecordReference.js +66 -0
  169. package/dist/tmux/commandExecutor.js +75 -2
  170. package/dist/tmux/tmuxManager.js +747 -49
  171. package/dist/version.js +23 -0
  172. package/dist/web/assets/assetManifest.js +62 -0
  173. package/dist/web/assets/client/app.js +631 -0
  174. package/dist/web/assets/client/components.js +605 -0
  175. package/dist/web/assets/client/dom.js +14 -0
  176. package/dist/web/assets/client/format.js +28 -0
  177. package/dist/web/assets/client/i18n.js +494 -0
  178. package/dist/web/assets/client/markdown.js +114 -0
  179. package/dist/web/assets/client/theme.js +32 -0
  180. package/dist/web/assets/client/view.js +458 -0
  181. package/dist/web/assets/fontData.js +12 -0
  182. package/dist/web/assets/fonts.js +12 -0
  183. package/dist/web/assets/shell.js +114 -0
  184. package/dist/web/assets/styles/cards.js +135 -0
  185. package/dist/web/assets/styles/layout.js +47 -0
  186. package/dist/web/assets/styles/markdown.js +29 -0
  187. package/dist/web/assets/styles/responsive.js +39 -0
  188. package/dist/web/assets/styles/tokens.js +101 -0
  189. package/dist/web/assets/styles/widgets.js +147 -0
  190. package/dist/web/tmuxWebTerminal.js +158 -0
  191. package/dist/web/webServer.js +463 -0
  192. package/dist/web/webSnapshot.js +148 -0
  193. package/dist/workItem/workItem.js +642 -23
  194. package/dist/workspace/gitChangeSetCapture.js +86 -0
  195. package/dist/workspace/workItemChangeSetManager.js +445 -0
  196. package/dist/worktree/managedWorkspace.js +202 -0
  197. package/docs/task-local-identity.md +62 -0
  198. package/i18n/README.zh-CN.md +406 -31
  199. package/package.json +10 -2
  200. package/skills/yui-leader/SKILL.md +601 -39
  201. package/skills/yui-operator/SKILL.md +255 -34
  202. package/skills/yui-reviewer/SKILL.md +57 -0
  203. package/skills/yui-worker/SKILL.md +214 -17
  204. package/dist/commands/repositoryCommands.js +0 -86
  205. package/dist/operator/operatorContext.js +0 -66
  206. package/dist/repository/repository.js +0 -55
  207. package/dist/scheduler/archivedTaskRuntime.js +0 -12
  208. package/dist/worktree/roleWorkspace.js +0 -62
@@ -0,0 +1,203 @@
1
+ import { usageError } from "../errors/cliError.js";
2
+ import { defaultTableWidth, renderTable } from "../output/table.js";
3
+ import { BUILTIN_PROFILE_IDS, builtinAgentProfileInputs, createAgentProfile, updateAgentProfile } from "../profile/agentProfile.js";
4
+ import { parseRoleOptions } from "./roleConfiguration.js";
5
+ export function runProfileCommand(args, store, now = () => new Date()) {
6
+ const [command, ...rest] = args;
7
+ switch (command) {
8
+ case "add": return addProfile(rest, store, now());
9
+ case "list": return listProfiles(rest, store);
10
+ case "show": return showProfile(rest, store);
11
+ case "update": return updateProfile(rest, store, now());
12
+ case "remove": return removeProfile(rest, store);
13
+ case "reset": return resetProfiles(rest, store, now());
14
+ default:
15
+ throw usageError(command === undefined
16
+ ? "Profile command is required."
17
+ : `Unknown command: profile ${command}`);
18
+ }
19
+ }
20
+ function addProfile(args, store, now) {
21
+ const usage = "Profile add usage: yui profile add <id> [--access <read|write>] [Profile settings].";
22
+ const [id, ...tail] = args;
23
+ if (id === undefined || id.startsWith("--"))
24
+ throw usageError("Profile id is required.", usage);
25
+ const parsed = parseProfileOptions(tail, false, usage);
26
+ const profile = createAgentProfile({
27
+ id,
28
+ defaultAccess: parseAccess(parsed.one("--access") ?? "read"),
29
+ ...profileValues(parsed)
30
+ }, now);
31
+ store.transaction((tx) => {
32
+ if (tx.getAgentProfile(profile.id) !== null) {
33
+ throw usageError(`Agent Profile already exists: ${profile.id}.`);
34
+ }
35
+ tx.saveAgentProfile(profile);
36
+ });
37
+ return { output: `Added Agent Profile ${profile.id}\n`, data: { profile } };
38
+ }
39
+ function listProfiles(args, store) {
40
+ noArgs(args, "Profile list usage: yui profile list.");
41
+ const profiles = store.listAgentProfiles();
42
+ const output = profiles.length === 0
43
+ ? "No Agent Profiles found.\n"
44
+ : `${renderTable("Agent Profiles", [
45
+ { header: "Profile", minWidth: 7, maxWidth: 24 },
46
+ { header: "Revision", minWidth: 8, maxWidth: 10 },
47
+ { header: "Access", minWidth: 6, maxWidth: 8 },
48
+ { header: "Description", minWidth: 12, maxWidth: 54 }
49
+ ], profiles.map((profile) => [
50
+ profile.id,
51
+ String(profile.revision),
52
+ profile.defaultAccess,
53
+ profile.description ?? "-"
54
+ ]), defaultTableWidth())}\n`;
55
+ return { output, data: { profiles } };
56
+ }
57
+ function showProfile(args, store) {
58
+ const profile = requireProfile(store, oneArg(args, "Profile show usage: yui profile show <id>."));
59
+ return {
60
+ output: `${[
61
+ `Agent Profile: ${profile.id}`,
62
+ `Revision: ${profile.revision}`,
63
+ `Default access: ${profile.defaultAccess}`,
64
+ `Description: ${profile.description ?? "-"}`,
65
+ `Instructions: ${profile.instructions ?? "-"}`,
66
+ `Skills: ${profile.skills?.join(", ") || "-"}`,
67
+ `Model: ${profile.model ?? "-"}`,
68
+ `Effort: ${profile.effort ?? "-"}`
69
+ ].join("\n")}\n`,
70
+ data: { profile }
71
+ };
72
+ }
73
+ function updateProfile(args, store, now) {
74
+ const usage = "Profile update usage: yui profile update <id> [--access <read|write>] [Profile settings].";
75
+ const [id, ...tail] = args;
76
+ if (id === undefined || id.startsWith("--"))
77
+ throw usageError("Profile id is required.", usage);
78
+ const parsed = parseProfileOptions(tail, true, usage);
79
+ if (parsed.seen.size === 0)
80
+ throw usageError("At least one Profile option is required.", usage);
81
+ assertOptionPairs(parsed);
82
+ const current = requireProfile(store, id);
83
+ const updated = updateAgentProfile(current, {
84
+ ...(parsed.has("--access") ? { defaultAccess: parseAccess(parsed.one("--access")) } : {}),
85
+ ...profilePatch(parsed)
86
+ }, now);
87
+ store.saveAgentProfile(updated);
88
+ return {
89
+ output: `Updated Agent Profile ${updated.id} to revision ${updated.revision}\n`,
90
+ data: { profile: updated }
91
+ };
92
+ }
93
+ function removeProfile(args, store) {
94
+ const id = oneArg(args, "Profile remove usage: yui profile remove <id>.");
95
+ if (BUILTIN_PROFILE_IDS.includes(id)) {
96
+ throw usageError(`Built-in Agent Profile cannot be removed: ${id}. Use profile reset instead.`);
97
+ }
98
+ if (!store.removeAgentProfile(id))
99
+ throw usageError(`Agent Profile not found: ${id}.`);
100
+ return { output: `Removed Agent Profile ${id}\n`, data: { profileId: id } };
101
+ }
102
+ function resetProfiles(args, store, now) {
103
+ noArgs(args, "Profile reset usage: yui profile reset.");
104
+ store.transaction((tx) => {
105
+ for (const desired of builtinAgentProfileInputs()) {
106
+ const existing = tx.getAgentProfile(desired.id);
107
+ tx.saveAgentProfile(existing === null
108
+ ? createAgentProfile(desired, now)
109
+ : updateAgentProfile(existing, {
110
+ defaultAccess: desired.defaultAccess,
111
+ description: desired.description,
112
+ instructions: desired.instructions,
113
+ skills: desired.skills,
114
+ model: desired.model,
115
+ effort: desired.effort
116
+ }, now));
117
+ }
118
+ });
119
+ const profiles = BUILTIN_PROFILE_IDS.map((id) => requireProfile(store, id));
120
+ return {
121
+ output: `Reset ${BUILTIN_PROFILE_IDS.length} built-in Agent Profiles\n`,
122
+ data: { profiles }
123
+ };
124
+ }
125
+ const BASE_OPTIONS = [
126
+ ["--access", "value"],
127
+ ["--description", "value"],
128
+ ["--instructions", "value"],
129
+ ["--skill", "repeatable"],
130
+ ["--model", "value"],
131
+ ["--effort", "value"]
132
+ ];
133
+ const CLEAR_OPTIONS = [
134
+ ["--clear-description", "flag"],
135
+ ["--clear-instructions", "flag"],
136
+ ["--clear-skills", "flag"],
137
+ ["--clear-model", "flag"],
138
+ ["--clear-effort", "flag"]
139
+ ];
140
+ function parseProfileOptions(args, update, usage) {
141
+ return parseRoleOptions(args, new Map([
142
+ ...BASE_OPTIONS,
143
+ ...(update ? CLEAR_OPTIONS : [])
144
+ ]), usage);
145
+ }
146
+ function profileValues(parsed) {
147
+ return {
148
+ ...(parsed.has("--description") ? { description: requiredText(parsed.one("--description")) } : {}),
149
+ ...(parsed.has("--instructions") ? { instructions: requiredText(parsed.one("--instructions")) } : {}),
150
+ ...(parsed.has("--skill") ? { skills: parsed.many("--skill").map(requiredText) } : {}),
151
+ ...(parsed.has("--model") ? { model: requiredText(parsed.one("--model")) } : {}),
152
+ ...(parsed.has("--effort") ? { effort: requiredText(parsed.one("--effort")) } : {})
153
+ };
154
+ }
155
+ function profilePatch(parsed) {
156
+ return {
157
+ ...profileValues(parsed),
158
+ ...(parsed.has("--clear-description") ? { description: undefined } : {}),
159
+ ...(parsed.has("--clear-instructions") ? { instructions: undefined } : {}),
160
+ ...(parsed.has("--clear-skills") ? { skills: undefined } : {}),
161
+ ...(parsed.has("--clear-model") ? { model: undefined } : {}),
162
+ ...(parsed.has("--clear-effort") ? { effort: undefined } : {})
163
+ };
164
+ }
165
+ function assertOptionPairs(parsed) {
166
+ for (const [value, clear] of [
167
+ ["--description", "--clear-description"],
168
+ ["--instructions", "--clear-instructions"],
169
+ ["--skill", "--clear-skills"],
170
+ ["--model", "--clear-model"],
171
+ ["--effort", "--clear-effort"]
172
+ ]) {
173
+ if (parsed.has(value) && parsed.has(clear)) {
174
+ throw usageError(`${value} and ${clear} cannot be used together.`);
175
+ }
176
+ }
177
+ }
178
+ function requireProfile(store, id) {
179
+ const profile = store.getAgentProfile(id);
180
+ if (profile === null)
181
+ throw usageError(`Agent Profile not found: ${id}.`);
182
+ return profile;
183
+ }
184
+ function parseAccess(value) {
185
+ if (value === "read" || value === "write")
186
+ return value;
187
+ throw usageError(`Invalid Profile access: ${String(value)}.`);
188
+ }
189
+ function requiredText(value) {
190
+ const result = value?.trim();
191
+ if (result === undefined || result.length === 0)
192
+ throw usageError("Profile option value is required.");
193
+ return result;
194
+ }
195
+ function oneArg(args, usage) {
196
+ if (args.length !== 1 || args[0].trim().length === 0)
197
+ throw usageError(usage);
198
+ return args[0];
199
+ }
200
+ function noArgs(args, usage) {
201
+ if (args.length !== 0)
202
+ throw usageError(usage);
203
+ }