@entrorove/skill 0.1.59 → 0.1.60
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/CHANGELOG.md +5 -0
- package/IDE-EXECUTION.md +2 -0
- package/SKILL.md +2 -2
- package/cli.mjs +5 -2
- package/ide-command.mjs +1 -1
- package/ide-exit.mjs +26 -0
- package/ide-hook.mjs +16 -11
- package/ide-install.mjs +1 -1
- package/ide-session.mjs +1 -1
- package/manifest.json +1 -1
- package/package.json +2 -1
- package/release-state.json +12 -11
- package/release.mjs +2 -1
- package/releases.json +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.60 — 2026-10-17
|
|
4
|
+
|
|
5
|
+
- 修复范围补正误用独立交接的完整依赖校验,接收原账号签名器的真实受限扫描并保留未解析依赖、原审批与预算;新增当前 IDE 会话离线 exit,识别明确停用决定并保持退出状态,不再要求重建流程。
|
|
6
|
+
- Fix scope amendments to verify the original member signer wire receipt while preserving unresolved imports, owner approval and native budgets. Add offline exit for the current IDE session, recognize explicit stop decisions and preserve exited governance without requiring a replacement flow.
|
|
7
|
+
|
|
3
8
|
## 0.1.59 — 2026-10-17
|
|
4
9
|
|
|
5
10
|
- 新增同一任务的精确范围补正:原账号审核文件哈希与写入/只读角色,原S签名真实事实并重评原合同;计划、写入和结算绑定不可变范围修订,改后刷新保留原M消费证据与失败历史。
|
package/IDE-EXECUTION.md
CHANGED
|
@@ -14,6 +14,8 @@ Approved Codex `exec_command` reads and SDK calls run with `/bin/sh` and `login:
|
|
|
14
14
|
|
|
15
15
|
For a Codex task-to-task report explicitly authorized by the human user, the guard passes the exact `mcp__codex_app__send_message_to_thread` tool through unchanged, including a static `tools.mcp__codex_app__send_message_to_thread({...})` call inside `functions.exec`. Codex still decides whether the user authorized the message. Its text and response grant no Entrorove flow, file, shell or task-creation authority.
|
|
16
16
|
|
|
17
|
+
To stop governance only in the current IDE session after an explicit user decision, run `entrorove exit`. It needs no network, credential, agreement or hook callback and preserves original evidence and queues. Other sessions remain unchanged. `flow-cancel` and `flow-abandon` settle a flow; they do not express a decision to stop using the skill.
|
|
18
|
+
|
|
17
19
|
To stop using Entrorove on this computer, run `entrorove uninstall` directly. It works offline, removes only the recorded Entrorove host hooks and pristine global skill, and leaves other host settings, credentials and task records in place. A hand-edited file is reported as preserved rather than deleted. This command does not inspect or change another project.
|
|
18
20
|
|
|
19
21
|
Every invocation rereads that same credential file, including clients already running. After an authenticated account page supplies the current key and `configure` synchronizes it once, all tasks under the same OS user automatically use the new value. A revoked or expired key cannot obtain new permissions for itself: return to the authenticated account page and synchronize once through JSON stdin. Status recovery only queries the original request; it never rotates credentials or repeats the operation.
|
package/SKILL.md
CHANGED
|
@@ -5,7 +5,7 @@ description: Execute an engineering task through Entrorove, preserving its origi
|
|
|
5
5
|
|
|
6
6
|
# entrorove · 熵巡
|
|
7
7
|
|
|
8
|
-
Version: 0.1.
|
|
8
|
+
Version: 0.1.60.
|
|
9
9
|
|
|
10
10
|
Entrorove applies to the whole task once selected. Reading this document or calling an entry once does not execute the task. On every later turn, including after compaction, continue the original task and its required next operation before dependent work. Keep the original goal, scope, account, flow, cloud task and failure records. Never describe planning, a reported step or model output as verified delivery.
|
|
11
11
|
|
|
@@ -26,7 +26,7 @@ Entrorove applies to the whole task once selected. Reading this document or call
|
|
|
26
26
|
8. Read [DELIVERY-BOUNDARIES.md](DELIVERY-BOUNDARIES.md) before claiming a delivered stage or showing consumption. A delivered stage requires a clean boundary and uses `delivered-stage-N`. Blocked or unknown work can wait with recovery data intact; it is not a delivered stage. Display consumption only with a measured baseline.
|
|
27
27
|
9. For independent verified completion, submit actual independent execution evidence and run server verification and verdict. For a signed member-local plan, finish all original local steps and requirement checkpoints, then call the returned `workflow-verdict`; only its signed final `localAcceptance` means local acceptance is complete. Describe it as local execution and tests accepted, with independent validation not performed. Never invoke formal V, merge, Swarm or handoff to relabel it. Display the confirmed evaluation acknowledgement and preserve `receiptId`, `requestId`, execution generation and evaluation digest. “已回传” requires `acknowledgement.stored: true`. Missing or failed feedback remains visible. Active, waiting and unknown tasks retain recovery data.
|
|
28
28
|
|
|
29
|
-
The Codex guard preserves this binding over subsequent prompts and compaction and denies unsupported native mutations before execution. Hooks are host guardrails, not an operating-system security boundary; unsupported tool paths or a disabled/untrusted hook cannot be described as enforced. An explicit user decision to stop using the skill ends its governance and never becomes verified Entrorove delivery. Do not infer such a decision from quoted screenshots or a service failure.
|
|
29
|
+
The Codex guard preserves this binding over subsequent prompts and compaction and denies unsupported native mutations before execution. Hooks are host guardrails, not an operating-system security boundary; unsupported tool paths or a disabled/untrusted hook cannot be described as enforced. An explicit user decision to stop using the skill ends its governance and never becomes verified Entrorove delivery. Do not infer such a decision from quoted screenshots or a service failure. For that explicit decision, run `entrorove exit` in the affected IDE session. It works offline without a credential, agreement or hook callback, stops governance for that session and preserves its original flow, failed requests and queued work. It does not cancel the business goal, resume another flow or grant an Entrorove mutation pass. Do not substitute `flow-abandon` for user exit: abandonment releases a flow binding but leaves the skill selected.
|
|
30
30
|
|
|
31
31
|
After the same real blocked result occurs twice, diagnose it and use its supported recovery path. Do not send a third identical execution call. Read-only status and checkpoint acknowledgements do not count as execution progress. A blocked task may wait with its original flow, queue and recovery data intact; Stop must not force repeated automatic continuation of the same blocked turn.
|
|
32
32
|
|
package/cli.mjs
CHANGED
|
@@ -21,6 +21,7 @@ import { activeIdeAdapters, ideAdapters, installIdeHooks, uninstallIdeHooks } fr
|
|
|
21
21
|
import { cleanManagedDuplicates } from './install-cleanup.mjs';
|
|
22
22
|
import { assertIdeExecution, ideGuardBinding, settleBreakGlassSession } from './ide-session.mjs';
|
|
23
23
|
import { writeBreakGlass } from './break-glass.mjs';
|
|
24
|
+
import { exitIdeSession } from './ide-exit.mjs';
|
|
24
25
|
const markerName = '.entrorove-managed.json';
|
|
25
26
|
const installFiles = ['SKILL.md', 'CAPABILITY-MAP.md', 'AGREEMENT.md', 'manifest.json', 'IDE-EXECUTION.md', 'REUSE-DISCIPLINE.md', 'DELIVERY-BOUNDARIES.md'];
|
|
26
27
|
const markerSchema = 'entrorove.managed-install/1.0';
|
|
@@ -427,7 +428,9 @@ async function runAccountCommand(command, args) {
|
|
|
427
428
|
|
|
428
429
|
async function main() {
|
|
429
430
|
const [command, ...args] = process.argv.slice(2);
|
|
430
|
-
if (command === '
|
|
431
|
+
if (command === 'exit' && args.length === 0) {
|
|
432
|
+
process.stdout.write(`${JSON.stringify(await exitIdeSession())}\n`);
|
|
433
|
+
} else if (command === 'unlock' && args.length === 0) {
|
|
431
434
|
process.stdout.write(`${JSON.stringify(await writeBreakGlass(os.homedir(), Date.now(), ideGuardBinding().sessionId))}\n`);
|
|
432
435
|
} else if (command === 'uninstall' && args.length === 0) {
|
|
433
436
|
const result = await uninstall();
|
|
@@ -477,7 +480,7 @@ async function main() {
|
|
|
477
480
|
} else if (command === 'local') {
|
|
478
481
|
await runLocal(args);
|
|
479
482
|
} else {
|
|
480
|
-
throw new Error('Usage: entrorove unlock | uninstall | install [--host codex] | configure | agreement | invoke | queue | native <domain> <operation> | notifications configure|status|test | scope-connect <repositoryRoot> | scope-amend <repositoryRoot> | mutation-connect <repositoryRoot> | mutation-settle <repositoryRoot> | workflow-observe-step <repositoryRoot> | host-message [adapterModulePath] | cloud-task | cloud-watch | cloud-status | feedback <requestId> [generation] | status <requestId> | flows | usage [flowId] | billing | recurring list|claim|finish|runs | review | local (JSON on stdin)');
|
|
483
|
+
throw new Error('Usage: entrorove exit | unlock | uninstall | install [--host codex] | configure | agreement | invoke | queue | native <domain> <operation> | notifications configure|status|test | scope-connect <repositoryRoot> | scope-amend <repositoryRoot> | mutation-connect <repositoryRoot> | mutation-settle <repositoryRoot> | workflow-observe-step <repositoryRoot> | host-message [adapterModulePath] | cloud-task | cloud-watch | cloud-status | feedback <requestId> [generation] | status <requestId> | flows | usage [flowId] | billing | recurring list|claim|finish|runs | review | local (JSON on stdin)');
|
|
481
484
|
}
|
|
482
485
|
}
|
|
483
486
|
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) { const { captureIdeResults } = await import('./ide-results.mjs');
|
package/ide-command.mjs
CHANGED
|
@@ -76,7 +76,7 @@ export function sdkCommand(parsed, runtime) {
|
|
|
76
76
|
args = words.slice(1);
|
|
77
77
|
} else return null;
|
|
78
78
|
const simple = new Set(['invoke', 'cloud-task', 'cloud-status', 'cloud-watch', 'agreement', 'configure', 'queue', 'unlock']);
|
|
79
|
-
if (['unlock', 'uninstall'].includes(args[0]) && args.length === 1 && !parsed.input) return { args };
|
|
79
|
+
if (['exit', 'unlock', 'uninstall'].includes(args[0]) && args.length === 1 && !parsed.input) return { args };
|
|
80
80
|
if (simple.has(args[0]) && args.length === 1 && parsed.input) return { args, input: parsed.input };
|
|
81
81
|
if (['status', 'feedback'].includes(args[0]) && /^[a-f0-9]{64}$/u.test(args[1] ?? '') && [2,3].includes(args.length)) return { args };
|
|
82
82
|
if (args[0] === 'flows' && args.length === 1 && (!parsed.input || typeof parsed.input === 'object'
|
package/ide-exit.mjs
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { ideDirectory, ideDigest, ideError, ideGuardBinding, ideSession, readIdeJson, verifiedIdeGuards } from './ide-session.mjs';
|
|
4
|
+
|
|
5
|
+
const exactExit = /^(?:(?:请)?(?:停止使用|退出)\s*\$?entrorove|(?:stop using|exit)\s+\$?entrorove)[.!。!]?$/iu;
|
|
6
|
+
const naturalExit = /(?:^|[,,。;;!!\n])\s*(?:从现在开始|接下来|今后)?\s*(?:停止使用|不再使用|不使用)\s*(?:entrorove(?:\s*技能)?|(?:这个|该)?技能)\s*(?:(?:来)?(?:执行|处理|完成|继续)[^,,。;;!!\n]{0,40}(?:任务|工作))?[。!!]?\s*$/iu;
|
|
7
|
+
export function explicitIdeExit(prompt) {
|
|
8
|
+
if (exactExit.test(prompt)) return true;
|
|
9
|
+
return !/[`"'“”‘’「」『』<>]|如果|假如|假设|示例|截图|引用/u.test(prompt) && naturalExit.test(prompt);
|
|
10
|
+
}
|
|
11
|
+
export function markIdeExited(state, source) {
|
|
12
|
+
if (state.phase !== 'user-exited') state.exitPhase = state.phase;
|
|
13
|
+
state.active = false; state.phase = 'user-exited';
|
|
14
|
+
state.exitDecision = { source, observedAt: new Date().toISOString() };
|
|
15
|
+
}
|
|
16
|
+
export async function exitIdeSession({ home = os.homedir(), environment = process.env } = {}) {
|
|
17
|
+
const { host, sessionId } = ideGuardBinding(environment);
|
|
18
|
+
if (!Object.hasOwn(verifiedIdeGuards, host) || !sessionId) throw ideError('ENTROROVE_IDE_IDENTITY', 'Exit requires the current verified IDE session identity');
|
|
19
|
+
const directory = await ideDirectory(home), state = await readIdeJson(path.join(directory, `session-${ideDigest(sessionId)}.json`));
|
|
20
|
+
if (!state || state.sessionId !== sessionId) throw ideError('ENTROROVE_IDE_IDENTITY', 'Exit requires the existing current IDE session');
|
|
21
|
+
return ideSession({ session_id: sessionId, cwd: state.repositoryRoot }, current => {
|
|
22
|
+
markIdeExited(current, 'cli');
|
|
23
|
+
return { schemaVersion: 'entrorove.ide-exit/1.0', status: 'user-exited', sessionId,
|
|
24
|
+
offline: true, network: false, hook: 'not-required', originalFlowPreserved: true, claimsCompletion: false };
|
|
25
|
+
}, home);
|
|
26
|
+
}
|
package/ide-hook.mjs
CHANGED
|
@@ -13,6 +13,7 @@ import { parseIdeResults, consumeIdeResults } from './ide-results.mjs';
|
|
|
13
13
|
import { verifyIdeLocalAcceptance } from './ide-local-acceptance.mjs';
|
|
14
14
|
import { registerIdeRequirement, ideQueueContext, unclassifiedIdeRequirements,
|
|
15
15
|
advanceIdeQueue, checkQueuedStart, unfinishedIdeQueue } from './ide-queue.mjs';
|
|
16
|
+
import { explicitIdeExit, markIdeExited } from './ide-exit.mjs';
|
|
16
17
|
|
|
17
18
|
const output = (event, extra = {}) => ({ hookSpecificOutput: { hookEventName: event, ...extra } });
|
|
18
19
|
const deny = reason => output('PreToolUse', { permissionDecision: 'deny', permissionDecisionReason: reason });
|
|
@@ -24,7 +25,6 @@ const inputErrors = {
|
|
|
24
25
|
const publicId = value => typeof value === 'string' && /^[A-Za-z0-9_-]{1,200}$/u.test(value);
|
|
25
26
|
const readTools = new Set(['wait', 'view_image', 'list_mcp_resources', 'list_mcp_resource_templates', 'read_mcp_resource', 'web_search', 'update_plan', 'request_user_input', 'request_user_input_async', 'get_goal']);
|
|
26
27
|
const unlockCommand = 'entrorove unlock';
|
|
27
|
-
const exitPrompt = /^(?:(?:请)?(?:停止使用|退出)\s*\$?entrorove|(?:stop using|exit)\s+\$?entrorove)[.!。!]?$/iu;
|
|
28
28
|
const selectPrompt = /^(?:(?:请)?(?:使用|启用)\s+\$?entrorove|\$entrorove)(?:\s|[,。,::!!]|$)/iu;
|
|
29
29
|
function userPrompt(event) {
|
|
30
30
|
let prompt = (event.prompt ?? '').trim();
|
|
@@ -143,19 +143,24 @@ function originalLocalCall(pending, call, input) {
|
|
|
143
143
|
['taskId', 'flowId', 'stepId', 'leaseId', 'generation'].map(field => [field, input?.[field]]));
|
|
144
144
|
if (operationOf(call) === 'continue') pending.continuationOperation = input?.operation;
|
|
145
145
|
}
|
|
146
|
+
function offlineExitCall(event, runtime, state, call) {
|
|
147
|
+
return output('PreToolUse', { permissionDecision: 'allow', updatedInput: prepareIdeShellInput(event.tool_name,
|
|
148
|
+
event.tool_input, renderSdkCommand(call, runtime, state.sessionId), true) });
|
|
149
|
+
}
|
|
150
|
+
function allowInstaller(event, state, command) {
|
|
151
|
+
const safeInput = prepareIdeShellInput(event.tool_name, event.tool_input, command, true);
|
|
152
|
+
if (!safeInput) return denyUnsafeShellInput(state, event);
|
|
153
|
+
if (state.active) { state.readCalls ??= {};
|
|
154
|
+
state.readCalls[event.tool_use_id] = { toolUseId: event.tool_use_id, command: 'install' }; }
|
|
155
|
+
return output('PreToolUse', { permissionDecision: 'allow', updatedInput: safeInput });
|
|
156
|
+
}
|
|
146
157
|
async function beforeTool(event, state, home) {
|
|
147
158
|
if (state.phase === 'user-exited') return {};
|
|
148
159
|
const unlocked = await readBreakGlass(home, state.sessionId);
|
|
149
160
|
const command = event.tool_input?.command ?? event.tool_input?.cmd, parsed = literalCommand(command);
|
|
150
161
|
const isShell = ['Bash', 'exec_command', 'shell_command'].includes(event.tool_name);
|
|
151
162
|
const installer = isShell && installerCommand(parsed);
|
|
152
|
-
if (installer)
|
|
153
|
-
const safeInput = prepareIdeShellInput(event.tool_name, event.tool_input, installer, true);
|
|
154
|
-
if (!safeInput) return denyUnsafeShellInput(state, event);
|
|
155
|
-
if (state.active) { state.readCalls ??= {};
|
|
156
|
-
state.readCalls[event.tool_use_id] = { toolUseId: event.tool_use_id, command: 'install' }; }
|
|
157
|
-
return output('PreToolUse', { permissionDecision: 'allow', updatedInput: safeInput });
|
|
158
|
-
}
|
|
163
|
+
if (installer) return allowInstaller(event, state, installer);
|
|
159
164
|
const namedSdk = parsed?.words.some(word => word === 'entrorove' || /^@entrorove\/skill(?:@[^ ]+)?$/u.test(word)
|
|
160
165
|
|| /(?:@entrorove\/skill|entrorove-skill)\/cli\.mjs$/u.test(word));
|
|
161
166
|
if (!state.active && !namedSdk) return {};
|
|
@@ -163,6 +168,7 @@ async function beforeTool(event, state, home) {
|
|
|
163
168
|
const call = runtime && sdkCommand(parsed, runtime);
|
|
164
169
|
if (call) {
|
|
165
170
|
if (!prepareIdeShellInput(event.tool_name, event.tool_input, command, true)) return denyUnsafeShellInput(state, event);
|
|
171
|
+
if (call.args[0] === 'exit' && call.args.length === 1) return offlineExitCall(event, runtime, state, call);
|
|
166
172
|
if (call.args[0] === 'uninstall') {
|
|
167
173
|
state.active = false; state.phase = 'user-exited';
|
|
168
174
|
return output('PreToolUse', { permissionDecision: 'allow', updatedInput: prepareIdeShellInput(event.tool_name,
|
|
@@ -253,9 +259,8 @@ export async function runIdeHook(event, { home } = {}) {
|
|
|
253
259
|
delete state.stopNoticeTurn;
|
|
254
260
|
}
|
|
255
261
|
if (name === 'PreToolUse') state.enforcement = 'enforced';
|
|
256
|
-
if (name === 'UserPromptSubmit' &&
|
|
257
|
-
|
|
258
|
-
state.active = false; state.phase = 'user-exited';
|
|
262
|
+
if (name === 'UserPromptSubmit' && explicitIdeExit(userPrompt(event))) {
|
|
263
|
+
markIdeExited(state, 'user-prompt');
|
|
259
264
|
return output(name, { additionalContext: '用户明确退出 Entrorove 管理;原任务仍保留,未验收、未评分为成功。' });
|
|
260
265
|
}
|
|
261
266
|
if (selected) {
|
package/ide-install.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { ideDirectory, ideDigest, readIdeJson, writeIdeJson, ideError } from './
|
|
|
5
5
|
import { withStateLock } from './local-state-lock.mjs';
|
|
6
6
|
|
|
7
7
|
const source = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const files = ['ide-hook.mjs', 'ide-session.mjs', 'break-glass.mjs', 'ide-results.mjs', 'ide-local-acceptance.mjs', 'ide-queue.mjs', 'ide-command.mjs', 'ide-code-mode.mjs', 'remote-transport.mjs', 'local-credential.mjs', 'local-state-lock.mjs', 'local-stage-boundary.mjs'];
|
|
8
|
+
const files = ['ide-hook.mjs', 'ide-session.mjs', 'ide-exit.mjs', 'break-glass.mjs', 'ide-results.mjs', 'ide-local-acceptance.mjs', 'ide-queue.mjs', 'ide-command.mjs', 'ide-code-mode.mjs', 'remote-transport.mjs', 'local-credential.mjs', 'local-state-lock.mjs', 'local-stage-boundary.mjs'];
|
|
9
9
|
const quote = text => `'${text.replace(/'/gu, "'\\''")}'`;
|
|
10
10
|
|
|
11
11
|
// One shared host-agnostic hook binary; every host is described by its own
|
package/ide-session.mjs
CHANGED
|
@@ -204,7 +204,7 @@ export async function settleBreakGlassSession(args, input, result, { home = os.h
|
|
|
204
204
|
for (const key of ['flowId', 'taskId', 'taskNumber', 'requestId', 'remoteRequestId', 'nextStep', 'pendingCall', 'readCalls']) delete state[key];
|
|
205
205
|
state.feedbackAcknowledged = false;
|
|
206
206
|
if (state.phase !== 'user-exited') state.phase = 'entry';
|
|
207
|
-
} else state.phase = 'ended';
|
|
207
|
+
} else if (state.phase !== 'user-exited') state.phase = 'ended';
|
|
208
208
|
return true;
|
|
209
209
|
}, home);
|
|
210
210
|
}
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@entrorove/skill",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.60",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"entrorove": "cli.mjs"
|
|
@@ -225,6 +225,7 @@
|
|
|
225
225
|
"ide-install.mjs",
|
|
226
226
|
"install-cleanup.mjs",
|
|
227
227
|
"ide-session.mjs",
|
|
228
|
+
"ide-exit.mjs",
|
|
228
229
|
"break-glass.mjs",
|
|
229
230
|
"ide-results.mjs",
|
|
230
231
|
"ide-local-acceptance.mjs",
|
package/release-state.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "entrorove.release-state/1.0",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"digest": "
|
|
3
|
+
"version": "0.1.60",
|
|
4
|
+
"digest": "e17ae66b1a55cf8a12f750bc8211a083ecb15c6625687e7d17b7ea08a4b302a1",
|
|
5
5
|
"files": {
|
|
6
6
|
"connected-cli.mjs": "79c3359303957a9ebb8987e3dfb181f189d380fa02ef4462683b786aedfc7802",
|
|
7
7
|
"local-approved-process.mjs": "442856df788e63f38757439ba0657d1c689aaf797631a955fae3dd639e844e6d",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"mutation-client.mjs": "6455c35b483d6d22e42e7be708630db07d9fd1d3cdf639294b126b69db2eae2f",
|
|
23
23
|
"cloud-mutation-authority.mjs": "c7226e882a4f3be4d2f55728f515d5a815c0aa1f21aa5e4689314e6e6a8c66a2",
|
|
24
24
|
"ide-code-mode.mjs": "f8ba4de33632ab4c6df52dab52f392414b4632c7e94b218b8065677970c075c7",
|
|
25
|
-
"ide-command.mjs": "
|
|
26
|
-
"ide-hook.mjs": "
|
|
27
|
-
"ide-install.mjs": "
|
|
28
|
-
"ide-session.mjs": "
|
|
25
|
+
"ide-command.mjs": "4f61da5a39f88b8ba657d6b1beeb76f765c7f37f3d3e7f52dd9d2eb398499ec3",
|
|
26
|
+
"ide-hook.mjs": "037c245cd2b261acbaed126d5441a2b64a91bc9733a150ebd1ecfdf531d8c49f",
|
|
27
|
+
"ide-install.mjs": "7effa871a44e1215e26b913edc3de0c5b36deaff1a57c0f20d33212160a63f22",
|
|
28
|
+
"ide-session.mjs": "eb8021bc6e38e5c9c35d1dc4cc0015178960cb4eeb39da5a4de47762bf8d7c95",
|
|
29
29
|
"break-glass.mjs": "6ec9f97c5d68bb33121b2374c06b9d4c8eb3419b52d00849fec7124bc63e4582",
|
|
30
30
|
"ide-results.mjs": "baa0618845ced901334644479bf4e0d298bad3f955bc18846752de6c283a5573",
|
|
31
31
|
"ide-local-acceptance.mjs": "238eec6d7b6093fb8ad022da0ed3383a48ba2ffcf693e3ce8a241cf9624088d8",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"runtime/validator-runtime-v7.0.44.d.mts": "7797edbfe2f7de24da370204dce4dfd22822a1bd80df93514fff900b98afe36f",
|
|
51
51
|
"snapshot-retention.mjs": "ca46aeb36b1a5a24fe7e967031a71b9a3d33f40cb715d344402cbe0dc9c425cb",
|
|
52
52
|
"snapshot-cleanup-journal.mjs": "76a9684cc95b4eb076e1298d78a9dff37948b00d9607b8f546c599072d3ed331",
|
|
53
|
-
"IDE-EXECUTION.md": "
|
|
53
|
+
"IDE-EXECUTION.md": "12bff5711e9100ffcab03409bdf2b587e4a2d3f464500dbaa48ff59786d9cf42",
|
|
54
54
|
"REUSE-DISCIPLINE.md": "5b214cf313e7f715f52d54e28093a2d038f0f196ca64b15d1c49587b9d8eecf8",
|
|
55
55
|
"reuse-discipline-release.mjs": "7f55ae10ec3396ed3bc5430a0c64f94c33c2dfbc57b32084caab92fd5fd1586f",
|
|
56
56
|
"local-final-gate16.mjs": "083aec470670e6cdb7ad2ab27b7a51b53a9ec3a8b4121cb9cbfa17d9940892c2",
|
|
@@ -94,17 +94,18 @@
|
|
|
94
94
|
"local-autocoord17-waits.mjs": "2b0a713987822548a94e1ed3a9a891532db45383797dfc5d5bc8d1e35593cf25",
|
|
95
95
|
"local-validator-isolation17.mjs": "48e94604e28b8fddd567dfb35ff60b73fd094a5803bd49f076388b7f310f92aa",
|
|
96
96
|
"local-calctool-composition17.mjs": "ac89fcb41ab0d0d9b47c1b5696945281b0894eb064820775e36a011c76314e6a",
|
|
97
|
-
"cli.mjs": "
|
|
97
|
+
"cli.mjs": "d0f29034c812f6d2ebfecdfcddacce70334ab379e3d25dc673a72ece817a977c",
|
|
98
|
+
"ide-exit.mjs": "c890c7b34fa6f12e0ccff7a7b85738d515fb13ad93f671a8547ae6570b66488d",
|
|
98
99
|
"install-cleanup.mjs": "8a8e1a7dfe37427f86cd4d6e317890d0829894a9949d4216674a716b36edbc54",
|
|
99
100
|
"review-client.mjs": "3491eef68ed533174b31db3c53febb6519b8f088f71a9964644714a9a4c03c77",
|
|
100
101
|
"version.mjs": "1f392147d72c40af4b03b307ea607075fb815af5174fa07e254b95fe12dbf3e7",
|
|
101
|
-
"SKILL.md": "
|
|
102
|
+
"SKILL.md": "f6e8b3f64d102063b8e6e263b3422563ed3dd4781c7dd5c46a1c6bccef02ffad",
|
|
102
103
|
"CAPABILITY-MAP.md": "e420bbc202c27d983635ae33b823b39dd445cf5cdf40ffe88e210a755cb7424d",
|
|
103
104
|
"AGREEMENT.md": "f93a68e92c457200dd024610e65f74e478b8f60860f951da818b70561f1b9bf8",
|
|
104
105
|
"DELIVERY-BOUNDARIES.md": "9b9db50ed1bcce9e77ff6527b6bb7eaf12f3b913162ea9cb7fe90db06b393a4f",
|
|
105
|
-
"package.json": "
|
|
106
|
+
"package.json": "5da583a9c348c5acedbd8a97c9ed0b3ba3844bb8b6445c7b3d78690981f612ba",
|
|
106
107
|
"manifest.json": "ab06e307795bc9da5add926752b6c4dbdaf18625090261a035aa356a679c504f",
|
|
107
|
-
"release.mjs": "
|
|
108
|
+
"release.mjs": "b404798d90a4447740857a58a7656ecd80b51c36971561d822961913793e101b",
|
|
108
109
|
"local-cli.mjs": "41e2a737c8587cb5ce469a7661f6d14b5ea4cd073f8286822fc4dc96b67f56a1",
|
|
109
110
|
"local-state-lock.mjs": "1dbf64264642a0851faf043e07ee9f66d2ad0508e9f799b0626246e42fae893e",
|
|
110
111
|
"local-execution.mjs": "185f34e917440a360b3c4bafd3af245243807d964ae3820b3cffaaa2e6348cc6",
|
package/release.mjs
CHANGED
|
@@ -68,7 +68,7 @@ const sourceFiles = [
|
|
|
68
68
|
'local-merge-transaction.mjs',
|
|
69
69
|
...swarmSourceFiles,
|
|
70
70
|
...coordination17SourceFiles,
|
|
71
|
-
'cli.mjs', 'install-cleanup.mjs', 'review-client.mjs', 'version.mjs', 'SKILL.md', 'CAPABILITY-MAP.md', 'AGREEMENT.md', 'DELIVERY-BOUNDARIES.md',
|
|
71
|
+
'cli.mjs', 'ide-exit.mjs', 'install-cleanup.mjs', 'review-client.mjs', 'version.mjs', 'SKILL.md', 'CAPABILITY-MAP.md', 'AGREEMENT.md', 'DELIVERY-BOUNDARIES.md',
|
|
72
72
|
'package.json', 'manifest.json', 'release.mjs',
|
|
73
73
|
'local-cli.mjs', 'local-state-lock.mjs', 'local-execution.mjs', 'local-integrity.mjs', 'local-evidence-verification.mjs', 'local-formula.mjs', 'local-ledger.mjs',
|
|
74
74
|
'local-error.mjs',
|
|
@@ -337,6 +337,7 @@ function releaseLabels() {
|
|
|
337
337
|
'blueprint-criterion-wire.mjs': { zh: '蓝图验收标准执行授权', en: 'Blueprint criterion execution authority' },
|
|
338
338
|
'blueprint-criterion-runner.mjs': { zh: '蓝图验收标准实际执行器', en: 'Blueprint criterion process runner' },
|
|
339
339
|
'cli.mjs': { zh: '技能运行和受管安装', en: 'skill runtime and managed installation' },
|
|
340
|
+
'ide-exit.mjs': { zh: '当前 IDE 会话明确退出', en: 'explicit exit for the current IDE session' },
|
|
340
341
|
'install-cleanup.mjs': { zh: '旧版受管安装清理', en: 'managed installation cleanup' },
|
|
341
342
|
'version.mjs': { zh: '版本安全检查', en: 'version safety checks' },
|
|
342
343
|
'SKILL.md': { zh: 'IDE 工作流程说明', en: 'IDE workflow instructions' },
|
package/releases.json
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.1.60",
|
|
4
|
+
"date": "2026-10-17",
|
|
5
|
+
"zh": "修复范围补正误用独立交接的完整依赖校验,接收原账号签名器的真实受限扫描并保留未解析依赖、原审批与预算;新增当前 IDE 会话离线 exit,识别明确停用决定并保持退出状态,不再要求重建流程。",
|
|
6
|
+
"en": "Fix scope amendments to verify the original member signer wire receipt while preserving unresolved imports, owner approval and native budgets. Add offline exit for the current IDE session, recognize explicit stop decisions and preserve exited governance without requiring a replacement flow."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.1.59",
|
|
4
10
|
"date": "2026-10-17",
|