flowspec 0.1.0 → 0.1.1

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.md CHANGED
@@ -39,9 +39,11 @@ flowspec init
39
39
  This creates:
40
40
  - `flowspec.config.yaml` - Project configuration
41
41
  - `specs/example.flow.yaml` - Sample flow to get started
42
- - `.claude/settings.local.json` - Hooks to protect specs from AI modification
42
+ - `.claude/settings.local.json` - PreToolUse hook to protect specs from AI modification
43
43
  - Updates `package.json` with `test:e2e` script
44
44
 
45
+ Running `init` again is safe: existing files are skipped, and the protection hook is merged into an existing `settings.local.json` without overwriting your other settings.
46
+
45
47
  ### Run Flows
46
48
 
47
49
  ```bash
package/dist/init.d.ts CHANGED
@@ -5,6 +5,7 @@ export interface InitFileResult {
5
5
  path: string;
6
6
  created: boolean;
7
7
  skipped: boolean;
8
+ merged?: boolean;
8
9
  error?: string;
9
10
  }
10
11
  /**
@@ -22,10 +23,24 @@ export declare const DEFAULT_CONFIG_CONTENT = "baseUrl: http://localhost:3000\nt
22
23
  * Default content for example flow file
23
24
  */
24
25
  export declare const DEFAULT_EXAMPLE_FLOW_CONTENT = "name: example-flow\ndescription: Example flow - customize this for your app\nsteps:\n - visit: /\nexpect:\n - visible: Welcome\n";
26
+ /**
27
+ * Marker string used to detect if the FlowSpec hook is already present
28
+ */
29
+ export declare const FLOWSPEC_HOOK_MARKER = "Flow specs are immutable";
30
+ /**
31
+ * PreToolUse hook with correct Claude Code hooks schema
32
+ */
33
+ export declare const FLOWSPEC_PRETOOLUSE_HOOK: {
34
+ matcher: string;
35
+ hooks: {
36
+ type: string;
37
+ command: string;
38
+ }[];
39
+ };
25
40
  /**
26
41
  * Default content for Claude settings to protect specs
27
42
  */
28
- export declare const DEFAULT_CLAUDE_SETTINGS_CONTENT = "{\n \"hooks\": {\n \"PreToolUse\": [{\n \"matcher\": { \"tool\": [\"Edit\", \"Write\"], \"path\": \"specs/**/*.flow.yaml\" },\n \"command\": \"echo '\u274C Flow specs are immutable. Fix the implementation, not the spec.' && exit 1\"\n }]\n }\n}\n";
43
+ export declare const DEFAULT_CLAUDE_SETTINGS_CONTENT: string;
29
44
  /**
30
45
  * Initialize FlowSpec in a project directory
31
46
  * Creates configuration files and example flow
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,uEAGlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,uIAMxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,6QAQ3C,CAAC;AAiGF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,UAAU,GAAE,MAAsB,GAAG,UAAU,CAgC1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAuC3D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,uEAGlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,uIAMxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;CAQpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,QAIvC,CAAC;AA2LN;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,UAAU,GAAE,MAAsB,GAAG,UAAU,CA6B1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAyC3D"}
package/dist/init.js CHANGED
@@ -17,18 +17,26 @@ steps:
17
17
  expect:
18
18
  - visible: Welcome
19
19
  `;
20
+ /**
21
+ * Marker string used to detect if the FlowSpec hook is already present
22
+ */
23
+ export const FLOWSPEC_HOOK_MARKER = "Flow specs are immutable";
24
+ /**
25
+ * PreToolUse hook with correct Claude Code hooks schema
26
+ */
27
+ export const FLOWSPEC_PRETOOLUSE_HOOK = {
28
+ matcher: "Edit|Write",
29
+ hooks: [
30
+ {
31
+ type: "command",
32
+ command: `node -e "const j=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));if(/\\bspecs\\/.*\\.flow\\.yaml$/.test(j.tool_input?.file_path||'')){console.log(JSON.stringify({decision:'block',reason:'Flow specs are immutable. Fix the implementation, not the spec.'}))}"`,
33
+ },
34
+ ],
35
+ };
20
36
  /**
21
37
  * Default content for Claude settings to protect specs
22
38
  */
