flowbook 0.1.1 → 0.1.3

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/README.zh-CN.md CHANGED
@@ -12,9 +12,6 @@
12
12
  ## 快速开始
13
13
 
14
14
  ```bash
15
- # 安装
16
- npm install -D flowbook
17
-
18
15
  # 初始化 — 添加脚本 + 示例文件
19
16
  npx flowbook@latest init
20
17
 
@@ -92,6 +89,72 @@ Flowbook 默认扫描以下模式:
92
89
 
93
90
  忽略 `node_modules/`、`.git/` 和 `dist/`。
94
91
 
92
+ ## AI Agent Skill
93
+
94
+ `flowbook init` 自动将 AI 代理技能安装到所有支持的编码代理目录中。
95
+ 当编码代理(Claude Code、OpenAI Codex、VS Code Copilot、Cursor、Gemini CLI 等)检测到你的提示中有 **"flowbook"** 关键字时,它会:
96
+
97
+ 1. 分析你的代码库中的逻辑流(API 路由、认证、状态管理、业务逻辑等)
98
+ 2. 如果尚未初始化,设置 Flowbook
99
+ 3. 为每个重要流程生成包含 Mermaid 图表的 `.flow.md` 文件
100
+ 4. 验证构建
101
+
102
+ ### 手动技能安装
103
+
104
+ 如果你没有使用 `flowbook init`,请手动复制技能:
105
+
106
+ ```bash
107
+ # Claude Code
108
+ mkdir -p .claude/skills/flowbook
109
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .claude/skills/flowbook/
110
+
111
+ # OpenAI Codex
112
+ mkdir -p .agents/skills/flowbook
113
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .agents/skills/flowbook/
114
+
115
+ # VS Code / GitHub Copilot
116
+ mkdir -p .github/skills/flowbook
117
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .github/skills/flowbook/
118
+
119
+ # Google Antigravity
120
+ mkdir -p .agent/skills/flowbook
121
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .agent/skills/flowbook/
122
+
123
+ # Gemini CLI
124
+ mkdir -p .gemini/skills/flowbook
125
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .gemini/skills/flowbook/
126
+
127
+ # Cursor
128
+ mkdir -p .cursor/skills/flowbook
129
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .cursor/skills/flowbook/
130
+
131
+ # Windsurf (Codeium)
132
+ mkdir -p .windsurf/skills/flowbook
133
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .windsurf/skills/flowbook/
134
+
135
+ # AmpCode
136
+ mkdir -p .amp/skills/flowbook
137
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .amp/skills/flowbook/
138
+
139
+ # OpenCode / oh-my-opencode
140
+ mkdir -p .opencode/skills/flowbook
141
+ cp node_modules/flowbook/src/skills/flowbook/SKILL.md .opencode/skills/flowbook/
142
+ ```
143
+
144
+ ### 兼容代理
145
+
146
+ | 代理 | 技能位置 |
147
+ |-------|---------------|
148
+ | Claude Code | `.claude/skills/flowbook/SKILL.md` |
149
+ | OpenAI Codex | `.agents/skills/flowbook/SKILL.md` |
150
+ | VS Code / GitHub Copilot | `.github/skills/flowbook/SKILL.md` |
151
+ | Google Antigravity | `.agent/skills/flowbook/SKILL.md` |
152
+ | Gemini CLI | `.gemini/skills/flowbook/SKILL.md` |
153
+ | Cursor | `.cursor/skills/flowbook/SKILL.md` |
154
+ | Windsurf (Codeium) | `.windsurf/skills/flowbook/SKILL.md` |
155
+ | AmpCode | `.amp/skills/flowbook/SKILL.md` |
156
+ | OpenCode / oh-my-opencode | `.opencode/skills/flowbook/SKILL.md` |
157
+
95
158
  ## 工作原理
96
159
 
97
160
  ```
package/dist/cli.js CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/node/init.ts
4
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
- import { resolve } from "path";
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from "fs";
5
+ import { resolve, dirname } from "path";
6
6
  import { execSync } from "child_process";
