flow-lang 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Abraham Oluwa
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,256 @@
1
+ # Flow
2
+
3
+ ```
4
+ # Order Processing Workflow
5
+ # This is real, runnable Flow code.
6
+
7
+ config:
8
+ name: "Order Processing"
9
+ version: 1
10
+ timeout: 5 minutes
11
+
12
+ services:
13
+ Inventory is an API at "https://inventory.example.com/api"
14
+ Stripe is a plugin "stripe-payments"
15
+ Notifier is an AI using "openai/gpt-4o"
16
+
17
+ workflow:
18
+ trigger: when a new order is placed
19
+
20
+ set order-id to order.id
21
+ set items to order.items
22
+ log "Processing order {order-id}"
23
+
24
+ step CheckInventory:
25
+ for each item in items:
26
+ check stock using Inventory with product item
27
+
28
+ step CalculateTotal:
29
+ set subtotal to order.subtotal
30
+ set tax to subtotal times 0.08
31
+ set total to subtotal plus tax
32
+
33
+ step ChargePayment:
34
+ charge payment using Stripe with amount total and currency "usd"
35
+ on failure:
36
+ retry 3 times waiting 5 seconds
37
+ if still failing:
38
+ reject with "We could not process your payment. Please try again."
39
+
40
+ step SendConfirmation:
41
+ ask Notifier to write a friendly order confirmation
42
+ save the result as confirmation
43
+ log confirmation
44
+
45
+ complete with status "processed" and order-id order-id and total total
46
+ ```
47
+
48
+ **Flow is a programming language for people who aren't programmers.** It lets operations teams, business analysts, and product managers write automated workflows in structured English — no semicolons, no brackets, no classes. If you can write a process document, you can write a Flow program.
49
+
50
+ ## Installation
51
+
52
+ ```bash
53
+ npm install -g flow-lang
54
+ ```
55
+
56
+ Requires Node.js 18 or later.
57
+
58
+ ## Quick Start
59
+
60
+ ```bash
61
+ # Check a file for errors
62
+ flow check my-workflow.flow
63
+
64
+ # Run with mock services (no real API calls)
65
+ flow test my-workflow.flow
66
+
67
+ # Run for real
68
+ flow run my-workflow.flow --input '{"order": {"id": "123", "items": ["A", "B"], "subtotal": 100}}'
69
+ ```
70
+
71
+ ## CLI Commands
72
+
73
+ ```bash
74
+ flow check <file> # Parse and validate (no execution)
75
+ flow run <file> # Execute a .flow file
76
+ flow run <file> --input '<json>' # Pass trigger data as JSON
77
+ flow run <file> --verbose # Show detailed execution log
78
+ flow run <file> --mock # Use mock services instead of real APIs
79
+ flow run <file> --strict-env # Error on missing environment variables
80
+ flow test <file> # Dry-run with mock services
81
+ flow test <file> --verbose # Mock dry-run with execution log
82
+ ```
83
+
84
+ ## Language Overview
85
+
86
+ Flow has exactly **7 constructs** and **5 data types**. That's the whole language.
87
+
88
+ ### Service Calls
89
+
90
+ Call real REST APIs, AI models, webhooks, or plugins:
91
+
92
+ ```
93
+ verify email using EmailVerifier with address email
94
+ get user using GitHub at "/users/octocat"
95
+ charge payment using Stripe with amount total and currency "usd"
96
+ ```
97
+
98
+ ### Conditions
99
+
100
+ ```
101
+ if requested-amount is above 50000:
102
+ set risk-adjustment to 1.5
103
+ otherwise if requested-amount is above 20000:
104
+ set risk-adjustment to 0.75
105
+ otherwise:
106
+ set risk-adjustment to 0
107
+ ```
108
+
109
+ ### AI Requests
110
+
111
+ Ask an AI model to do something, and save the response:
112
+
113
+ ```
114
+ ask RiskAnalyst to assess the risk level of this loan application
115
+ save the result as risk-assessment
116
+ save the confidence as risk-confidence
117
+ ```
118
+
119
+ Works with OpenAI and Anthropic models out of the box.
120
+
121
+ ### Variables
122
+
123
+ ```
124
+ set name to "Alice"
125
+ set total to subtotal plus tax
126
+ set monthly-payment to amount times rate divided by 1200
127
+ set monthly-payment to monthly-payment rounded to 2
128
+ ```
129
+
130
+ ### Loops
131
+
132
+ ```
133
+ for each item in order.items:
134
+ check stock using Inventory with product item
135
+ ```
136
+
137
+ ### Named Steps
138
+
139
+ Organize your workflow into labeled sections:
140
+
141
+ ```
142
+ step VerifyIdentity:
143
+ verify identity using IdentityService with applicant applicant-id
144
+ log "Identity verified"
145
+ ```
146
+
147
+ ### Output
148
+
149
+ ```
150
+ complete with status "approved" and rate final-rate
151
+ reject with "We could not verify your identity at this time."
152
+ log "Processing order {order-id}"
153
+ ```
154
+
155
+ ### Comparisons and Math
156
+
157
+ Flow uses English words instead of symbols:
158
+
159
+ | Instead of | Flow uses |
160
+ |---|---|
161
+ | `==` | `is` |
162
+ | `!=` | `is not` |
163
+ | `>` | `is above` |
164
+ | `<` | `is below` |
165
+ | `>=` | `is at least` |
166
+ | `<=` | `is at most` |
167
+ | `+` | `plus` |
168
+ | `-` | `minus` |
169
+ | `*` | `times` |
170
+ | `/` | `divided by` |
171
+
172
+ ### Data Types
173
+
174
+ | Type | Example |
175
+ |---|---|
176
+ | Text | `"hello"`, `"Order {id} confirmed"` |
177
+ | Number | `42`, `3.14`, `0.08` |
178
+ | Boolean | `true`, `false` |
179
+ | List | `order.items` |
180
+ | Record | `order` (accessed via dot notation: `order.id`) |
181
+
182
+ There are no nulls. If a value doesn't exist, it's `empty` — and you can check for it with `is empty` or `is not empty`.
183
+
184
+ ## Services
185
+
186
+ Flow connects to real external services:
187
+
188
+ ```
189
+ services:
190
+ # REST APIs — verb inference maps English to HTTP methods
191
+ GitHub is an API at "https://api.github.com"
192
+
193
+ # AI agents — OpenAI and Anthropic supported
194
+ Analyst is an AI using "openai/gpt-4o"
195
+ Claude is an AI using "anthropic/claude-sonnet-4-20250514"
196
+
197
+ # Webhooks — always POST
198
+ SlackNotifier is a webhook at "https://hooks.slack.com/..."
199
+
200
+ # Plugins — stub connector for future plugin system
201
+ Stripe is a plugin "stripe-payments"
202
+ ```
203
+
204
+ ### API Keys
205
+
206
+ Create a `.env` file in your project root:
207
+
208
+ ```
209
+ OPENAI_API_KEY=sk-...
210
+ ANTHROPIC_API_KEY=sk-ant-...
211
+ ```
212
+
213
+ Flow loads `.env` automatically via dotenv. Access any environment variable with `env.VARIABLE_NAME`.
214
+
215
+ ## Error Messages
216
+
217
+ Flow doesn't show stack traces. Every error is written in plain English with the exact line, what went wrong, and how to fix it:
218
+
219
+ ```
220
+ Error in loan-application.flow, line 12:
221
+
222
+ verify the email using EmailChecker
223
+
224
+ I don't know what "EmailChecker" is. You haven't declared it
225
+ in your services block.
226
+
227
+ Did you mean "EmailVerifier"?
228
+
229
+ Hint: Every service must be declared at the top of your file:
230
+ services:
231
+ EmailChecker is an API at "https://..."
232
+ ```
233
+
234
+ ## Examples
235
+
236
+ The `examples/` directory has complete workflows:
237
+
238
+ - **email-verification.flow** — Validates a submitted email address
239
+ - **order-processing.flow** — Inventory check, payment, and confirmation
240
+ - **loan-application.flow** — Full pipeline: identity, credit, AI risk assessment, fraud screening, and approval
241
+
242
+ ## Contributing
243
+
244
+ ```bash
245
+ git clone https://github.com/AbrahamOluwa/flow-lang.git
246
+ cd flow-lang
247
+ npm install
248
+ npm run build
249
+ npm run test
250
+ ```
251
+
252
+ The test suite uses [Vitest](https://vitest.dev/) with 389 tests across all pipeline stages.
253
+
254
+ ## License
255
+
256
+ MIT
@@ -0,0 +1,3 @@
1
+ import { Program, FlowError } from "../types/index.js";
2
+ export declare function analyze(program: Program, source: string, fileName?: string): FlowError[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EAAE,SAAS,EAOrB,MAAM,mBAAmB,CAAC;AAO3B,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,SAAS,EAAE,CAyUnG"}
@@ -0,0 +1,268 @@
1
+ import { createError, findClosestMatch } from "../errors/index.js";
2
+ // ============================================================
3
+ // Analyzer
4
+ // ============================================================
5
+ export function analyze(program, source, fileName = "<input>") {
6
+ const errors = [];
7
+ // Collect declared service names
8
+ const declaredServices = new Set();
9
+ if (program.services) {
10
+ for (const decl of program.services.declarations) {
11
+ declaredServices.add(decl.name);
12
+ }
13
+ }
14
+ const serviceNames = [...declaredServices];
15
+ // Collect declared config keys
16
+ const declaredConfigKeys = new Set();
17
+ // Track step names for duplicate detection
18
+ const declaredSteps = new Set();
19
+ // Known config keys
20
+ const knownConfigKeys = new Set(["name", "version", "timeout", "description"]);
21
+ function createScope(parent) {
22
+ return { variables: new Set(), parent };
23
+ }
24
+ function defineVar(scope, name) {
25
+ scope.variables.add(name);
26
+ }
27
+ function isVarDefined(scope, name) {
28
+ let current = scope;
29
+ while (current) {
30
+ if (current.variables.has(name))
31
+ return true;
32
+ current = current.parent;
33
+ }
34
+ return false;
35
+ }
36
+ function allDefinedVars(scope) {
37
+ const vars = [];
38
+ let current = scope;
39
+ while (current) {
40
+ for (const v of current.variables) {
41
+ vars.push(v);
42
+ }
43
+ current = current.parent;
44
+ }
45
+ return vars;
46
+ }
47
+ // --------------------------------------------------------
48
+ // Error helpers
49
+ // --------------------------------------------------------
50
+ function addError(loc, message, suggestion, hint) {
51
+ errors.push(createError(fileName, loc.line, loc.column, message, source, { suggestion, hint }));
52
+ }
53
+ function addWarning(loc, message, suggestion, hint) {
54
+ errors.push(createError(fileName, loc.line, loc.column, message, source, { suggestion, hint, severity: "warning" }));
55
+ }
56
+ // --------------------------------------------------------
57
+ // Config validation
58
+ // --------------------------------------------------------
59
+ function analyzeConfig() {
60
+ if (!program.config)
61
+ return;
62
+ for (const entry of program.config.entries) {
63
+ // Duplicate config keys
64
+ if (declaredConfigKeys.has(entry.key)) {
65
+ addError(entry.loc, `Duplicate config key "${entry.key}". Each config key can only appear once.`);
66
+ }
67
+ declaredConfigKeys.add(entry.key);
68
+ // Unknown config keys
69
+ if (!knownConfigKeys.has(entry.key)) {
70
+ addWarning(entry.loc, `Unknown config key "${entry.key}".`, undefined, `Known config keys are: ${[...knownConfigKeys].join(", ")}`);
71
+ }
72
+ }
73
+ }
74
+ // --------------------------------------------------------
75
+ // Services validation
76
+ // --------------------------------------------------------
77
+ function analyzeServices() {
78
+ if (!program.services)
79
+ return;
80
+ const seen = new Set();
81
+ for (const decl of program.services.declarations) {
82
+ if (seen.has(decl.name)) {
83
+ addError(decl.loc, `Duplicate service name "${decl.name}". Each service must have a unique name.`);
84
+ }
85
+ seen.add(decl.name);
86
+ }
87
+ }
88
+ // --------------------------------------------------------
89
+ // Check service references
90
+ // --------------------------------------------------------
91
+ function checkServiceRef(name, loc) {
92
+ if (name === "")
93
+ return; // skip empty (parse error artifact)
94
+ if (declaredServices.has(name))
95
+ return;
96
+ const suggestion = findClosestMatch(name, serviceNames);
97
+ addError(loc, `I don't know what "${name}" is. You haven't declared it in your services block.`, suggestion ? `Did you mean "${suggestion}"?` : undefined, `Every service must be declared at the top of your file:\n services:\n ${name} is an API at "https://..."`);
98
+ }
99
+ // --------------------------------------------------------
100
+ // Check variable references in expressions
101
+ // --------------------------------------------------------
102
+ function checkExpression(expr, scope) {
103
+ switch (expr.kind) {
104
+ case "Identifier":
105
+ if (!isVarDefined(scope, expr.name)) {
106
+ const suggestion = findClosestMatch(expr.name, allDefinedVars(scope));
107
+ addError(expr.loc, `I don't recognize the variable "${expr.name}". It hasn't been set yet.`, suggestion ? `Did you mean "${suggestion}"?` : undefined, 'Variables must be created with "set" before they can be used:\n set ' + expr.name + ' to ...');
108
+ }
109
+ break;
110
+ case "DotAccess":
111
+ checkDotAccessRoot(expr, scope);
112
+ break;
113
+ case "InterpolatedString":
114
+ for (const part of expr.parts) {
115
+ if (part.kind === "expression") {
116
+ checkExpression(part.value, scope);
117
+ }
118
+ }
119
+ break;
120
+ case "MathExpression":
121
+ checkExpression(expr.left, scope);
122
+ checkExpression(expr.right, scope);
123
+ break;
124
+ case "ComparisonExpression":
125
+ checkExpression(expr.left, scope);
126
+ if (expr.right)
127
+ checkExpression(expr.right, scope);
128
+ break;
129
+ case "LogicalExpression":
130
+ checkExpression(expr.left, scope);
131
+ if (expr.right)
132
+ checkExpression(expr.right, scope);
133
+ break;
134
+ case "StringLiteral":
135
+ case "NumberLiteral":
136
+ case "BooleanLiteral":
137
+ // No variables to check
138
+ break;
139
+ }
140
+ }
141
+ /**
142
+ * Dot-access roots (e.g., `signup` in `signup.email`) are treated as
143
+ * potentially implicit external data (trigger payload, service response).
144
+ * We don't flag them as undefined — only standalone Identifier expressions
145
+ * are checked strictly.
146
+ */
147
+ function checkDotAccessRoot(_expr, _scope) {
148
+ // Intentionally lenient: dot-access roots may be implicit trigger/service data.
149
+ }
150
+ // --------------------------------------------------------
151
+ // Statement analysis
152
+ // --------------------------------------------------------
153
+ function analyzeStatements(stmts, scope) {
154
+ for (const stmt of stmts) {
155
+ analyzeStatement(stmt, scope);
156
+ }
157
+ }
158
+ function analyzeStatement(stmt, scope) {
159
+ switch (stmt.kind) {
160
+ case "SetStatement":
161
+ analyzeSetStatement(stmt, scope);
162
+ break;
163
+ case "IfStatement":
164
+ analyzeIfStatement(stmt, scope);
165
+ break;
166
+ case "ForEachStatement":
167
+ analyzeForEachStatement(stmt, scope);
168
+ break;
169
+ case "ServiceCall":
170
+ analyzeServiceCall(stmt, scope);
171
+ break;
172
+ case "AskStatement":
173
+ analyzeAskStatement(stmt, scope);
174
+ break;
175
+ case "LogStatement":
176
+ checkExpression(stmt.expression, scope);
177
+ break;
178
+ case "CompleteStatement":
179
+ analyzeCompleteStatement(stmt, scope);
180
+ break;
181
+ case "RejectStatement":
182
+ checkExpression(stmt.message, scope);
183
+ break;
184
+ case "StepBlock":
185
+ analyzeStepBlock(stmt, scope);
186
+ break;
187
+ }
188
+ }
189
+ function analyzeSetStatement(stmt, scope) {
190
+ // Check the value expression first (before the variable is defined)
191
+ checkExpression(stmt.value, scope);
192
+ // Then define the variable
193
+ defineVar(scope, stmt.variable);
194
+ }
195
+ function analyzeIfStatement(stmt, scope) {
196
+ checkExpression(stmt.condition, scope);
197
+ analyzeStatements(stmt.body, scope);
198
+ for (const oi of stmt.otherwiseIfs) {
199
+ checkExpression(oi.condition, scope);
200
+ analyzeStatements(oi.body, scope);
201
+ }
202
+ if (stmt.otherwise) {
203
+ analyzeStatements(stmt.otherwise, scope);
204
+ }
205
+ }
206
+ function analyzeForEachStatement(stmt, scope) {
207
+ checkExpression(stmt.collection, scope);
208
+ // Loop variable is scoped to the loop body
209
+ const loopScope = createScope(scope);
210
+ defineVar(loopScope, stmt.itemName);
211
+ analyzeStatements(stmt.body, loopScope);
212
+ }
213
+ function analyzeServiceCall(stmt, scope) {
214
+ if (stmt.service) {
215
+ checkServiceRef(stmt.service, stmt.loc);
216
+ }
217
+ for (const param of stmt.parameters) {
218
+ checkExpression(param.value, scope);
219
+ }
220
+ if (stmt.errorHandler) {
221
+ analyzeErrorHandler(stmt.errorHandler, scope);
222
+ }
223
+ }
224
+ function analyzeAskStatement(stmt, scope) {
225
+ checkServiceRef(stmt.agent, stmt.loc);
226
+ // save the result as / save the confidence as define variables
227
+ if (stmt.resultVar) {
228
+ defineVar(scope, stmt.resultVar);
229
+ }
230
+ if (stmt.confidenceVar) {
231
+ defineVar(scope, stmt.confidenceVar);
232
+ }
233
+ }
234
+ function analyzeCompleteStatement(stmt, scope) {
235
+ for (const param of stmt.outputs) {
236
+ checkExpression(param.value, scope);
237
+ }
238
+ }
239
+ function analyzeStepBlock(stmt, scope) {
240
+ if (declaredSteps.has(stmt.name)) {
241
+ addError(stmt.loc, `Duplicate step name "${stmt.name}". Each step must have a unique name.`, "Rename one of the steps to something different.");
242
+ }
243
+ declaredSteps.add(stmt.name);
244
+ // Steps do NOT create a new scope — they are organizational only
245
+ analyzeStatements(stmt.body, scope);
246
+ }
247
+ function analyzeErrorHandler(handler, scope) {
248
+ if (handler.fallback) {
249
+ analyzeStatements(handler.fallback, scope);
250
+ }
251
+ }
252
+ // --------------------------------------------------------
253
+ // Main analysis
254
+ // --------------------------------------------------------
255
+ analyzeConfig();
256
+ analyzeServices();
257
+ if (program.workflow) {
258
+ const globalScope = createScope(null);
259
+ // Trigger data is implicitly available (users access it via dot notation)
260
+ // We don't know the exact shape, so we treat any root-level identifier
261
+ // referenced via dot access as potentially valid trigger data.
262
+ // But we do need to make "env" available.
263
+ defineVar(globalScope, "env");
264
+ analyzeStatements(program.workflow.body, globalScope);
265
+ }
266
+ return errors;
267
+ }
268
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}