@coralai/sps-cli 0.65.60 → 0.65.62

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/commands/projectInit.d.ts.map +1 -1
  3. package/dist/commands/projectInit.js +8 -12
  4. package/dist/commands/projectInit.js.map +1 -1
  5. package/dist/console/index.d.ts.map +1 -1
  6. package/dist/console/index.js +4 -0
  7. package/dist/console/index.js.map +1 -1
  8. package/dist/console/routes/chat.d.ts.map +1 -1
  9. package/dist/console/routes/chat.js +7 -0
  10. package/dist/console/routes/chat.js.map +1 -1
  11. package/dist/console/routes/preview.d.ts +10 -0
  12. package/dist/console/routes/preview.d.ts.map +1 -0
  13. package/dist/console/routes/preview.js +121 -0
  14. package/dist/console/routes/preview.js.map +1 -0
  15. package/dist/console-assets/assets/{ShowcasePage-DeqouOiN.js → ShowcasePage-BCO-h0JV.js} +1 -1
  16. package/dist/console-assets/assets/{index-CpGlOvqu.js → index-C-y1kIT5.js} +155 -150
  17. package/dist/console-assets/index.html +1 -1
  18. package/dist/core/agents/configureProjectAgent.d.ts +39 -0
  19. package/dist/core/agents/configureProjectAgent.d.ts.map +1 -0
  20. package/dist/core/agents/configureProjectAgent.js +82 -0
  21. package/dist/core/agents/configureProjectAgent.js.map +1 -0
  22. package/dist/core/agents/modelSettingsFile.d.ts +7 -0
  23. package/dist/core/agents/modelSettingsFile.d.ts.map +1 -1
  24. package/dist/core/agents/modelSettingsFile.js +37 -5
  25. package/dist/core/agents/modelSettingsFile.js.map +1 -1
  26. package/dist/core/agents/workerModelEnv.d.ts +17 -0
  27. package/dist/core/agents/workerModelEnv.d.ts.map +1 -1
  28. package/dist/core/agents/workerModelEnv.js +25 -13
  29. package/dist/core/agents/workerModelEnv.js.map +1 -1
  30. package/dist/core/skills/configure.d.ts +25 -0
  31. package/dist/core/skills/configure.d.ts.map +1 -0
  32. package/dist/core/skills/configure.js +36 -0
  33. package/dist/core/skills/configure.js.map +1 -0
  34. package/dist/core/skills/index.d.ts +1 -0
  35. package/dist/core/skills/index.d.ts.map +1 -1
  36. package/dist/core/skills/index.js +1 -0
  37. package/dist/core/skills/index.js.map +1 -1
  38. package/dist/server.d.ts +3 -0
  39. package/dist/server.d.ts.map +1 -1
  40. package/dist/server.js +6 -0
  41. package/dist/server.js.map +1 -1
  42. package/package.json +1 -1
@@ -8,7 +8,7 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-CpGlOvqu.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-C-y1kIT5.js"></script>
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-DT-bJh9j.css">
13
13
  </head>
14
14
  <body>
