@entrorove/skill 0.1.40 → 0.1.41

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,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.41 — 2026-10-15
4
+
5
+ - 修复 0.1.39 受管技能升级与 Codex hook 配置权限误拒;补齐本地 probe/reassess 的 importContexts 输入合同。
6
+ - Fixed upgrades from the 0.1.39 managed skill and Codex hook config permission checks; added importContexts to local probe and reassess inputs.
7
+
3
8
  ## 0.1.40 — 2026-10-15
4
9
 
5
10
  - 修复 flow 终止与会话解绑、tsconfig 授权路径解析,并加入离线 unlock 自救入口。
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.40.
8
+ Version: 0.1.41.
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
 
package/cli.mjs CHANGED
@@ -133,7 +133,7 @@ async function managedState(directory) {
133
133
  if (marker.schemaVersion !== markerSchema || marker.name !== 'entrorove'
134
134
  || typeof marker.version !== 'string' || !/^\d+\.\d+\.\d+$/.test(marker.version)
135
135
  || !markerFiles.includes('SKILL.md') || !markerFiles.includes('manifest.json')
136
- || markerFiles.some((name) => !installFiles.includes(name))
136
+ || markerFiles.some((name) => !installFiles.includes(name) && !(marker.version === '0.1.39' && name === 'DELIVERY-BOUNDARIES.md'))
137
137
  || entries.slice().sort().join(',') !== [...markerFiles, markerName].sort().join(',')) {
138
138
  return false;
139
139
  }
package/ide-install.mjs CHANGED
@@ -21,6 +21,11 @@ async function prepareConfigDirectory(home) {
21
21
  if (!stat.isDirectory() || stat.isSymbolicLink() || process.platform !== 'win32' && stat.uid !== process.getuid()) throw ideError('ENTROROVE_IDE_CONFIG', 'Codex config must be an owned real directory');
22
22
  return directory;
23
23
  }
24
+ async function readHostConfig(file) {
25
+ const raw = await fs.readFile(file, 'utf8').catch(cause => { if (cause.code === 'ENOENT') return null; throw cause; });
26
+ if (raw === null) return null;
27
+ try { return JSON.parse(raw); } catch { throw ideError('ENTROROVE_IDE_CONFIG', 'Existing Codex hooks config is not valid JSON; it was preserved'); }
28
+ }
24
29
  function mergeHooks(existing, previous, current) {
25
30
  if (existing && (typeof existing !== 'object' || Array.isArray(existing) || existing.hooks && typeof existing.hooks !== 'object')) throw ideError('ENTROROVE_IDE_CONFIG', 'Existing hooks config is invalid; it was preserved');
26
31
  const next = { ...existing, hooks: { ...existing?.hooks } };
@@ -37,7 +42,7 @@ export async function installIdeHooks({ home, version, packageDirectory = source
37
42
  const directory = await ideDirectory(home, true), configDirectory = await prepareConfigDirectory(home);
38
43
  const hooksPath = path.join(configDirectory, 'hooks.json'), recordPath = path.join(directory, 'installation.json');
39
44
  return withStateLock(hooksPath, async () => {
40
- const existing = await readIdeJson(hooksPath), previous = await readIdeJson(recordPath);
45
+ const existing = await readHostConfig(hooksPath), previous = await readIdeJson(recordPath);
41
46
  const current = definition(node, path.join(directory, 'ide-hook.mjs'));
42
47
  const config = mergeHooks(existing, previous?.definition, current);
43
48
  const contents = await Promise.all(files.map(async name => [name, await fs.readFile(path.join(source, name))]));
@@ -85,6 +85,8 @@ add('budget-auto-renew-request', renewal, ['repositoryRoot', 'flowId', 'requestI
85
85
  add('budget-auto-renew', { ...renewal, confirmation, grant: record }, ['repositoryRoot', 'flowId', 'requestId', 'scope', 'policy'], ['grant', 'confirmation']);
86
86
  add('budget-auto-renew-stop', { ...flow, reason: enumeration(['revoked', 'completed']) }, ['repositoryRoot', 'flowId', 'reason']);
87
87
  const probePaths = { anyOf: [paths, { const: ['.'] }] };
88
+ const importContexts = { ...array(object({ sourcePrefix: relativePath, configPath: relativePath }, ['sourcePrefix', 'configPath'])),
89
+ maxItems: 100, uniqueItems: true, $comment: 'Source prefixes must be unique even when config paths differ.' };
88
90
  const scopeRequirement = object({ id: ledgerIdentifier, description: { ...text, pattern: '\\S', maxLength: 12000 } }, ['id', 'description']);
89
91
  const scopeInteraction = object({ type: enumeration(['confirm', 'choice', 'multi', 'input']), question: text,
90
92
  options: array(object({ id: ledgerIdentifier, label: text, hint: { type: 'string' } }, ['id', 'label'])), riskDescription: { type: 'string' },
@@ -94,7 +96,8 @@ const scopeTask = object({ goal: { ...text, pattern: '\\S', maxLength: 12000 },
94
96
  unclear: { type: 'boolean' }, architectureContract: { type: 'boolean' }, explicitAimlockRequested: { type: 'boolean' }, explicitEntroroveRequested: { type: 'boolean' }, userSpecifiedSkills: array(text),
95
97
  requirements: { ...array(scopeRequirement, 1), maxItems: 500 }, phase: enumeration(['plan', 'coordinate', 'architecture', 'verify', 'merge', 'decision']), baselineRef: text, interaction: scopeInteraction }, ['goal', 'workType', 'difficulty', 'risk']);
96
98
  const probe = { ...step, paths: probePaths, targetPaths: probePaths, task: scopeTask, baselineRef: text, snapshotId: identifier,
97
- targetSymbols: array(text, 1), contextMapPath: relativePath, signerConfigPath: nullable(text), taskDigest: sha256, ownerId: ledgerIdentifier, chainDigest: sha256, repositoryId: identifier, challenge: ledgerIdentifier };
99
+ targetSymbols: array(text, 1), contextMapPath: relativePath, importContexts, signerConfigPath: nullable(text),
100
+ taskDigest: sha256, ownerId: ledgerIdentifier, chainDigest: sha256, repositoryId: identifier, challenge: ledgerIdentifier };
98
101
  add('probe', { ...probe, handoffCandidate: HANDOFF_SNAPSHOT_CANDIDATE_SCHEMA }, ['repositoryRoot']);
99
102
  schemas.probe.allOf = [{ if: { type: 'object', anyOf: ['flowId', 'stepId', 'snapshotId'].map(field => ({ required: [field] })) },
100
103
  then: { type: 'object', required: ['flowId', 'stepId', 'snapshotId'], anyOf: ['paths', 'targetPaths', 'targetSymbols'].map(field => ({ required: [field] })) } },
@@ -155,6 +158,11 @@ export function validateLocalInput(operation, input) {
155
158
  const details = validate.errors.map(error => `${error.instancePath || '/'} ${error.message}`).join('; ');
156
159
  throw Object.assign(new Error(`Invalid ${operation} input: ${details}`), { code: 'ENTROROVE_INPUT_INVALID' });
157
160
  }
161
+ if ((operation === 'probe' || operation === 'reassess') && Array.isArray(input.importContexts)) {
162
+ const prefixes = input.importContexts.map(context => context.sourcePrefix);
163
+ if (new Set(prefixes).size !== prefixes.length) throw Object.assign(
164
+ new Error(`Invalid ${operation} input: importContexts sourcePrefix values must be unique`), { code: 'ENTROROVE_INPUT_INVALID' });
165
+ }
158
166
  return input;
159
167
  }
160
168
  export const operationSchemasFor = operations => Object.freeze(Object.fromEntries(Object.keys(operations).map(name => [name, schemas[name]])));
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.40",
4
+ "version": "0.1.41",
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.40",
3
+ "version": "0.1.41",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "entrorove": "cli.mjs"
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": "entrorove.release-state/1.0",
3
- "version": "0.1.40",
4
- "digest": "4175f36123295cacefbcd09150116696d7528716ba1541256cf345ec3f31a2f3",
3
+ "version": "0.1.41",
4
+ "digest": "c69d8d891d666165a31daadaf5b8e4a12fb823400a06ed0b41ff7f8e6644d2b3",
5
5
  "files": {
6
6
  "ide-code-mode.mjs": "cd5318342aac23ba9719ad760b7d7b8018d31839df1bed4ed7142c2782e22def",
7
7
  "ide-command.mjs": "e50a7e0b68bfc1812568f60562598a463ae169984a1abe9d401229c2b66c78c2",
8
8
  "ide-hook.mjs": "567593a4c06911889954dc6499bd22be0ab67c78f0d8d46ad671bf55934f9041",
9
- "ide-install.mjs": "65814d1e73cbdccdae4d8703cf9e8573492a3fd6a549ef8562a3f9d703f0ba09",
9
+ "ide-install.mjs": "90ff0b8d1ce26cfeae08cd88aef49e4784c0816dfdb81046bfcf463ffccb4bd8",
10
10
  "ide-session.mjs": "964c5088454a9069fbf5672d2456ba136718c3b2e9eec31c96f7c5943972731b",
11
11
  "break-glass.mjs": "2ad6f084c788d63fec11e64412864ac715bcb1a282dd2d8f03dc14e89e82135e",
12
12
  "ide-results.mjs": "dfe0d3f773c65a9fc21056538d7005012c982ed4509bc0410d7f62813d0863fd",
@@ -73,7 +73,7 @@
73
73
  "local-autocoord17-waits.mjs": "2b0a713987822548a94e1ed3a9a891532db45383797dfc5d5bc8d1e35593cf25",
74
74
  "local-validator-isolation17.mjs": "48e94604e28b8fddd567dfb35ff60b73fd094a5803bd49f076388b7f310f92aa",
75
75
  "local-calctool-composition17.mjs": "ac89fcb41ab0d0d9b47c1b5696945281b0894eb064820775e36a011c76314e6a",
76
- "cli.mjs": "bb99f5a52c770ded055fe27a35b3067ac348441b9488df336e6bf751b803e459",
76
+ "cli.mjs": "12e2fa1e1f6b922f249668a18eec50e56c3c71d318eb5aeac6a3d63279e60d68",
77
77
  "review-client.mjs": "3491eef68ed533174b31db3c53febb6519b8f088f71a9964644714a9a4c03c77",
78
78
  "version.mjs": "1f392147d72c40af4b03b307ea607075fb815af5174fa07e254b95fe12dbf3e7",
79
79
  "SKILL.md": "d89c2a83a080a217d67d75fa0251b0f054b92e81a9e40a6c0b52c7ecf3d79099",
@@ -182,7 +182,7 @@
182
182
  "workflow-local-request.mjs": "4e24c543ce386292a87dc9cd41f90d23375f12079cacffc515c8cd01fd571780",
183
183
  "task-message-entry.mjs": "31d10056cb905237cd5649e8eb067009ff1612ec5dc1061e0373209fbc0b646a",
184
184
  "task-message-cli.mjs": "3ca65e96c28129b3bd5cac962d106e0859a1f17df1f6a66ee543c6efc22f918d",
185
- "local-contracts.mjs": "d47022162233ee0b840bfd808b9d12590f4a367133ef0999233b7f76d76daa43",
185
+ "local-contracts.mjs": "bb1df682f06782f1c8814d50fe1c455153b29f3a1a093e87dd4ab2ed5ae16e1a",
186
186
  "local-contract-types.mjs": "85e71fa4dd67e351a4b67573c740bcdb1661cede53f097189f11837771e75e91",
187
187
  "local-archguard-ast.mjs": "7ff7df9dab0d98ed62983add751c80edea598bc94ef4f38ede0ebd4d41226c87",
188
188
  "local-archguard-checkpoint.mjs": "37896902520cc995720c96288e4a5ed3585952b55c9c35be281f91fa754c71ec",
package/releases.json CHANGED
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.1.41",
4
+ "date": "2026-10-15",
5
+ "zh": "修复 0.1.39 受管技能升级与 Codex hook 配置权限误拒;补齐本地 probe/reassess 的 importContexts 输入合同。",
6
+ "en": "Fixed upgrades from the 0.1.39 managed skill and Codex hook config permission checks; added importContexts to local probe and reassess inputs."
7
+ },
2
8
  {
3
9
  "version": "0.1.40",
4
10
  "date": "2026-10-15",