@entrorove/skill 0.1.47 → 0.1.48
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 +7 -2
- package/IDE-EXECUTION.md +1 -1
- package/SKILL.md +2 -2
- package/cli.mjs +10 -6
- package/ide-command.mjs +4 -2
- package/install-cleanup.mjs +5 -3
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/release-state.json +7 -7
- package/releases.json +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.48 — 2026-10-16
|
|
4
|
+
|
|
5
|
+
- 新增标准命令 `install --host codex`,仅配置 Codex 并保留 Claude 的配置与技能副本;后续自动更新沿用已配置的宿主范围。安装命令守卫和旧版清理也按目标宿主限界。
|
|
6
|
+
- Added the standard `install --host codex` command to configure Codex while preserving Claude configuration and skill copies. Later automatic updates retain the already configured host scope; installer command guards and obsolete-install cleanup honor the selected host.
|
|
7
|
+
|
|
3
8
|
## 0.1.47 — 2026-10-16
|
|
4
9
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
10
|
+
- 修复失败 flow 的取消、放弃和会话解绑;离线 unlock 仅恢复当前会话并保留任务队列。放行授权根或依赖目录内的只读 tsconfig 引用,越界错误说明原路径、解析结果和原因。升级时清理未改动的旧受管安装,保留用户编辑及其他任务;IDE 钩子仅对已绑定的会话和仓库生效。
|
|
11
|
+
- Fixed cancellation, abandonment, and session unbinding for failed flows; offline unlock restores only the current session and preserves its queue. Read-only tsconfig references inside the authorized root or dependency directories are accepted, while escape errors identify the input path, resolved path, and reason. Upgrades remove pristine obsolete managed installs while preserving user edits and unrelated tasks; IDE hooks apply only to a bound session and repository.
|
|
7
12
|
|
|
8
13
|
## 0.1.46 — 2026-10-16
|
|
9
14
|
|
package/IDE-EXECUTION.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Install or update the managed copy with `npx @entrorove/skill install`. The installer keeps one global managed entrorove skill, replaces its older pristine version, removes only pristine duplicate installations, and preserves hand-edited files. An older package cannot overwrite a newer managed version.
|
|
1
|
+
Install or update the managed copy with `npx @entrorove/skill install`. In Codex, use `npx @entrorove/skill install --host codex` to configure Codex only; this leaves Claude Code hook settings and skill copies alone. The installer keeps one global managed entrorove skill, replaces its older pristine version, removes only pristine duplicate installations for the selected host, and preserves hand-edited files. An older package cannot overwrite a newer managed version.
|
|
2
2
|
|
|
3
3
|
Register or sign in by email at https://entrorove.com. Enter the account key once with `npx @entrorove/skill configure` and `{"token":"..."}` on standard input. The credential persists in the current OS user's restricted local store across skill upgrades. Before asking again, use the stored credential; a missing or invalid credential must be reported explicitly. Never place the key in arguments, URLs, project files or logs. entrorove accounts and keys are independent of other services.
|
|
4
4
|
|
package/SKILL.md
CHANGED
|
@@ -5,13 +5,13 @@ 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.48.
|
|
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
|
|
|
12
12
|
## Required execution
|
|
13
13
|
|
|
14
|
-
1. Install `npx --yes --prefer-online @entrorove/skill@latest install` only when the user chooses to enable this skill. The managed installer writes the skill and
|
|
14
|
+
1. Install `npx --yes --prefer-online @entrorove/skill@latest install --host codex` in Codex only when the user chooses to enable this skill. The managed installer writes the skill and Codex lifecycle hook configuration without changing Claude Code settings; confirm that the IDE trusts it and observe a real callback before describing enforcement as active. Do not ask the user to type a nonexistent `/hooks` command. If the host reports a blocked management call, show and allow the offline `entrorove unlock` command; it only opens the skill management plane and never grants project-write authority. New execution from a detected IDE requires the exact live host approval. An unsupported IDE adapter, missing hook callback, missing credential, or failed discovery stops execution explicitly. Do not silently use native tools instead. The guard is host-agnostic: one managed hook is installed once, and each host is described by its own adapter (config location, event names, entry shape). Codex and Claude Code are the verified adapters today; a host with no verified adapter, or a run whose host session identity is missing, is refused explicitly rather than degrading to native tools.
|
|
15
15
|
`entrorove unlock` is the break-glass path: run the installed CLI directly in the affected IDE terminal. It writes a short-lived lease for that IDE session only, without a hook callback, network request, credential read, agreement check or protocol lookup. The current session ID must be available from the host environment or `ENTROROVE_SESSION`. The lease permits `flow-cancel` and `flow-abandon` recovery, never project writes or another session's calls. A successful `flow-abandon` clears that session's old binding locally even without a hook callback and preserves its queued requests.
|
|
16
16
|
To remove this skill and its host hooks, run `entrorove uninstall` directly. It works offline and preserves unrelated host settings, credentials and task records. If a managed file was edited, it reports the preserved path instead of deleting it.
|
|
17
17
|
2. Read [IDE-EXECUTION.md](IDE-EXECUTION.md) for the exact entry, cloud callbacks, account agreement and operation contracts. Use the stored account credential; never put it in arguments, URLs, project files, output or fixtures. Entrorove is independent of other systems.
|
package/cli.mjs
CHANGED
|
@@ -17,7 +17,7 @@ import { buildReview, submitSkillFeedback, feedbackNoticeVersion } from './revie
|
|
|
17
17
|
import { queryCloudTask, runCloudTask as dispatchCloudTask } from './cloud-task-client.mjs';
|
|
18
18
|
import { watchCloudTask } from './cloud-watch-client.mjs';
|
|
19
19
|
import { queryAutomaticFeedback } from './automatic-feedback-client.mjs';
|
|
20
|
-
import { activeIdeAdapters, installIdeHooks, uninstallIdeHooks } from './ide-install.mjs';
|
|
20
|
+
import { activeIdeAdapters, ideAdapters, installIdeHooks, uninstallIdeHooks } from './ide-install.mjs';
|
|
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';
|
|
@@ -246,7 +246,9 @@ async function updateGlobalInstall(target, bundle) {
|
|
|
246
246
|
return true;
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
-
export async function install({ home = os.homedir(), cwd = process.cwd(), explicit = false } = {}) {
|
|
249
|
+
export async function install({ home = os.homedir(), cwd = process.cwd(), explicit = false, hostId } = {}) {
|
|
250
|
+
const selected = hostId === undefined ? null : ideAdapters.find(adapter => adapter.id === hostId);
|
|
251
|
+
if (hostId !== undefined && hostId !== 'codex') throw new Error('Install host must be codex');
|
|
250
252
|
const target = globalInstallPath(home);
|
|
251
253
|
if (!explicit && !(await managedState(target))) return { installed: false, updated: false };
|
|
252
254
|
const parent = path.dirname(target);
|
|
@@ -259,8 +261,10 @@ export async function install({ home = os.homedir(), cwd = process.cwd(), explic
|
|
|
259
261
|
const updated = await updateGlobalInstall(target, bundle);
|
|
260
262
|
const { removed, preserved } = await cleanManagedDuplicates({
|
|
261
263
|
target, cwd, home, isManaged: managedState, includeProject: explicit,
|
|
264
|
+
hostIds: selected ? [selected.id] : active?.map(adapter => adapter.id),
|
|
262
265
|
});
|
|
263
|
-
const ide = await installIdeHooks({ home, version: bundle.manifest.version,
|
|
266
|
+
const ide = await installIdeHooks({ home, version: bundle.manifest.version,
|
|
267
|
+
adapters: selected ? [selected] : active });
|
|
264
268
|
return { version: bundle.manifest.version, updated, removed, preserved, agreementStale: stale, ide };
|
|
265
269
|
});
|
|
266
270
|
}
|
|
@@ -429,8 +433,8 @@ async function main() {
|
|
|
429
433
|
const result = await uninstall();
|
|
430
434
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
431
435
|
if (!result.uninstalled) process.exitCode = 2;
|
|
432
|
-
} else if (command === 'install' && args.length === 0) {
|
|
433
|
-
process.stdout.write(JSON.stringify(await install({ explicit: true })) + '\n');
|
|
436
|
+
} else if (command === 'install' && (args.length === 0 || args.length === 2 && args[0] === '--host')) {
|
|
437
|
+
process.stdout.write(JSON.stringify(await install({ explicit: true, hostId: args[1] })) + '\n');
|
|
434
438
|
} else if (command === 'configure' && args.length === 0) {
|
|
435
439
|
const data = await stdinJson();
|
|
436
440
|
if (Object.keys(data).length !== 1 || typeof data.token !== 'string') throw new Error('Expected {"token":"..."} on stdin');
|
|
@@ -475,7 +479,7 @@ async function main() {
|
|
|
475
479
|
} else if (command === 'local') {
|
|
476
480
|
await runLocal(args);
|
|
477
481
|
} else {
|
|
478
|
-
throw new Error('Usage: entrorove unlock | uninstall | install | configure | agreement | invoke | queue | native <domain> <operation> | notifications configure|status|test | scope-connect <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)');
|
|
482
|
+
throw new Error('Usage: entrorove unlock | uninstall | install [--host codex] | configure | agreement | invoke | queue | native <domain> <operation> | notifications configure|status|test | scope-connect <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)');
|
|
479
483
|
}
|
|
480
484
|
}
|
|
481
485
|
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
|
@@ -48,6 +48,7 @@ export function sdkCommand(parsed, runtime) {
|
|
|
48
48
|
if (simple.has(args[0]) && args.length === 1 && parsed.input) return { args, input: parsed.input };
|
|
49
49
|
if (['status', 'feedback'].includes(args[0]) && /^[a-f0-9]{64}$/u.test(args[1] ?? '') && [2,3].includes(args.length)) return { args };
|
|
50
50
|
if (['flows', 'install', 'billing'].includes(args[0]) && args.length === 1 && !parsed.input) return { args };
|
|
51
|
+
if (args[0] === 'install' && args.length === 3 && args[1] === '--host' && args[2] === 'codex' && !parsed.input) return { args };
|
|
51
52
|
if (args[0] === 'recurring' && ['list', 'claim'].includes(args[1] ?? '') && args.length === 2 && !parsed.input) return { args };
|
|
52
53
|
if (args[0] === 'recurring' && ['finish', 'runs'].includes(args[1] ?? '') && args.length === 3 && (!parsed.input || args[1] === 'finish')) return { args, ...(parsed.input ? { input: parsed.input } : {}) };
|
|
53
54
|
if (args[0] === 'usage' && args.length <= 2 && !parsed.input
|
|
@@ -61,8 +62,9 @@ export function installerCommand(parsed) {
|
|
|
61
62
|
if (!parsed || parsed.input || !['npx', 'npx.cmd'].includes(parsed.words[0])) return null;
|
|
62
63
|
const words = [...parsed.words]; words.shift();
|
|
63
64
|
while (['--yes', '--prefer-online', '--registry=https://registry.npmjs.org'].includes(words[0])) words.shift();
|
|
64
|
-
if (words.length
|
|
65
|
-
|
|
65
|
+
if (![2, 4].includes(words.length) || !/^@entrorove\/skill(?:@(?:latest|\d+\.\d+\.\d+))?$/u.test(words[0]) || words[1] !== 'install'
|
|
66
|
+
|| words.length === 4 && (words[2] !== '--host' || words[3] !== 'codex')) return null;
|
|
67
|
+
return `npx --yes --prefer-online --registry=https://registry.npmjs.org ${words[0]} install${words.length === 4 ? ' --host codex' : ''}`;
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
export function readCommand(parsed) {
|
package/install-cleanup.mjs
CHANGED
|
@@ -39,12 +39,14 @@ async function removeDuplicate(directory, target, root, isManaged) {
|
|
|
39
39
|
return 'removed';
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
export async function cleanManagedDuplicates({ target, cwd, home, isManaged, includeProject = true }) {
|
|
42
|
+
export async function cleanManagedDuplicates({ target, cwd, home, isManaged, includeProject = true, hostIds = null }) {
|
|
43
43
|
const root = includeProject ? gitRoot(cwd) : null, homeRoot = gitRoot(home);
|
|
44
|
+
const includeClaude = hostIds === null || hostIds.includes('claude');
|
|
44
45
|
const candidates = [
|
|
45
|
-
...(root ? ['.codex/skills/entrorove', '.agents/skills/entrorove',
|
|
46
|
+
...(root ? ['.codex/skills/entrorove', '.agents/skills/entrorove',
|
|
47
|
+
...(includeClaude ? ['.claude/skills/entrorove'] : [])]
|
|
46
48
|
.map(relative => ({ directory: path.join(root, relative), label: relative, root })) : []),
|
|
47
|
-
...['.agents/skills/entrorove', '.claude/skills/entrorove']
|
|
49
|
+
...['.agents/skills/entrorove', ...(includeClaude ? ['.claude/skills/entrorove'] : [])]
|
|
48
50
|
.map(relative => ({ directory: path.join(home, relative), label: `~/${relative}`, root: homeRoot })),
|
|
49
51
|
];
|
|
50
52
|
const removed = [], preserved = [], seen = new Set([target]);
|
package/manifest.json
CHANGED
package/package.json
CHANGED
package/release-state.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "entrorove.release-state/1.0",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"digest": "
|
|
3
|
+
"version": "0.1.48",
|
|
4
|
+
"digest": "6f79c0e2c12d4e8766801bf117bcf73070156ba89fb87e4b1137c9706b8f7df3",
|
|
5
5
|
"files": {
|
|
6
6
|
"ide-code-mode.mjs": "f3f53357ba09727b3b597851976a24de93287c0faca5052448277d0904bb61f7",
|
|
7
|
-
"ide-command.mjs": "
|
|
7
|
+
"ide-command.mjs": "dcd4b48305cc4f106e5e4509e794e4b46ef02de29afa9cccbbc2774308c81ff3",
|
|
8
8
|
"ide-hook.mjs": "2f00e56de1e1149f117714d5dd334196f1a3f206c3bfab541393bc0f625e0108",
|
|
9
9
|
"ide-install.mjs": "10247efadcfeef5da001022d12080bd0f789e67fdf7862bcc65db73dda3bbe57",
|
|
10
10
|
"ide-session.mjs": "dc256e77b03303932d354768c0e79384340a3137e7421b4ae9c869f7e58e1a3a",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"runtime/validator-runtime-v7.0.44.d.mts": "7797edbfe2f7de24da370204dce4dfd22822a1bd80df93514fff900b98afe36f",
|
|
30
30
|
"snapshot-retention.mjs": "4f8919fe8ec49fb4c23e080a8ad2fa3a9282bca3fffe7cf55c64e89ef316697e",
|
|
31
31
|
"snapshot-cleanup-journal.mjs": "76a9684cc95b4eb076e1298d78a9dff37948b00d9607b8f546c599072d3ed331",
|
|
32
|
-
"IDE-EXECUTION.md": "
|
|
32
|
+
"IDE-EXECUTION.md": "6c8b9abe17cc8f01aa3da2ab19ed34b2b9be3e3b38c1739fa6a7d763622c4864",
|
|
33
33
|
"REUSE-DISCIPLINE.md": "295ecd41c931b00c21d009ab65ac160f0e2ab81b4000ed498d2e8e97c2dc6c63",
|
|
34
34
|
"reuse-discipline-release.mjs": "20ded9c21bd71b8779c454f5eba4c7c0a943ef99d94117b9bbef891d2ab6e3de",
|
|
35
35
|
"local-final-gate16.mjs": "083aec470670e6cdb7ad2ab27b7a51b53a9ec3a8b4121cb9cbfa17d9940892c2",
|
|
@@ -73,11 +73,11 @@
|
|
|
73
73
|
"local-autocoord17-waits.mjs": "2b0a713987822548a94e1ed3a9a891532db45383797dfc5d5bc8d1e35593cf25",
|
|
74
74
|
"local-validator-isolation17.mjs": "48e94604e28b8fddd567dfb35ff60b73fd094a5803bd49f076388b7f310f92aa",
|
|
75
75
|
"local-calctool-composition17.mjs": "ac89fcb41ab0d0d9b47c1b5696945281b0894eb064820775e36a011c76314e6a",
|
|
76
|
-
"cli.mjs": "
|
|
77
|
-
"install-cleanup.mjs": "
|
|
76
|
+
"cli.mjs": "2f1fa353a80000ed26061feeb44a6a4ad12e32a2f49c84bfbb6c54f89f519b7b",
|
|
77
|
+
"install-cleanup.mjs": "8a8e1a7dfe37427f86cd4d6e317890d0829894a9949d4216674a716b36edbc54",
|
|
78
78
|
"review-client.mjs": "3491eef68ed533174b31db3c53febb6519b8f088f71a9964644714a9a4c03c77",
|
|
79
79
|
"version.mjs": "1f392147d72c40af4b03b307ea607075fb815af5174fa07e254b95fe12dbf3e7",
|
|
80
|
-
"SKILL.md": "
|
|
80
|
+
"SKILL.md": "0d581e76d8c959ae04e091e24df5580e56d9ec9b6c1c6fa25a531a21e8b88ea4",
|
|
81
81
|
"CAPABILITY-MAP.md": "a0f0468a098725ced52a96dd8e22bfc7d1ce7681a8446ebf7dae3696c76c3385",
|
|
82
82
|
"AGREEMENT.md": "f93a68e92c457200dd024610e65f74e478b8f60860f951da818b70561f1b9bf8",
|
|
83
83
|
"DELIVERY-BOUNDARIES.md": "d1bb2895e23fc14bf1c76707bd1f6f03b39695501a78a0b7289dc37b099889dc",
|
package/releases.json
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.1.48",
|
|
4
|
+
"date": "2026-10-16",
|
|
5
|
+
"zh": "新增标准命令 `install --host codex`,仅配置 Codex 并保留 Claude 的配置与技能副本;后续自动更新沿用已配置的宿主范围。安装命令守卫和旧版清理也按目标宿主限界。",
|
|
6
|
+
"en": "Added the standard `install --host codex` command to configure Codex while preserving Claude configuration and skill copies. Later automatic updates retain the already configured host scope; installer command guards and obsolete-install cleanup honor the selected host."
|
|
7
|
+
},
|
|
2
8
|
{
|
|
3
9
|
"version": "0.1.47",
|
|
4
10
|
"date": "2026-10-16",
|
|
5
|
-
"zh": "
|
|
6
|
-
"en": "
|
|
11
|
+
"zh": "修复失败 flow 的取消、放弃和会话解绑;离线 unlock 仅恢复当前会话并保留任务队列。放行授权根或依赖目录内的只读 tsconfig 引用,越界错误说明原路径、解析结果和原因。升级时清理未改动的旧受管安装,保留用户编辑及其他任务;IDE 钩子仅对已绑定的会话和仓库生效。",
|
|
12
|
+
"en": "Fixed cancellation, abandonment, and session unbinding for failed flows; offline unlock restores only the current session and preserves its queue. Read-only tsconfig references inside the authorized root or dependency directories are accepted, while escape errors identify the input path, resolved path, and reason. Upgrades remove pristine obsolete managed installs while preserving user edits and unrelated tasks; IDE hooks apply only to a bound session and repository."
|
|
7
13
|
},
|
|
8
14
|
{
|
|
9
15
|
"version": "0.1.46",
|