@tbox.cn/tboxcode-dsh-runtime 0.0.0-stage → 0.1.0-rc.1

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.
@@ -0,0 +1,88 @@
1
+ 'use strict'
2
+ /**
3
+ * stdout 双档守卫(stdio 净化层 1/2/4 合体——invariant:stdio-purity)。
4
+ *
5
+ * 触发:NODE_OPTIONS=--require <本文件>(cli 注入;缺省零行为——本文件以
6
+ * TBOXCODE_STDIO_GUARD 环境变量分档):
7
+ * - strict(acp 形态):层 1 console 劫持 + 层 2 internals 接管 + 层 4 探测器
8
+ * - quiet(headless 形态):层 1 console 劫持(stdout 是最终答案输出通道,
9
+ * 探测器会误告警协议外合法输出——不装)
10
+ *
11
+ * 层 1(两档):console 整族 → stderr(console 与协议通道无关,收容无损)。
12
+ * 层 2(strict):profile 锚定 require('@deepseek-ai/dsh-cmdline'),internals.stdout
13
+ * 可变单例改道 stderr——commander 帮助/错误输出(writeOut 间接路径)改道;
14
+ * Node ESM/CJS 缓存按 resolved 路径(spike-cmdline 矩阵结论),先加载即同实例。
15
+ * 层 4(strict):wrap process.stdout.write **收容拦截**——非 '{' 起始的写入改道
16
+ * stderr(协议帧经 ndJsonStream 整帧原子单写、JSON.stringify 起始必为 '{'
17
+ * ——分片不存在,拦截无协议风险),告警计数达阈值以协议偏斜退出码 3 退出
18
+ * (信封表 third-party 行)。stdout 由此承载纯 JSON-RPC(invariant:stdio-purity)。
19
+ */
20
+ ;(function stdoutGuard() {
21
+ const mode = process.env['TBOXCODE_STDIO_GUARD']
22
+ if (mode !== 'strict' && mode !== 'quiet') return
23
+ const stderr = process.stderr
24
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout)
25
+
26
+ // 层 1:console 整族改道 stderr
27
+ for (const method of ['log', 'info', 'warn', 'error', 'debug', 'trace']) {
28
+ const original = console[method]
29
+ if (typeof original !== 'function') continue
30
+ console[method] = function taintedConsole(...args) {
31
+ const text = args
32
+ .map((entry) => {
33
+ if (typeof entry === 'string') return entry
34
+ try {
35
+ return JSON.stringify(entry)
36
+ } catch {
37
+ return String(entry) // circular / 不可序列化——String 降级(守卫自身不得抛)
38
+ }
39
+ })
40
+ .join(' ')
41
+ stderr.write(`[tboxcode-console] ${text}\n`)
42
+ }
43
+ }
44
+
45
+ if (mode !== 'strict') return
46
+
47
+ // 层 2:dsh-cmdline internals.stdout 接管(profile 锚定 require——树内物理实例)
48
+ try {
49
+ const profileDir = process.env['TBOXCODE_PROFILE_DIR']
50
+ if (profileDir === undefined || profileDir === '') throw new Error('TBOXCODE_PROFILE_DIR is not set')
51
+ const { createRequire } = require('node:module')
52
+ const { pathToFileURL } = require('node:url')
53
+ const { join } = require('node:path')
54
+ const profileRequire = createRequire(pathToFileURL(join(profileDir, 'package.json')))
55
+ const cmdline = profileRequire('@deepseek-ai/dsh-cmdline')
56
+ cmdline.internals.stdout = {
57
+ write(text) {
58
+ stderr.write(text)
59
+ return true
60
+ },
61
+ }
62
+ } catch (error) {
63
+ stderr.write(`[tboxcode-stdout-guard] internals takeover failed: ${String(error)}\n`)
64
+ }
65
+
66
+ // 层 4:泄漏探测器(收容拦截——协议帧整帧原子单写,非 '{' 写必为杂散)
67
+ const PROTOCOL_START = 0x7b // '{'
68
+ const alertLimit = Number(process.env['TBOXCODE_STDIO_GUARD_ALERT_LIMIT'] ?? 64)
69
+ let alerts = 0
70
+ process.stdout.write = function guardedStdoutWrite(chunk, encoding, callback) {
71
+ let first = PROTOCOL_START
72
+ if (typeof chunk === 'string') first = chunk.charCodeAt(0)
73
+ else if (chunk instanceof Uint8Array) first = chunk[0] ?? PROTOCOL_START
74
+ if (first !== PROTOCOL_START) {
75
+ alerts += 1
76
+ const stackHead = (new Error().stack ?? '').split('\n')[2]?.trim() ?? 'unknown frame'
77
+ stderr.write(`[tboxcode-stdout-guard] contained non-protocol stdout write #${alerts} (${String(chunk).length} bytes) ${stackHead}\n`)
78
+ stderr.write(typeof chunk === 'string' ? chunk : Buffer.from(chunk.valueOf()).toString('utf8'))
79
+ if (alerts >= alertLimit) {
80
+ stderr.write(`[tboxcode-stdout-guard] alert limit ${alertLimit} exceeded — exiting 3 (protocol skew)\n`)
81
+ process.exit(3)
82
+ }
83
+ if (typeof callback === 'function') callback()
84
+ return true
85
+ }
86
+ return originalStdoutWrite(chunk, encoding, callback)
87
+ }
88
+ })()
package/lib/index.d.ts ADDED
@@ -0,0 +1,140 @@
1
+ //#region src/config.d.ts
2
+ /** config 目录解析:env 覆盖优先,缺省 ~/.config/tboxcode-dsh。 */
3
+ declare function resolveConfigDir(): string;
4
+ /** config.jsonc 优先,退回 config.json(openacpagent 基线次序);两皆缺位返回 null(零配置合法态)。 */
5
+ declare function resolveConfigPath(configDir?: string): string | null;
6
+ /**
7
+ * JSONC 剥离:行注释、块注释与尾逗号(字符串字面量内不误伤)。
8
+ * 本仓零依赖纪律的翻译器侧最小实现;openacpagent 同能力基线。
9
+ */
10
+ declare function stripJsonc(source: string): string;
11
+ interface LoadedConfig {
12
+ path: string | null;
13
+ config: Record<string, unknown>;
14
+ }
15
+ /**
16
+ * `${VAR}` 环境引用内插(基线 config/env.ts 语义:递归替换、未知变量原样保留、
17
+ * 循环引用守卫)。K3 决断:内插归 runtime loadConfig 单源——llm/tools 自读域
18
+ * 与翻译器共用同一展开视图(openacpagent 基线为两次 zod parse 之间的全树
19
+ * post-parse 变换;本仓为 parse 后的递归变换,语义等价)。
20
+ */
21
+ declare function interpolateEnv(value: unknown, seen?: WeakSet<object>): unknown;
22
+ /** 读 config(缺失 = null + 空对象);解析失败明错(JSON 语法错误原样上抛带路径);
23
+ * 成功路径应用 `${VAR}` 内插(全树,基线 parity)。 */
24
+ declare function loadConfig(configDir?: string): LoadedConfig;
25
+ //#endregion
26
+ //#region src/watch.d.ts
27
+ interface ConfigWatchHandle {
28
+ /** 释放 watcher(disposer 语义)。 */
29
+ dispose(): void;
30
+ }
31
+ /**
32
+ * 监听 configDir 目录(平铺布局)中对 filenames 集合内文件的变更。
33
+ * 目录级监听捕获文件创建 / 修改 / 删除;500ms 稳定窗口去抖(编辑器多写
34
+ * 合并为一次回调);回调不携带事件细节——消费方语义是"文件集脏了,重读"。
35
+ * headless 短命形态的空转开销接受(不做形态条件化——S1a 注记)。
36
+ */
37
+ declare function watchConfigFiles(configDir: string, filenames: readonly string[], onChange: () => void, stableWindowMs?: number): ConfigWatchHandle;
38
+ /** 便捷:configDir 下指定文件是否存在的惰性求值(watcher 重建判断用)。 */
39
+ declare function configFilePath(configDir: string, name: string): string;
40
+ //#endregion
41
+ //#region src/translate.d.ts
42
+ /**
43
+ * 翻译器全量(C8):config → patch 行域 + 自读域 passthrough 快照 + warn 清单。
44
+ *
45
+ * 字段映射真源 = config-translation-contract design 逐字段映射表(三落点):
46
+ * - patch 行域:model(agent-default-model 行)/ tools.output(tboxcode-webfetch
47
+ * 行 maxLines/maxBytes)/ skill 清单截断(tool-skill 行
48
+ * catalogDescriptionMaxLength 恒定 1024——基线 MAX_SKILL_DESC 常量固化)
49
+ * - warn + skip(无等价翻译面,Revisions 记档):bash 超时(tool-bash Config
50
+ * 无 timeout 面——enableRunInBackground/promoteOnTimeout;shell spec timeoutMs
51
+ * 是调用面非行 config)/ watchdog(timeout-policy 零 Config——声明制
52
+ * timeoutMs 是工具定义硬编码)/ compaction(dsh 字符阈值制 vs 基线上下文
53
+ * 比例制——语义异构不硬译)/ subagent.max_parallel(dsh 无 per-tool 并发
54
+ * 上限——契约既定)
55
+ * - 自读域 passthrough:翻译器零消费、插件自读(provider 域 / effort /
56
+ * trait_presets / llm_log / retention / system_prompt / rules / skills /
57
+ * permission / title / interaction 等)——快照进 Translation 供对账
58
+ *
59
+ * 密钥铁律:翻译输出永不含密钥材料——行值与 passthrough 过扫描器(模式表:
60
+ * sk- 前缀 / AWS AKIA / Bearer 头 / api_key 键面),命中即明错(invariant:
61
+ * no-secret-on-disk 的翻译面;`${VAR}` 内插已在 runtime loadConfig 全树完成,
62
+ * 扫描防的是"env 引用的值本身就是密钥"场景——M4 风险兜底)。
63
+ *
64
+ * 委派面(subagent-native-adoption,0.2.1 原生采纳):agents 结构 / small_model /
65
+ * deny 闭包翻译域整体退役——委派组合全链走 preset 树原生单实例行(官方 standard
66
+ * 同构)+ acp 链 full-app insert 行,maxDepth: 1 深度封锁行 config 钉住;
67
+ * config 的 agents / small_model 键不再消费(自定义类型 Reintroduction 条件住
68
+ * note)。
69
+ */
70
+ /** base 行 id 与插件名——同 id 覆盖必须 name 匹配(dsh patch 覆盖语义:name 非空时不匹配即跳过并 warn)。 */
71
+ declare const AGENT_DEFAULT_MODEL_ROW_ID = "agent-default-model";
72
+ declare const AGENT_DEFAULT_MODEL_PLUGIN = "@deepseek-ai/dsh-agent-default-model";
73
+ /** 明错类型:config 未设置 model(spawn 前置 fail fast)。 */
74
+ declare class ModelNotSetError extends Error {
75
+ readonly code = "MODEL_NOT_SET";
76
+ constructor(configDir: string, hasFile: boolean);
77
+ }
78
+ /** 明错类型:model 值形态非法(须为 "provider/model")。 */
79
+ declare class ModelMalformedError extends Error {
80
+ readonly code = "MODEL_MALFORMED";
81
+ constructor(value: unknown);
82
+ }
83
+ /** tool-skill 行 id(dsh-base 原生——同 id 覆盖补截断上限)。 */
84
+ declare const TOOL_SKILL_ROW_ID = "tool-skill";
85
+ /** tboxcode-webfetch 行 id(本仓 tools 包——同 id 覆盖截断参数)。 */
86
+ declare const TOOL_WEBFETCH_ROW_ID = "tboxcode-webfetch";
87
+ /** patch 行域产物行(overlay 数组元素;config 值经密钥扫描)。 */
88
+ interface PatchRow {
89
+ id: string;
90
+ name?: string;
91
+ config?: Record<string, unknown>;
92
+ }
93
+ /** warn + skip 清单项(无等价翻译面或超出本翻译器范围的字段)。 */
94
+ interface TranslationWarning {
95
+ field: string;
96
+ reason: string;
97
+ }
98
+ interface Translation {
99
+ /** patch 行域产物(overlay 数组全体即我方行集——识别免配置)。 */
100
+ rows: PatchRow[];
101
+ /** 插件自读域 passthrough 快照(翻译器零消费字段——对账面;密钥扫描同规)。 */
102
+ passthrough: Record<string, unknown>;
103
+ /** warn + skip 清单(watcher 通道日志 / Remote 通道回执)。 */
104
+ warnings: TranslationWarning[];
105
+ }
106
+ /** 明错类型:翻译输出命中密钥模式(invariant:no-secret-on-disk 翻译面)。 */
107
+ declare class SecretInTranslationError extends Error {
108
+ readonly code = "SECRET_IN_TRANSLATION";
109
+ constructor(where: string);
110
+ }
111
+ /**
112
+ * 翻译 config → patch 行集 + passthrough 快照 + warn 清单。
113
+ * model 缺失仍为明错(default-model-row-mapping:spawn 前置 fail fast 跨形态一致);
114
+ * 其余字段级问题走 warnings(warn + skip 单字段隔离)。
115
+ */
116
+ declare function translateConfig(config: Record<string, unknown>, configDir: string, hasFile: boolean): Translation;
117
+ //#endregion
118
+ //#region src/patch.d.ts
119
+ /**
120
+ * 「同 id 覆盖语义」的行 id 闭集(翻译产物中落在 dsh 基座既有行上的覆盖行);
121
+ * 其余行(翻译器当前无——0.2.1 原生采纳后 agents 域退役,闭集即全量)为 insert
122
+ * 语义。收敛环(bundle/convergence)与 overlay 序列化共用同一推导——两通道形态
123
+ * 必须一致。
124
+ */
125
+ declare const OVERLAY_ROW_IDS: ReadonlySet<string>;
126
+ /**
127
+ * 翻译行 → patch 元素:覆盖行裸交付(同 id 覆盖 later-wins);新增行包 insert
128
+ * 块(新增行裸行 = 覆盖语义 → not found skip——C8 场景实证)。
129
+ */
130
+ declare function rowsToPatchElements(rows: PatchRow[]): unknown[];
131
+ interface OverlayPatch {
132
+ /** patch 文件绝对路径(spawn --patch 参数)。 */
133
+ path: string;
134
+ /** 正常退出清理;崩溃路径不调用(产物保留供 doctor 诊断)。 */
135
+ dispose: () => Promise<void>;
136
+ }
137
+ /** 单文件 overlay,其数组全体即我方行集(识别规则免配置——config-translation-contract overlay 行规则)。 */
138
+ declare function writeOverlayPatch(rows: PatchRow[]): Promise<OverlayPatch>;
139
+ //#endregion
140
+ export { AGENT_DEFAULT_MODEL_PLUGIN, AGENT_DEFAULT_MODEL_ROW_ID, type ConfigWatchHandle, type LoadedConfig, ModelMalformedError, ModelNotSetError, OVERLAY_ROW_IDS, type OverlayPatch, type PatchRow, SecretInTranslationError, TOOL_SKILL_ROW_ID, TOOL_WEBFETCH_ROW_ID, type Translation, type TranslationWarning, configFilePath, interpolateEnv, loadConfig, resolveConfigDir, resolveConfigPath, rowsToPatchElements, stripJsonc, translateConfig, watchConfigFiles, writeOverlayPatch };
package/lib/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{existsSync as e,readFileSync as t,watch as n}from"node:fs";import{homedir as r,tmpdir as i}from"node:os";import{join as a}from"node:path";import{mkdtemp as o,rm as s,writeFile as c}from"node:fs/promises";import{stringify as l}from"yaml";function u(){return process.env.TBOXCODE_DSH_CONFIG_DIR??a(r(),`.config`,`tboxcode-dsh`)}function d(t=u()){for(let n of[`config.jsonc`,`config.json`]){let r=a(t,n);if(e(r))return r}return null}function f(e){let t=``,n=0,r=e.length,i=!1;for(;n<r;){let a=e[n];if(i){if(t+=a,a===`\\`){n+1<r&&(t+=e[n+1]),n+=2;continue}a===`"`&&(i=!1),n++;continue}if(a===`"`){i=!0,t+=a,n++;continue}if(a===`/`&&e[n+1]===`/`){for(;n<r&&e[n]!==`
2
+ `;)n++;continue}if(a===`/`&&e[n+1]===`*`){for(n+=2;n<r&&!(e[n]===`*`&&e[n+1]===`/`);)n++;n+=2;continue}t+=a,n++}return t.replace(/,(\s*[}\]])/g,`$1`)}function p(e,t=new WeakSet){if(typeof e==`string`)return e.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(e,t)=>{let n=process.env[t];return n===void 0?e:n});if(Array.isArray(e))return e.map(e=>p(e,t));if(typeof e==`object`&&e){let n=e;if(t.has(n))return e;t.add(n);let r={};for(let[e,i]of Object.entries(n))r[e]=p(i,t);return t.delete(n),r}return e}function m(e=u()){let n=d(e);if(n===null)return{path:null,config:{}};let r=t(n,`utf-8`);try{let e=JSON.parse(f(r));if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`config 顶层必须是对象`);return{path:n,config:p(e)}}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`config 解析失败(${n}):${t}`)}}function h(e,t,r,i=500){let a=new Set(t),o,s=!1,c=()=>{o!==void 0&&clearTimeout(o),o=setTimeout(()=>{s||r()},i)},l;try{l=n(e,{persistent:!1},(e,t)=>{t!==null&&!a.has(t)||c()})}catch{return{dispose:()=>{s=!0}}}return l.on(`error`,()=>{}),{dispose:()=>{s=!0,o!==void 0&&clearTimeout(o),l.close()}}}function g(e,t){return a(e,t)}const _=`agent-default-model`,v=`@deepseek-ai/dsh-agent-default-model`;var y=class extends Error{code=`MODEL_NOT_SET`;constructor(e,t){let n=t?e:`${e}(配置文件尚不存在)`;super(`tboxcode: config 未设置 model——spawn 拒绝(fail fast,跨形态一致)。base 默认行指向 deepseek-official 专有 provider,本栈禁用该行族,静默回落即首请求失败(决策:default-model-row-mapping 未设明错)。请在 ${n} 的 config.jsonc 设置 model: "<provider>/<model>",或运行 tboxcode-dsh init --config 生成配置骨架。`),this.name=`ModelNotSetError`}},b=class extends Error{code=`MODEL_MALFORMED`;constructor(e){super(`tboxcode: config model 形态非法(${JSON.stringify(e)})——须为 "<provider>/<model>" 两段式`),this.name=`ModelMalformedError`}};const x=`tool-skill`,S=`tboxcode-webfetch`;var C=class extends Error{code=`SECRET_IN_TRANSLATION`;constructor(e){super(`tboxcode: 翻译输出疑似密钥材料(${e})——翻译输出永不含密钥(契约密钥铁律)。凭据三来源:auth.jsonc / provider.options.apiKey 值内 \${VAR} / reload 旁路;若 \${VAR} 引用的 env 值本身是密钥,请改走 auth.jsonc(0600)。`),this.name=`SecretInTranslationError`}};const w=[/api[_-]?key/i,/secret/i,/password/i,/authorization/i,/private[_-]?key/i],T=[/\bsk-[A-Za-z0-9]{16,}/,/\bAKIA[A-Z0-9]{16}\b/,/Bearer\s+[A-Za-z0-9._-]{24,}/];function E(e,t,n=new WeakSet){if(typeof e==`string`){for(let n of T)if(n.test(e))throw new C(`${t}: 值命中密钥模式 ${n.source}`);return}if(Array.isArray(e)){for(let r of e)E(r,t,n);return}if(typeof e==`object`&&e){if(n.has(e))return;n.add(e);for(let[r,i]of Object.entries(e)){if(w.some(e=>e.test(r))&&typeof i==`string`&&i.length>0)throw new C(`${t}: 键 ${r} 携带疑似凭据面(凭据归 auth.jsonc / \${VAR} 值引用)`);E(i,`${t}.${r}`,n)}}}function D(e,t){if(typeof e!=`string`)throw new b(`${t}=${JSON.stringify(e)}`.slice(0,120));let n=e.indexOf(`/`),r=n>0?e.slice(0,n):``,i=n>0?e.slice(n+1):``;if(r.length===0||i.length===0)throw new b(`${t}=${JSON.stringify(e)}`.slice(0,120));return{provider:r,model:i}}function O(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}function k(e,t,n){let r=e.model;if(r==null||r===``)throw new y(t,n);let i=D(r,`model`),a=[],o=[];a.push({id:_,name:v,config:{provider:i.provider,model:i.model}});let s=e.tools?.output;if(s!==void 0&&typeof s==`object`){let e=O(s.max_lines),t=O(s.max_bytes);if(e===void 0&&s.max_lines!==void 0&&o.push({field:`tools.output.max_lines`,reason:`非正整数——跳过`}),t===void 0&&s.max_bytes!==void 0&&o.push({field:`tools.output.max_bytes`,reason:`非正整数——跳过`}),e!==void 0||t!==void 0){let n={};e!==void 0&&(n.maxLines=e),t!==void 0&&(n.maxBytes=t),a.push({id:S,name:`@tbox.cn/tboxcode-dsh-tools/webfetch`,config:n})}}a.push({id:x,name:`@deepseek-ai/dsh-tool-skill`,config:{catalogDescriptionMaxLength:1024}}),e.bash!==void 0&&o.push({field:`bash`,reason:`dsh tool-bash Config 无超时面(enableRunInBackground/promoteOnTimeout),shell spec timeoutMs 是调用面非行 config——无等价翻译面,跳过`}),e.watchdog!==void 0&&o.push({field:`watchdog`,reason:`dsh timeout-policy 零 Config(声明制 timeoutMs 归工具定义硬编码)——turn 级 idle 超时无对位,跳过(近似对位非同构的落点修正)`}),e.compaction!==void 0&&o.push({field:`compaction`,reason:`dsh compaction-basic 是字符阈值制(thresholdChars),基线是上下文比例制(threshold ≤1)——语义异构不硬译,跳过`}),e.subagent!==void 0&&o.push({field:`subagent.max_parallel`,reason:`dsh 无 per-tool 并发上限可翻译(契约既定 warn + skip)`}),e.small_model!==void 0&&o.push({field:`small_model`,reason:`键已退役(subagent-native-adoption——0.2.1 原生采纳,委派模型路由归 modelSelectionSettings/agent_preset),值被忽略`}),e.agents!==void 0&&o.push({field:`agents`,reason:`键已退役(subagent-native-adoption——0.2.1 类型面弃用,委派全链原生单实例),值被忽略`});let c={};for(let t of[`provider`,`enabled_providers`,`disabled_providers`,`effort`,`effort_templates`,`trait_presets`,`llm_log`,`retention`,`system_prompt`,`rules`,`skills`,`permission`,`title`,`interaction`,`env`])e[t]!==void 0&&(c[t]=e[t]);return E(a,`rows`),{rows:a,passthrough:c,warnings:o}}const A=new Set([`agent-default-model`,`tool-skill`,`tboxcode-webfetch`]);function j(e){let t=e.filter(e=>A.has(e.id)),n=e.filter(e=>!A.has(e.id)),r=t.map(e=>({...e}));return n.length>0&&r.push({insert:n.map(e=>({...e}))}),r}async function M(e){let t=await o(a(i(),`tboxcode-overlay-`)),n=a(t,`tboxcode-overlay.yml`);return await c(n,l(j(e),{lineWidth:0}),`utf-8`),{path:n,dispose:async()=>{await s(t,{recursive:!0,force:!0})}}}export{v as AGENT_DEFAULT_MODEL_PLUGIN,_ as AGENT_DEFAULT_MODEL_ROW_ID,b as ModelMalformedError,y as ModelNotSetError,A as OVERLAY_ROW_IDS,C as SecretInTranslationError,x as TOOL_SKILL_ROW_ID,S as TOOL_WEBFETCH_ROW_ID,g as configFilePath,p as interpolateEnv,m as loadConfig,u as resolveConfigDir,d as resolveConfigPath,j as rowsToPatchElements,f as stripJsonc,k as translateConfig,h as watchConfigFiles,M as writeOverlayPatch};
package/package.json CHANGED
@@ -1,6 +1,27 @@
1
1
  {
2
2
  "name": "@tbox.cn/tboxcode-dsh-runtime",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0-rc.1",
4
+ "type": "module",
5
+ "description": "config 翻译器(密钥铁律)+ stdout 双档守卫 + requestedSchema 构造器",
6
+ "main": "lib/index.js",
7
+ "types": "lib/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/index.d.ts",
11
+ "default": "./lib/index.js"
12
+ },
13
+ "./stdout-guard.cjs": "./assets/stdout-guard.cjs",
14
+ "./package.json": "./package.json"
15
+ },
16
+ "files": [
17
+ "lib",
18
+ "assets"
19
+ ],
20
+ "dependencies": {
21
+ "yaml": "^2.8.0"
22
+ },
23
+ "scripts": {
24
+ "build": "tsdown",
25
+ "typecheck": "tsc --noEmit -p tsconfig.json"
26
+ }
6
27
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.