7
+ import { fileURLToPath } from "url";
8
+ var __dirname = dirname(fileURLToPath(import.meta.url));
7
9
  var EXAMPLE_FLOW = `---
8
10
  title: Example Flow
9
11
  category: Getting Started
@@ -64,6 +66,51 @@ async function initFlowbook() {
64
66
  } else {
65
67
  console.log(" \u2713 Example flow already exists");
66
68
  }
69
+ const gitignorePath = resolve(cwd, ".gitignore");
70
+ if (existsSync(gitignorePath)) {
71
+ const gitignore = readFileSync(gitignorePath, "utf-8");
72
+ if (!gitignore.includes("flowbook-static")) {
73
+ writeFileSync(gitignorePath, gitignore.trimEnd() + "\nflowbook-static\n");
74
+ console.log(" \u2713 Added flowbook-static to .gitignore");
75
+ }
76
+ }
77
+ const skillSrc = resolve(__dirname, "..", "src", "skills", "flowbook", "SKILL.md");
78
+ const skillDirs = [
79
+ resolve(cwd, ".claude", "skills", "flowbook"),
80
+ // Claude Code
81
+ resolve(cwd, ".agents", "skills", "flowbook"),
82
+ // OpenAI Codex / cross-tool alias
83
+ resolve(cwd, ".github", "skills", "flowbook"),
84
+ // VS Code / GitHub Copilot
85
+ resolve(cwd, ".agent", "skills", "flowbook"),
86
+ // Google Antigravity
87
+ resolve(cwd, ".gemini", "skills", "flowbook"),
88
+ // Gemini CLI
89
+ resolve(cwd, ".cursor", "skills", "flowbook"),
90
+ // Cursor
91
+ resolve(cwd, ".windsurf", "skills", "flowbook"),
92
+ // Windsurf (Codeium)
93
+ resolve(cwd, ".amp", "skills", "flowbook"),
94
+ // AmpCode
95
+ resolve(cwd, ".opencode", "skills", "flowbook")
96
+ // OpenCode / oh-my-opencode
97
+ ];
98
+ if (existsSync(skillSrc)) {
99
+ let installed = 0;
100
+ for (const dir of skillDirs) {
101
+ const dest = resolve(dir, "SKILL.md");
102
+ if (!existsSync(dest)) {
103
+ mkdirSync(dir, { recursive: true });
104
+ copyFileSync(skillSrc, dest);
105
+ installed++;
106
+ }
107
+ }
108
+ if (installed > 0) {
109
+ console.log(` \u2713 Installed AI agent skill to ${installed} agent directories`);
110
+ } else {
111
+ console.log(" \u2713 AI agent skills already installed");
112
+ }
113
+ }
67
114
  const run = pm === "yarn" ? "yarn" : `${pm} run`;
68
115
  console.log("");
69
116
  console.log(" Next steps:");
@@ -181,11 +228,11 @@ function flowbookPlugin(options = {}) {
181
228
  }
182
229
 
183
230
  // src/node/server.ts
184
- import { resolve as resolve2, dirname } from "path";
185
- import { fileURLToPath } from "url";
186
- var __dirname = dirname(fileURLToPath(import.meta.url));
231
+ import { resolve as resolve2, dirname as dirname2 } from "path";
232
+ import { fileURLToPath as fileURLToPath2 } from "url";
233
+ var __dirname2 = dirname2(fileURLToPath2(import.meta.url));
187
234
  function getClientDir() {
188
- return resolve2(__dirname, "..", "src", "client");
235
+ return resolve2(__dirname2, "..", "src", "client");
189
236
  }
190
237
  function createConfig(options) {
191
238
  const cwd = options.cwd ?? process.cwd();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowbook",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "flowbook": "./dist/cli.js"
@@ -12,7 +12,9 @@
12
12
  "scripts": {
13
13
  "dev": "vite",
14
14
  "build": "tsup",
15
- "preview": "vite preview"
15
+ "preview": "vite preview",
16
+ "flowbook": "flowbook dev",
17
+ "build-flowbook": "flowbook build"
16
18
  },
17
19
  "dependencies": {
18
20
  "@tailwindcss/vite": "^4.0.0",
@@ -29,6 +31,7 @@
29
31
  "@types/node": "^25.3.3",
30
32
  "@types/react": "^19.0.0",
31
33
  "@types/react-dom": "^19.0.0",
34
+ "flowbook": "^0.1.2",
32
35
  "tsup": "^8.0.0",
33
36
  "typescript": "^5.7.0"
34
37
  }
package/src/node/init.ts CHANGED
@@ -1,6 +1,9 @@
1
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
2
- import { resolve } from "node:path";
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from "node:fs";
2
+ import { resolve, dirname } from "node:path";
3
3
  import { execSync } from "node:child_process";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
4
7
 
5
8
  const EXAMPLE_FLOW = `---
6
9
  title: Example Flow
@@ -75,6 +78,47 @@ export async function initFlowbook() {
75
78
  console.log(" ✓ Example flow already exists");
76
79
  }
77
80
 
81
+ // 4. Add flowbook-static to .gitignore
82
+ const gitignorePath = resolve(cwd, ".gitignore");
83
+ if (existsSync(gitignorePath)) {
84
+ const gitignore = readFileSync(gitignorePath, "utf-8");
85
+ if (!gitignore.includes("flowbook-static")) {
86
+ writeFileSync(gitignorePath, gitignore.trimEnd() + "\nflowbook-static\n");
87
+ console.log(" ✓ Added flowbook-static to .gitignore");
88
+ }
89
+ }
90
+
91
+ // 5. Install AI agent skill to all supported agent directories
92
+ const skillSrc = resolve(__dirname, "..", "src", "skills", "flowbook", "SKILL.md");
93
+ const skillDirs = [
94
+ resolve(cwd, ".claude", "skills", "flowbook"), // Claude Code
95
+ resolve(cwd, ".agents", "skills", "flowbook"), // OpenAI Codex / cross-tool alias
96
+ resolve(cwd, ".github", "skills", "flowbook"), // VS Code / GitHub Copilot
97
+ resolve(cwd, ".agent", "skills", "flowbook"), // Google Antigravity
98
+ resolve(cwd, ".gemini", "skills", "flowbook"), // Gemini CLI
99
+ resolve(cwd, ".cursor", "skills", "flowbook"), // Cursor
100
+ resolve(cwd, ".windsurf", "skills", "flowbook"), // Windsurf (Codeium)
101
+ resolve(cwd, ".amp", "skills", "flowbook"), // AmpCode
102
+ resolve(cwd, ".opencode", "skills", "flowbook"), // OpenCode / oh-my-opencode
103
+ ];
104
+
105
+ if (existsSync(skillSrc)) {
106
+ let installed = 0;
107
+ for (const dir of skillDirs) {
108
+ const dest = resolve(dir, "SKILL.md");
109
+ if (!existsSync(dest)) {
110
+ mkdirSync(dir, { recursive: true });
111
+ copyFileSync(skillSrc, dest);
112
+ installed++;
113
+ }
114
+ }
115
+ if (installed > 0) {
116
+ console.log(` \u2713 Installed AI agent skill to ${installed} agent directories`);
117
+ } else {
118
+ console.log(" \u2713 AI agent skills already installed");
119
+ }
120
+ }
121
+
78
122
  const run = pm === "yarn" ? "yarn" : `${pm} run`;
79
123
  console.log("");
80
124
  console.log(" Next steps:");