@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 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
- - 更新了Codex 后续轮次工具门禁、IDE 执行与复用纪律文档、技能运行和受管安装、IDE 工作流程说明、本地执行命令、远端恢复客户端。
6
- - Updated Codex tool guards across turns, IDE execution and reuse discipline documentation, skill runtime and managed installation, IDE workflow instructions, local execution command, remote recovery client.
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.47.
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 IDE lifecycle hook configuration; 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.
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, adapters: active });
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 !== 2 || !/^@entrorove\/skill(?:@(?:latest|\d+\.\d+\.\d+))?$/u.test(words[0]) || words[1] !== 'install') return null;
65
- return `npx --yes --prefer-online --registry=https://registry.npmjs.org ${words[0]} install`;
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) {
@@ -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', '.claude/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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "entrorove.skill-manifest/1.0",
3
3
  "name": "entrorove",
4
- "version": "0.1.47",
4
+ "version": "0.1.48",
5
5
  "endpoint": "https://entrorove.com",
6
6
  "requestSchemaVersion": "entrorove.skill.request/2.0",
7
7
  "supportedRequestSchemaVersions": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entrorove/skill",
3
- "version": "0.1.47",
3
+ "version": "0.1.48",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "entrorove": "cli.mjs"
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "schemaVersion": "entrorove.release-state/1.0",
3
- "version": "0.1.47",
4
- "digest": "479d681e00143de8b7ac8191a245dd1240918b9ff5c0fcca2145b0a73a184452",
3
+ "version": "0.1.48",
4
+ "digest": "6f79c0e2c12d4e8766801bf117bcf73070156ba89fb87e4b1137c9706b8f7df3",
5
5
  "files": {
6
6
  "ide-code-mode.mjs": "f3f53357ba09727b3b597851976a24de93287c0faca5052448277d0904bb61f7",
7
- "ide-command.mjs": "158d8f26c1dc28a04284e429150a2060d7278661f656a75e7e9f7600f536b7bf",
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": "fc40040262f07d6bcc64fe157e200bfb85e6ea1845109e4624e7903745877891",
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": "0119f5c5647c41ba5a4b709664b529be76f1a9b698ab9574ba38e6683eff9717",
77
- "install-cleanup.mjs": "72bb6bd55382449a986828cd1ae3e98e5fd0bf373f89bbdcc039023ae72a2337",
76
+ "cli.mjs": "2f1fa353a80000ed26061feeb44a6a4ad12e32a2f49c84bfbb6c54f89f519b7b",
77
+ "install-cleanup.mjs": "8a8e1a7dfe37427f86cd4d6e317890d0829894a9949d4216674a716b36edbc54",
78
78
  "review-client.mjs": "3491eef68ed533174b31db3c53febb6519b8f088f71a9964644714a9a4c03c77",
79
79
  "version.mjs": "1f392147d72c40af4b03b307ea607075fb815af5174fa07e254b95fe12dbf3e7",
80
- "SKILL.md": "6d55d552c31ee30795aec5e29b5f3eb0a007b8da9a81431901fae4b20b3f4be5",
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": "更新了Codex 后续轮次工具门禁、IDE 执行与复用纪律文档、技能运行和受管安装、IDE 工作流程说明、本地执行命令、远端恢复客户端。",
6
- "en": "Updated Codex tool guards across turns, IDE execution and reuse discipline documentation, skill runtime and managed installation, IDE workflow instructions, local execution command, remote recovery client."
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",