@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 +5 -0
- package/SKILL.md +1 -1
- package/cli.mjs +1 -1
- package/ide-install.mjs +6 -1
- package/local-contracts.mjs +9 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/release-state.json +5 -5
- package/releases.json +6 -0
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.
|
|
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
|
|
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))]));
|
package/local-contracts.mjs
CHANGED
|
@@ -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),
|
|
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
package/package.json
CHANGED
package/release-state.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "entrorove.release-state/1.0",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"digest": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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",
|