@jspg-ai/coding-bb 0.0.1 → 0.0.2-beta.22

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 (145) hide show
  1. package/cbb/bin/cbb.js +6 -0
  2. package/cbb/bin/cbbm.js +6 -0
  3. package/cbb/dev-standards/rules/cbb-ai-behavior.md +103 -103
  4. package/cbb/dev-standards/rules/cbb-priority.md +55 -55
  5. package/cbb/lib/install/claude-code.js +2 -0
  6. package/cbb/lib/install/init.js +496 -290
  7. package/cbb/lib/install/opencode.js +31 -0
  8. package/cbb/lib/install/qoder.js +2 -0
  9. package/cbb/lib/install/workspaces.js +53 -13
  10. package/cbb/lib/openspec/index.js +3 -3
  11. package/cbb/lib/superpowers/index.js +1 -1
  12. package/cbb/lib/utils/check-update.js +16 -14
  13. package/cbb/lib/utils/gitignore.js +2 -1
  14. package/cbb/lib/utils/output.js +92 -4
  15. package/cbb/lib/utils/version.js +2 -31
  16. package/cbb/lib/wiki/cli.js +25 -25
  17. package/cbb/lib/wiki/index.js +16 -16
  18. package/cbb/tools/cbb-design-to-wiki/SKILL.md +14 -14
  19. package/cbb/tools/cbb-wiki-ops/SKILL.md +22 -22
  20. package/cbb/worktrees/_shared/scripts/find-target-worktree.js +2 -2
  21. package/cbb/worktrees/_shared/scripts/find-workspace-root.js +7 -7
  22. package/cbb/worktrees/_shared/scripts/push-core.js +18 -0
  23. package/cbb/worktrees/commands/{close.md → worktree-close.md} +8 -8
  24. package/cbb/worktrees/commands/{init.md → worktree-init.md} +9 -9
  25. package/cbb/worktrees/commands/{push.md → worktree-push.md} +3 -3
  26. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/SKILL.md +20 -20
  27. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/check-env.js +4 -4
  28. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/check-unarchived.js +1 -1
  29. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/delete-branches.js +3 -3
  30. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/discover-apps.js +6 -6
  31. package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-close}/scripts/find-target-worktree.js +2 -2
  32. package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-close}/scripts/find-workspace-root.js +7 -7
  33. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/remove-worktrees.js +4 -4
  34. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/safety-check.js +4 -4
  35. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/SKILL.md +81 -107
  36. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/auto-open.js +1 -1
  37. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/check-env-deep.js +4 -4
  38. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/check-env.js +6 -6
  39. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/check-repos.js +4 -4
  40. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/create-branches.js +4 -4
  41. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/create-worktrees.js +8 -7
  42. package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-init}/scripts/find-workspace-root.js +7 -7
  43. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/install-ai.js +33 -33
  44. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/parse-config.js +7 -7
  45. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/push-branches.js +9 -7
  46. package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-init}/scripts/push-core.js +18 -0
  47. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/sync-repos.js +10 -12
  48. package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/update-gitignore.js +19 -6
  49. package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/SKILL.md +16 -16
  50. package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/commit-worktrees.js +2 -2
  51. package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/find-target-worktree.js +2 -2
  52. package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-push}/scripts/find-workspace-root.js +7 -7
  53. package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/push-core.js +18 -0
  54. package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/push-worktrees.js +7 -5
  55. package/config/workspace-config.sample.json +18 -0
  56. package/config/workspaces.json +11 -6
  57. package/openspec/.version +6 -6
  58. package/openspec/commands/apply.md +7 -7
  59. package/openspec/commands/archive.md +7 -7
  60. package/openspec/commands/bulk-archive.md +7 -7
  61. package/openspec/commands/continue.md +7 -7
  62. package/openspec/commands/explore.md +7 -7
  63. package/openspec/commands/ff.md +7 -7
  64. package/openspec/commands/new.md +7 -7
  65. package/openspec/commands/onboard.md +7 -7
  66. package/openspec/commands/propose.md +7 -7
  67. package/openspec/commands/sync.md +7 -7
  68. package/openspec/commands/update.md +7 -7
  69. package/openspec/commands/verify.md +7 -7
  70. package/openspec/skills/openspec-apply-change/SKILL.md +187 -187
  71. package/openspec/skills/openspec-archive-change/SKILL.md +181 -181
  72. package/openspec/skills/openspec-bulk-archive-change/SKILL.md +338 -338
  73. package/openspec/skills/openspec-continue-change/SKILL.md +117 -117
  74. package/openspec/skills/openspec-explore/SKILL.md +342 -342
  75. package/openspec/skills/openspec-ff-change/SKILL.md +116 -116
  76. package/openspec/skills/openspec-new-change/SKILL.md +76 -76
  77. package/openspec/skills/openspec-onboard/SKILL.md +560 -560
  78. package/openspec/skills/openspec-propose/SKILL.md +162 -162
  79. package/openspec/skills/openspec-sync-specs/SKILL.md +261 -261
  80. package/openspec/skills/openspec-update-change/SKILL.md +90 -90
  81. package/openspec/skills/openspec-verify-change/SKILL.md +174 -174
  82. package/package.json +4 -3
  83. package/superpowers/.version +6 -6
  84. package/superpowers/skills/brainstorming/SKILL.md +250 -250
  85. package/superpowers/skills/brainstorming/scripts/helper.js +167 -167
  86. package/superpowers/skills/brainstorming/scripts/start-server.sh +209 -209
  87. package/superpowers/skills/brainstorming/scripts/stop-server.sh +120 -120
  88. package/superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -49
  89. package/superpowers/skills/brainstorming/visual-companion.md +299 -299
  90. package/superpowers/skills/dispatching-parallel-agents/SKILL.md +167 -167
  91. package/superpowers/skills/executing-plans/SKILL.md +64 -64
  92. package/superpowers/skills/finishing-a-development-branch/SKILL.md +225 -225
  93. package/superpowers/skills/receiving-code-review/SKILL.md +205 -205
  94. package/superpowers/skills/requesting-code-review/SKILL.md +95 -95
  95. package/superpowers/skills/requesting-code-review/code-reviewer.md +181 -181
  96. package/superpowers/skills/subagent-driven-development/SKILL.md +568 -568
  97. package/superpowers/skills/subagent-driven-development/implementer-prompt.md +154 -154
  98. package/superpowers/skills/subagent-driven-development/re-review-prompt.md +115 -115
  99. package/superpowers/skills/subagent-driven-development/task-reviewer-prompt.md +207 -207
  100. package/superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -119
  101. package/superpowers/skills/systematic-debugging/SKILL.md +283 -283
  102. package/superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  103. package/superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -115
  104. package/superpowers/skills/systematic-debugging/defense-in-depth.md +122 -122
  105. package/superpowers/skills/systematic-debugging/find-polluter.sh +72 -72
  106. package/superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -169
  107. package/superpowers/skills/systematic-debugging/test-academic.md +14 -14
  108. package/superpowers/skills/systematic-debugging/test-pressure-1.md +58 -58
  109. package/superpowers/skills/systematic-debugging/test-pressure-2.md +68 -68
  110. package/superpowers/skills/systematic-debugging/test-pressure-3.md +69 -69
  111. package/superpowers/skills/test-driven-development/SKILL.md +320 -320
  112. package/superpowers/skills/test-driven-development/writing-good-tests.md +198 -198
  113. package/superpowers/skills/using-git-worktrees/SKILL.md +167 -167
  114. package/superpowers/skills/using-superpowers/SKILL.md +63 -63
  115. package/superpowers/skills/using-superpowers/references/antigravity-tools.md +23 -23
  116. package/superpowers/skills/using-superpowers/references/codex-tools.md +108 -108
  117. package/superpowers/skills/using-superpowers/references/gemini-tools.md +63 -63
  118. package/superpowers/skills/using-superpowers/references/hermes-tools.md +56 -56
  119. package/superpowers/skills/using-superpowers/references/pi-tools.md +16 -16
  120. package/superpowers/skills/verification-before-completion/SKILL.md +120 -120
  121. package/superpowers/skills/writing-plans/SKILL.md +171 -171
  122. package/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -49
  123. package/superpowers/skills/writing-skills/SKILL.md +679 -679
  124. package/superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -1150
  125. package/superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
  126. package/superpowers/skills/writing-skills/persuasion-principles.md +187 -187
  127. package/superpowers/skills/writing-skills/render-graphs.js +169 -169
  128. package/superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -384
  129. package/cbb/worktrees/commands/extend.md +0 -65
  130. package/cbb/worktrees/skills/openspec-close-worktree/scripts/find-target-worktree.js +0 -96
  131. package/cbb/worktrees/skills/openspec-extend-worktree/SKILL.md +0 -390
  132. package/cbb/worktrees/skills/openspec-extend-worktree/scripts/check-env.js +0 -95
  133. package/cbb/worktrees/skills/openspec-extend-worktree/scripts/check-repos.js +0 -98
  134. package/cbb/worktrees/skills/openspec-extend-worktree/scripts/create-branches-and-worktrees.js +0 -135
  135. package/cbb/worktrees/skills/openspec-extend-worktree/scripts/install-ai.js +0 -150
  136. package/cbb/worktrees/skills/openspec-extend-worktree/scripts/list-available-apps.js +0 -88
  137. package/cbb/worktrees/skills/openspec-extend-worktree/scripts/sync-repos.js +0 -93
  138. package/cbb/worktrees/skills/openspec-init-worktree/scripts/find-workspace-root.js +0 -67
  139. package/cbb/worktrees/skills/openspec-init-worktree/scripts/generate-app-options.js +0 -93
  140. package/cbb/worktrees/skills/openspec-init-worktree/scripts/push-core.js +0 -136
  141. package/cbb/worktrees/skills/openspec-push-worktrees/scripts/silence-popup.js +0 -23
  142. package/config/config.sample.json +0 -16
  143. /package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/silence-popup.js +0 -0
  144. /package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-init}/scripts/silence-popup.js +0 -0
  145. /package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-push}/scripts/silence-popup.js +0 -0
