@chenmk/superflow 0.1.3 → 0.2.0
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/dist/app/cli.js +215 -0
- package/dist/app/cli.js.map +1 -0
- package/dist/app/commands/archive.js +6 -0
- package/dist/app/commands/archive.js.map +1 -0
- package/dist/app/commands/check.js +123 -0
- package/dist/app/commands/check.js.map +1 -0
- package/dist/app/commands/clarify.js +6 -0
- package/dist/app/commands/clarify.js.map +1 -0
- package/dist/app/commands/config.js +103 -0
- package/dist/app/commands/config.js.map +1 -0
- package/dist/app/commands/design.js +28 -0
- package/dist/app/commands/design.js.map +1 -0
- package/dist/app/commands/docs.js +6 -0
- package/dist/app/commands/docs.js.map +1 -0
- package/dist/app/commands/doctor.js +494 -0
- package/dist/app/commands/doctor.js.map +1 -0
- package/dist/app/commands/implement.js +6 -0
- package/dist/app/commands/implement.js.map +1 -0
- package/dist/app/commands/init.js +520 -0
- package/dist/app/commands/init.js.map +1 -0
- package/dist/app/commands/pipeline.js +6 -0
- package/dist/app/commands/pipeline.js.map +1 -0
- package/dist/app/commands/scan.js +63 -0
- package/dist/app/commands/scan.js.map +1 -0
- package/dist/app/commands/status.js +192 -0
- package/dist/app/commands/status.js.map +1 -0
- package/dist/app/commands/uninstall.js +214 -0
- package/dist/app/commands/uninstall.js.map +1 -0
- package/dist/app/commands/update.js +193 -0
- package/dist/app/commands/update.js.map +1 -0
- package/dist/app/commands/verify.js +6 -0
- package/dist/app/commands/verify.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/archive.js +1 -1
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/clarify.js +1 -1
- package/dist/commands/clarify.js.map +1 -1
- package/dist/commands/design.js +1 -1
- package/dist/commands/design.js.map +1 -1
- package/dist/commands/docs.js +1 -1
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/doctor.js +4 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/implement.js +1 -1
- package/dist/commands/implement.js.map +1 -1
- package/dist/commands/init.js +13 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pipeline.js +1 -1
- package/dist/commands/pipeline.js.map +1 -1
- package/dist/commands/scan.js +2 -2
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/uninstall.js +6 -5
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +10 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/verify.js +1 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/dependencies.js +1 -1
- package/dist/core/dependencies.js.map +1 -1
- package/dist/core/detect.js +0 -60
- package/dist/core/detect.js.map +1 -1
- package/dist/core/skill-check.js +3 -2
- package/dist/core/skill-check.js.map +1 -1
- package/dist/domains/agent.js +64 -0
- package/dist/domains/agent.js.map +1 -0
- package/dist/domains/config/cli-help.js +98 -0
- package/dist/domains/config/cli-help.js.map +1 -0
- package/dist/domains/config/context.js +123 -0
- package/dist/domains/config/context.js.map +1 -0
- package/dist/domains/config/i18n.js +105 -0
- package/dist/domains/config/i18n.js.map +1 -0
- package/dist/domains/config/manifest.js +21 -0
- package/dist/domains/config/manifest.js.map +1 -0
- package/dist/domains/deps.js +146 -0
- package/dist/domains/deps.js.map +1 -0
- package/dist/domains/hook.js +134 -0
- package/dist/domains/hook.js.map +1 -0
- package/dist/domains/intent.js +69 -0
- package/dist/domains/intent.js.map +1 -0
- package/dist/domains/run-state.js +47 -0
- package/dist/domains/run-state.js.map +1 -0
- package/dist/domains/skill/assets.js +27 -0
- package/dist/domains/skill/assets.js.map +1 -0
- package/dist/domains/skill/check.js +32 -0
- package/dist/domains/skill/check.js.map +1 -0
- package/dist/domains/skill/deploy.js +62 -0
- package/dist/domains/skill/deploy.js.map +1 -0
- package/dist/domains/skill/prompts.js +20 -0
- package/dist/domains/skill/prompts.js.map +1 -0
- package/dist/domains/skill/rules.js +17 -0
- package/dist/domains/skill/rules.js.map +1 -0
- package/dist/domains/skill/scripts.js +48 -0
- package/dist/domains/skill/scripts.js.map +1 -0
- package/dist/domains/state-events.js +32 -0
- package/dist/domains/state-events.js.map +1 -0
- package/dist/domains/state.js +54 -0
- package/dist/domains/state.js.map +1 -0
- package/dist/domains/workflow-state.js +47 -0
- package/dist/domains/workflow-state.js.map +1 -0
- package/dist/platform/fs.js +45 -0
- package/dist/platform/fs.js.map +1 -0
- package/dist/platform/os.js +14 -0
- package/dist/platform/os.js.map +1 -0
- package/dist/platform/paths.js +55 -0
- package/dist/platform/paths.js.map +1 -0
- package/dist/platform/process.js +29 -0
- package/dist/platform/process.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/domains/skill/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AAMxB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAmB,EACnB,SAAiB,EACjB,QAAgB,EAChB,UAA8B,EAAE;IAEhC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO,CAAC,YAAY,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACvD,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,QAAgB;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export async function deployScripts(scriptNames, assetsDir, scriptsDir, options = {}) {
|
|
4
|
+
await fs.mkdir(scriptsDir, { recursive: true });
|
|
5
|
+
for (const name of scriptNames) {
|
|
6
|
+
const source = path.join(assetsDir, name);
|
|
7
|
+
const dest = path.join(scriptsDir, name);
|
|
8
|
+
try {
|
|
9
|
+
if (options.skipExisting) {
|
|
10
|
+
await fs.access(dest);
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// file does not exist; continue with deployment
|
|
16
|
+
}
|
|
17
|
+
if (shouldRewriteScript(source)) {
|
|
18
|
+
const content = await fs.readFile(source, 'utf-8');
|
|
19
|
+
await fs.writeFile(dest, rewriteScriptContent(content, options.agent ?? 'codex'), 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
await fs.cp(source, dest, { recursive: false, force: true });
|
|
23
|
+
}
|
|
24
|
+
await fs.chmod(dest, 0o755);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function shouldRewriteScript(file) {
|
|
28
|
+
return /\.(sh|py|js|json|md)$/i.test(file);
|
|
29
|
+
}
|
|
30
|
+
function rewriteScriptContent(content, agent) {
|
|
31
|
+
if (agent === 'codex')
|
|
32
|
+
return content;
|
|
33
|
+
if (agent === 'opencode') {
|
|
34
|
+
return content
|
|
35
|
+
.replaceAll('$HOME/.codex/hooks', '$HOME/.opencode/scripts')
|
|
36
|
+
.replaceAll('~/.codex/hooks', '~/.opencode/scripts')
|
|
37
|
+
.replaceAll('~/.codex/skills', '~/.opencode/skills')
|
|
38
|
+
.replaceAll('$HOME/.codex/skills', '$HOME/.opencode/skills')
|
|
39
|
+
.replaceAll('codex-auto-backup-hook.sh', 'opencode-auto-backup-hook.sh');
|
|
40
|
+
}
|
|
41
|
+
return content
|
|
42
|
+
.replaceAll('$HOME/.codex/hooks', '$HOME/.claude/scripts')
|
|
43
|
+
.replaceAll('~/.codex/hooks', '~/.claude/scripts')
|
|
44
|
+
.replaceAll('~/.codex/skills', '~/.claude/skills')
|
|
45
|
+
.replaceAll('$HOME/.codex/skills', '$HOME/.claude/skills')
|
|
46
|
+
.replaceAll('codex-auto-backup-hook.sh', 'claude-auto-backup-hook.sh');
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../src/domains/skill/scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAqB,EACrB,SAAiB,EACjB,UAAkB,EAClB,UAAgC,EAAE;IAElC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtB,SAAS;YACX,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;QACD,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe,EAAE,KAAY;IACzD,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,OAAO;aACX,UAAU,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;aAC3D,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;aACnD,UAAU,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;aACnD,UAAU,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;aAC3D,UAAU,CAAC,2BAA2B,EAAE,8BAA8B,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO;SACX,UAAU,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;SACzD,UAAU,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;SACjD,UAAU,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SACjD,UAAU,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;SACzD,UAAU,CAAC,2BAA2B,EAAE,4BAA4B,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const EVENTS_FILE = '.sdd/state-events.jsonl';
|
|
4
|
+
function ensureDir(changeDir) {
|
|
5
|
+
const sddDir = path.join(changeDir, '.sdd');
|
|
6
|
+
if (!existsSync(sddDir))
|
|
7
|
+
mkdirSync(sddDir, { recursive: true });
|
|
8
|
+
}
|
|
9
|
+
/** 追加一条审计事件 */
|
|
10
|
+
export function appendStateEvent(changeDir, type, detail = {}) {
|
|
11
|
+
ensureDir(changeDir);
|
|
12
|
+
const event = {
|
|
13
|
+
timestamp: new Date().toISOString(),
|
|
14
|
+
type,
|
|
15
|
+
detail,
|
|
16
|
+
};
|
|
17
|
+
const file = path.join(changeDir, EVENTS_FILE);
|
|
18
|
+
appendFileSync(file, JSON.stringify(event) + '\n', 'utf-8');
|
|
19
|
+
}
|
|
20
|
+
/** 记录阶段转换 */
|
|
21
|
+
export function logPhaseTransition(changeDir, from, to, trigger = 'auto') {
|
|
22
|
+
appendStateEvent(changeDir, 'phase-transition', { from, to, trigger });
|
|
23
|
+
}
|
|
24
|
+
/** 记录 review_mode 变更 */
|
|
25
|
+
export function logReviewModeChange(changeDir, from, to) {
|
|
26
|
+
appendStateEvent(changeDir, 'review-mode-changed', { from, to });
|
|
27
|
+
}
|
|
28
|
+
/** 记录 auto_transition 切换 */
|
|
29
|
+
export function logAutoTransitionToggle(changeDir, enabled) {
|
|
30
|
+
appendStateEvent(changeDir, 'auto-transition-toggled', { enabled });
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=state-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-events.js","sourceRoot":"","sources":["../../src/domains/state-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,IAAI,MAAM,MAAM,CAAC;AAwBxB,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,SAAS,SAAS,CAAC,SAAiB;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,eAAe;AACf,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,IAAoB,EACpB,SAAkC,EAAE;IAEpC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrB,MAAM,KAAK,GAAe;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI;QACJ,MAAM;KACP,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/C,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,aAAa;AACb,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,IAAc,EACd,EAAY,EACZ,UAA6B,MAAM;IAEnC,gBAAgB,CAAC,SAAS,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,IAAY,EACZ,EAAU;IAEV,gBAAgB,CAAC,SAAS,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,OAAgB;IAEhB,gBAAgB,CAAC,SAAS,EAAE,yBAAyB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const SUPPORTED_AGENTS = ['claude', 'codex', 'opencode'];
|
|
4
|
+
export function loadState(file) {
|
|
5
|
+
if (!existsSync(file))
|
|
6
|
+
return null;
|
|
7
|
+
try {
|
|
8
|
+
const raw = readFileSync(file, 'utf-8');
|
|
9
|
+
const parsed = JSON.parse(raw);
|
|
10
|
+
// 顶层字段验证(防止老版本残留或外部破坏)
|
|
11
|
+
if (!parsed.version || !parsed.platforms || !parsed.completedSteps) {
|
|
12
|
+
throw new Error('state file missing required top-level fields');
|
|
13
|
+
}
|
|
14
|
+
return ensureStatePlatforms(parsed);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
throw new Error(`Failed to parse state file ${file}: ${err.message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function ensureStatePlatforms(state) {
|
|
21
|
+
const emptyPlatform = () => ({ skills: [], scripts: [], hooks: [] });
|
|
22
|
+
for (const agent of SUPPORTED_AGENTS) {
|
|
23
|
+
if (!state.platforms[agent]) {
|
|
24
|
+
state.platforms[agent] = emptyPlatform();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return state;
|
|
28
|
+
}
|
|
29
|
+
export function saveState(file, state) {
|
|
30
|
+
const dir = path.dirname(file);
|
|
31
|
+
if (!existsSync(dir))
|
|
32
|
+
mkdirSync(dir, { recursive: true });
|
|
33
|
+
writeFileSync(file, JSON.stringify(state, null, 2), 'utf-8');
|
|
34
|
+
}
|
|
35
|
+
export function initState(version, _agent, language = 'zh') {
|
|
36
|
+
const emptyPlatform = { skills: [], scripts: [], hooks: [] };
|
|
37
|
+
return {
|
|
38
|
+
version,
|
|
39
|
+
lastInit: new Date().toISOString(),
|
|
40
|
+
language,
|
|
41
|
+
completedSteps: [],
|
|
42
|
+
platforms: {
|
|
43
|
+
claude: { ...emptyPlatform },
|
|
44
|
+
codex: { ...emptyPlatform },
|
|
45
|
+
opencode: { ...emptyPlatform },
|
|
46
|
+
},
|
|
47
|
+
backups: {
|
|
48
|
+
settingsFiles: [],
|
|
49
|
+
skills: [],
|
|
50
|
+
},
|
|
51
|
+
previousVersion: null,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/domains/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,gBAAgB,GAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAElE,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;QACpD,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,oBAAoB,CAAC,MAAkB,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAe;IAC3C,MAAM,aAAa,GAAG,GAAkB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACpF,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,aAAa,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAe;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,MAAa,EAAE,WAAqB,IAAI;IACjF,MAAM,aAAa,GAAkB,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC5E,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAClC,QAAQ;QACR,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE;YACT,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE;YAC5B,KAAK,EAAE,EAAE,GAAG,aAAa,EAAE;YAC3B,QAAQ,EAAE,EAAE,GAAG,aAAa,EAAE;SAC/B;QACD,OAAO,EAAE;YACP,aAAa,EAAE,EAAE;YACjB,MAAM,EAAE,EAAE;SACX;QACD,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export const DEFAULT_WORKFLOW_STATE = {
|
|
4
|
+
workflow: 'full',
|
|
5
|
+
phase: 'docs',
|
|
6
|
+
reviewMode: 'standard',
|
|
7
|
+
autoTransition: true,
|
|
8
|
+
designDoc: null,
|
|
9
|
+
plan: null,
|
|
10
|
+
verifyResult: 'pending',
|
|
11
|
+
verificationReport: null,
|
|
12
|
+
createdAt: new Date().toISOString(),
|
|
13
|
+
archivedAt: null,
|
|
14
|
+
};
|
|
15
|
+
const STATE_FILE = '.sdd/state.yaml';
|
|
16
|
+
/** 从 change 目录加载工作流状态 */
|
|
17
|
+
export function loadWorkflowState(changeDir) {
|
|
18
|
+
// TODO: YAML 解析 — 当前使用 JSON 兼容格式
|
|
19
|
+
const file = path.join(changeDir, STATE_FILE);
|
|
20
|
+
if (!existsSync(file))
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const raw = readFileSync(file, 'utf-8');
|
|
24
|
+
const parsed = JSON.parse(raw);
|
|
25
|
+
return { ...DEFAULT_WORKFLOW_STATE, ...parsed };
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** 保存工作流状态到 change 目录 */
|
|
32
|
+
export function saveWorkflowState(changeDir, state) {
|
|
33
|
+
const file = path.join(changeDir, STATE_FILE);
|
|
34
|
+
const dir = path.dirname(file);
|
|
35
|
+
if (!existsSync(dir))
|
|
36
|
+
mkdirSync(dir, { recursive: true });
|
|
37
|
+
writeFileSync(file, JSON.stringify(state, null, 2), 'utf-8');
|
|
38
|
+
}
|
|
39
|
+
/** 初始化一个新的工作流状态 */
|
|
40
|
+
export function initWorkflowState(overrides = {}) {
|
|
41
|
+
return {
|
|
42
|
+
...DEFAULT_WORKFLOW_STATE,
|
|
43
|
+
createdAt: new Date().toISOString(),
|
|
44
|
+
...overrides,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=workflow-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../src/domains/workflow-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,IAAI,MAAM,MAAM,CAAC;AAkCxB,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,UAAU;IACtB,cAAc,EAAE,IAAI;IACpB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,YAAY,EAAE,SAAS;IACvB,kBAAkB,EAAE,IAAI;IACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnC,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC,yBAAyB;AACzB,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,iCAAiC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACzD,OAAO,EAAE,GAAG,sBAAsB,EAAE,GAAG,MAAM,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,KAAoB;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,iBAAiB,CAC/B,YAAoC,EAAE;IAEtC,OAAO;QACL,GAAG,sBAAsB;QACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { readdirSync, readFileSync, statSync } from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* 计算目录的 SHA-256 哈希。
|
|
6
|
+
* 算法:递归读取所有文件,path + sha256(file) 拼接后整体 hash。
|
|
7
|
+
*/
|
|
8
|
+
export function computeDirHash(dir) {
|
|
9
|
+
const files = collectFiles(dir);
|
|
10
|
+
const hash = createHash('sha256');
|
|
11
|
+
for (const file of files) {
|
|
12
|
+
const relative = path.relative(dir, file);
|
|
13
|
+
hash.update(`path:${relative}\n`);
|
|
14
|
+
hash.update(`sha256:${hashFile(file)}\n`);
|
|
15
|
+
}
|
|
16
|
+
return hash.digest('hex');
|
|
17
|
+
}
|
|
18
|
+
function collectFiles(dir) {
|
|
19
|
+
const result = [];
|
|
20
|
+
walk(dir, result);
|
|
21
|
+
return result.sort();
|
|
22
|
+
}
|
|
23
|
+
function walk(dir, result) {
|
|
24
|
+
let entries;
|
|
25
|
+
try {
|
|
26
|
+
entries = readdirSync(dir);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
throw new Error(`Cannot read directory: ${dir} (${err.message})`);
|
|
30
|
+
}
|
|
31
|
+
for (const entry of entries) {
|
|
32
|
+
const full = path.join(dir, entry);
|
|
33
|
+
const stat = statSync(full);
|
|
34
|
+
if (stat.isDirectory()) {
|
|
35
|
+
walk(full, result);
|
|
36
|
+
}
|
|
37
|
+
else if (stat.isFile()) {
|
|
38
|
+
result.push(full);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function hashFile(file) {
|
|
43
|
+
return createHash('sha256').update(readFileSync(file)).digest('hex');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/platform/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,QAAQ,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,UAAU,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,MAAgB;IACzC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,KAAM,GAAa,CAAC,OAAO,GAAG,CAAC,CAAC;IAC/E,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function detectOS() {
|
|
2
|
+
const platform = process.platform;
|
|
3
|
+
if (platform === 'darwin' || platform === 'linux')
|
|
4
|
+
return platform;
|
|
5
|
+
if (platform === 'win32') {
|
|
6
|
+
if (process.env.MSYSTEM)
|
|
7
|
+
return 'msys';
|
|
8
|
+
if (process.env.SHELL?.includes('bash'))
|
|
9
|
+
return 'mingw';
|
|
10
|
+
return 'windows';
|
|
11
|
+
}
|
|
12
|
+
return 'unknown';
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=os.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os.js","sourceRoot":"","sources":["../../src/platform/os.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,QAAQ;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IACnE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC;QACvC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,OAAO,CAAC;QACxD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export const home = homedir();
|
|
4
|
+
/** legacy path constants — prefer getPlatformPaths() for new code */
|
|
5
|
+
export const claudeSkills = path.join(home, '.claude', 'skills');
|
|
6
|
+
export const claudeScripts = path.join(home, '.claude', 'scripts');
|
|
7
|
+
export const claudeSettings = path.join(home, '.claude', 'settings.json');
|
|
8
|
+
export const codexSkills = path.join(home, '.codex', 'skills');
|
|
9
|
+
export const codexHooks = path.join(home, '.codex', 'hooks');
|
|
10
|
+
export const codexHooksFile = path.join(home, '.codex', 'hooks.json');
|
|
11
|
+
export const stateFile = path.join(home, '.sdd-state.json');
|
|
12
|
+
export function getPlatformPaths(agent, scope = 'global', projectPath = process.cwd()) {
|
|
13
|
+
const base = scope === 'global' ? homedir() : projectPath;
|
|
14
|
+
switch (agent) {
|
|
15
|
+
case 'claude':
|
|
16
|
+
return {
|
|
17
|
+
id: 'claude',
|
|
18
|
+
name: 'Claude Code',
|
|
19
|
+
skillsDir: path.join(base, '.claude', 'skills'),
|
|
20
|
+
rulesDir: path.join(base, '.claude', 'rules'),
|
|
21
|
+
scriptsDir: path.join(base, '.claude', 'scripts'),
|
|
22
|
+
promptsDir: path.join(base, '.claude', 'commands'),
|
|
23
|
+
settingsFile: path.join(base, '.claude', 'settings.json'),
|
|
24
|
+
};
|
|
25
|
+
case 'codex':
|
|
26
|
+
return {
|
|
27
|
+
id: 'codex',
|
|
28
|
+
name: 'Codex',
|
|
29
|
+
skillsDir: path.join(base, '.codex', 'skills'),
|
|
30
|
+
rulesDir: path.join(base, '.codex', 'rules'),
|
|
31
|
+
scriptsDir: path.join(base, '.codex', 'hooks'),
|
|
32
|
+
promptsDir: path.join(base, '.codex', 'prompts'),
|
|
33
|
+
settingsFile: path.join(base, '.codex', 'hooks.json'),
|
|
34
|
+
};
|
|
35
|
+
case 'opencode': {
|
|
36
|
+
const root = scope === 'global'
|
|
37
|
+
? path.join(homedir(), '.config', 'opencode')
|
|
38
|
+
: path.join(projectPath, '.opencode');
|
|
39
|
+
return {
|
|
40
|
+
id: 'opencode',
|
|
41
|
+
name: 'OpenCode',
|
|
42
|
+
skillsDir: path.join(root, 'skills'),
|
|
43
|
+
rulesDir: path.join(root, 'rules'),
|
|
44
|
+
scriptsDir: path.join(root, 'scripts'),
|
|
45
|
+
promptsDir: path.join(root, 'commands'),
|
|
46
|
+
settingsFile: scope === 'global'
|
|
47
|
+
? path.join(root, 'opencode.json')
|
|
48
|
+
: path.join(projectPath, 'opencode.json'),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
default:
|
|
52
|
+
throw new Error(`Unknown agent: ${agent}. Expected 'claude', 'codex', or 'opencode'.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/platform/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import spawn from 'cross-spawn';
|
|
2
|
+
export function runCommand(command, args, options = {}) {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
const child = spawn(command, args, {
|
|
5
|
+
cwd: options.cwd,
|
|
6
|
+
env: { ...process.env, ...(options.env ?? {}) },
|
|
7
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
8
|
+
shell: process.platform === 'win32',
|
|
9
|
+
});
|
|
10
|
+
let stdout = '';
|
|
11
|
+
let stderr = '';
|
|
12
|
+
child.stdout?.on('data', (data) => { stdout += data.toString(); });
|
|
13
|
+
child.stderr?.on('data', (data) => { stderr += data.toString(); });
|
|
14
|
+
const timeout = options.timeout ?? 120_000;
|
|
15
|
+
const timer = setTimeout(() => {
|
|
16
|
+
child.kill('SIGKILL');
|
|
17
|
+
reject(new Error(`Command timed out after ${timeout}ms: ${command} ${args.join(' ')}`));
|
|
18
|
+
}, timeout);
|
|
19
|
+
child.on('close', (code) => {
|
|
20
|
+
clearTimeout(timer);
|
|
21
|
+
resolve({ code: code ?? 1, stdout, stderr });
|
|
22
|
+
});
|
|
23
|
+
child.on('error', (err) => {
|
|
24
|
+
clearTimeout(timer);
|
|
25
|
+
reject(err);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/platform/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,aAAa,CAAC;AAQhC,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,UAAuE,EAAE;IAEzE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAC/C,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;QAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,OAAO,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chenmk/superflow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "SuperBridge Flow workflow CLI for Claude Code, Codex, and OpenCode",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"node": ">=20"
|
|
24
24
|
},
|
|
25
25
|
"bin": {
|
|
26
|
-
"superflow": "dist/cli
|
|
26
|
+
"superflow": "dist/app/cli.js"
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist",
|