23
- export const DEFAULT_CLAUDE_SETTINGS_CONTENT = `{
24
- "hooks": {
25
- "PreToolUse": [{
26
- "matcher": { "tool": ["Edit", "Write"], "path": "specs/**/*.flow.yaml" },
27
- "command": "echo '❌ Flow specs are immutable. Fix the implementation, not the spec.' && exit 1"
28
- }]
29
- }
30
- }
31
- `;
39
+ export const DEFAULT_CLAUDE_SETTINGS_CONTENT = `${JSON.stringify({ hooks: { PreToolUse: [FLOWSPEC_PRETOOLUSE_HOOK] } }, null, 2)}\n`;
32
40
  /**
33
41
  * Safely create a directory if it doesn't exist
34
42
  */
@@ -104,6 +112,82 @@ function updatePackageJson(projectDir) {
104
112
  }
105
113
  return result;
106
114
  }
115
+ /**
116
+ * Check if a parsed settings object already contains the FlowSpec hook
117
+ */
118
+ function hasFlowSpecHook(settings) {
119
+ const hooks = settings.hooks;
120
+ if (!hooks || typeof hooks !== "object")
121
+ return false;
122
+ const preToolUse = hooks.PreToolUse;
123
+ if (!Array.isArray(preToolUse))
124
+ return false;
125
+ return preToolUse.some((entry) => {
126
+ if (!entry || typeof entry !== "object")
127
+ return false;
128
+ const nested = entry.hooks;
129
+ if (!Array.isArray(nested))
130
+ return false;
131
+ return nested.some((h) => h &&
132
+ typeof h === "object" &&
133
+ typeof h.command === "string" &&
134
+ h.command.includes(FLOWSPEC_HOOK_MARKER));
135
+ });
136
+ }
137
+ /**
138
+ * Ensure the Claude settings file contains the FlowSpec protection hook.
139
+ * Creates the file if missing, merges the hook if the file exists but lacks it.
140
+ */
141
+ function ensureClaudeHook(projectDir) {
142
+ const settingsPath = join(projectDir, ".claude", "settings.local.json");
143
+ const result = {
144
+ path: settingsPath,
145
+ created: false,
146
+ skipped: false,
147
+ };
148
+ try {
149
+ if (!existsSync(settingsPath)) {
150
+ // File doesn't exist - create with defaults
151
+ const parentDir = dirname(settingsPath);
152
+ ensureDirectory(parentDir);
153
+ writeFileSync(settingsPath, DEFAULT_CLAUDE_SETTINGS_CONTENT, "utf-8");
154
+ result.created = true;
155
+ return result;
156
+ }
157
+ // File exists - try to parse and merge
158
+ const content = readFileSync(settingsPath, "utf-8");
159
+ let settings;
160
+ try {
161
+ settings = JSON.parse(content);
162
+ }
163
+ catch {
164
+ // Can't parse - skip silently to preserve the file
165
+ result.skipped = true;
166
+ return result;
167
+ }
168
+ // Check if hook is already present
169
+ if (hasFlowSpecHook(settings)) {
170
+ result.skipped = true;
171
+ return result;
172
+ }
173
+ // Merge hook into existing settings
174
+ if (!settings.hooks || typeof settings.hooks !== "object") {
175
+ settings.hooks = {};
176
+ }
177
+ const hooks = settings.hooks;
178
+ if (!Array.isArray(hooks.PreToolUse)) {
179
+ hooks.PreToolUse = [];
180
+ }
181
+ hooks.PreToolUse.push(FLOWSPEC_PRETOOLUSE_HOOK);
182
+ writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`, "utf-8");
183
+ result.merged = true;
184
+ }
185
+ catch (error) {
186
+ result.error =
187
+ error instanceof Error ? error.message : "Unknown error occurred";
188
+ }
189
+ return result;
190
+ }
107
191
  /**
108
192
  * Initialize FlowSpec in a project directory
109
193
  * Creates configuration files and example flow
@@ -119,8 +203,8 @@ export function initProject(projectDir = process.cwd()) {
119
203
  // 2. Create specs/example.flow.yaml
120
204
  const exampleFlowResult = createFileIfNotExists(join(projectDir, "specs", "example.flow.yaml"), DEFAULT_EXAMPLE_FLOW_CONTENT);
121
205
  files.push(exampleFlowResult);
122
- // 3. Create .claude/settings.local.json
123
- const claudeSettingsResult = createFileIfNotExists(join(projectDir, ".claude", "settings.local.json"), DEFAULT_CLAUDE_SETTINGS_CONTENT);
206
+ // 3. Create or merge .claude/settings.local.json
207
+ const claudeSettingsResult = ensureClaudeHook(projectDir);
124
208
  files.push(claudeSettingsResult);
125
209
  // 4. Update package.json if it exists
126
210
  const packageJsonResult = updatePackageJson(projectDir);
@@ -152,6 +236,9 @@ export function formatInitResult(result) {
152
236
  }
153
237
  lines.push(`· Skipped ${displayPath} (already exists)`);
154
238
  }
239
+ else if (file.merged) {
240
+ lines.push(`✓ Merged FlowSpec hook into ${displayPath}`);
241
+ }
155
242
  else if (file.created) {
156
243
  if (file.path.endsWith("package.json")) {
157
244
  lines.push(`✓ ${displayPath}`);
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqB1C;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;CAGrC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;CAM3C,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE;QACL;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,8QAA8Q;SACxR;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,IAAI,CAAC,SAAS,CAC9D,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,EACrD,IAAI,EACJ,CAAC,CACF,IAAI,CAAC;AAEN;;GAEG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAC5B,QAAgB,EAChB,OAAe;IAEf,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK;KACf,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,eAAe,CAAC,SAAS,CAAC,CAAC;QAE3B,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK;YACV,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK;KACf,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAE3D,+BAA+B;QAC/B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpD,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAiC,CAAC;QAEtD,mCAAmC;QACnC,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,0BAA0B;QAC1B,OAAO,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC;QAErC,oCAAoC;QACpC,aAAa,CACX,eAAe,EACf,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACnC,OAAO,CACR,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK;YACV,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAiC;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAA4C,CAAC;IACpE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAc,EAAE,EAAE;QACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,MAAM,GAAI,KAAiC,CAAC,KAAK,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,OAAO,MAAM,CAAC,IAAI,CAChB,CAAC,CAAU,EAAE,EAAE,CACb,CAAC;YACD,OAAO,CAAC,KAAK,QAAQ;YACrB,OAAQ,CAA6B,CAAC,OAAO,KAAK,QAAQ;YACxD,CAA6B,CAAC,OAAkB,CAAC,QAAQ,CACzD,oBAAoB,CACrB,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACxE,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK;KACf,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,4CAA4C;YAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YACxC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,aAAa,CAAC,YAAY,EAAE,+BAA+B,EAAE,OAAO,CAAC,CAAC;YACtE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,uCAAuC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,QAAiC,CAAC;QACtC,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;YACnD,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,mCAAmC;QACnC,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1D,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAgC,CAAC;QAExD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;QACxB,CAAC;QACA,KAAK,CAAC,UAAwB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAE/D,aAAa,CACX,YAAY,EACZ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACxC,OAAO,CACR,CAAC;QACF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK;YACV,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,aAAqB,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,iCAAiC;IACjC,MAAM,YAAY,GAAG,qBAAqB,CACxC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,EACxC,sBAAsB,CACvB,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEzB,oCAAoC;IACpC,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAC9C,4BAA4B,CAC7B,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE9B,iDAAiD;IACjD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEjC,sCAAsC;IACtC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE9B,4BAA4B;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAEd,+CAA+C;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YACpD,CAAC,CAAC,uCAAuC;YACzC,CAAC,CAAC,YAAY,CAAC;QAEjB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,WAAW,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,4FAA4F;gBAC5F,SAAS;YACX,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,mBAAmB,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowspec",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Immutable user flow specifications for the age of agentic coding",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -8,12 +8,22 @@
8
8
  "bin": {
9
9
  "flowspec": "./dist/index.js"
10
10
  },
11
- "files": ["dist"],
11
+ "files": [
12
+ "dist"
13
+ ],
12
14
  "repository": {
13
15
  "type": "git",
14
16
  "url": "https://github.com/queso/FlowSpec"
15
17
  },
16
- "keywords": ["testing", "e2e", "flow", "specs", "yaml", "claude", "ai"],
18
+ "keywords": [
19
+ "testing",
20
+ "e2e",
21
+ "flow",
22
+ "specs",
23
+ "yaml",
24
+ "claude",
25
+ "ai"
26
+ ],
17
27
  "author": "Josh Owens",
18
28
  "scripts": {
19
29
  "dev": "bun run src/index.ts",