yugoo-design 0.1.0 → 0.1.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Yugoo Design
2
2
 
3
- Package: `yugoo-design@0.1.0`.
3
+ Package: `yugoo-design@0.1.2`.
4
4
 
5
5
  Yugoo Design (语构设计系统) is an interactive design plugin for native Agent Hosts.
6
6
  It combines domain methods, Design Projects, versioned Design Files and shared
@@ -55,7 +55,7 @@ from another operating system requires an explicit Windows path and reports that
55
55
  locator as unverified; it does not establish target runtime acceptance.
56
56
 
57
57
  ```sh
58
- ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install --ignore-scripts=false --save-exact yugoo-design@0.1.0 --registry=https://registry.npmjs.org
58
+ ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install --ignore-scripts=false --save-exact yugoo-design@0.1.2 --registry=https://registry.npmjs.org
59
59
  npx --no-install yugoo-design --help
60
60
  ```
61
61
 
@@ -72,7 +72,7 @@ allowBuilds:
72
72
  ```
73
73
 
74
74
  ```sh
75
- ONNXRUNTIME_NODE_INSTALL_CUDA=skip pnpm add --save-exact yugoo-design@0.1.0 --registry=https://registry.npmjs.org
75
+ ONNXRUNTIME_NODE_INSTALL_CUDA=skip pnpm add --save-exact yugoo-design@0.1.2 --registry=https://registry.npmjs.org
76
76
  pnpm exec yugoo-design --help