@@ -0,0 +1,39 @@
1
+ /** 项目要用的端点。省略整个 provider = 官方订阅端点。 */
2
+ export interface ProjectAgentProvider {
3
+ /** 注册表 id(openai 面落盘用;claude 面仅用于可读性)。 */
4
+ id: string;
5
+ name?: string;
6
+ baseUrl: string;
7
+ apiKey?: string;
8
+ /** 仅 openai 面有意义:三方兼容口(缺省)还是 Responses API。 */
9
+ transport?: 'chat_completions' | 'responses';
10
+ /** 仅 claude 面有意义:平台特殊 env(OpenRouter 等)。 */
11
+ extraEnv?: Record<string, unknown>;
12
+ }
13
+ export interface ConfigureProjectAgentOpts {
14
+ /** 该项目跑哪个 agent 后端 —— **这是调用方的产品决策**,sps 只据此选落地方式。 */
15
+ backend: 'claude' | 'openai';
16
+ /** 省略 = 官方订阅端点(claude 面只写 model;openai 面无可写内容)。 */
17
+ provider?: ProjectAgentProvider;
18
+ model?: string;
19
+ /** 仅 openai 面:注册表条目的可用模型列表;省略时取 `model` 单元素。 */
20
+ models?: string[];
21
+ /**
22
+ * 仅 claude 面:调用方自己的 env 旋钮(输出上限 / effort / 上下文窗口等),原样并入。
23
+ *
24
+ * ⚠️ **过渡口**。这些目前是 claude 专属键名(`CLAUDE_CODE_*`),让应用直接给 = 应用仍知道
25
+ * 一部分 claude 细节。之所以先留着:它们背后是"输出上限/思考预算/上下文窗口"这类
26
+ * **本该后端无关**的概念,抽成一等参数是独立一笔账。收口文件写入先行,概念抽象后补。
27
+ */
28
+ env?: Record<string, string>;
29
+ }
30
+ /** 实际写了哪个载体(`none` = 无可写内容,例如官方端点且没给 model)。 */
31
+ export type ProjectAgentTarget = 'claude-settings' | 'sps-agent-providers' | 'none';
32
+ /**
33
+ * 配置项目的 agent 端点/模型。**幂等**:同参数重复调用结果一致。
34
+ * openai 面按 `provider.id` **upsert**,不清掉项目里其它 provider。
35
+ */
36
+ export declare function configureProjectAgent(projectDir: string, opts: ConfigureProjectAgentOpts): {
37
+ wrote: ProjectAgentTarget;
38
+ };
39
+ //# sourceMappingURL=configureProjectAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureProjectAgent.d.ts","sourceRoot":"","sources":["../../../src/core/agents/configureProjectAgent.ts"],"names":[],"mappings":"AAwBA,sCAAsC;AACtC,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAAC;IAC7C,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,qBAAqB,GAAG,MAAM,CAAC;AAIpF;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,yBAAyB,GAC9B;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,CA6C/B"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @module core/agents/configureProjectAgent
3
+ * @description **项目级 agent 端点/模型配置的后端无关入口**(建项目之后也能改)。
4
+ *
5
+ * 调用方只说「这个项目用哪个 provider / 哪个模型」,**落到哪个文件由 sps 按后端决定**:
6
+ * - `backend: 'claude'` → `<项目>/.claude/settings.local.json`(Claude Code 原生读)
7
+ * - `backend: 'openai'` → `<项目>/.sps/agent-providers.json`(sps 的项目级注册表,
8
+ * 由 `resolveAgentProvider(id, cwd)` 读取,覆盖全局兜底)
9
+ *
10
+ * 🔴 存在的理由:此前 sps 只在**建项目那一刻**开放配置(`ProjectService`),之后没有入口。
11
+ * 于是平台各自手写这两个文件 —— gameforge 拼 `.claude/settings.local.json`、
12
+ * createexperiments 拼 `.sps/agent-providers.json`。两者都把「某个后端的配置格式」
13
+ * 复制进了应用层:sps 改 schema 应用会悄悄坏掉,换后端时那套也不成立。
14
+ *
15
+ * 对照 `projectAgentConfig.ts` —— 那个读的是 per-agent **人设**(outputStyle),不碰模型/端点。
16
+ *
17
+ * @layer core
18
+ * @boundedContext agents
19
+ */
20
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
21
+ import { resolve } from 'node:path';
22
+ import { writeModelSettingsFileFor } from './modelSettingsFile.js';
23
+ const AGENT_PROVIDERS_REL = '.sps/agent-providers.json';
24
+ /**
25
+ * 配置项目的 agent 端点/模型。**幂等**:同参数重复调用结果一致。
26
+ * openai 面按 `provider.id` **upsert**,不清掉项目里其它 provider。
27
+ */
28
+ export function configureProjectAgent(projectDir, opts) {
29
+ if (opts.backend === 'claude') {
30
+ const wrote = writeModelSettingsFileFor(projectDir, opts.model, opts.provider
31
+ ? { baseUrl: opts.provider.baseUrl, apiKey: opts.provider.apiKey, extraEnv: opts.provider.extraEnv }
32
+ : undefined, opts.env);
33
+ return { wrote: wrote ? 'claude-settings' : 'none' };
34
+ }
35
+ // openai 面:没有端点就没什么可落的(模型选择走 worker 配置,不在项目注册表里)。
36
+ if (!opts.provider)
37
+ return { wrote: 'none' };
38
+ const path = resolve(projectDir, AGENT_PROVIDERS_REL);
39
+ mkdirSync(resolve(projectDir, '.sps'), { recursive: true });
40
+ let list = [];
41
+ if (existsSync(path)) {
42
+ try {
43
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
44
+ if (Array.isArray(parsed))
45
+ list = parsed;
46
+ }
47
+ catch {
48
+ list = []; // 坏文件 → 重建(与 providers.ts 的读容错一致)
49
+ }
50
+ }
51
+ const entry = {
52
+ id: opts.provider.id,
53
+ name: opts.provider.name ?? opts.provider.id,
54
+ baseUrl: opts.provider.baseUrl,
55
+ apiKey: opts.provider.apiKey ?? '',
56
+ models: opts.models ?? (opts.model ? [opts.model] : []),
57
+ ...(opts.provider.transport ? { transport: opts.provider.transport } : {}),
58
+ };
59
+ const idx = list.findIndex((x) => x.id === entry.id);
60
+ // upsert:保留条目上的额外字段(createdAt 等),只覆盖本次给的。
61
+ if (idx >= 0)
62
+ list[idx] = { ...list[idx], ...entry };
63
+ else
64
+ list.push(entry);
65
+ writeFileSync(path, `${JSON.stringify(list, null, 2)}\n`);
66
+ // 🔴 该文件含 apiKey,而业务 repo 会被分发/下载 → 必须挡在版本库外。
67
+ // (claude 面的 settings.local.json 由 projectInit 建项目时已加进 .gitignore。)
68
+ ensureIgnored(projectDir, AGENT_PROVIDERS_REL);
69
+ return { wrote: 'sps-agent-providers' };
70
+ }
71
+ /** 幂等地把一行加进项目 `.gitignore`(已有则不动)。 */
72
+ function ensureIgnored(projectDir, entry) {
73
+ const gitignore = resolve(projectDir, '.gitignore');
74
+ let existing = '';
75
+ if (existsSync(gitignore))
76
+ existing = readFileSync(gitignore, 'utf-8');
77
+ if (existing.split('\n').some((l) => l.trim() === entry))
78
+ return;
79
+ const prefix = existing && !existing.endsWith('\n') ? '\n' : '';
80
+ appendFileSync(gitignore, `${prefix}${entry}\n`);
81
+ }
82
+ //# sourceMappingURL=configureProjectAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureProjectAgent.js","sourceRoot":"","sources":["../../../src/core/agents/configureProjectAgent.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type InlineWorkerProvider } from './workerModelEnv.js';
1
2
  /** 读取 cwd 的 settings.local.json 中显式指定的模型。其它配置(如 permissions)不算模型配置。 */