@@ -1,93 +0,0 @@
1
- #!/usr/bin/env node
2
- require('./silence-popup');
3
- /**
4
- * 从 CONFIG.json 读取应用列表,机械生成 AskUserQuestion options
5
- *
6
- * 核心原则:label 由代码硬生成,绝不依赖 AI 理解或翻译
7
- * label = "【" + sideLabel + "】 - " + app.name
8
- *
9
- * 用法:
10
- * node generate-app-options.js → 生成全部应用的 options
11
- * node generate-app-options.js --filter app1,app2 → 只生成指定 app 的 options
12
- *
13
- * 退出码:
14
- * 0 - 成功,输出 APP_OPTIONS
15
- * 1 - 解析失败
16
- * 2 - apps 为空
17
- *
18
- * 输出格式(末行为机器可解析行):
19
- * ✅ 已生成 N 个应用选项
20
- * ---
21
- * APP_OPTIONS [{"label":"...", "name":"..."}, ...]
22
- */
23
-
24
- const fs = require('fs');
25
- const path = require('path');
26
-
27
- // === 解析命令行参数 ===
28
- const filterNames = [];
29
- const args = process.argv.slice(2);
30
- for (const arg of args) {
31
- if (arg.startsWith('--filter=')) {
32
- const raw = arg.slice('--filter='.length);
33
- if (raw) {
34
- filterNames.push(...raw.split(',').map(s => s.trim()).filter(Boolean));
35
- }
36
- }
37
- }
38
-
39
- // === 读取 CONFIG.json ===
40
- const configPath = path.join(process.cwd(), 'CONFIG.json');
41
-
42
- if (!fs.existsSync(configPath)) {
43
- console.error('❌ CONFIG.json 不存在');
44
- console.error('---');
45
- console.error('CONFIG_MISSING');
46
- process.exit(1);
47
- }
48
-
49
- let config;
50
- try {
51
- config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
52
- } catch (e) {
53
- console.error('❌ CONFIG.json 解析失败:', e.message);
54
- console.error('---');
55
- console.error('CONFIG_INVALID');
56
- process.exit(1);
57
- }
58
-
59
- const apps = config.apps || [];
60
- if (apps.length === 0) {
61
- console.error('❌ CONFIG.json 中 apps 为空');
62
- console.error('---');
63
- console.error('CONFIG_EMPTY');
64
- process.exit(2);
65
- }
66
-
67
- // === 过滤(如果指定了 --filter) ===
68
- let targetApps = apps;
69
- if (filterNames.length > 0) {
70
- targetApps = apps.filter(app => filterNames.includes(app.name));
71
- if (targetApps.length === 0) {
72
- console.error('❌ --filter 指定的应用均不在 CONFIG.json 中:' + filterNames.join(', '));
73
- console.error('---');
74
- console.error('FILTER_NO_MATCH');
75
- process.exit(2);
76
- }
77
- }
78
-
79
- // === 机械生成 label(核心逻辑,不可修改) ===
80
- // 公式:label = "【" + sideLabel + "】 - " + app.name
81
- // app.name 逐字符原样复制,不翻译、不加工
82
- const options = [];
83
- for (const app of targetApps) {
84
- const sideLabel = (app.side === 'front') ? '前端' : '后端';
85
- const label = '【' + sideLabel + '】 - ' + app.name;
86
- options.push({ label: label, name: app.name });
87
- }
88
-
89
- // === 输出 ===
90
- console.log('✅ 已生成 ' + options.length + ' 个应用选项(label 由脚本硬编码,绝不翻译)');
91
- console.log('---');
92
- console.log('APP_OPTIONS ' + JSON.stringify(options));
93
- process.exit(0);
@@ -1,136 +0,0 @@
1
- require('./silence-popup');
2
- /**
3
- * openspec-shared 推送核心模块
4
- *
5
- * 唯一真源:cbb/worktrees/_shared/scripts/push-core.js
6
- * 由 scripts/sync-shared.js 展开到各 skill 的 scripts/ 下(init-worktree / extend-worktree / push-worktrees)。
7
- *
8
- * 公开 API:
9
- * - tryExec(cmd, cwd, execImpl) 包装 execSync,统一返回 {ok, out|err}
10
- * - escapeBranch(name) 分支名 shell 转义(防命令注入)
11
- * - classifyError(stderr) 将 stderr 归类为 8 种错误码之一
12
- * - pushSingle(repoPath, repoName, branch) 推送单个仓库并建立 upstream
13
- * - collectRemoteMetadata(repoPath, branch, remote) 采集远程 commit 元信息
14
- *
15
- * 错误码契约(classifyError 输出):
16
- * - ssh-auth-failed Permission denied (publickey)
17
- * - https-auth-failed Authentication failed
18
- * - network-unreachable Could not resolve host / hung up / connection refused
19
- * - branch-protected protected branch / deny updating
20
- * - remote-exists already exists
21
- * - no-remote (pushSingle 内部判定)
22
- * - non-fast-forward non-fast-forward
23
- * - unknown 兜底
24
- */
25
-
26
- const { execSync: realExecSync } = require('child_process');
27
-
28
- const PUSH_TIMEOUT_MS = 60000;
29
-
30
- function tryExec(cmd, cwd, execImpl) {
31
- const execSync = (execImpl || realExecSync);
32
- try {
33
- return {
34
- ok: true,
35
- out: execSync(cmd, { cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'pipe'], timeout: PUSH_TIMEOUT_MS }).toString().trim(),
36
- };
37
- } catch (e) {
38
- const stderr = (e.stderr ? e.stderr.toString() : e.message || String(e)).trim();
39
- return { ok: false, err: stderr };
40
- }
41
- }
42
-
43
- function escapeBranch(name) {
44
- return '"' + String(name).replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
45
- }
46
-
47
- function classifyError(stderr) {
48
- const s = (stderr || '').toLowerCase();
49
- if (s.includes('permission denied (publickey)')) return 'ssh-auth-failed';
50
- if (s.includes('authentication failed')) return 'https-auth-failed';
51
- if (s.includes('could not resolve host') || s.includes('hung up') || s.includes('connection refused')) {
52
- return 'network-unreachable';
53
- }
54
- if (s.includes('protected branch') || s.includes('deny updating')) return 'branch-protected';
55
- if (s.includes('already exists')) return 'remote-exists';
56
- if (s.includes('non-fast-forward')) return 'non-fast-forward';
57
- return 'unknown';
58
- }
59
-
60
- /**
61
- * 采集远程分支的元信息(hash/author/date/message + 本地 hash)
62
- * 任意子命令失败时返回 null(不抛错)
63
- * @param {string} repoPath
64
- * @param {string} branch
65
- * @param {string} remote
66
- * @param {{ execSyncImpl?: Function }} [opts]
67
- * @returns {{ remote: {hash, author, date, message}, local: {hash} } | null}
68
- */
69
- function collectRemoteMetadata(repoPath, branch, remote, opts) {
70
- const execImpl = opts && opts.execSyncImpl;
71
- try {
72
- const remoteHash = tryExec('git rev-parse ' + escapeBranch(remote + '/' + branch), repoPath, execImpl);
73
- if (!remoteHash.ok || !remoteHash.out) return null;
74
-
75
- const remoteLog = tryExec('git log -1 --format="%an <%ae> | %ad | %s" ' + escapeBranch(remote + '/' + branch), repoPath, execImpl);
76
- const localHash = tryExec('git rev-parse ' + escapeBranch(branch), repoPath, execImpl);
77
- if (!remoteLog.ok || !localHash.ok || !localHash.out) return null;
78
-
79
- // 解析 "author <email> | date | message"
80
- const parts = remoteLog.out.split(' | ');
81
- const author = parts[0] || '';
82
- const date = parts[1] || '';
83
- const message = parts.slice(2).join(' | ') || '';
84
-
85
- return {
86
- remote: {
87
- hash: remoteHash.out,
88
- author,
89
- date,
90
- message,
91
- },
92
- local: {
93
- hash: localHash.out,
94
- },
95
- };
96
- } catch (e) {
97
- return null;
98
- }
99
- }
100
-
101
- /**
102
- * 推送单个仓库的分支并建立 upstream
103
- * @param {string} repoPath
104
- * @param {string} repoName
105
- * @param {string} branch
106
- * @param {{ execSyncImpl?: Function }} [opts]
107
- * @returns {{ name: string, status: string, upstream?: string, error?: string, message?: string, metadata?: object }}
108
- */
109
- function pushSingle(repoPath, repoName, branch, opts) {
110
- const execImpl = opts && opts.execSyncImpl;
111
- const remote = tryExec('git remote', repoPath, execImpl);
112
- if (!remote.ok || !remote.out) {
113
- return { name: repoName, status: 'failed', error: 'no-remote', message: '无远程配置' };
114
- }
115
- const r = remote.out.split(/\r?\n/)[0];
116
- const branchEsc = escapeBranch(branch);
117
- const remoteEsc = '"' + String(r).replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
118
- const pushResult = tryExec('git push -u ' + remoteEsc + ' ' + branchEsc, repoPath, execImpl);
119
- if (pushResult.ok) {
120
- return { name: repoName, status: 'pushed', upstream: r + '/' + branch };
121
- }
122
- const errCode = classifyError(pushResult.err);
123
- if (errCode === 'remote-exists') {
124
- const metadata = collectRemoteMetadata(repoPath, branch, r, opts);
125
- return {
126
- name: repoName,
127
- status: 'remote-exists',
128
- error: errCode,
129
- message: '远程分支已存在,需用户决策',
130
- metadata,
131
- };
132
- }
133
- return { name: repoName, status: 'failed', error: errCode, message: pushResult.err.split(/\r?\n/)[0] };
134
- }
135
-
136
- module.exports = { tryExec, escapeBranch, classifyError, pushSingle, collectRemoteMetadata };
@@ -1,23 +0,0 @@
1
- // silence-popup.js (shared)
2
- // Silences Windows 0xc0000142 (STATUS_DLL_INIT_FAILED) popups from child git processes.
3
- // Cross-platform: only effective on Windows; no-op on macOS/Linux.
4
- // koffi is resolved from cbb global install (no local node_modules needed).
5
- //
6
- // 唯一真源:cbb/worktrees/_shared/scripts/silence-popup.js
7
- // 由 scripts/sync-shared.js 展开到各 skill 的 scripts/ 下(init / extend / close / push)。
8
- // skill 内同目录引用:脚本第一行 `require('./silence-popup')`。
9
- if (process.platform === 'win32') {
10
- try {
11
- const path = require('path');
12
- const { execSync } = require('child_process');
13
- const globalRoot = execSync('npm root -g', { stdio: 'pipe', timeout: 5000 }).toString().trim();
14
- const koffiPath = path.join(globalRoot, '@jspg-ai', 'coding-bb', 'node_modules', 'koffi');
15
- const koffi = require(koffiPath);
16
- const kernel32 = koffi.load('kernel32.dll');
17
- const SetErrorMode = kernel32.func('uint __stdcall SetErrorMode(uint uMode)');
18
- // SEM_FAILCRITICALERRORS=0x0001 | SEM_NOGPFAULTERRORBOX=0x0002 | SEM_NOOPENFILEERRORBOX=0x8000
19
- SetErrorMode(0x0001 | 0x0002 | 0x8000);
20
- } catch (e) {
21
- // koffi unavailable or SetErrorMode failed: silently continue (worst case: popups may reappear)
22
- }
23
- }
@@ -1,16 +0,0 @@
1
- {
2
- "_comment": "AI 开发工作空间配置样例(请勿修改本文件,复制为工作空间根目录的 CONFIG.json 后编辑使用)。apps 数组中每个对象需包含:name(应用名,同时作为 .code/ 子目录名)、repo(Git 仓库地址,支持 SSH 或 HTTPS)、side(仓库类型,'front' 表示前端工程,'back' 表示后端工程)。",
3
- "apps":
4
- [
5
- {
6
- "name": "ep-user-auth-app",
7
- "repo": "git@code.example.com:team/ep-user-auth-app.git",
8
- "side": "back"
9
- },
10
- {
11
- "name": "ep-user-web",
12
- "repo": "git@code.example.com:team/ep-user-web.git",
13
- "side": "front"
14
- }
15
- ]
16
- }