@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.
- package/cbb/bin/cbb.js +6 -0
- package/cbb/bin/cbbm.js +6 -0
- package/cbb/dev-standards/rules/cbb-ai-behavior.md +103 -103
- package/cbb/dev-standards/rules/cbb-priority.md +55 -55
- package/cbb/lib/install/claude-code.js +2 -0
- package/cbb/lib/install/init.js +496 -290
- package/cbb/lib/install/opencode.js +31 -0
- package/cbb/lib/install/qoder.js +2 -0
- package/cbb/lib/install/workspaces.js +53 -13
- package/cbb/lib/openspec/index.js +3 -3
- package/cbb/lib/superpowers/index.js +1 -1
- package/cbb/lib/utils/check-update.js +16 -14
- package/cbb/lib/utils/gitignore.js +2 -1
- package/cbb/lib/utils/output.js +92 -4
- package/cbb/lib/utils/version.js +2 -31
- package/cbb/lib/wiki/cli.js +25 -25
- package/cbb/lib/wiki/index.js +16 -16
- package/cbb/tools/cbb-design-to-wiki/SKILL.md +14 -14
- package/cbb/tools/cbb-wiki-ops/SKILL.md +22 -22
- package/cbb/worktrees/_shared/scripts/find-target-worktree.js +2 -2
- package/cbb/worktrees/_shared/scripts/find-workspace-root.js +7 -7
- package/cbb/worktrees/_shared/scripts/push-core.js +18 -0
- package/cbb/worktrees/commands/{close.md → worktree-close.md} +8 -8
- package/cbb/worktrees/commands/{init.md → worktree-init.md} +9 -9
- package/cbb/worktrees/commands/{push.md → worktree-push.md} +3 -3
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/SKILL.md +20 -20
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/check-env.js +4 -4
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/check-unarchived.js +1 -1
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/delete-branches.js +3 -3
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/discover-apps.js +6 -6
- package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-close}/scripts/find-target-worktree.js +2 -2
- package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-close}/scripts/find-workspace-root.js +7 -7
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/remove-worktrees.js +4 -4
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/safety-check.js +4 -4
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/SKILL.md +81 -107
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/auto-open.js +1 -1
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/check-env-deep.js +4 -4
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/check-env.js +6 -6
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/check-repos.js +4 -4
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/create-branches.js +4 -4
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/create-worktrees.js +8 -7
- package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-init}/scripts/find-workspace-root.js +7 -7
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/install-ai.js +33 -33
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/parse-config.js +7 -7
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/push-branches.js +9 -7
- package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-init}/scripts/push-core.js +18 -0
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/sync-repos.js +10 -12
- package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-init}/scripts/update-gitignore.js +19 -6
- package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/SKILL.md +16 -16
- package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/commit-worktrees.js +2 -2
- package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/find-target-worktree.js +2 -2
- package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-push}/scripts/find-workspace-root.js +7 -7
- package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/push-core.js +18 -0
- package/cbb/worktrees/skills/{openspec-push-worktrees → cbb-worktree-push}/scripts/push-worktrees.js +7 -5
- package/config/workspace-config.sample.json +18 -0
- package/config/workspaces.json +11 -6
- package/openspec/.version +6 -6
- package/openspec/commands/apply.md +7 -7
- package/openspec/commands/archive.md +7 -7
- package/openspec/commands/bulk-archive.md +7 -7
- package/openspec/commands/continue.md +7 -7
- package/openspec/commands/explore.md +7 -7
- package/openspec/commands/ff.md +7 -7
- package/openspec/commands/new.md +7 -7
- package/openspec/commands/onboard.md +7 -7
- package/openspec/commands/propose.md +7 -7
- package/openspec/commands/sync.md +7 -7
- package/openspec/commands/update.md +7 -7
- package/openspec/commands/verify.md +7 -7
- package/openspec/skills/openspec-apply-change/SKILL.md +187 -187
- package/openspec/skills/openspec-archive-change/SKILL.md +181 -181
- package/openspec/skills/openspec-bulk-archive-change/SKILL.md +338 -338
- package/openspec/skills/openspec-continue-change/SKILL.md +117 -117
- package/openspec/skills/openspec-explore/SKILL.md +342 -342
- package/openspec/skills/openspec-ff-change/SKILL.md +116 -116
- package/openspec/skills/openspec-new-change/SKILL.md +76 -76
- package/openspec/skills/openspec-onboard/SKILL.md +560 -560
- package/openspec/skills/openspec-propose/SKILL.md +162 -162
- package/openspec/skills/openspec-sync-specs/SKILL.md +261 -261
- package/openspec/skills/openspec-update-change/SKILL.md +90 -90
- package/openspec/skills/openspec-verify-change/SKILL.md +174 -174
- package/package.json +4 -3
- package/superpowers/.version +6 -6
- package/superpowers/skills/brainstorming/SKILL.md +250 -250
- package/superpowers/skills/brainstorming/scripts/helper.js +167 -167
- package/superpowers/skills/brainstorming/scripts/start-server.sh +209 -209
- package/superpowers/skills/brainstorming/scripts/stop-server.sh +120 -120
- package/superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/superpowers/skills/brainstorming/visual-companion.md +299 -299
- package/superpowers/skills/dispatching-parallel-agents/SKILL.md +167 -167
- package/superpowers/skills/executing-plans/SKILL.md +64 -64
- package/superpowers/skills/finishing-a-development-branch/SKILL.md +225 -225
- package/superpowers/skills/receiving-code-review/SKILL.md +205 -205
- package/superpowers/skills/requesting-code-review/SKILL.md +95 -95
- package/superpowers/skills/requesting-code-review/code-reviewer.md +181 -181
- package/superpowers/skills/subagent-driven-development/SKILL.md +568 -568
- package/superpowers/skills/subagent-driven-development/implementer-prompt.md +154 -154
- package/superpowers/skills/subagent-driven-development/re-review-prompt.md +115 -115
- package/superpowers/skills/subagent-driven-development/task-reviewer-prompt.md +207 -207
- package/superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -119
- package/superpowers/skills/systematic-debugging/SKILL.md +283 -283
- package/superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -115
- package/superpowers/skills/systematic-debugging/defense-in-depth.md +122 -122
- package/superpowers/skills/systematic-debugging/find-polluter.sh +72 -72
- package/superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -169
- package/superpowers/skills/systematic-debugging/test-academic.md +14 -14
- package/superpowers/skills/systematic-debugging/test-pressure-1.md +58 -58
- package/superpowers/skills/systematic-debugging/test-pressure-2.md +68 -68
- package/superpowers/skills/systematic-debugging/test-pressure-3.md +69 -69
- package/superpowers/skills/test-driven-development/SKILL.md +320 -320
- package/superpowers/skills/test-driven-development/writing-good-tests.md +198 -198
- package/superpowers/skills/using-git-worktrees/SKILL.md +167 -167
- package/superpowers/skills/using-superpowers/SKILL.md +63 -63
- package/superpowers/skills/using-superpowers/references/antigravity-tools.md +23 -23
- package/superpowers/skills/using-superpowers/references/codex-tools.md +108 -108
- package/superpowers/skills/using-superpowers/references/gemini-tools.md +63 -63
- package/superpowers/skills/using-superpowers/references/hermes-tools.md +56 -56
- package/superpowers/skills/using-superpowers/references/pi-tools.md +16 -16
- package/superpowers/skills/verification-before-completion/SKILL.md +120 -120
- package/superpowers/skills/writing-plans/SKILL.md +171 -171
- package/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/superpowers/skills/writing-skills/SKILL.md +679 -679
- package/superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -1150
- package/superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/superpowers/skills/writing-skills/persuasion-principles.md +187 -187
- package/superpowers/skills/writing-skills/render-graphs.js +169 -169
- package/superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -384
- package/cbb/worktrees/commands/extend.md +0 -65
- package/cbb/worktrees/skills/openspec-close-worktree/scripts/find-target-worktree.js +0 -96
- package/cbb/worktrees/skills/openspec-extend-worktree/SKILL.md +0 -390
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/check-env.js +0 -95
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/check-repos.js +0 -98
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/create-branches-and-worktrees.js +0 -135
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/install-ai.js +0 -150
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/list-available-apps.js +0 -88
- package/cbb/worktrees/skills/openspec-extend-worktree/scripts/sync-repos.js +0 -93
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/find-workspace-root.js +0 -67
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/generate-app-options.js +0 -93
- package/cbb/worktrees/skills/openspec-init-worktree/scripts/push-core.js +0 -136
- package/cbb/worktrees/skills/openspec-push-worktrees/scripts/silence-popup.js +0 -23
- package/config/config.sample.json +0 -16
- /package/cbb/worktrees/skills/{openspec-close-worktree → cbb-worktree-close}/scripts/silence-popup.js +0 -0
- /package/cbb/worktrees/skills/{openspec-extend-worktree → cbb-worktree-init}/scripts/silence-popup.js +0 -0
- /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
|
-
}
|
|
File without changes
|
|
File without changes
|
/package/cbb/worktrees/skills/{openspec-init-worktree → cbb-worktree-push}/scripts/silence-popup.js
RENAMED
|
File without changes
|