2
3
  export declare function readModelSettingsFile(dir: string): string | undefined;
3
4
  /**
@@ -7,4 +8,10 @@ export declare function readModelSettingsFile(dir: string): string | undefined;
7
8
  * @returns 是否写入
8
9
  */
9
10
  export declare function writeModelSettingsFile(dir: string, model: string | undefined, providerId: string | undefined): boolean;
11
+ /**
12
+ * 同上,但 **端点由调用方直接给**(不查全局注册表)。
13
+ * 用于临时签发的端点(如平台网关:每用户每任务一个 baseUrl + 轮换 token),
14
+ * 它们进不了 providers.json —— 此前平台因此自己拼这个文件,属于越界。
15
+ */
16
+ export declare function writeModelSettingsFileFor(dir: string, model: string | undefined, provider: InlineWorkerProvider | undefined, extraEnv?: Record<string, string>): boolean;
10
17
  //# sourceMappingURL=modelSettingsFile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"modelSettingsFile.d.ts","sourceRoot":"","sources":["../../../src/core/agents/modelSettingsFile.ts"],"names":[],"mappings":"AAcA,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWrE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAuBT"}
1
+ {"version":3,"file":"modelSettingsFile.d.ts","sourceRoot":"","sources":["../../../src/core/agents/modelSettingsFile.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,oBAAoB,EAA4C,MAAM,qBAAqB,CAAC;AAE1G,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWrE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,oBAAoB,GAAG,SAAS,EAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAET"}
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
12
12
  import { resolve } from 'node:path';
13
- import { resolveWorkerModelEnv } from './workerModelEnv.js';
13
+ import { resolveWorkerModelEnv, workerModelEnvFor } from './workerModelEnv.js';
14
14
  /** 读取 cwd 的 settings.local.json 中显式指定的模型。其它配置(如 permissions)不算模型配置。 */
15
15
  export function readModelSettingsFile(dir) {
16
16
  const settingsPath = resolve(dir, '.claude', 'settings.local.json');
@@ -33,7 +33,32 @@ export function readModelSettingsFile(dir) {
33
33
  * @returns 是否写入
34
34
  */
35
35
  export function writeModelSettingsFile(dir, model, providerId) {
36
- const env = resolveWorkerModelEnv(model, providerId);
36
+ return mergeModelSettings(dir, model, resolveWorkerModelEnv(model, providerId));
37
+ }
38
+ /**
39
+ * 同上,但 **端点由调用方直接给**(不查全局注册表)。
40
+ * 用于临时签发的端点(如平台网关:每用户每任务一个 baseUrl + 轮换 token),
41
+ * 它们进不了 providers.json —— 此前平台因此自己拼这个文件,属于越界。
42
+ */
43
+ export function writeModelSettingsFileFor(dir, model, provider, extraEnv) {
44
+ return mergeModelSettings(dir, model, { ...workerModelEnvFor(model, provider), ...(extraEnv ?? {}) });
45
+ }
46
+ /**
47
+ * sps 自己管的端点 env 键。**换回官方端点时必须清掉残留**,否则 worker 仍打旧的第三方
48
+ * baseUrl(合并写入的固有坑;此前平台整体覆盖文件正是为了绕开它)。
49
+ * provider 的 extraEnv 键不可预知,不在清理范围。
50
+ */
51
+ const ENDPOINT_ENV_KEYS = [
52
+ 'ANTHROPIC_BASE_URL',
53
+ 'ANTHROPIC_AUTH_TOKEN',
54
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
55
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
56
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL',
57
+ 'ANTHROPIC_SMALL_FAST_MODEL',
58
+ 'CLAUDE_CODE_ATTRIBUTION_HEADER',
59
+ ];
60
+ /** 合并写 `<dir>/.claude/settings.local.json`(两个入口共用);model 与 env 皆空 → 不写。 */
61
+ function mergeModelSettings(dir, model, env) {
37
62
  const m = model?.trim();
38
63
  if (!m && Object.keys(env).length === 0)
39
64
  return false;
@@ -53,9 +78,16 @@ export function writeModelSettingsFile(dir, model, providerId) {
53
78
  const merged = { ...existing };
54
79
  if (m)
55
80
  merged.model = m;
56
- if (Object.keys(env).length) {
57
- merged.env = { ...existing.env, ...env };
58
- }
81
+ const prevEnv = existing.env ?? {};
82
+ const nextEnv = { ...prevEnv, ...env };
83
+ // 本次没给的端点键 = 已切走(如换回官方)→ 清掉,别留残留指向旧端点。
84
+ for (const k of ENDPOINT_ENV_KEYS)
85
+ if (!(k in env))
86
+ delete nextEnv[k];
87
+ if (Object.keys(nextEnv).length)
88
+ merged.env = nextEnv;
89
+ else
90
+ delete merged.env;
59
91
  writeFileSync(settingsPath, JSON.stringify(merged, null, 2) + '\n');
60
92
  return true;
61
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"modelSettingsFile.js","sourceRoot":"","sources":["../../../src/core/agents/modelSettingsFile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAwB,CAAC;QACxF,OAAO,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC3E,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;YACvB,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAW,EACX,KAAyB,EACzB,UAA8B;IAE9B,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAA4B,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,EAAE,CAAC,CAAC,WAAW;QAC5B,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,GAAG,QAAQ,EAAE,CAAC;IACxD,IAAI,CAAC;QAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,EAAE,GAAI,QAAQ,CAAC,GAA2C,EAAE,GAAG,GAAG,EAAE,CAAC;IACpF,CAAC;IACD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"modelSettingsFile.js","sourceRoot":"","sources":["../../../src/core/agents/modelSettingsFile.ts"],"names":[],"mappings":"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"}
@@ -8,4 +8,21 @@
8
8
  * 空对象 = 无需注入(既没 model 也没自定义端点)。
9
9
  */
10
10
  export declare function resolveWorkerModelEnv(model?: string, providerId?: string): Record<string, string>;
11
+ /** 端点信息已在手时用这个(不查注册表)。 */
12
+ export interface InlineWorkerProvider {
13
+ baseUrl?: string;
14
+ apiKey?: string;
15
+ /** 平台特殊 env(OpenRouter / claude-api 等),原样并入。 */
16
+ extraEnv?: Record<string, unknown>;
17
+ }
18
+ /**
19
+ * 同 `resolveWorkerModelEnv`,但 **provider 由调用方直接给**,不经全局注册表。
20
+ *
21
+ * 存在的理由:平台(gameforge)的 coral 网关端点是**每用户每任务临时签发**的
22
+ * (baseUrl + 轮换 token),不可能落进全局 providers.json;此前平台因此自己拼
23
+ * `.claude/settings.local.json` —— 那是 claude 专属落地方式写进了应用层。
24
+ *
25
+ * `provider` 省略 = 官方订阅端点(只设 `ANTHROPIC_MODEL`)。
26
+ */
27
+ export declare function workerModelEnvFor(model?: string, provider?: InlineWorkerProvider): Record<string, string>;
11
28
  //# sourceMappingURL=workerModelEnv.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workerModelEnv.d.ts","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwCxB"}
1
+ {"version":3,"file":"workerModelEnv.d.ts","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAED,0BAA0B;AAC1B,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqCxB"}
@@ -18,16 +18,30 @@ import { getProvider } from '../../providers/llm/providers.js';
18
18
  * 空对象 = 无需注入(既没 model 也没自定义端点)。
19
19
  */
20
20
  export function resolveWorkerModelEnv(model, providerId) {
21
+ const pid = providerId?.trim();
22
+ // pid 空 / 'official' → 官方订阅端点(只设 model);否则第三方模式。
23
+ // 🔴 查不到 provider 也仍算第三方(传 `{}`)—— 保持原行为:归因头与默认模型变量照设。
24
+ const thirdParty = Boolean(pid && pid !== 'official');
25
+ return workerModelEnvFor(model, thirdParty ? getProvider(pid) ?? {} : undefined);
26
+ }
27
+ /**
28
+ * 同 `resolveWorkerModelEnv`,但 **provider 由调用方直接给**,不经全局注册表。
29
+ *
30
+ * 存在的理由:平台(gameforge)的 coral 网关端点是**每用户每任务临时签发**的
31
+ * (baseUrl + 轮换 token),不可能落进全局 providers.json;此前平台因此自己拼
32
+ * `.claude/settings.local.json` —— 那是 claude 专属落地方式写进了应用层。
33
+ *
34
+ * `provider` 省略 = 官方订阅端点(只设 `ANTHROPIC_MODEL`)。
35
+ */
36
+ export function workerModelEnvFor(model, provider) {
21
37
  const env = {};
22
38
  const m = model?.trim();
23
39
  if (m)
24
40
  env.ANTHROPIC_MODEL = m;
25
- const pid = providerId?.trim();
26
- if (pid && pid !== 'official') {
27
- const provider = getProvider(pid);
28
- if (provider?.baseUrl)
41
+ if (provider) {
42
+ if (provider.baseUrl)
29
43
  env.ANTHROPIC_BASE_URL = provider.baseUrl;
30
- if (provider?.baseUrl) {
44
+ if (provider.baseUrl) {
31
45
  // 第三方端点必须覆盖用户级 Claude settings 中可能残留的官方/其它 provider 凭据。
32
46
  // Ollama 等无鉴权端点也给占位 token,避免 Claude Code 回退读取用户级 token。
33
47
  env.ANTHROPIC_AUTH_TOKEN = provider.apiKey || 'sps-local';
@@ -41,20 +55,18 @@ export function resolveWorkerModelEnv(model, providerId) {
41
55
  }
42
56
  // 平台特殊 env(如 OpenRouter 需 ANTHROPIC_API_KEY='' 避免与 AUTH_TOKEN 冲突;
43
57
  // claude-api 把 key 放 ANTHROPIC_API_KEY)。存在 provider.extraEnv 才并入。
44
- const extra = provider?.extraEnv;
58
+ const extra = provider.extraEnv;
45
59
  if (extra && typeof extra === 'object') {
46
60
  for (const [k, v] of Object.entries(extra)) {
47
61
  if (typeof v === 'string')
48
62
  env[k] = v;
49
63
  }
50
64
  }
51
- }
52
- // 第三方 anthropic 兼容端点 关掉逐请求变化的归因头。
53
- // Claude Code 2.1.x 把 `x-anthropic-billing-header`(含每请求都变的 cc_prev_req)作为一段
54
- // 系统提示词注入;第三方 API 会把它算进 prompt-cache key 每次 key 不同 → 缓存命中率归零、
55
- // token 暴涨、变慢。设 CLAUDE_CODE_ATTRIBUTION_HEADER=0 让 Claude Code 不注入该段。
56
- // 官方 claude 订阅端点(pid 空 / 'official')无此问题,故仅第三方时注入。
57
- if (pid && pid !== 'official') {
65
+ // 第三方 anthropic 兼容端点 → 关掉逐请求变化的归因头。
66
+ // Claude Code 2.1.x `x-anthropic-billing-header`(含每请求都变的 cc_prev_req)作为一段
67
+ // 系统提示词注入;第三方 API 会把它算进 prompt-cache key → 每次 key 不同 → 缓存命中率归零、
68
+ // token 暴涨、变慢。设 CLAUDE_CODE_ATTRIBUTION_HEADER=0 Claude Code 不注入该段。
69
+ // 官方 claude 订阅端点无此问题,故仅第三方时注入。
58
70
  env.CLAUDE_CODE_ATTRIBUTION_HEADER = '0';
59
71
  }
60
72
  return env;
@@ -1 +1 @@
1
- {"version":3,"file":"workerModelEnv.js","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,UAAmB;IAEnB,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC;QAAE,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;IAE/B,MAAM,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/B,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,EAAE,OAAO;YAAE,GAAG,CAAC,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjE,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;YACtB,wDAAwD;YACxD,wDAAwD;YACxD,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC;YACN,4DAA4D;YAC5D,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC;YACtC,GAAG,CAAC,8BAA8B,GAAG,CAAC,CAAC;YACvC,GAAG,CAAC,4BAA4B,GAAG,CAAC,CAAC;YACrC,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,kEAAkE;QAClE,kEAAkE;QAClE,MAAM,KAAK,GAAI,QAA+C,EAAE,QAAQ,CAAC;QACzE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;gBACtE,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,4EAA4E;IAC5E,gEAAgE;IAChE,sEAAsE;IACtE,mDAAmD;IACnD,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,GAAG,CAAC,8BAA8B,GAAG,GAAG,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"workerModelEnv.js","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,UAAmB;IAEnB,MAAM,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/B,iDAAiD;IACjD,uDAAuD;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,KAAK,UAAU,CAAC,CAAC;IACtD,OAAO,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,GAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7F,CAAC;AAUD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,QAA+B;IAE/B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC;QAAE,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;IAE/B,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,OAAO;YAAE,GAAG,CAAC,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,wDAAwD;YACxD,wDAAwD;YACxD,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC;YACN,4DAA4D;YAC5D,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC;YACtC,GAAG,CAAC,8BAA8B,GAAG,CAAC,CAAC;YACvC,GAAG,CAAC,4BAA4B,GAAG,CAAC,CAAC;YACrC,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,kEAAkE;QAClE,kEAAkE;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAChC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,4EAA4E;QAC5E,gEAAgE;QAChE,sEAAsE;QACtE,+BAA+B;QAC/B,GAAG,CAAC,8BAA8B,GAAG,GAAG,CAAC;IAC3C,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { GateOpts } from './types.js';
2
+ /** 一次配置的落地结果(各计数便于调用方打日志;都为 0 = 无技能可投)。 */
3
+ export interface ConfigureProjectSkillsResult {
4
+ /** 全局 HQ(`~/.coral/skills`)→ `.claude/skills` 的软链数。 */
5
+ linked: number;
6
+ /** 同上,软链失败回退整目录拷贝的数量。 */
7
+ copied: number;
8
+ /** 已存在且保留(含 frozen)的数量。 */
9
+ kept: number;
10
+ /** 因策略收窄而移除的数量。 */
11
+ pruned: number;
12
+ /** 项目专属技能(`<项目>/.sps/skills`)桥接进 `.claude/skills` 的数量。 */
13
+ projectLocal: number;
14
+ }
15
+ /**
16
+ * 配置某个项目可用的 skill,并按当前后端把它们投影到位。**幂等,可反复调用。**
17
+ *
18
+ * @param projectDir 项目目录(工作区 cwd)
19
+ * @param gate 传了就先落成 `.sps/skills-policy.yaml`;**省略 = 沿用磁盘上已有策略**,只重投影。
20
+ *
21
+ * 后端差异由 sps 内部兜:claude 需要 `.claude/skills` 里有实体(原生发现),
22
+ * openai/codex 直读 `.sps/skills` 与 HQ —— 调用方不必关心,也不该关心。
23
+ */
24
+ export declare function configureProjectSkills(projectDir: string, gate?: GateOpts): ConfigureProjectSkillsResult;
25
+ //# sourceMappingURL=configure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../../src/core/skills/configure.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,2CAA2C;AAC3C,MAAM,WAAW,4BAA4B;IAC3C,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,QAAQ,GACd,4BAA4B,CAO9B"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @module core/skills/configure
3
+ * @description **项目 skill 配置的可重复调用入口**(建项目之后也能改)。
4
+ *
5
+ * 组合已有三件:`writeProjectSkillPolicy`(落白名单)→ `resolveEligibleSkillNames`(算合格集)
6
+ * → `syncAllSkillsToProject` + `linkProjectSkillsToClaude`(按后端投影)。
7
+ *
8
+ * 🔴 存在的理由:此前这套只在 `commands/projectInit` 建项目时跑一次(`installProjectSkills`),
9
+ * 包外拿不到。于是平台(gameforge / createexperiments)在"换角色要重投技能"时**各自手写了一份**,
10
+ * 直接写 `.claude/skills` —— 绕过 policy、且把 claude 专属落地方式写进了应用层(换 openai 后端即不成立)。
11
+ * 开放这个入口就是为了收掉那类越界:**应用只说"这个项目用哪些技能",落到哪由 sps 按后端决定。**
12
+ *
13
+ * @layer core
14
+ * @boundedContext skills
15
+ */
16
+ import { linkProjectSkillsToClaude, syncAllSkillsToProject } from './distribution.js';
17
+ import { resolveEligibleSkillNames, writeProjectSkillPolicy } from './policy.js';
18
+ /**
19
+ * 配置某个项目可用的 skill,并按当前后端把它们投影到位。**幂等,可反复调用。**
20
+ *
21
+ * @param projectDir 项目目录(工作区 cwd)
22
+ * @param gate 传了就先落成 `.sps/skills-policy.yaml`;**省略 = 沿用磁盘上已有策略**,只重投影。
23
+ *
24
+ * 后端差异由 sps 内部兜:claude 需要 `.claude/skills` 里有实体(原生发现),
25
+ * openai/codex 直读 `.sps/skills` 与 HQ —— 调用方不必关心,也不该关心。
26
+ */
27
+ export function configureProjectSkills(projectDir, gate) {
28
+ if (gate)
29
+ writeProjectSkillPolicy(projectDir, gate);
30
+ // 空策略 → resolveEligibleSkillNames 返回 null = 不门控(全量投影),与建项目时的向后兼容语义一致。
31
+ const keep = resolveEligibleSkillNames(projectDir);
32
+ const { linked, copied, kept, pruned } = syncAllSkillsToProject(projectDir, { keep });
33
+ const proj = linkProjectSkillsToClaude(projectDir);
34
+ return { linked, copied, kept, pruned, projectLocal: proj.linked };
35
+ }
36
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/core/skills/configure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAiBjF;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,IAAe;IAEf,IAAI,IAAI;QAAE,uBAAuB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACpD,sEAAsE;IACtE,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACrE,CAAC"}
@@ -11,4 +11,5 @@ export * from './types.js';
11
11
  export { readSkillMeta, isReviewerSkill, SkillsManager, type SkillsManagerOpts } from './SkillsManager.js';
12
12
  export * from './distribution.js';
13
13
  export { isEmptyPolicy, loadProjectSkillPolicy, projectSkillPolicyPath, resolveEligibleSkillNames, SKILL_POLICY_REL, writeProjectSkillPolicy, } from './policy.js';
14
+ export { configureProjectSkills, type ConfigureProjectSkillsResult } from './configure.js';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC3G,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC3G,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,gBAAgB,CAAC"}
@@ -11,4 +11,5 @@ export * from './types.js';
11
11
  export { readSkillMeta, isReviewerSkill, SkillsManager } from './SkillsManager.js';
12
12
  export * from './distribution.js';
13
13
  export { isEmptyPolicy, loadProjectSkillPolicy, projectSkillPolicyPath, resolveEligibleSkillNames, SKILL_POLICY_REL, writeProjectSkillPolicy, } from './policy.js';
14
+ export { configureProjectSkills } from './configure.js';
14
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAA0B,MAAM,oBAAoB,CAAC;AAC3G,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAA0B,MAAM,oBAAoB,CAAC;AAC3G,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAqC,MAAM,gBAAgB,CAAC"}
package/dist/server.d.ts CHANGED
@@ -34,6 +34,9 @@ export { createReviewerModel } from './providers/llm/modelFactory.js';
34
34
  export { loadAgentsConfig } from './core/intel/agentsConfig.js';
35
35
  export { RuntimeSession } from './core/intel/RuntimeSession.js';
36
36
  export { SkillsManager, type SkillsManagerOpts, type SkillMeta } from './core/skills/index.js';
37
+ export { configureProjectSkills, type ConfigureProjectSkillsResult } from './core/skills/configure.js';
38
+ export type { GateOpts } from './core/skills/types.js';
39
+ export { configureProjectAgent, type ConfigureProjectAgentOpts, type ProjectAgentProvider, type ProjectAgentTarget, } from './core/agents/configureProjectAgent.js';
37
40
  export { exportModelConfigBundle, importModelConfigBundle, isModelConfigBundle, type ModelConfigBundle, type ImportSummary, } from './core/modelConfigBundle.js';
38
41
  export { runSubAgent, abortSubagentRun, SubAgentError, type SubAgentSpec, type SubAgentResult, type SubAgentUsage, type SubAgentToolCall, type SubAgentEvent, type SubAgentErrorKind, type SubAgentToolMode, } from './providers/subagent/runSubAgent.js';
39
42
  export { getSubagentRun, listSubagentRuns, type SubagentRunRecord, type SubagentRunStatus, } from './providers/subagent/runLedger.js';
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE/F,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oCAAoC,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG/F,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AACvG,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EACL,qBAAqB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oCAAoC,CAAC"}
package/dist/server.js CHANGED
@@ -33,6 +33,12 @@ export { createReviewerModel } from './providers/llm/modelFactory.js';
33
33
  export { loadAgentsConfig } from './core/intel/agentsConfig.js';
34
34
  export { RuntimeSession } from './core/intel/RuntimeSession.js';
35
35
  export { SkillsManager } from './core/skills/index.js';
36
+ // 项目 skill 配置(建项目之后也能改):平台只说"这个项目用哪些技能",落到 .claude/skills 还是
37
+ // .sps/skills 由 sps 按后端决定 —— 收掉平台自写投影那类越界(见 core/skills/configure.ts)。
38
+ export { configureProjectSkills } from './core/skills/configure.js';
39
+ // 项目级 agent 端点/模型(建项目之后也能改):平台只说"用哪个 provider/模型",
40
+ // 落 .claude/settings.local.json 还是 .sps/agent-providers.json 由 sps 按后端决定。
41
+ export { configureProjectAgent, } from './core/agents/configureProjectAgent.js';
36
42
  // 模型配置包(0.65.27 CLI 功能的库形态):嵌入平台(coral)的导入口分流/双包导出用。
37
43
  export { exportModelConfigBundle, importModelConfigBundle, isModelConfigBundle, } from './core/modelConfigBundle.js';
38
44
  // 轻 agent(subagent,一次性子 agent):平台(gameforge 审图等)直调,provider/密钥留 sps。
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAA0C,MAAM,wBAAwB,CAAC;AAC/F,qDAAqD;AACrD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AACrC,qEAAqE;AACrE,oEAAoE;AACpE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,GAQd,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,gBAAgB,GAGjB,MAAM,mCAAmC,CAAC;AAC3C,+CAA+C;AAC/C,OAAO,EAAE,aAAa,EAAqD,MAAM,oCAAoC,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAA0C,MAAM,wBAAwB,CAAC;AAC/F,6DAA6D;AAC7D,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,EAAqC,MAAM,4BAA4B,CAAC;AAEvG,mDAAmD;AACnD,0EAA0E;AAC1E,OAAO,EACL,qBAAqB,GAItB,MAAM,wCAAwC,CAAC;AAChD,qDAAqD;AACrD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AACrC,qEAAqE;AACrE,oEAAoE;AACpE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,GAQd,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,gBAAgB,GAGjB,MAAM,mCAAmC,CAAC;AAC3C,+CAA+C;AAC/C,OAAO,EAAE,aAAa,EAAqD,MAAM,oCAAoC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralai/sps-cli",
3
- "version": "0.65.60",
3
+ "version": "0.65.62",
4
4
  "description": "SPS CLI — AI-driven development pipeline orchestrator",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",