@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.
Files changed (111) hide show
  1. package/dist/app/cli.js +215 -0
  2. package/dist/app/cli.js.map +1 -0
  3. package/dist/app/commands/archive.js +6 -0
  4. package/dist/app/commands/archive.js.map +1 -0
  5. package/dist/app/commands/check.js +123 -0
  6. package/dist/app/commands/check.js.map +1 -0
  7. package/dist/app/commands/clarify.js +6 -0
  8. package/dist/app/commands/clarify.js.map +1 -0
  9. package/dist/app/commands/config.js +103 -0
  10. package/dist/app/commands/config.js.map +1 -0
  11. package/dist/app/commands/design.js +28 -0
  12. package/dist/app/commands/design.js.map +1 -0
  13. package/dist/app/commands/docs.js +6 -0
  14. package/dist/app/commands/docs.js.map +1 -0
  15. package/dist/app/commands/doctor.js +494 -0
  16. package/dist/app/commands/doctor.js.map +1 -0
  17. package/dist/app/commands/implement.js +6 -0
  18. package/dist/app/commands/implement.js.map +1 -0
  19. package/dist/app/commands/init.js +520 -0
  20. package/dist/app/commands/init.js.map +1 -0
  21. package/dist/app/commands/pipeline.js +6 -0
  22. package/dist/app/commands/pipeline.js.map +1 -0
  23. package/dist/app/commands/scan.js +63 -0
  24. package/dist/app/commands/scan.js.map +1 -0
  25. package/dist/app/commands/status.js +192 -0
  26. package/dist/app/commands/status.js.map +1 -0
  27. package/dist/app/commands/uninstall.js +214 -0
  28. package/dist/app/commands/uninstall.js.map +1 -0
  29. package/dist/app/commands/update.js +193 -0
  30. package/dist/app/commands/update.js.map +1 -0
  31. package/dist/app/commands/verify.js +6 -0
  32. package/dist/app/commands/verify.js.map +1 -0
  33. package/dist/cli/index.js +1 -1
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/commands/archive.js +1 -1
  36. package/dist/commands/archive.js.map +1 -1
  37. package/dist/commands/clarify.js +1 -1
  38. package/dist/commands/clarify.js.map +1 -1
  39. package/dist/commands/design.js +1 -1
  40. package/dist/commands/design.js.map +1 -1
  41. package/dist/commands/docs.js +1 -1
  42. package/dist/commands/docs.js.map +1 -1
  43. package/dist/commands/doctor.js +4 -3
  44. package/dist/commands/doctor.js.map +1 -1
  45. package/dist/commands/implement.js +1 -1
  46. package/dist/commands/implement.js.map +1 -1
  47. package/dist/commands/init.js +13 -12
  48. package/dist/commands/init.js.map +1 -1
  49. package/dist/commands/pipeline.js +1 -1
  50. package/dist/commands/pipeline.js.map +1 -1
  51. package/dist/commands/scan.js +2 -2
  52. package/dist/commands/scan.js.map +1 -1
  53. package/dist/commands/status.js +1 -1
  54. package/dist/commands/status.js.map +1 -1
  55. package/dist/commands/uninstall.js +6 -5
  56. package/dist/commands/uninstall.js.map +1 -1
  57. package/dist/commands/update.js +10 -9
  58. package/dist/commands/update.js.map +1 -1
  59. package/dist/commands/verify.js +1 -1
  60. package/dist/commands/verify.js.map +1 -1
  61. package/dist/core/dependencies.js +1 -1
  62. package/dist/core/dependencies.js.map +1 -1
  63. package/dist/core/detect.js +0 -60
  64. package/dist/core/detect.js.map +1 -1
  65. package/dist/core/skill-check.js +3 -2
  66. package/dist/core/skill-check.js.map +1 -1
  67. package/dist/domains/agent.js +64 -0
  68. package/dist/domains/agent.js.map +1 -0
  69. package/dist/domains/config/cli-help.js +98 -0
  70. package/dist/domains/config/cli-help.js.map +1 -0
  71. package/dist/domains/config/context.js +123 -0
  72. package/dist/domains/config/context.js.map +1 -0
  73. package/dist/domains/config/i18n.js +105 -0
  74. package/dist/domains/config/i18n.js.map +1 -0
  75. package/dist/domains/config/manifest.js +21 -0
  76. package/dist/domains/config/manifest.js.map +1 -0
  77. package/dist/domains/deps.js +146 -0
  78. package/dist/domains/deps.js.map +1 -0
  79. package/dist/domains/hook.js +134 -0
  80. package/dist/domains/hook.js.map +1 -0
  81. package/dist/domains/intent.js +69 -0
  82. package/dist/domains/intent.js.map +1 -0
  83. package/dist/domains/run-state.js +47 -0
  84. package/dist/domains/run-state.js.map +1 -0
  85. package/dist/domains/skill/assets.js +27 -0
  86. package/dist/domains/skill/assets.js.map +1 -0
  87. package/dist/domains/skill/check.js +32 -0
  88. package/dist/domains/skill/check.js.map +1 -0
  89. package/dist/domains/skill/deploy.js +62 -0
  90. package/dist/domains/skill/deploy.js.map +1 -0
  91. package/dist/domains/skill/prompts.js +20 -0
  92. package/dist/domains/skill/prompts.js.map +1 -0
  93. package/dist/domains/skill/rules.js +17 -0
  94. package/dist/domains/skill/rules.js.map +1 -0
  95. package/dist/domains/skill/scripts.js +48 -0
  96. package/dist/domains/skill/scripts.js.map +1 -0
  97. package/dist/domains/state-events.js +32 -0
  98. package/dist/domains/state-events.js.map +1 -0
  99. package/dist/domains/state.js +54 -0
  100. package/dist/domains/state.js.map +1 -0
  101. package/dist/domains/workflow-state.js +47 -0
  102. package/dist/domains/workflow-state.js.map +1 -0
  103. package/dist/platform/fs.js +45 -0
  104. package/dist/platform/fs.js.map +1 -0
  105. package/dist/platform/os.js +14 -0
  106. package/dist/platform/os.js.map +1 -0
  107. package/dist/platform/paths.js +55 -0
  108. package/dist/platform/paths.js.map +1 -0
  109. package/dist/platform/process.js +29 -0
  110. package/dist/platform/process.js.map +1 -0
  111. 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.1.3",
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/index.js"
26
+ "superflow": "dist/app/cli.js"
27
27
  },
28
28
  "files": [
29
29
  "dist",