@foggy-projects/deepseek-harness-plugin 0.4.0-rc.1 → 0.4.0-rc.2
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/README.md +1 -1
- package/docs/PUBLIC-BETA-READINESS.md +6 -6
- package/docs/RELEASE-CANDIDATE-0.4.0-RC.2.md +38 -0
- package/docs/WINDOWS-BETA-ACCEPTANCE.md +4 -4
- package/lib/client.js +10 -1
- package/lib/index.js +18 -3
- package/lib/remote-descriptor.js +1 -0
- package/lib/skill-provider.js +13 -8
- package/package.json +2 -2
- package/skills/foggy-deepseek-onboarding/SKILL.md +1 -1
- package/skills/foggy-deepseek-onboarding/assets/versions.json +52 -27
- package/skills/foggy-deepseek-onboarding/references/onboarding-workflow.md +1 -1
- package/skills/foggy-deepseek-onboarding/scripts/onboarding.py +53 -36
- package/docs/RELEASE-CANDIDATE-0.4.0-RC.1.md +0 -61
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ modify `PATH`, or register Python globally. Advanced users may explicitly set
|
|
|
14
14
|
## Local beta installation
|
|
15
15
|
|
|
16
16
|
```powershell
|
|
17
|
-
dsh plugin --profile web add --workspace-root ./foggy-projects-deepseek-harness-plugin-0.4.0-rc.
|
|
17
|
+
dsh plugin --profile web add --workspace-root ./foggy-projects-deepseek-harness-plugin-0.4.0-rc.2.tgz
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
Restart `dsh web`, use the browser it opens (or the complete printed URL,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Public beta readiness: 0.4.0-rc.
|
|
1
|
+
# Public beta readiness: 0.4.0-rc.2
|
|
2
2
|
|
|
3
3
|
Assessment date: 2026-09-05
|
|
4
4
|
|
|
5
5
|
## Verdict
|
|
6
6
|
|
|
7
|
-
`0.4.0-rc.
|
|
7
|
+
`0.4.0-rc.2` is suitable for a scoped public beta on Windows 10/11 x64 and
|
|
8
8
|
Linux/WSL2 x64. It is not a general-availability release.
|
|
9
9
|
|
|
10
10
|
The plugin package stays small and downloads large components only during
|
|
@@ -31,7 +31,7 @@ system PATH, registry, or a user's existing Python installation.
|
|
|
31
31
|
Runtime. The password is excluded from onboarding state and evidence, and
|
|
32
32
|
datasource setup does not trigger Runtime restart. Opaque profiles remain an
|
|
33
33
|
optional advanced path.
|
|
34
|
-
- A real Launcher 0.1.
|
|
34
|
+
- A real Launcher 0.1.21 smoke on Java 17 accepted a synthetic inline-password
|
|
35
35
|
datasource through the public Runtime API while retaining the same Java PID.
|
|
36
36
|
The isolated registry confirmed the documented local-development plaintext
|
|
37
37
|
persistence boundary; the test datasource was then removed and the temporary
|
|
@@ -41,8 +41,8 @@ system PATH, registry, or a user's existing Python installation.
|
|
|
41
41
|
PID, while the persisted onboarding state and command evidence contained no
|
|
42
42
|
copy of the synthetic password.
|
|
43
43
|
- The package and settings contract report Python 3.12.13 as `Foggy private`,
|
|
44
|
-
CLI 0.1.23, Launcher 0.1.
|
|
45
|
-
0.4.0-rc.
|
|
44
|
+
CLI 0.1.23, Launcher 0.1.21, analysis/query Skills 0.1.18, and onboarding Skill
|
|
45
|
+
0.4.0-rc.2; the same component display was accepted in the preceding
|
|
46
46
|
native Windows beta run.
|
|
47
47
|
- Runtime startup now reports the current phase, elapsed/timeout seconds, and a
|
|
48
48
|
bounded progress value. A real Windows launch with Temurin 17 reached readiness
|
|
@@ -67,7 +67,7 @@ system PATH, registry, or a user's existing Python installation.
|
|
|
67
67
|
new datasource tests cover secret-free persisted state, direct Runtime API
|
|
68
68
|
submission, CLI bypass for inline development credentials, stable inline
|
|
69
69
|
credential resumption, bounded transient connection retry, and output redaction.
|
|
70
|
-
- A real Java 17 / Launcher 0.1.
|
|
70
|
+
- A real Java 17 / Launcher 0.1.21 regression resumed the same completed inline
|
|
71
71
|
datasource composite twice, retained the Runtime PID, and emitted a complete
|
|
72
72
|
`01` through `06` workspace evidence sequence without falling back to granular
|
|
73
73
|
commands.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Foggy DeepSeek Harness plugin 0.4.0-rc.2 release candidate
|
|
2
|
+
|
|
3
|
+
Assessment date: 2026-09-06
|
|
4
|
+
|
|
5
|
+
## Decision
|
|
6
|
+
|
|
7
|
+
This build is a public preview for Windows 10/11 x64 and Linux/WSL2 x64. It
|
|
8
|
+
remains a development and evaluation plugin; the bundled Runtime defaults are
|
|
9
|
+
not a production security profile.
|
|
10
|
+
|
|
11
|
+
No Java engine or `foggy-runtime-cli` source was changed for this candidate.
|
|
12
|
+
The plugin consumes the independently accepted CLI 0.1.23, Runtime Launcher
|
|
13
|
+
0.1.21, foggy-ai-analysis Skill 0.1.18, and foggy-semantic-query Skill 0.1.18
|
|
14
|
+
public releases.
|
|
15
|
+
|
|
16
|
+
## Delta from rc.1
|
|
17
|
+
|
|
18
|
+
- Upgrade Runtime Launcher from 0.1.20 to 0.1.21.
|
|
19
|
+
- Upgrade foggy-ai-analysis from 0.1.17 to 0.1.18.
|
|
20
|
+
- Install and register foggy-semantic-query 0.1.18 as a second managed Skill.
|
|
21
|
+
- Keep DeepSeek Harness 0.1.2-rc.1, managed Python 3.12.13, CLI 0.1.23, and the
|
|
22
|
+
default Runtime port 18166 unchanged.
|
|
23
|
+
|
|
24
|
+
The new public assets and their nested Skill manifests were independently
|
|
25
|
+
checksum-verified. Runtime acceptance covered automatic static-dictionary
|
|
26
|
+
captions, label-to-code filtering, dictionary member enumeration, self-date
|
|
27
|
+
dimensions, and the `$year`, `$month`, and `$yearMonth` describe/query path.
|
|
28
|
+
|
|
29
|
+
## Publication gate
|
|
30
|
+
|
|
31
|
+
The plugin's existing automated tests and npm tarball inspection must pass.
|
|
32
|
+
The Runtime functional matrix is not repeated because the exact public
|
|
33
|
+
Launcher and Skill assets were accepted independently before this pin update.
|
|
34
|
+
|
|
35
|
+
DeepSeek Harness minimum-release-age policy can reject a recently published
|
|
36
|
+
version still present in a profile lockfile. Users should inspect and rebuild
|
|
37
|
+
the profile lockfile or wait for the policy window rather than weakening
|
|
38
|
+
plugin integrity checks.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Native Windows Beta acceptance
|
|
2
2
|
|
|
3
3
|
This runbook validates DeepSeek Harness `0.1.2-rc.1` with Foggy plugin
|
|
4
|
-
`0.4.0-rc.
|
|
4
|
+
`0.4.0-rc.2` on a clean 64-bit Windows 10 or Windows 11 machine. Use a local
|
|
5
5
|
directory that is not synchronized by OneDrive.
|
|
6
6
|
|
|
7
7
|
## Prerequisites
|
|
@@ -60,9 +60,9 @@ Expected component state:
|
|
|
60
60
|
|
|
61
61
|
- Python 3.12.13, source `Foggy private`;
|
|
62
62
|
- CLI 0.1.23;
|
|
63
|
-
- Launcher 0.1.
|
|
64
|
-
- analysis
|
|
65
|
-
- onboarding Skill 0.4.0-rc.
|
|
63
|
+
- Launcher 0.1.21;
|
|
64
|
+
- analysis/query Skills 0.1.18;
|
|
65
|
+
- onboarding Skill 0.4.0-rc.2;
|
|
66
66
|
- Java 17+ available;
|
|
67
67
|
- native DSH Skill registration available.
|
|
68
68
|
|
package/lib/client.js
CHANGED
|
@@ -35,7 +35,7 @@ window.__ModuleLoader__.load({
|
|
|
35
35
|
package: '@foggy-projects/deepseek-harness-plugin',
|
|
36
36
|
descriptors: [
|
|
37
37
|
...[
|
|
38
|
-
'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill',
|
|
38
|
+
'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill', 'repairSemanticQuerySkill',
|
|
39
39
|
'migrateProfiles', 'diagnostics', 'runtimeStart', 'runtimeStop',
|
|
40
40
|
].map((method) => descriptor(method)),
|
|
41
41
|
descriptor('saveRuntimeSettings', [{
|
|
@@ -66,6 +66,7 @@ window.__ModuleLoader__.load({
|
|
|
66
66
|
cli: 'CLI',
|
|
67
67
|
launcher: 'Launcher',
|
|
68
68
|
analysisSkill: '分析 Skill',
|
|
69
|
+
semanticQuerySkill: '语义查询 Skill',
|
|
69
70
|
onboardingSkill: '引导 Skill',
|
|
70
71
|
skillRegistry: 'DSH Skill 注册',
|
|
71
72
|
python: 'Python',
|
|
@@ -81,6 +82,7 @@ window.__ModuleLoader__.load({
|
|
|
81
82
|
repairCli: '检查 / 修复 CLI',
|
|
82
83
|
repairLauncher: '检查 / 修复 Launcher',
|
|
83
84
|
repairAnalysisSkill: '检查 / 修复分析 Skill',
|
|
85
|
+
repairSemanticQuerySkill: '检查 / 修复语义查询 Skill',
|
|
84
86
|
diagnostics: '导出诊断报告',
|
|
85
87
|
diagnosticsSaved: '诊断报告已保存',
|
|
86
88
|
start: '启动 Runtime',
|
|
@@ -92,6 +94,7 @@ window.__ModuleLoader__.load({
|
|
|
92
94
|
progressCli: '准备 CLI',
|
|
93
95
|
progressLauncher: '准备 Launcher',
|
|
94
96
|
progressAnalysis: '准备分析 Skill',
|
|
97
|
+
progressSemanticQuery: '准备语义查询 Skill',
|
|
95
98
|
progressSkills: '注册 DSH Skills',
|
|
96
99
|
progressState: '写入安装状态',
|
|
97
100
|
progressComplete: '初始化完成',
|
|
@@ -169,6 +172,7 @@ window.__ModuleLoader__.load({
|
|
|
169
172
|
cli: 'CLI',
|
|
170
173
|
launcher: 'Launcher',
|
|
171
174
|
analysisSkill: 'Analysis Skill',
|
|
175
|
+
semanticQuerySkill: 'Semantic Query Skill',
|
|
172
176
|
onboardingSkill: 'Onboarding Skill',
|
|
173
177
|
skillRegistry: 'DSH Skill registry',
|
|
174
178
|
python: 'Python',
|
|
@@ -184,6 +188,7 @@ window.__ModuleLoader__.load({
|
|
|
184
188
|
repairCli: 'Check / repair CLI',
|
|
185
189
|
repairLauncher: 'Check / repair Launcher',
|
|
186
190
|
repairAnalysisSkill: 'Check / repair analysis Skill',
|
|
191
|
+
repairSemanticQuerySkill: 'Check / repair semantic query Skill',
|
|
187
192
|
diagnostics: 'Export diagnostics',
|
|
188
193
|
diagnosticsSaved: 'Diagnostics saved',
|
|
189
194
|
start: 'Start Runtime',
|
|
@@ -195,6 +200,7 @@ window.__ModuleLoader__.load({
|
|
|
195
200
|
progressCli: 'Preparing CLI',
|
|
196
201
|
progressLauncher: 'Preparing Launcher',
|
|
197
202
|
progressAnalysis: 'Preparing analysis Skill',
|
|
203
|
+
progressSemanticQuery: 'Preparing semantic query Skill',
|
|
198
204
|
progressSkills: 'Registering DSH Skills',
|
|
199
205
|
progressState: 'Writing install state',
|
|
200
206
|
progressComplete: 'Initialization complete',
|
|
@@ -324,6 +330,7 @@ window.__ModuleLoader__.load({
|
|
|
324
330
|
cli: 'progressCli',
|
|
325
331
|
launcher: 'progressLauncher',
|
|
326
332
|
'analysis-skill': 'progressAnalysis',
|
|
333
|
+
'semantic-query-skill': 'progressSemanticQuery',
|
|
327
334
|
'workspace-skills': 'progressSkills',
|
|
328
335
|
state: 'progressState',
|
|
329
336
|
complete: 'progressComplete',
|
|
@@ -603,6 +610,7 @@ window.__ModuleLoader__.load({
|
|
|
603
610
|
componentCard(t('cli'), status.components.cli, 'runtime', t),
|
|
604
611
|
componentCard(t('launcher'), status.components.launcher, 'runtime', t),
|
|
605
612
|
componentCard(t('analysisSkill'), status.components.analysisSkill, 'runtime', t),
|
|
613
|
+
componentCard(t('semanticQuerySkill'), status.components.semanticQuerySkill, 'runtime', t),
|
|
606
614
|
componentCard(t('onboardingSkill'), status.components.onboardingSkill, 'runtime', t),
|
|
607
615
|
componentCard(t('skillRegistry'), { installed: status.components.onboardingSkill?.provider === 'foggy-managed-skills', version: 'native' }, 'runtime', t),
|
|
608
616
|
] }),
|
|
@@ -613,6 +621,7 @@ window.__ModuleLoader__.load({
|
|
|
613
621
|
jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairCli'), children: t('repairCli') }),
|
|
614
622
|
jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairLauncher'), children: t('repairLauncher') }),
|
|
615
623
|
jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairAnalysisSkill'), children: t('repairAnalysisSkill') }),
|
|
624
|
+
jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairSemanticQuerySkill'), children: t('repairSemanticQuerySkill') }),
|
|
616
625
|
] }),
|
|
617
626
|
] }),
|
|
618
627
|
status.profileMigration?.pendingCount || status.profileMigration?.conflictCount ? jsxs('div', { className: 'foggy-warning', children: [
|
package/lib/index.js
CHANGED
|
@@ -228,8 +228,10 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
|
|
|
228
228
|
const cliPath = state?.cli?.command
|
|
229
229
|
const launcherPath = state?.launcher?.path
|
|
230
230
|
const analysisSkillPath = state?.skills?.analysis?.path || join(roots.installRoot, 'skills', 'foggy-ai-analysis')
|
|
231
|
+
const semanticQuerySkillPath = state?.skills?.semanticQuery?.path || join(roots.installRoot, 'skills', 'foggy-semantic-query')
|
|
231
232
|
const onboardingSkillPath = join(packageRoot, 'skills', 'foggy-deepseek-onboarding')
|
|
232
233
|
const analysisMarker = await readOptionalJson(join(analysisSkillPath, '.foggy-managed-skill.json'))
|
|
234
|
+
const semanticQueryMarker = await readOptionalJson(join(semanticQuerySkillPath, '.foggy-managed-skill.json'))
|
|
233
235
|
const components = {
|
|
234
236
|
python,
|
|
235
237
|
java,
|
|
@@ -249,6 +251,14 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
|
|
|
249
251
|
),
|
|
250
252
|
version: state?.skills?.analysis?.version ?? manifest.components.analysisSkill.version,
|
|
251
253
|
},
|
|
254
|
+
semanticQuerySkill: {
|
|
255
|
+
installed: Boolean(
|
|
256
|
+
await exists(join(semanticQuerySkillPath, 'SKILL.md'))
|
|
257
|
+
&& semanticQueryMarker?.schemaVersion === 'foggy-managed-skill/v1'
|
|
258
|
+
&& semanticQueryMarker?.componentVersion === manifest.components.semanticQuerySkill.version
|
|
259
|
+
),
|
|
260
|
+
version: state?.skills?.semanticQuery?.version ?? manifest.components.semanticQuerySkill.version,
|
|
261
|
+
},
|
|
252
262
|
onboardingSkill: {
|
|
253
263
|
installed: await exists(join(onboardingSkillPath, 'SKILL.md')),
|
|
254
264
|
version: manifest.packageVersion,
|
|
@@ -259,6 +269,7 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
|
|
|
259
269
|
&& components.cli.installed
|
|
260
270
|
&& components.launcher.installed
|
|
261
271
|
&& components.analysisSkill.installed
|
|
272
|
+
&& components.semanticQuerySkill.installed
|
|
262
273
|
&& components.onboardingSkill.installed
|
|
263
274
|
const running = Boolean(runtime && processRunning(Number(runtime.pid)))
|
|
264
275
|
const activePort = running && Number.isInteger(Number(runtime?.port)) ? Number(runtime.port) : null
|
|
@@ -314,8 +325,8 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
|
|
|
314
325
|
'download and verify a pinned private Python runtime',
|
|
315
326
|
'create isolated Python environment',
|
|
316
327
|
'download and verify pinned CLI and Launcher assets',
|
|
317
|
-
'install the Foggy analysis
|
|
318
|
-
'register onboarding and
|
|
328
|
+
'install the Foggy analysis and semantic-query Skills into the global managed component directory',
|
|
329
|
+
'register onboarding, analysis, and semantic-query Skills through the native DSH Skill registry',
|
|
319
330
|
'write global install state; resolve each workspace from the DSH session cwd',
|
|
320
331
|
],
|
|
321
332
|
secretsInDshSettings: false,
|
|
@@ -346,6 +357,10 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
|
|
|
346
357
|
return this.startOperation('repair-analysis-skill', true, ['install', '--repair-component', 'analysis-skill'])
|
|
347
358
|
}
|
|
348
359
|
|
|
360
|
+
async repairSemanticQuerySkill() {
|
|
361
|
+
return this.startOperation('repair-semantic-query-skill', true, ['install', '--repair-component', 'semantic-query-skill'])
|
|
362
|
+
}
|
|
363
|
+
|
|
349
364
|
async migrateProfiles() {
|
|
350
365
|
return this.startOperation('profile-migration', false, ['profile-migrate', '--approve'])
|
|
351
366
|
}
|
|
@@ -530,7 +545,7 @@ export class FoggyIntegrationGateway extends TypertRemoteService {
|
|
|
530
545
|
|
|
531
546
|
const markerInitializers = []
|
|
532
547
|
for (const method of [
|
|
533
|
-
'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill',
|
|
548
|
+
'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill', 'repairSemanticQuerySkill',
|
|
534
549
|
'migrateProfiles', 'diagnostics', 'runtimeStart', 'runtimeStop',
|
|
535
550
|
'saveRuntimeSettings',
|
|
536
551
|
]) {
|
package/lib/remote-descriptor.js
CHANGED
package/lib/skill-provider.js
CHANGED
|
@@ -56,15 +56,15 @@ function candidate(name, description, path, source) {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
async function
|
|
59
|
+
async function managedSkill(installRoot, manifest, { stateKey, componentKey, kind }) {
|
|
60
60
|
const state = await readOptionalJson(join(installRoot, 'install-state.json'))
|
|
61
|
-
const path = state?.skills?.
|
|
61
|
+
const path = state?.skills?.[stateKey]?.path
|
|
62
62
|
if (!path || !await exists(join(path, 'SKILL.md'))) return null
|
|
63
63
|
const marker = await readOptionalJson(join(path, '.foggy-managed-skill.json'))
|
|
64
64
|
if (
|
|
65
65
|
marker?.schemaVersion !== 'foggy-managed-skill/v1'
|
|
66
|
-
|| marker?.kind !==
|
|
67
|
-
|| marker?.componentVersion !== manifest.components.
|
|
66
|
+
|| marker?.kind !== kind
|
|
67
|
+
|| marker?.componentVersion !== manifest.components[componentKey].version
|
|
68
68
|
) return null
|
|
69
69
|
return join(path, 'SKILL.md')
|
|
70
70
|
}
|
|
@@ -83,10 +83,15 @@ export function createFoggySkillProvider({ installRoot, versionsFile }) {
|
|
|
83
83
|
'bundled',
|
|
84
84
|
)]
|
|
85
85
|
if (!manifest) return result
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
const managedSkills = [
|
|
87
|
+
{ name: 'foggy-ai-analysis', stateKey: 'analysis', componentKey: 'analysisSkill', kind: 'analysis' },
|
|
88
|
+
{ name: 'foggy-semantic-query', stateKey: 'semanticQuery', componentKey: 'semanticQuerySkill', kind: 'semantic-query' },
|
|
89
|
+
]
|
|
90
|
+
for (const spec of managedSkills) {
|
|
91
|
+
const path = await managedSkill(installRoot, manifest, spec)
|
|
92
|
+
if (!path) continue
|
|
93
|
+
const skill = parseSkill(await readFile(path, 'utf8'), spec.name)
|
|
94
|
+
result.push(candidate(spec.name, skill.metadata.description, path, 'bundled'))
|
|
90
95
|
}
|
|
91
96
|
return result
|
|
92
97
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foggy-projects/deepseek-harness-plugin",
|
|
3
|
-
"version": "0.4.0-rc.
|
|
3
|
+
"version": "0.4.0-rc.2",
|
|
4
4
|
"description": "Foggy Java data analysis engine integration for DeepSeek Harness",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"cordis.patch.yml",
|
|
21
21
|
"experience/linux/**",
|
|
22
22
|
"docs/PUBLIC-BETA-READINESS.md",
|
|
23
|
-
"docs/RELEASE-CANDIDATE-0.4.0-RC.
|
|
23
|
+
"docs/RELEASE-CANDIDATE-0.4.0-RC.2.md",
|
|
24
24
|
"docs/WINDOWS-BETA-ACCEPTANCE.md",
|
|
25
25
|
"THIRD-PARTY-RUNTIME-NOTICES.md",
|
|
26
26
|
"README.md"
|
|
@@ -65,7 +65,7 @@ are authoritative; do not copy the Skill into the current workspace.
|
|
|
65
65
|
instead of treating success as proof that every requested option took effect. Free-text advice is
|
|
66
66
|
optional. When a warning indicates possible semantic drift, use `models describe` to prepare a
|
|
67
67
|
corrected payload if the user's intent can be preserved; otherwise disclose the limitation.
|
|
68
|
-
Runtime 0.1.
|
|
68
|
+
Runtime 0.1.21 defaults unknown ordinary Query DSL properties to `WARN`; `IGNORE` continues without
|
|
69
69
|
`queryInputWarnings`, while `STRICT` rejects the request with the complete structured violations.
|
|
70
70
|
Never reinterpret a protected or governance-field failure as an ignorable warning.
|
|
71
71
|
7. When the model works, recommend committing the model directory to the user's own Git repository.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "foggy-deepseek-onboarding-versions/v1",
|
|
3
|
-
"packageVersion": "0.4.0-rc.
|
|
4
|
-
"validatedAt": "2026-09-
|
|
3
|
+
"packageVersion": "0.4.0-rc.2",
|
|
4
|
+
"validatedAt": "2026-09-06",
|
|
5
5
|
"components": {
|
|
6
6
|
"deepseekHarness": {
|
|
7
7
|
"version": "0.1.2-rc.1",
|
|
@@ -66,64 +66,89 @@
|
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
"launcher": {
|
|
69
|
-
"version": "0.1.
|
|
69
|
+
"version": "0.1.21",
|
|
70
70
|
"minimumJavaVersion": "17.0.0",
|
|
71
71
|
"runtimeApiContract": "foggy-runtime-api/v1",
|
|
72
72
|
"assets": [
|
|
73
73
|
{
|
|
74
|
-
"file": "foggy-runtime-launcher-0.1.
|
|
75
|
-
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.
|
|
76
|
-
"sha256": "
|
|
74
|
+
"file": "foggy-runtime-launcher-0.1.21.jar",
|
|
75
|
+
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/foggy-runtime-launcher-0.1.21.jar",
|
|
76
|
+
"sha256": "0b5002e40633f4606b0f5d3adbcd734ad4a11d8204decab162bb53b6ab28b3b3"
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
"file": "start-foggy-runtime.ps1",
|
|
80
|
-
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.
|
|
81
|
-
"sha256": "
|
|
80
|
+
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/start-foggy-runtime.ps1",
|
|
81
|
+
"sha256": "8609f8c60bad9e56460b132e1bd6c699d4ebf47cf591c3e6bc37bc8563d7de5a"
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
"file": "start-foggy-runtime.sh",
|
|
85
|
-
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.
|
|
86
|
-
"sha256": "
|
|
85
|
+
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/start-foggy-runtime.sh",
|
|
86
|
+
"sha256": "fa844f422473ba00a31cf801092b0fe4ef93fe8697656a9063e0ec27dacef715"
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
"file": "README-foggy-runtime-launcher.md",
|
|
90
|
-
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.
|
|
91
|
-
"sha256": "
|
|
90
|
+
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/README-foggy-runtime-launcher.md",
|
|
91
|
+
"sha256": "6b63cafe798e19c255a043e15e64109f6fb3252aee3fb9c37ab6a66d9adbf3cf"
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
94
|
"file": "runtime-launcher-manifest.json",
|
|
95
|
-
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.
|
|
96
|
-
"sha256": "
|
|
95
|
+
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/runtime-launcher-manifest.json",
|
|
96
|
+
"sha256": "1591804035bbf589912907195c74746bf97edff3b9e6ebd7d569ecc0e5aebed7"
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
"file": "SHA256SUMS",
|
|
100
|
-
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.
|
|
101
|
-
"sha256": "
|
|
100
|
+
"url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/download/foggy-runtime-launcher-v0.1.21/SHA256SUMS",
|
|
101
|
+
"sha256": "6e03f8861176d73be22c4c7c6f6345a68e49aacfb5375cd5cf2c54f1dc4cbe5d"
|
|
102
102
|
}
|
|
103
103
|
]
|
|
104
104
|
},
|
|
105
105
|
"analysisSkill": {
|
|
106
106
|
"name": "foggy-ai-analysis",
|
|
107
|
-
"version": "0.1.
|
|
108
|
-
"minimumCliVersion": "0.1.
|
|
107
|
+
"version": "0.1.18",
|
|
108
|
+
"minimumCliVersion": "0.1.23",
|
|
109
109
|
"assets": [
|
|
110
110
|
{
|
|
111
111
|
"role": "zip",
|
|
112
|
-
"file": "foggy-ai-analysis-skill-0.1.
|
|
113
|
-
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.
|
|
114
|
-
"sha256": "
|
|
112
|
+
"file": "foggy-ai-analysis-skill-0.1.18.zip",
|
|
113
|
+
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-ai-analysis-skill-0.1.18.zip",
|
|
114
|
+
"sha256": "93d7bb8812e91a7f85040fe14ce40a3e0657cb2fed07ddfeb9c6f28aca9e2925"
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
117
|
"role": "manifest",
|
|
118
|
-
"file": "foggy-ai-analysis-skill-0.1.
|
|
119
|
-
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.
|
|
120
|
-
"sha256": "
|
|
118
|
+
"file": "foggy-ai-analysis-skill-0.1.18-manifest.json",
|
|
119
|
+
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-ai-analysis-skill-0.1.18-manifest.json",
|
|
120
|
+
"sha256": "c6e3ae9d9ab17d8fd05fde9b94bba25577662f7edd862b099429e24244d22739"
|
|
121
121
|
},
|
|
122
122
|
{
|
|
123
123
|
"role": "checksums",
|
|
124
|
-
"file": "foggy-ai-analysis-skill-0.1.
|
|
125
|
-
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.
|
|
126
|
-
"sha256": "
|
|
124
|
+
"file": "foggy-ai-analysis-skill-0.1.18-SHA256SUMS",
|
|
125
|
+
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-ai-analysis-skill-0.1.18-SHA256SUMS",
|
|
126
|
+
"sha256": "10b4c97e30201d63fa1fb9773e9a540827b92b495369403deb12b9ab67c69846"
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
"semanticQuerySkill": {
|
|
131
|
+
"name": "foggy-semantic-query",
|
|
132
|
+
"version": "0.1.18",
|
|
133
|
+
"minimumCliVersion": "0.1.23",
|
|
134
|
+
"assets": [
|
|
135
|
+
{
|
|
136
|
+
"role": "zip",
|
|
137
|
+
"file": "foggy-semantic-query-skill-0.1.18.zip",
|
|
138
|
+
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-semantic-query-skill-0.1.18.zip",
|
|
139
|
+
"sha256": "828aa8517385ea7c4956906834d3bea918f56de6e1d2df7ff0779dc31f7f7fb2"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"role": "manifest",
|
|
143
|
+
"file": "foggy-semantic-query-skill-0.1.18-manifest.json",
|
|
144
|
+
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-semantic-query-skill-0.1.18-manifest.json",
|
|
145
|
+
"sha256": "0348c0786b72c3ea39a5e091ef494559f2fd48a625bd41796fc1b0f6eba82400"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"role": "checksums",
|
|
149
|
+
"file": "foggy-semantic-query-skill-0.1.18-SHA256SUMS",
|
|
150
|
+
"url": "https://github.com/foggy-projects/foggy-ai-analysis/releases/download/v0.1.18/foggy-semantic-query-skill-0.1.18-SHA256SUMS",
|
|
151
|
+
"sha256": "9fdba41edcb39e07f199b3347191e025a4ade4b535827842f861ffa42f4da9cc"
|
|
127
152
|
}
|
|
128
153
|
]
|
|
129
154
|
}
|
|
@@ -117,7 +117,7 @@ The composite result keeps `success=true` when the Runtime safely continues with
|
|
|
117
117
|
on free-text remediation alone: compare `path`, `suggestedNextAction`, `safeToAutoRepair`,
|
|
118
118
|
`normalizedFragment`, `docsRef`, and `details.allowedProperties` with the described
|
|
119
119
|
model, correct and revalidate when an equivalent supported query preserves the user's intent, or
|
|
120
|
-
clearly report the degraded interpretation. The wrapper accepts Runtime 0.1.
|
|
120
|
+
clearly report the degraded interpretation. The wrapper accepts Runtime 0.1.21
|
|
121
121
|
`queryInputWarnings` and legacy `warnings` as separate warning kinds. In `IGNORE`, ordinary unknown
|
|
122
122
|
properties continue without `queryInputWarnings`; in `STRICT`, the Runtime rejects the query with the
|
|
123
123
|
complete violations. Protected and governance fields remain fail-closed in every mode.
|
|
@@ -1168,22 +1168,26 @@ def safe_extract(zip_path: Path, destination: Path) -> None:
|
|
|
1168
1168
|
archive.extractall(destination)
|
|
1169
1169
|
|
|
1170
1170
|
|
|
1171
|
-
def
|
|
1171
|
+
def install_managed_skill(
|
|
1172
1172
|
zip_path: Path,
|
|
1173
1173
|
install_root: Path,
|
|
1174
1174
|
version: str,
|
|
1175
1175
|
expected_hash: str,
|
|
1176
1176
|
package_version: str,
|
|
1177
1177
|
replace: bool,
|
|
1178
|
+
*,
|
|
1179
|
+
skill_name: str,
|
|
1180
|
+
kind: str,
|
|
1181
|
+
display_name: str,
|
|
1178
1182
|
) -> dict:
|
|
1179
1183
|
skills_root = install_root / "skills"
|
|
1180
|
-
destination = skills_root /
|
|
1184
|
+
destination = skills_root / skill_name
|
|
1181
1185
|
with tempfile.TemporaryDirectory(prefix="foggy-skill-") as temporary:
|
|
1182
1186
|
extract_root = Path(temporary)
|
|
1183
1187
|
safe_extract(zip_path, extract_root)
|
|
1184
1188
|
candidates = list(extract_root.rglob("SKILL.md"))
|
|
1185
1189
|
if len(candidates) != 1:
|
|
1186
|
-
raise OnboardingError(f"Expected exactly one SKILL.md in
|
|
1190
|
+
raise OnboardingError(f"Expected exactly one SKILL.md in {display_name} archive, found {len(candidates)}")
|
|
1187
1191
|
source = candidates[0].parent
|
|
1188
1192
|
source_digest = skill_tree_digest(source)
|
|
1189
1193
|
if destination.exists():
|
|
@@ -1199,7 +1203,7 @@ def install_analysis_skill(
|
|
|
1199
1203
|
if marker_matches:
|
|
1200
1204
|
marker = write_skill_marker(
|
|
1201
1205
|
destination,
|
|
1202
|
-
kind=
|
|
1206
|
+
kind=kind,
|
|
1203
1207
|
package_version=package_version,
|
|
1204
1208
|
component_version=version,
|
|
1205
1209
|
source_digest=source_digest,
|
|
@@ -1207,13 +1211,13 @@ def install_analysis_skill(
|
|
|
1207
1211
|
)
|
|
1208
1212
|
return {"path": str(destination), "version": version, "digest": marker["installedDigest"], "managed": True, "action": "kept-matching"}
|
|
1209
1213
|
if not replace:
|
|
1210
|
-
raise OnboardingError(f"
|
|
1214
|
+
raise OnboardingError(f"{display_name} is missing, modified, or outdated at {destination}; use the plugin Repair action to back it up and restore it")
|
|
1211
1215
|
backup_skill(destination, install_root / "skill-backups")
|
|
1212
1216
|
skills_root.mkdir(parents=True, exist_ok=True)
|
|
1213
1217
|
shutil.copytree(source, destination)
|
|
1214
1218
|
marker = write_skill_marker(
|
|
1215
1219
|
destination,
|
|
1216
|
-
kind=
|
|
1220
|
+
kind=kind,
|
|
1217
1221
|
package_version=package_version,
|
|
1218
1222
|
component_version=version,
|
|
1219
1223
|
source_digest=source_digest,
|
|
@@ -1264,7 +1268,7 @@ def install_command(args: argparse.Namespace) -> dict:
|
|
|
1264
1268
|
"workspaceMode": "dsh-session-cwd",
|
|
1265
1269
|
"versions": {name: value.get("version") for name, value in components.items()},
|
|
1266
1270
|
"repairComponent": repair_component,
|
|
1267
|
-
"operations": ["verify private Python", "install isolated CLI", "verify Launcher assets", "install global analysis
|
|
1271
|
+
"operations": ["verify private Python", "install isolated CLI", "verify Launcher assets", "install global analysis/query Skills", "write install state"],
|
|
1268
1272
|
"productionReady": False,
|
|
1269
1273
|
}
|
|
1270
1274
|
if args.dry_run:
|
|
@@ -1364,32 +1368,41 @@ def install_command(args: argparse.Namespace) -> dict:
|
|
|
1364
1368
|
(launcher_dir / "start-foggy-runtime.sh").chmod(0o755)
|
|
1365
1369
|
progress.update("launcher", 3, "Launcher ready", fraction=1.0)
|
|
1366
1370
|
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
fraction=index / len(analysis_assets), current_file=asset["file"],
|
|
1372
|
-
completed_files=index, total_files=len(analysis_assets),
|
|
1373
|
-
)
|
|
1374
|
-
verified.append(materialize(
|
|
1375
|
-
asset, downloads / "skill" / asset["file"], cache_dirs,
|
|
1376
|
-
progress=progress, progress_phase="analysis-skill", progress_step=4,
|
|
1377
|
-
progress_index=index, progress_total=len(analysis_assets),
|
|
1378
|
-
progress_message="Downloading and verifying analysis Skill",
|
|
1379
|
-
replace_corrupt=repair_component == "analysis-skill",
|
|
1380
|
-
))
|
|
1381
|
-
progress.update(
|
|
1382
|
-
"analysis-skill", 4, "Downloading and verifying analysis Skill",
|
|
1383
|
-
fraction=(index + 1) / len(analysis_assets), current_file=asset["file"],
|
|
1384
|
-
completed_files=index + 1, total_files=len(analysis_assets),
|
|
1385
|
-
)
|
|
1386
|
-
zip_asset = next(item for item in analysis_assets if item["role"] == "zip")
|
|
1387
|
-
progress.update("analysis-skill", 4, "Installing analysis Skill", fraction=0.9, current_file=zip_asset["file"])
|
|
1388
|
-
analysis_skill = install_analysis_skill(
|
|
1389
|
-
downloads / "skill" / zip_asset["file"], install_root, components["analysisSkill"]["version"],
|
|
1390
|
-
zip_asset["sha256"], versions["packageVersion"], args.replace_skill or repair_component == "analysis-skill",
|
|
1371
|
+
installed_skills = {}
|
|
1372
|
+
skill_specs = (
|
|
1373
|
+
("analysisSkill", "analysis", "foggy-ai-analysis", "Analysis Skill", "analysis-skill"),
|
|
1374
|
+
("semanticQuerySkill", "semantic-query", "foggy-semantic-query", "Semantic Query Skill", "semantic-query-skill"),
|
|
1391
1375
|
)
|
|
1392
|
-
|
|
1376
|
+
for component_key, state_key, skill_name, display_name, repair_key in skill_specs:
|
|
1377
|
+
skill_assets = components[component_key]["assets"]
|
|
1378
|
+
for index, asset in enumerate(skill_assets):
|
|
1379
|
+
progress.update(
|
|
1380
|
+
repair_key, 4, f"Downloading and verifying {display_name}",
|
|
1381
|
+
fraction=index / len(skill_assets), current_file=asset["file"],
|
|
1382
|
+
completed_files=index, total_files=len(skill_assets),
|
|
1383
|
+
)
|
|
1384
|
+
verified.append(materialize(
|
|
1385
|
+
asset, downloads / "skill" / asset["file"], cache_dirs,
|
|
1386
|
+
progress=progress, progress_phase=repair_key, progress_step=4,
|
|
1387
|
+
progress_index=index, progress_total=len(skill_assets),
|
|
1388
|
+
progress_message=f"Downloading and verifying {display_name}",
|
|
1389
|
+
replace_corrupt=repair_component == repair_key,
|
|
1390
|
+
))
|
|
1391
|
+
progress.update(
|
|
1392
|
+
repair_key, 4, f"Downloading and verifying {display_name}",
|
|
1393
|
+
fraction=(index + 1) / len(skill_assets), current_file=asset["file"],
|
|
1394
|
+
completed_files=index + 1, total_files=len(skill_assets),
|
|
1395
|
+
)
|
|
1396
|
+
zip_asset = next(item for item in skill_assets if item["role"] == "zip")
|
|
1397
|
+
progress.update(repair_key, 4, f"Installing {display_name}", fraction=0.9, current_file=zip_asset["file"])
|
|
1398
|
+
installed_skills[state_key] = install_managed_skill(
|
|
1399
|
+
downloads / "skill" / zip_asset["file"], install_root, components[component_key]["version"],
|
|
1400
|
+
zip_asset["sha256"], versions["packageVersion"], args.replace_skill or repair_component == repair_key,
|
|
1401
|
+
skill_name=skill_name, kind=state_key, display_name=display_name,
|
|
1402
|
+
)
|
|
1403
|
+
progress.update(repair_key, 4, f"{display_name} ready", fraction=1.0)
|
|
1404
|
+
analysis_skill = installed_skills["analysis"]
|
|
1405
|
+
semantic_query_skill = installed_skills["semantic-query"]
|
|
1393
1406
|
progress.update("workspace-skills", 5, "Registering native DSH Skills", fraction=0.1)
|
|
1394
1407
|
onboarding_skill = {
|
|
1395
1408
|
"path": str(skill_root()),
|
|
@@ -1414,7 +1427,7 @@ def install_command(args: argparse.Namespace) -> dict:
|
|
|
1414
1427
|
},
|
|
1415
1428
|
"cli": {"version": cli_component["version"], "command": str(cli_command), "mode": cli_mode},
|
|
1416
1429
|
"launcher": {"version": components["launcher"]["version"], "path": str(launcher_dir)},
|
|
1417
|
-
"skills": {"onboarding": onboarding_skill, "analysis": analysis_skill},
|
|
1430
|
+
"skills": {"onboarding": onboarding_skill, "analysis": analysis_skill, "semanticQuery": semantic_query_skill},
|
|
1418
1431
|
"verifiedAssets": verified,
|
|
1419
1432
|
"securityMode": versions["defaults"]["securityMode"],
|
|
1420
1433
|
"productionReady": False,
|
|
@@ -1433,6 +1446,7 @@ def install_command(args: argparse.Namespace) -> dict:
|
|
|
1433
1446
|
"cliVersion": cli_component["version"],
|
|
1434
1447
|
"launcherVersion": components["launcher"]["version"],
|
|
1435
1448
|
"analysisSkill": analysis_skill,
|
|
1449
|
+
"semanticQuerySkill": semantic_query_skill,
|
|
1436
1450
|
"onboardingSkill": onboarding_skill,
|
|
1437
1451
|
"java": java_probe(),
|
|
1438
1452
|
"next": "run doctor, then runtime-start",
|
|
@@ -3324,8 +3338,10 @@ def doctor_command(args: argparse.Namespace) -> dict:
|
|
|
3324
3338
|
launcher_checks.append({"file": asset["file"], "present": path.is_file(), "sha256Valid": path.is_file() and sha256(path) == asset["sha256"]})
|
|
3325
3339
|
launcher_ok = bool(launcher_checks) and all(item["present"] and item["sha256Valid"] for item in launcher_checks)
|
|
3326
3340
|
analysis_skill_root = normalized(state.get("skills", {}).get("analysis", {}).get("path") or install_root / "skills" / "foggy-ai-analysis") if state else install_root / "skills" / "foggy-ai-analysis"
|
|
3341
|
+
semantic_query_skill_root = normalized(state.get("skills", {}).get("semanticQuery", {}).get("path") or install_root / "skills" / "foggy-semantic-query") if state else install_root / "skills" / "foggy-semantic-query"
|
|
3327
3342
|
onboarding_skill_root = skill_root()
|
|
3328
3343
|
analysis_skill = managed_skill_status(analysis_skill_root, "analysis", versions["components"]["analysisSkill"]["version"])
|
|
3344
|
+
semantic_query_skill = managed_skill_status(semantic_query_skill_root, "semantic-query", versions["components"]["semanticQuerySkill"]["version"])
|
|
3329
3345
|
onboarding_skill = {
|
|
3330
3346
|
"path": str(onboarding_skill_root),
|
|
3331
3347
|
"present": (onboarding_skill_root / "SKILL.md").is_file(),
|
|
@@ -3348,6 +3364,7 @@ def doctor_command(args: argparse.Namespace) -> dict:
|
|
|
3348
3364
|
"cli": cli_ok,
|
|
3349
3365
|
"launcher": launcher_ok,
|
|
3350
3366
|
"analysisSkill": analysis_skill["valid"],
|
|
3367
|
+
"semanticQuerySkill": semantic_query_skill["valid"],
|
|
3351
3368
|
"onboardingSkill": onboarding_skill["valid"],
|
|
3352
3369
|
}
|
|
3353
3370
|
if args.strict_runtime:
|
|
@@ -3362,7 +3379,7 @@ def doctor_command(args: argparse.Namespace) -> dict:
|
|
|
3362
3379
|
"java": java,
|
|
3363
3380
|
"cli": cli,
|
|
3364
3381
|
"launcherAssets": launcher_checks,
|
|
3365
|
-
"skills": {"analysis": analysis_skill, "onboarding": onboarding_skill},
|
|
3382
|
+
"skills": {"analysis": analysis_skill, "semanticQuery": semantic_query_skill, "onboarding": onboarding_skill},
|
|
3366
3383
|
"workspace": {"path": str(project_root), "mode": "dsh-session-cwd"},
|
|
3367
3384
|
"runtime": runtime,
|
|
3368
3385
|
"environmentPresence": {name: bool(os.environ.get(name)) for name in ("DEEPSEEK_API_KEY", "ALIYUN_TOKEN_PLAN_API_KEY", "FOGGY_RUNTIME_API_AUTH_CODE", "FOGGY_RUNTIME_AUTHORIZATION")},
|
|
@@ -3380,7 +3397,7 @@ def uninstall_command(args: argparse.Namespace) -> dict:
|
|
|
3380
3397
|
if install_root == data_root:
|
|
3381
3398
|
raise OnboardingError("Install root and data root must be different")
|
|
3382
3399
|
skills_root = install_root / "skills"
|
|
3383
|
-
skill_targets = [skills_root / "foggy-ai-analysis"]
|
|
3400
|
+
skill_targets = [skills_root / "foggy-ai-analysis", skills_root / "foggy-semantic-query"]
|
|
3384
3401
|
plan = {"installRoot": str(install_root), "dataRoot": str(data_root), "removeSkills": args.remove_skills, "purgeData": args.purge_data}
|
|
3385
3402
|
if args.dry_run:
|
|
3386
3403
|
return {"success": True, "dryRun": True, "plan": plan}
|
|
@@ -3415,7 +3432,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3415
3432
|
install.add_argument("--project-root")
|
|
3416
3433
|
install.add_argument("--asset-cache-dir", action="append", default=[])
|
|
3417
3434
|
install.add_argument("--replace-skill", action="store_true")
|
|
3418
|
-
install.add_argument("--repair-component", choices=("cli", "launcher", "analysis-skill"))
|
|
3435
|
+
install.add_argument("--repair-component", choices=("cli", "launcher", "analysis-skill", "semantic-query-skill"))
|
|
3419
3436
|
install.add_argument("--skip-cli-install", action="store_true")
|
|
3420
3437
|
install.add_argument("--cli-command")
|
|
3421
3438
|
install.add_argument("--progress-file")
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Foggy DeepSeek Harness plugin 0.4.0-rc.1 release candidate
|
|
2
|
-
|
|
3
|
-
Assessment date: 2026-09-05
|
|
4
|
-
|
|
5
|
-
## Decision
|
|
6
|
-
|
|
7
|
-
The implementation is ready for a public release-candidate build on Windows
|
|
8
|
-
10/11 x64 and Linux/WSL2 x64. It remains a development and evaluation plugin;
|
|
9
|
-
the bundled Runtime defaults are not a production security profile.
|
|
10
|
-
|
|
11
|
-
No Java engine or `foggy-runtime-cli` source was changed for this candidate.
|
|
12
|
-
The plugin consumes the independently accepted Runtime Launcher 0.1.20 and CLI
|
|
13
|
-
0.1.23 releases.
|
|
14
|
-
|
|
15
|
-
## Rehearsed chain
|
|
16
|
-
|
|
17
|
-
1. Installed DeepSeek Harness 0.1.2-rc.1 and the packed plugin in isolated
|
|
18
|
-
Windows and WSL profiles.
|
|
19
|
-
2. Downloaded and verified the managed Python 3.12.13 distribution, CLI 0.1.23,
|
|
20
|
-
Runtime Launcher 0.1.20, and analysis Skill 0.1.17.
|
|
21
|
-
3. Started Java Runtime instances on both hosts and passed readiness checks.
|
|
22
|
-
4. Connected the LAN MySQL demo database without restarting the active
|
|
23
|
-
development Runtime, created namespace `tms_beta18`, inspected 127 tables,
|
|
24
|
-
and selected `eo_express_order` as the waybill fact table.
|
|
25
|
-
5. Validated and published one TM and one QM with 29 query fields. Eight
|
|
26
|
-
executable question-bank cases passed; three additional cases remained
|
|
27
|
-
explicit clarification or capability-gap cases.
|
|
28
|
-
6. Verified Runtime 0.1.20 WARN behavior with unknown `groupBy[].grain`: the
|
|
29
|
-
query continued, and the plugin surfaced the warning code, JSON path,
|
|
30
|
-
normalized fragment, allowed properties, documentation reference, and
|
|
31
|
-
suggested action.
|
|
32
|
-
7. Delivered the model as a Git bundle to `dev-kvm-jdk17`, installed a private
|
|
33
|
-
Temurin JRE 17, Python 3.12.13, CLI 0.1.23, and Launcher 0.1.20, then bound
|
|
34
|
-
the remote namespace and passed the same eight executable questions.
|
|
35
|
-
8. Published model commit `3f2a019`, verified a remote query, rolled back to
|
|
36
|
-
baseline `bf6b70e`, and verified another remote query. The remote model was
|
|
37
|
-
left at the baseline revision.
|
|
38
|
-
|
|
39
|
-
## Compatibility and operating boundaries
|
|
40
|
-
|
|
41
|
-
- Unknown Query DSL input warnings are visible in both command output and the
|
|
42
|
-
plugin settings contract. IGNORE and STRICT remain Runtime policy choices;
|
|
43
|
-
protected authorization, datasource, namespace, model, and governance fields
|
|
44
|
-
continue to fail closed.
|
|
45
|
-
- Datasource passwords are accepted directly for development experience and
|
|
46
|
-
are excluded from plugin onboarding state, evidence, TM/QM source, and Git.
|
|
47
|
-
Runtime 0.1.20 persists them in its private datasource registry; production
|
|
48
|
-
publication must use target-environment credential controls.
|
|
49
|
-
- Copying a JRE from a newer Linux distribution failed on Ubuntu 22.04 because
|
|
50
|
-
of glibc compatibility. Remote deployment therefore uses an official
|
|
51
|
-
target-compatible Temurin archive with checksum verification.
|
|
52
|
-
- DeepSeek Harness minimum-release-age policy can reject an immediately
|
|
53
|
-
preceding plugin version recorded in its lockfile. The documented recovery
|
|
54
|
-
is to inspect and rebuild the profile lockfile or wait for the policy window;
|
|
55
|
-
this is not handled by weakening plugin integrity checks.
|
|
56
|
-
|
|
57
|
-
## Remaining publication gate
|
|
58
|
-
|
|
59
|
-
The package must pass the final automated test and tarball inspection, then be
|
|
60
|
-
published to npm and tagged as a GitHub prerelease from the same commit. npm and
|
|
61
|
-
GitHub artifacts must be checked against the local tarball before announcement.
|