77
77
  ```
78
78
 
@@ -121,7 +121,7 @@ process value:
121
121
  $previousOrtCuda = [Environment]::GetEnvironmentVariable('ONNXRUNTIME_NODE_INSTALL_CUDA', 'Process')
122
122
  try {
123
123
  $env:ONNXRUNTIME_NODE_INSTALL_CUDA = 'skip'
124
- npm install --ignore-scripts=false --save-exact yugoo-design@0.1.0 --registry=https://registry.npmjs.org
124
+ npm install --ignore-scripts=false --save-exact yugoo-design@0.1.2 --registry=https://registry.npmjs.org
125
125
  } finally {
126
126
  [Environment]::SetEnvironmentVariable('ONNXRUNTIME_NODE_INSTALL_CUDA', $previousOrtCuda, 'Process')
127
127
  }
@@ -139,6 +139,34 @@ layout. A tokenizer or one weight file alone does not establish a usable cache.
139
139
  Use the acquired version's model identity; changing the model/revision or copying
140
140
  an arbitrary cache is not a supported repair.
141
141
 
142
+ When the acquired `yugoo-design --help` lists `prepare-embedding`, run it from
143
+ that installation directory under the actual runtime user and OS:
144
+
145
+ ```sh
146
+ npx --no-install yugoo-design prepare-embedding
147
+ # Only when downloading the fixed model has been allowed:
148
+ npx --no-install yugoo-design prepare-embedding --allow-download --probe
149
+ ```
150
+
151
+ The default command is an offline size/hash inspection: it creates no cache,
152
+ lock or network request. `--allow-download` prepares the four pinned files
153
+ (about 135 MB total), reusing verified files and resumable downloads. `--probe`
154
+ performs real local CPU inference with fixed synthetic text; use it without
155
+ `--allow-download` to test an existing cache. An explicitly selected cache can
156
+ be passed as `--embedding-cache /absolute/cache`; use that same cache for the
157
+ runtime. No Design Project or host registration is needed for preparation.
158
+
159
+ `assets-ready` means the files passed integrity checks and CPU inference has not
160
+ been tested; `ready` means the CPU probe also passed. `unavailable` reports the
161
+ resource or inference failure and exits unsuccessfully. None of these results
162
+ proves semantic KAG is current for a real project. Respect an explicitly disabled
163
+ embedding configuration. Preparation does not change DSH's provider or model
164
+ settings; it is relevant only when DSH uses this same default local model/cache.
165
+
166
+ Published `0.1.0` does not include this command. Follow that package's existing
167
+ runtime route below, or update to a published version whose help includes it;
168
+ do not pass the new command to an older installation.
169
+
142
170
  For the shared runtime's `scripts/design.mjs serve` entry used by Codex, Claude
143
171
  Code, Qoder and QwenWork, the default is **local-only** model loading. Its runtime
144
172
  help documents `--allow-embedding-download`: when explicitly allowed, this permits
@@ -150,11 +178,12 @@ semantic embeddings. Neither option changes host model credentials. Model-file
150
178
  download and CPU inference do not upload Design text.
151
179
 
152
180
  WorkBuddy's `yugoo_workbuddy_open_panel` service currently fixes `localOnly: true`
153
- and exposes no model-download parameter. It requires the existing complete cache
154
- for its Windows runtime user; the CLI flag above does not add a WorkBuddy download
155
- route. If the cache is missing, report that limitation and the semantic-index
156
- diagnostic. Do not invent an installer flag, change host identity or start another
157
- host's service to bypass it. Authorized design work can continue from Design Files
181
+ and exposes no model-download parameter. It requires a complete cache
182
+ for its Windows runtime user. A package with `prepare-embedding` can prepare that
183
+ cache before the service starts; the older runtime `serve` flag does not add a
184
+ WorkBuddy download route. If preparation is unavailable or fails, report the
185
+ semantic-index diagnostic. Do not change host identity or start another host's
186
+ service to bypass it. Authorized design work can continue from Design Files
158
187
  and structural evidence; do not report semantic KAG as ready. DSH follows its own
159
188
  provider configuration rather than these Companion `serve` flags.
160
189
 
package/bin/installer.mjs CHANGED
@@ -14,6 +14,7 @@ import { codexAdapter, assertCodexAdmission, createCodexNativeAdapter } from './
14
14
  import { createClaudeNativeAdapter, planClaudeInstallation, applyClaudeInstallation, recoverClaudeInstallation } from './npm-installer-claude.mjs'
15
15
  import { installQoderPlugin } from './npm-installer-qoder.mjs'
16
16
  import { checkRuntime, inspectRuntime, assertInstalledRuntimeReceipt } from './npm-runtime-check.mjs'
17
+ import { embeddingPreparationMain } from './npm-embedding-preparation.mjs'
17
18
  import { runDesktopDshInstaller } from './npm-installer-dsh-desktop.mjs'
18
19
  import { desktopPreparationMain, desktopPreparationReuseMain } from './npm-desktop-preparation.mjs'
19
20
  import { agentInstallation, AGENT_INSTALL_HOSTS, DESKTOP_INSTALL_OPTIONS } from './npm-agent-installation.mjs'
@@ -774,6 +775,7 @@ export async function nativePluginDirectory({npmRoot,host}) {
774
775
 
775
776
  export async function installerMain(args,{npmRoot,userRoot=homedir(),adapter=codexAdapter,dshAdapterFactory=createDshInstallerAdapter,claudeAdapterFactory=createClaudeNativeAdapter,qoderInstaller=installQoderPlugin,agentDispatch=true,signal,dshInstallTimeoutMs}={}) {
776
777
  if(args[0]==='prepare-desktop')return desktopPreparationMain(args.slice(1),{npmRoot})
778
+ if(args[0]==='prepare-embedding')return embeddingPreparationMain(args.slice(1),{npmRoot,signal})
777
779
  const {values,positionals}=parseArgs({args,allowPositionals:true,options:{host:{type:'string'},'dry-run':{type:'boolean'},
778
780
  help:{type:'boolean',short:'h'},apply:{type:'boolean'},plan:{type:'string'},'receipt-dir':{type:'string'},receipt:{type:'string'},'runtime-receipt':{type:'string'},'codex-executable':{type:'string'},'claude-executable':{type:'string'},'user-root':{type:'string'},'disable-embedding':{type:'boolean'},
779
781
  'qoder-executable':{type:'string'},'qoder-config-dir':{type:'string'},
@@ -785,6 +787,7 @@ export async function installerMain(args,{npmRoot,userRoot=homedir(),adapter=cod
785
787
  commands:{
786
788
  'resolve-node':'Discover and verify an existing compatible Node without a host, npm package or configuration writes.',
787
789
  'prepare-desktop':'Prepare a small QwenWork suite or stable WorkBuddy market from this exact acquired npm package. Uses --target, --package-name/--package-version, --suite-version, --node-executable and an external --destination; does not register a host. Updates use the previous preparation receipt.',
790
+ 'prepare-embedding':'Check the fixed local model cache; --allow-download explicitly prepares resources and --probe verifies actual offline CPU inference. No host or project required.',
788
791
  install:'The current Agent selects --host from trusted context or one user choice. Direct install orchestrates existing native routes or Codex Desktop/QwenWork/WorkBuddy preparation. Missing inputs and pending activation are explicit. Existing --dry-run / --apply remain available.',
789
792
  'plugin-directory':'Inspect the optional Claude/Qoder session-only --plugin-dir entry; this is not persistent installation.',
790
793
  'check-runtime':'Check runtime prerequisites and write an external runtime receipt; does not install.',
@@ -30,32 +30,35 @@ function pending(host, status, missing, message) {
30
30
  installation: { host: host ?? null, acquisition: 'unverified', registration: 'not-performed',
31
31
  activation: 'not-performed', usability: 'unverified', nextActions: [{ action: 'supply-inputs', automatic: false, message }] } }
32
32
  }
33
- function activationActions(host, result) {
33
+ function activationActions(host, result, disableEmbedding) {
34
+ const embedding = disableEmbedding ? [] : [{ action: 'prepare-local-embedding', automatic: true,
35
+ command: ['prepare-embedding'],
36
+ message: 'Use this acquired product\'s prepare-embedding to check the fixed model cache under the actual runtime user and operating system. Match the runtime\'s --embedding-cache and selected Node; a WSL cache is not a Windows runtime cache. Reuse complete files. If resources are missing or invalid, explain the model download and use --allow-download only when permitted; use --probe to verify CPU inference. DSH custom provider/model settings remain owned by DSH and must not be replaced with defaults. Report resource integrity, CPU inference and the real project\'s semantic status separately. Missing embeddings do not block basic design or available source-projection context.' }]
34
37
  const verify = { action: 'verify-native-session', automatic: true,
35
38
  message: 'In the intended native conversation, verify the actually loaded Yugoo Design version and tools; then open a project and verify Panel save/reopen and original-conversation receipt. Registration alone is not usability.' }
36
39
  if (host === 'codex-desktop') return [
37
40
  { action: 'activate-native-plugin', automatic: false, path: result.marketplacePath,
38
- message: 'Install or update this exact prepared local Yugoo Design source through Codex Desktop. If a normal restart is required, keep and return to the current conversation. Retain the exact npm version and previous owned source until the loaded version is verified.' }, verify]
41
+ message: 'Install or update this exact prepared local Yugoo Design source through Codex Desktop. If a normal restart is required, keep and return to the current conversation. Retain the exact npm version and previous owned source until the loaded version is verified.' }, ...embedding, verify]
39
42
  if (host === 'qwenwork') return [
40
43
  { action: 'import-expert-suite', automatic: false, path: result.nativeImport?.archive,
41
44
  message: 'Import this exact expert-suite ZIP through QwenWork. If bundled MCP is disabled by organization policy, use the emitted connector configuration and retain exactly one Yugoo Design connector.' },
42
45
  { action: 'activate-native-suite', automatic: false,
43
- message: 'Enable the imported suite; start a new native conversation if QwenWork requires it. Retain the acquired npm runtime and confirm the actually loaded suite version.' }, verify]
46
+ message: 'Enable the imported suite; start a new native conversation if QwenWork requires it. Retain the acquired npm runtime and confirm the actually loaded suite version.' }, ...embedding, verify]
44
47
  if (host === 'workbuddy') return [
45
48
  { action: 'import-or-update-market', automatic: false, path: result.nativeImport?.market,
46
49
  message: 'Import this stable marketplace through WorkBuddy, or refresh the same market and update its existing Yugoo Design plugin. Preparation has not registered or activated it.' },
47
50
  { action: 'activate-native-plugin', automatic: false,
48
- message: 'Enable the plugin and start a new native conversation if WorkBuddy requires it; confirm the actually loaded suite version.' }, verify]
51
+ message: 'Enable the plugin and start a new native conversation if WorkBuddy requires it; confirm the actually loaded suite version.' }, ...embedding, verify]
49
52
  return [{ action: 'activate-native-session', automatic: false,
50
53
  message: host === 'dsh'
51
54
  ? 'Use the selected existing DSH profile and the host-supported plugin activation/restart flow; verify runtime loading in a new native session.'
52
55
  : host === 'codex'
53
56
  ? 'Start a new Codex conversation normally in the intended workspace and invoke the installed yugoo Skill through the native Skill entry. Retain the registered npm runtime.'
54
- : 'Start a new native host conversation normally in the intended workspace and invoke /yugoo-design:yugoo. Retain the registered npm runtime; no --plugin-dir is needed.' }, verify]
57
+ : 'Start a new native host conversation normally in the intended workspace and invoke /yugoo-design:yugoo. Retain the registered npm runtime; no --plugin-dir is needed.' }, ...embedding, verify]
55
58
  }
56
59
 
57
60
  /** Project only verified facts from the owning native/preparation receipt. */
58
- export function installationResult(host, result, packageIdentity) {
61
+ export function installationResult(host, result, packageIdentity, { disableEmbedding = false } = {}) {
59
62
  const failed = result.status === 'failed-partial-state-retained'
60
63
  const desktop = host === 'qwenwork' || host === 'workbuddy' || host === 'codex-desktop'
61
64
  const registered = !desktop && !failed && (result.hostRegistered === true
@@ -68,9 +71,10 @@ export function installationResult(host, result, packageIdentity) {
68
71
  registryAcquisitionVerified: false,
69
72
  registration: failed ? 'failed-partial-state-retained' : registered ? 'verified' : 'not-performed',
70
73
  activation: failed ? 'not-performed' : 'required', usability: 'unverified',
74
+ embedding: { status: disableEmbedding ? 'disabled' : 'unverified', blocksBasicDesign: false },
71
75
  nextActions: failed ? [{ action: 'inspect-retained-state', automatic: false, path: result.receiptFile,
72
76
  message: 'Inspect the owning receipt and retained DSH state before another operation. No automatic rollback or retry was attempted.' }]
73
- : activationActions(host, result) } }
77
+ : activationActions(host, result, disableEmbedding) } }
74
78
  }
75
79
 
76
80
  export async function agentInstallation(values, { npmRoot, invoke, desktopPrepare, desktopReuse, codexDesktopPrepare,
@@ -116,7 +120,7 @@ export async function agentInstallation(values, { npmRoot, invoke, desktopPrepar
116
120
  return installationResult(host, reused || await desktopPrepare(args))
117
121
  }
118
122
  if (host === 'claude-code' || host === 'qoder')
119
- return installationResult(host, await invoke(argv('install', values, allowed)))
123
+ return installationResult(host, await invoke(argv('install', values, allowed)), undefined, { disableEmbedding: values['disable-embedding'] === true })
120
124
  // DSH's exclusive plan files are never overwritten. Each direct operation gets
121
125
  // its own receipt subdirectory; Codex keeps the stable directory needed by upgrades.
122
126
  const nativeValues = host === 'dsh' ? { ...values, 'receipt-dir': join(values['receipt-dir'], randomUUID()) } : values
@@ -135,7 +139,7 @@ export async function agentInstallation(values, { npmRoot, invoke, desktopPrepar
135
139
  assert.ok(runtime.receiptFile, 'The owning runtime checker did not retain its receipt')
136
140
  const applyArgs = argv('install', values, allowed.filter(key => !['receipt-dir', 'disable-embedding', 'node-executable'].includes(key)))
137
141
  applyArgs.push('--apply', '--plan', plan.planFile, '--runtime-receipt', runtime.receiptFile)
138
- return installationResult(host, await invoke(applyArgs), plan.package)
142
+ return installationResult(host, await invoke(applyArgs), plan.package, { disableEmbedding: values['disable-embedding'] === true })
139
143
  }
140
144
  const applyArgs = argv('install', nativeValues, allowed)
141
145
  applyArgs.push('--apply', '--plan', plan.planFile)
@@ -0,0 +1,32 @@
1
+ import { parseArgs } from 'node:util'
2
+ import { isAbsolute, join } from 'node:path'
3
+ import { pathToFileURL } from 'node:url'
4
+
5
+ /** Installed product entry. Resolves only the acquired package's existing Knowledge runtime. */
6
+ export async function embeddingPreparationMain(args, { npmRoot, signal } = {}) {
7
+ const { values, positionals } = parseArgs({ args, allowPositionals: true, options: {
8
+ help: { type: 'boolean', short: 'h' }, 'embedding-cache': { type: 'string' },
9
+ 'allow-download': { type: 'boolean' }, probe: { type: 'boolean' },
10
+ } })
11
+ if (positionals.length) throw new Error('prepare-embedding does not accept a host or project.')
12
+ if (values.help) return { schemaVersion: 1, kind: 'embedding-preparation-help', status: 'not-applicable',
13
+ usage: 'yugoo-design prepare-embedding [--embedding-cache /absolute/cache] [--allow-download] [--probe]',
14
+ options: { '--embedding-cache': 'Use the same absolute model cache as the target runtime; omission keeps the existing per-user default.',
15
+ '--allow-download': 'Explicitly permit the existing pinned model downloader to prepare missing or invalid resources; default only checks.',
16
+ '--probe': 'After verified resources, run one fixed text through the existing local CPU worker, offline. No project or host is required.' },
17
+ results: { 'assets-ready': 'All fixed resources verified; CPU inference has not been checked.', ready: 'Fixed resources verified and actual CPU inference passed.', unavailable: 'Resources or inference unavailable; see reasonCode. Basic design and source facts are unchanged.' } }
18
+ if (values['embedding-cache'] !== undefined && !isAbsolute(values['embedding-cache'])) throw new Error('--embedding-cache must be an absolute path.')
19
+ try {
20
+ const runtimeUrl = pathToFileURL(join(npmRoot, 'payload/shared/knowledge/runtime.mjs'))
21
+ const { runStandaloneKnowledgeOperation } = await import(pathToFileURL(join(npmRoot, 'payload/shared/knowledge/cli-lifecycle.mjs')).href)
22
+ return await runStandaloneKnowledgeOperation({ runtimeUrl, loadRuntime: () => import(runtimeUrl.href), run: runtime => {
23
+ if (typeof runtime.prepareLocalEmbedding !== 'function') throw new Error('Missing embedding preparation entry')
24
+ return runtime.prepareLocalEmbedding({ cacheDir: values['embedding-cache'], allowDownload: values['allow-download'] === true,
25
+ probe: values.probe === true, signal })
26
+ } })
27
+ } catch {
28
+ return { schemaVersion: 1, kind: 'embedding-preparation', status: 'unavailable', reasonCode: signal?.aborted ? 'cancelled' : 'runtime-unavailable',
29
+ resources: { state: 'unavailable' }, inference: { state: 'not-run' }, semanticKagVerified: false,
30
+ message: 'The installed Knowledge runtime could not run the embedding check. Check this package and its current-platform dependencies. Basic design and source facts are unchanged.' }
31
+ }
32
+ }
@@ -5,10 +5,12 @@ const args=process.argv.slice(2)
5
5
  const dshInstall=args[0]==='install'&&args.some((arg,index)=>arg==='--host=dsh'||arg==='--host'&&args[index+1]==='dsh')
6
6
  const cancellation=new AbortController()
7
7
  const cancel=()=>cancellation.abort()
8
- if(dshInstall) { process.on('SIGINT',cancel);process.on('SIGTERM',cancel) }
8
+ const cancellable=dshInstall||args[0]==='prepare-embedding'
9
+ if(cancellable) { process.on('SIGINT',cancel);process.on('SIGTERM',cancel) }
9
10
  try {
10
- const result=await installerMain(args,{npmRoot:fileURLToPath(new URL('../',import.meta.url)),signal:dshInstall?cancellation.signal:undefined})
11
+ const result=await installerMain(args,{npmRoot:fileURLToPath(new URL('../',import.meta.url)),signal:cancellable?cancellation.signal:undefined})
11
12
  console.log(JSON.stringify(result))
13
+ if(args[0]==='prepare-embedding'&&!['assets-ready','ready','not-applicable'].includes(result.status))process.exitCode=1
12
14
  if(process.argv[2]==='check-runtime'&&!['load-verified','disabled','not-applicable'].includes(result.status))process.exitCode=1
13
15
  if(result.status==='failed-partial-state-retained')process.exitCode=1
14
16
  if(['runtime-not-ready','unsupported-host'].includes(result.status))process.exitCode=1
@@ -17,5 +19,5 @@ try {
17
19
  console.error(error.installation ? JSON.stringify({error:error.message,installation:error.installation}) : error.message)
18
20
  process.exitCode=1
19
21
  } finally {
20
- if(dshInstall) { process.off('SIGINT',cancel);process.off('SIGTERM',cancel) }
22
+ if(cancellable) { process.off('SIGINT',cancel);process.off('SIGTERM',cancel) }
21
23
  }
package/package.json CHANGED
@@ -60,5 +60,5 @@
60
60
  }
61
61
  },
62
62
  "name": "yugoo-design",
63
- "version": "0.1.0"
63
+ "version": "0.1.2"
64
64
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "yugoo-design",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Yugoo Design: interactive Design Panels with Claude Code native agents and background design reviews."
5
5
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yugoo-design",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Yugoo Design: local Design Project Panels for an explicitly bound Codex conversation (development preview).",
5
5
  "author": {
6
6
  "name": "yugoo-design contributors"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "yugoo-design",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Yugoo Design: interactive Design Panels with Qoder-native Producers, Workers and background reviews."
5
5
  }
@@ -30,6 +30,17 @@ function ownKnowledgeSignals(runtimeUrl) {
30
30
  });
31
31
  for (const [name, listener] of owned) process.removeListener(name, listener);
32
32
  }
33
+ /** Finite CLI diagnostics use the same verified signal ownership and public terminal shutdown. */
34
+ async function runStandaloneKnowledgeOperation({ runtimeUrl, loadRuntime, run }) {
35
+ ownKnowledgeSignals(runtimeUrl);
36
+ let runtime;
37
+ try {
38
+ runtime = await loadRuntime();
39
+ return await run(runtime);
40
+ } finally {
41
+ await runtime?.shutdownLadybugKnowledgeRuntime();
42
+ }
43
+ }
33
44
  async function startStandaloneCompanion({ runtimeUrl, loadRuntime, start }) {
34
45
  ownKnowledgeSignals(runtimeUrl);
35
46
  let server, loading, closing;
@@ -76,4 +87,4 @@ async function startStandaloneCompanion({ runtimeUrl, loadRuntime, start }) {
76
87
  }
77
88
  }
78
89
  //#endregion
79
- export { startStandaloneCompanion };
90
+ export { runStandaloneKnowledgeOperation, startStandaloneCompanion };
@@ -8,11 +8,11 @@
8
8
  "undici": "8.10.2"
9
9
  },
10
10
  "assets": {
11
- "cli-lifecycle.mjs": "6951c54bf30bb90d4fd8ff4addfb46f6358b084059440213643b1aff03ae903a",
11
+ "cli-lifecycle.mjs": "039c7705557b58c435c0a96a6540b2a233a3583ebab36c5d100bad0771a15d88",
12
12
  "embedding-worker.js": "1dc5f99a02fc8bd58ab318991a2145665c95bc65f4a025b63be524dffdb66f00",
13
13
  "embedding-worker.mjs": "1dc5f99a02fc8bd58ab318991a2145665c95bc65f4a025b63be524dffdb66f00",
14
14
  "package.json": "a3e820bf1715afda0b535dd848a22362dbdc28296fbbbe6ffd6b7712d06194b6",
15
- "runtime.mjs": "7366e74ca57996e534c69c1e31bb7b8ca7deb2f85d40a1d8c6bef9349bf370d6"
15
+ "runtime.mjs": "08e99eae9738441b5a1a588a5a1a16a986e0dd8a8a41199fc88d19ab0956940e"
16
16
  },
17
17
  "officialInputs": {
18
18
  "repository": "https://github.com/deepseek-ai/deepseek-harness",
@@ -35181,19 +35181,58 @@ async function size(path) {
35181
35181
  throw error;
35182
35182
  }
35183
35183
  }
35184
- async function valid(path, asset) {
35184
+ async function valid(path, asset, signal) {
35185
35185
  if (await size(path) !== asset.bytes) return false;
35186
35186
  const hash = createHash(asset.kind === "git-blob-sha1" ? "sha1" : "sha256");
35187
35187
  if (asset.kind === "git-blob-sha1") hash.update(`blob ${asset.bytes}\0`);
35188
- for await (const bytes of createReadStream(path)) hash.update(bytes);
35188
+ for await (const bytes of createReadStream(path)) {
35189
+ signal?.throwIfAborted();
35190
+ hash.update(bytes);
35191
+ }
35189
35192
  return hash.digest("hex") === asset.hash;
35190
35193
  }
35194
+ function validateAssets(files) {
35195
+ if (files.some((file) => !/^[a-zA-Z0-9_.-]+(?:\/[a-zA-Z0-9_.-]+)*$/.test(file.path) || file.path.split("/").some((p) => p === "..") || !Number.isSafeInteger(file.bytes) || file.bytes < 1 || !["sha256", "git-blob-sha1"].includes(file.kind))) throw new EmbeddingAssetError("integrity");
35196
+ }
35197
+ /** Read-only inspection: never creates a cache, lock, staging file or network dispatcher. */
35198
+ async function inspectEmbeddingAssetSet(root, files, signal) {
35199
+ validateAssets(files);
35200
+ const results = [];
35201
+ for (const asset of files) {
35202
+ signal.throwIfAborted();
35203
+ const path = join(root, asset.path);
35204
+ try {
35205
+ const length = await size(path);
35206
+ results.push({
35207
+ path: asset.path,
35208
+ bytes: asset.bytes,
35209
+ state: length === void 0 ? "missing" : length !== asset.bytes ? "incomplete" : await valid(path, asset, signal) ? "ready" : "integrity"
35210
+ });
35211
+ } catch (error) {
35212
+ if (!(error instanceof EmbeddingAssetError)) throw error;
35213
+ results.push({
35214
+ path: asset.path,
35215
+ bytes: asset.bytes,
35216
+ state: "integrity"
35217
+ });
35218
+ }
35219
+ }
35220
+ signal.throwIfAborted();
35221
+ return {
35222
+ state: results.every((file) => file.state === "ready") ? "ready" : "unavailable",
35223
+ bytes: files.reduce((total, file) => total + file.bytes, 0),
35224
+ files: results
35225
+ };
35226
+ }
35227
+ function inspectDefaultEmbeddingAssets(cacheDir, signal) {
35228
+ return inspectEmbeddingAssetSet(join(cacheDir, DEFAULT_EMBEDDING_ASSETS.model, DEFAULT_EMBEDDING_ASSETS.revision), DEFAULT_EMBEDDING_ASSETS.files, signal);
35229
+ }
35191
35230
  /** Private resource preparation. No model/native session or Design text enters this path.
35192
35231
  * Download has its own bounded lifetime; the existing 180s inference budget is unchanged.
35193
35232
  * A failed pass keeps resumable staging bytes and never publishes a partial canonical file.
35194
35233
  */
35195
35234
  async function prepareEmbeddingAssetSet(root, files, localOnly, options) {
35196
- if (files.some((file) => !/^[a-zA-Z0-9_.-]+(?:\/[a-zA-Z0-9_.-]+)*$/.test(file.path) || file.path.split("/").some((p) => p === "..") || !Number.isSafeInteger(file.bytes) || file.bytes < 1 || !["sha256", "git-blob-sha1"].includes(file.kind))) throw new EmbeddingAssetError("integrity");
35235
+ validateAssets(files);
35197
35236
  options.signal.throwIfAborted();
35198
35237
  await mkdir(root, { recursive: true });
35199
35238
  const compromised = new AbortController();
@@ -35218,7 +35257,7 @@ async function prepareEmbeddingAssetSet(root, files, localOnly, options) {
35218
35257
  for (const asset of files) {
35219
35258
  signal.throwIfAborted();
35220
35259
  const target = join(root, asset.path);
35221
- if (await valid(target, asset)) continue;
35260
+ if (await valid(target, asset, signal)) continue;
35222
35261
  if (localOnly) throw new EmbeddingAssetError("missing");
35223
35262
  await mkdir(dirname(target), { recursive: true });
35224
35263
  const staged = target + ".yugoo-download.part";
@@ -35258,7 +35297,7 @@ async function prepareEmbeddingAssetSet(root, files, localOnly, options) {
35258
35297
  } finally {
35259
35298
  await output.close();
35260
35299
  }
35261
- if (!await valid(staged, asset)) throw new EmbeddingAssetError("integrity");
35300
+ if (!await valid(staged, asset, signal)) throw new EmbeddingAssetError("integrity");
35262
35301
  signal.throwIfAborted();
35263
35302
  if (await size(target) !== void 0) await copyFile(target, target + ".rejected-" + randomUUID(), constants.COPYFILE_EXCL);
35264
35303
  await rename(staged, target);
@@ -35661,4 +35700,114 @@ var DesignSemanticIndex = class {
35661
35700
  }
35662
35701
  };
35663
35702
  //#endregion
35664
- export { DesignSemanticIndex, LadybugDesignKnowledgeProvider, shutdownLadybugKnowledgeRuntime };
35703
+ //#region packages/knowledge-ladybug/src/embedding-preparation.ts
35704
+ const reasons = {
35705
+ missing: "固定版本模型资源缺失;允许下载后可显式准备。",
35706
+ incomplete: "固定版本模型资源不完整;允许下载后可显式续传。",
35707
+ integrity: "固定版本模型资源完整性校验失败;请显式重新准备。",
35708
+ download: "模型资源下载未完成;请检查网络及代理后显式重试。",
35709
+ busy: "另一进程正在准备模型资源;请在其完成后重试。",
35710
+ cancelled: "模型准备或推理检查已取消。",
35711
+ runtime: "模型缓存无法读取或运行依赖不可用。"
35712
+ };
35713
+ /** Installation diagnostic only: no project, provider database, publication or host configuration. */
35714
+ async function prepareLocalEmbedding(options = {}) {
35715
+ if (options.cacheDir !== void 0 && !isAbsolute(options.cacheDir)) throw new Error("Embedding cache must be an absolute path");
35716
+ const index = new DesignSemanticIndex({
35717
+ localOnly: true,
35718
+ ...options.cacheDir ? { cacheDir: options.cacheDir } : {}
35719
+ });
35720
+ const signal = options.signal ?? new AbortController().signal;
35721
+ const { cacheDir, model, revision } = index.config;
35722
+ let resources = { state: "unavailable" };
35723
+ const base = {
35724
+ schemaVersion: 1,
35725
+ kind: "embedding-preparation",
35726
+ cacheDir,
35727
+ model,
35728
+ revision,
35729
+ downloadAllowed: options.allowDownload === true,
35730
+ semanticKagVerified: false,
35731
+ note: "仅检查本地语义索引资源与可选 CPU 推理;不更改基础设计、源事实投影或项目语义发布状态。"
35732
+ };
35733
+ try {
35734
+ resources = await inspectDefaultEmbeddingAssets(cacheDir, signal);
35735
+ if (options.allowDownload === true && resources.state !== "ready") {
35736
+ await prepareDefaultEmbeddingAssets({
35737
+ ...index.config,
35738
+ localOnly: false
35739
+ }, signal);
35740
+ resources = await inspectDefaultEmbeddingAssets(cacheDir, signal);
35741
+ }
35742
+ if (resources.state !== "ready") {
35743
+ const code = resources.files.find((file) => file.state !== "ready").state;
35744
+ return {
35745
+ ...base,
35746
+ status: "unavailable",
35747
+ resources,
35748
+ inference: { state: "not-run" },
35749
+ reasonCode: code,
35750
+ message: reasons[code]
35751
+ };
35752
+ }
35753
+ if (!options.probe) return {
35754
+ ...base,
35755
+ status: "assets-ready",
35756
+ resources,
35757
+ inference: { state: "not-checked" },
35758
+ message: "固定模型资源完整;尚未验证实际 CPU 推理。使用 --probe 检查。"
35759
+ };
35760
+ try {
35761
+ await index.compute("installation-probe", {
35762
+ checkpoint: "installation-probe",
35763
+ nodes: [],
35764
+ edges: [],
35765
+ warnings: [],
35766
+ semanticUnits: [{
35767
+ id: "installation-probe:0",
35768
+ nodeId: "installation-probe",
35769
+ file: "installation-probe.json",
35770
+ pointer: "",
35771
+ text: "Local embedding readiness check.",
35772
+ digest: "installation-probe-v1"
35773
+ }]
35774
+ }, void 0, signal);
35775
+ return {
35776
+ ...base,
35777
+ status: "ready",
35778
+ resources,
35779
+ inference: {
35780
+ state: "ready",
35781
+ device: "cpu"
35782
+ },
35783
+ message: "固定模型资源完整,实际本地 CPU 推理通过。"
35784
+ };
35785
+ } catch {
35786
+ return {
35787
+ ...base,
35788
+ status: "unavailable",
35789
+ resources,
35790
+ inference: {
35791
+ state: "unavailable",
35792
+ device: "cpu"
35793
+ },
35794
+ reasonCode: signal.aborted ? "cancelled" : "inference-unavailable",
35795
+ message: signal.aborted ? reasons.cancelled : "模型资源完整,但实际 CPU 推理未通过。请检查当前平台运行依赖、CPU 和内存。"
35796
+ };
35797
+ }
35798
+ } catch (error) {
35799
+ const code = signal.aborted ? "cancelled" : error instanceof EmbeddingAssetError ? error.code : "runtime";
35800
+ return {
35801
+ ...base,
35802
+ status: "unavailable",
35803
+ resources,
35804
+ inference: { state: "not-run" },
35805
+ reasonCode: code,
35806
+ message: reasons[code]
35807
+ };
35808
+ } finally {
35809
+ await index.close();
35810
+ }
35811
+ }
35812
+ //#endregion
35813
+ export { DesignSemanticIndex, LadybugDesignKnowledgeProvider, prepareLocalEmbedding, shutdownLadybugKnowledgeRuntime };
@@ -4,7 +4,7 @@
4
4
  "dsh": {
5
5
  "aggregatePackage": "@yugoo-design/dsh-design-system-dsh",
6
6
  "registry": "https://registry.npmjs.org",
7
- "aggregateVersion": "0.1.0"
7
+ "aggregateVersion": "0.1.2"
8
8
  }
9
9
  }
10
10
  }
@@ -3,21 +3,22 @@
3
3
  "fixture": false,
4
4
  "distribution": "stable",
5
5
  "publishReady": false,
6
- "version": "0.1.0",
6
+ "version": "0.1.2",
7
7
  "readmeSource": {
8
8
  "path": "packages/companion/README.md",
9
- "sourceSha256": "e9caa13476599a62cf08b7bf04bf11fee8ba32f003fd1d8de1ebaf09c479fd41",
10
- "sectionSha256": "858538e4c8436757cba9a0f17679bcde6f243fe52bd0d8d0a40e98da6c4ff65d"
9
+ "sourceSha256": "0b4fdabb12018f52718b8d278a47ebf5818460b36d86d6be96da60cb98b52aa5",
10
+ "sectionSha256": "97c43b5e19f7b1d64a85534b15bb242cf0daccf60fd86ef578c4037a310f2f0c"
11
11
  },
12
12
  "assets": {
13
13
  "LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
14
14
  "NOTICE": "6119b21e1fa5d37ec3ab337ad43685970310aa5c97a0e90ecf6603d17091f371",
15
- "README.md": "b0c23e78d56febe16f7962a9b2fb7a5462b083ea8121a96b040ed7bc62ae0df2",
15
+ "README.md": "598ac20a2019438aadbfd66a1cc5bd94e6cefb004733bb6c773f4ab9b87046d9",
16
16
  "THIRD_PARTY_NOTICES.md": "bfcab921c6c15ccc47f9b1a6cc5941675c95962de5ea5b0edc50fbfa2aef136a",
17
- "bin/installer.mjs": "a28f62a92fbc14c3964452c8b61d3f4486d92b1771a65db253ff55f926e7897d",
18
- "bin/npm-agent-installation.mjs": "c5f8f845ea339c21834ac9f313458e63a9f0c299d6ed68feb8c689a1f060a0f5",
17
+ "bin/installer.mjs": "169f367c8c66d5066b51e305dbdbe692888b96dec4ae671dda1cd216b4baa8b4",
18
+ "bin/npm-agent-installation.mjs": "0b64248e789b4d3a3ee1752f5235744c27d37bb302e0e538d34a7905a59a5a6a",
19
19
  "bin/npm-codex-desktop-source.mjs": "a4990fe747ff8da2d884a795a255aa691c848b4a9d8ebbdb28f3929bcda8359d",
20
20
  "bin/npm-desktop-preparation.mjs": "43f7a972a44bea90291e113f206e3c3bc4a91a02e4b82eea85293c1cebb15237",
21
+ "bin/npm-embedding-preparation.mjs": "bd787ea9404e97e07adba68c700f61b1f25a70a1a475506cd91c258f2dc10afd",
21
22
  "bin/npm-installer-claude.mjs": "e34a681b3fa9d7f40518103fb4230e083077347e3d6aaa14dceeba609d5fd310",
22
23
  "bin/npm-installer-codex-desktop.mjs": "dcd8e75f5e47531843c5842cb3068a55f968fe20ed8ea3f5b3d0d7b155c0c5eb",
23
24
  "bin/npm-installer-codex.mjs": "5789195b889a78fa298395fb5e3b6f72539e473f816132c4762e0ee77ac4a9c8",
@@ -30,7 +31,7 @@
30
31
  "bin/npm-runtime-check.mjs": "31880b9b79fdceeef070f8d304cde66ce335bc34d173b16e603abf0a6a5d60ad",
31
32
  "bin/windows-native-platform.mjs": "57ac50c9a8cc0371597d6d40e3efe4cbe2a470e98f75f0229721c7d5a48e7e98",
32
33
  "bin/windows-private-storage.mjs": "27c3eb052278f0cb2850326e1d0864cfd2f3f6d2b1975ec7c24535ef6251ac94",
33
- "bin/yugoo-design.mjs": "2b9a0a610953dac800a7ee8d46fb05c193550bc57297985f42d076cec757a80f",
34
+ "bin/yugoo-design.mjs": "3a390aca541f6a7c6a987a54037d58926e3a5dc7971f9d540476e329ceeb027a",
34
35
  "licenses/DSH-LICENSE": "ebb4f09972aee8608be255debaf78451a68e95c290f55c240dec2ecfa16ea6be",
35
36
  "licenses/bundled-js/3d-force-graph@1.80.0/LICENSE": "7262e566e874d1ce8cfadace01d4f635f8d704b6bdf7b4345cc028e5faeafded",
36
37
  "licenses/bundled-js/@babel/runtime@7.29.7/LICENSE": "117da2af0d4ce0fe1c8e19b5cff9dcd806adf973d328d27b11d4448c4ff24f76",
@@ -427,7 +428,7 @@
427
428
  "licenses/third-party/whiteboard-fonts/licenses/JetBrainsMono-OFL.txt": "30f0c136e3c88e422d0791acd97238870f9054a9729bc34cf2ff0d4ed8cac4ad",
428
429
  "licenses/third-party/whiteboard-fonts/licenses/source-han-sans-LICENSE.txt": "fcac737e761ec63dbfbdce11030a1780161920d80315edba9c8beff1c2bac5a2",
429
430
  "licenses/third-party/whiteboard-fonts/manifest.json": "c164438115a40cdead905085e95298f28a4ffa2a3947512b9a98509f33c26972",
430
- "package.json": "47af5cb65de70871de72bb9722f70bfbe83f3b5252246b8874485051afb56508",
431
+ "package.json": "f812f334f59b81b251d26098fc659f3bcfe7a11b9d367fbac778a0b12ab43ebd",
431
432
  "payload/desktop-preparation/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
432
433
  "payload/desktop-preparation/NOTICE": "6b4eec391144fcbd96ec7b45a28764ab1932722a96325248377c3e28aac2c62d",
433
434
  "payload/desktop-preparation/THIRD_PARTY_NOTICES.md": "bfcab921c6c15ccc47f9b1a6cc5941675c95962de5ea5b0edc50fbfa2aef136a",
@@ -465,7 +466,7 @@
465
466
  "payload/desktop-preparation/src/workbuddy-relay-service.mjs": "44d60d6956250417507fb76c71c3030a01bc38e565e4572a761b46f255f8e669",
466
467
  "payload/desktop-preparation/src/workbuddy-ui-probes.mjs": "a91d4651248125769254755bdf66a44bbc9e5a793dad0a137c35acbb10a89a88",
467
468
  "payload/desktop-preparation/workbuddy-package.mjs": "f39407b3fd2406c73079b4067e9eb93d181a35ac53ad548b45e8599f486ca976",
468
- "payload/overlays/claude-code/.claude-plugin/plugin.json": "a0498213223ffd0a911e75b523a8bd2bfe6cab5eda9bc21b5c024df58f3b16ce",
469
+ "payload/overlays/claude-code/.claude-plugin/plugin.json": "e7f83d7c8e13b19fbaf437097b2df9d925ab98a5051ebdc4df095df884760247",
469
470
  "payload/overlays/claude-code/.mcp.json": "1108847d27abd953a52cd7c3ea4cd416898d67dcfdb80a92255d889186b12b66",
470
471
  "payload/overlays/claude-code/hooks/hooks.json": "e8bea6fdf13dce4023a2112dd4a31fd1a77e0f4ca2d4c506882ea80ef86b6482",
471
472
  "payload/overlays/claude-code/scripts/claude-connection.mjs": "83a6a2de1b28d1b5dd230b1447abac6f2209a80d6681f08766a53e7b6f63200f",
@@ -479,7 +480,7 @@
479
480
  "payload/overlays/claude-code/skills/design-component/SKILL.md": "85a1f2a016174787226eaa9e9e6675e86057212d322a65014edd71f3e4861b34",
480
481
  "payload/overlays/claude-code/skills/yugoo/SKILL.md": "045d81c10b0d18ebe1644180149f42059b114874bcf8daca805c6fd91e343c81",
481
482
  "payload/overlays/claude-code/skills/yugoo/native-execution.md": "2e66dc2811ce6552ab43547af3020337e9de60576ad3c8de4422f120dbd6d5a7",
482
- "payload/overlays/codex/.codex-plugin/plugin.json": "1dac83b8c20e668b97a3551002782d212a0da34f7831c12abb1305afa4c1933d",
483
+ "payload/overlays/codex/.codex-plugin/plugin.json": "c4dc58fe7b547e14369f072c3aa61f7e939b4792c0a4887e4bfd4f819b32ab62",
483
484
  "payload/overlays/codex/.mcp.json": "ee6450b4f9a5239ae9c173d07198d37041fad65f9f65ecf4ff88ccf8528a609a",
484
485
  "payload/overlays/codex/README.md": "614c04455a8b88941d62861bc9e6ab0ae96f7aefb4a04a31085a2d86ccbf363b",
485
486
  "payload/overlays/codex/scripts/design.mjs": "c116e3a9f60830923692a9f8785640d9a13a97320771bf9201de0e5089618a74",
@@ -489,7 +490,7 @@
489
490
  "payload/overlays/codex/skills/design-panel/native-execution.md": "2e66dc2811ce6552ab43547af3020337e9de60576ad3c8de4422f120dbd6d5a7",
490
491
  "payload/overlays/codex/skills/yugoo/SKILL.md": "d2c512b979178c9be0dd5cf2b855ad1d39af00f40728aa3031b87e12693a8600",
491
492
  "payload/overlays/qoder/.mcp.json": "7f86b52fffd552312441b9bd99dd39a3b80b2893dc4a85519614d906bdc6884e",
492
- "payload/overlays/qoder/.qoder-plugin/plugin.json": "5692a38ad807bc1721e7c1279b3f503f14a804e475c81a654f338e7ab6bb67e1",
493
+ "payload/overlays/qoder/.qoder-plugin/plugin.json": "75fdbe896e82f21077b7bb7a5ab0d106fed5cdd62598970e80360aa3cb20a4be",
493
494
  "payload/overlays/qoder/commands/yugoo.md": "1461cf9bd13ae18bf0ad204222dfd8c558552471628c31b2dc936f3329ac26cf",
494
495
  "payload/overlays/qoder/hooks/hooks.json": "6452852583af61a7b4f0ed501a41d02a212a8487e5d920bcb0b2ee7e7e643d7d",
495
496
  "payload/overlays/qoder/scripts/design.mjs": "c116e3a9f60830923692a9f8785640d9a13a97320771bf9201de0e5089618a74",
@@ -1161,12 +1162,12 @@
1161
1162
  "payload/shared/kits/web_app/THIRD_PARTY_NOTICES.md": "1d358b1a367efd6f4e0fb04436df7f814531cd6a01a0b2b752d7b8268a461c79",
1162
1163
  "payload/shared/kits/web_app/kit.yaml": "f66f6510d621933e2e45164c214bb3dc59c2a79bbe6521d93b37d5ba4419ca28",
1163
1164
  "payload/shared/kits/web_app/mindset.md": "dea0d63d0ae4795c1737d50d4564d3ddb934d80daee082a91afed4ea3be5cc08",
1164
- "payload/shared/knowledge/cli-lifecycle.mjs": "6951c54bf30bb90d4fd8ff4addfb46f6358b084059440213643b1aff03ae903a",
1165
+ "payload/shared/knowledge/cli-lifecycle.mjs": "039c7705557b58c435c0a96a6540b2a233a3583ebab36c5d100bad0771a15d88",
1165
1166
  "payload/shared/knowledge/embedding-worker.js": "1dc5f99a02fc8bd58ab318991a2145665c95bc65f4a025b63be524dffdb66f00",
1166
1167
  "payload/shared/knowledge/embedding-worker.mjs": "1dc5f99a02fc8bd58ab318991a2145665c95bc65f4a025b63be524dffdb66f00",
1167
1168
  "payload/shared/knowledge/package.json": "a3e820bf1715afda0b535dd848a22362dbdc28296fbbbe6ffd6b7712d06194b6",
1168
- "payload/shared/knowledge/runtime-manifest.json": "07094bc42a1ec010c7f1800b65e9737537233c9be149a901f48354590f9ea581",
1169
- "payload/shared/knowledge/runtime.mjs": "7366e74ca57996e534c69c1e31bb7b8ca7deb2f85d40a1d8c6bef9349bf370d6",
1169
+ "payload/shared/knowledge/runtime-manifest.json": "3320b95239598fd9a9fb424ec4fb1d3037441464f46543260c20084543e9b709",
1170
+ "payload/shared/knowledge/runtime.mjs": "08e99eae9738441b5a1a588a5a1a16a986e0dd8a8a41199fc88d19ab0956940e",
1170
1171
  "payload/shared/scripts/codex-connection-DuV2wtkn.mjs": "953b36e1a0a9892a126008ebdc2c29d2eb1036b279fa138fe881b5fd314cbf5e",
1171
1172
  "payload/shared/scripts/codex-desktop-bridge.mjs": "dc9eb9b8f35bc076758e520668cef19f853b797e798a6027f55bf0e230d33ed5",
1172
1173
  "payload/shared/scripts/codex-desktop-marketplace.mjs": "96974611780bffaf2b69b0fea143b6760cdaf7f8d38236931086bb3ad94f3892",
@@ -1368,7 +1369,7 @@
1368
1369
  "payload/shared/web/zh-CN-LNUGB5OW-B8jdxL1j.js": "009e897b8dce75b294018536f2c7d08f17d5174497d13cd0b5b46e17660e54ed",
1369
1370
  "payload/shared/web/zh-HK-E62DVLB3-C01JMzt_.js": "421281ca20c481adb4d774fdea5c907cc74241f6a745908b72dee694ed3f4112",
1370
1371
  "payload/shared/web/zh-TW-RAJ6MFWO-Cdn1Kb1q.js": "a48825086867a6b48a5e9a0fcdf91eb4d6752def51bf7b6dfa9bad12aed33624",
1371
- "release-hosts.json": "af227e2f3e03039e195f80e34e6d7cddf1d2369114dc307440361e494cb9d3e0"
1372
+ "release-hosts.json": "72c4cbb93852b7c3d856dc21cf7d2350336ab1acb55538bab3779ec7151569b2"
1372
1373
  },
1373
1374
  "dependencies": {
1374
1375
  "@ladybugdb/wasm-core": "0.21.1",
@@ -1383,7 +1384,7 @@
1383
1384
  "product": {
1384
1385
  "schemaVersion": 1,
1385
1386
  "name": "yugoo-design",
1386
- "version": "0.1.0",
1387
+ "version": "0.1.2",
1387
1388
  "bin": "yugoo-design"
1388
1389
  }
1389
1390
  },