Skip to content
This repository was archived by the owner on Feb 24, 2026. It is now read-only.

Commit 34064c6

Browse files
committed
release: prepare v0.2.0 stable CLI + QA gates
1 parent b92d6a6 commit 34064c6

29 files changed

+4808
-103
lines changed

.github/workflows/ci.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ jobs:
3232
run: |
3333
pytest -q tests/unit
3434
35+
- name: Run CLI smoke gate
36+
run: |
37+
bash scripts/release_readiness.sh --skip-tests --skip-node
38+
3539
node-wrapper-smoke:
3640
runs-on: ubuntu-latest
3741
needs: python-tests

.github/workflows/release-node.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,24 @@ jobs:
2323
- name: Checkout
2424
uses: actions/checkout@v4
2525

26+
- name: Setup Python
27+
uses: actions/setup-python@v5
28+
with:
29+
python-version: "3.12"
30+
31+
- name: Install python package
32+
run: |
33+
python -m pip install --upgrade pip
34+
python -m pip install -e .
35+
2636
- name: Validate operation-id mappings
2737
run: |
2838
python3 scripts/check_operation_id_mappings.py
2939
40+
- name: Run CLI smoke gate
41+
run: |
42+
bash scripts/release_readiness.sh --skip-tests --skip-node
43+
3044
- name: Setup Node
3145
uses: actions/setup-node@v4
3246
with:

.github/workflows/release-python.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ jobs:
4747
run: |
4848
python scripts/check_operation_id_mappings.py
4949
50+
- name: Install package with test dependencies
51+
run: |
52+
python -m pip install -e ".[dev]"
53+
54+
- name: Run release readiness gate
55+
run: |
56+
bash scripts/release_readiness.sh --skip-node
57+
5058
- name: Install build tooling
5159
run: |
5260
python -m pip install --upgrade pip

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ build/
1414
node_modules/
1515
*.tgz
1616
*.log
17+
.minion-runs/

README.md

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ In shared docs, prefer the module/venv path for deterministic resolution:
1919

2020
- Thin UX wrapper over `agenticflow_sdk` for high-level commands: `workflow`, `agent`, `node-types`, `connections`.
2121
- OpenAPI-backed discovery helpers: `ops`, `catalog`
22+
- Agent-native execution path: `code search`, `code execute`
2223
- Low-level OpenAPI transport via `call`
2324
- `call` resolves explicit `--operation-id` or raw `--method`/`--path` and executes the API request directly (not a high-level wrapper).
2425
- Preflight checks (`doctor`) and local policy guardrails (`policy`).
@@ -47,7 +48,6 @@ High-level commands in this section are SDK-driven. `call` is the only raw trans
4748
- `agent stream --agent-id <id> --body '{\"messages\":[]}' --dry-run`
4849
- `node-types dynamic-options --name <node_type> --field-name <field> --project-id <project_id> --input-config '{}' --dry-run`
4950
- `connections list --workspace-id <workspace_id> --project-id <project_id> --dry-run`
50-
- `connections categories --workspace-id <workspace_id> --dry-run`
5151

5252
Admin/internal endpoints are intentionally not included in the bundled snapshot.
5353

@@ -106,6 +106,10 @@ agenticflow auth whoami --json
106106

107107
`--token` bearer override is intentionally unsupported.
108108

109+
Compatibility note:
110+
- `connections categories` maps to a server endpoint that currently requires user JWT bearer auth.
111+
- With API-key-only auth, use `connections list` and `node-types` discovery flows.
112+
109113
## Release docs smoke checks
110114

111115
- `PYTHONPATH=. .venv/bin/python scripts/agenticflow_cli.py --help`
@@ -122,6 +126,24 @@ agenticflow auth whoami --json
122126
- `PYTHONPATH=. .venv/bin/python scripts/agenticflow_cli.py node-types dynamic-options --name google-drive --field-name folder --project-id proj_demo --input-config '{}' --dry-run`
123127
- `PYTHONPATH=. .venv/bin/python scripts/agenticflow_cli.py connections list --workspace-id ws_demo --project-id proj_demo --dry-run`
124128

129+
## Release Readiness Gate
130+
131+
Run the full local gate before tagging a release:
132+
133+
```bash
134+
bash scripts/release_readiness.sh
135+
```
136+
137+
This validates operation-id mappings, runs unit tests, executes CLI dry-run smoke checks, and verifies the Node wrapper.
138+
139+
## Unattended Minion Flow
140+
141+
This repository includes a tmux-based one-shot multi-agent workflow for `gpt-5.3-codex-spark`.
142+
143+
- Runbook: `docs/minion_runbook.md`
144+
- Launcher: `scripts/minion_orchestrator.sh`
145+
- Worker runner: `scripts/minion_worker.sh`
146+
125147
## Node Wrapper (npm)
126148

127149
This repo also ships a thin npm wrapper package (`@pixelml/agenticflow-cli`) that invokes the Python CLI.
@@ -131,7 +153,9 @@ npm i -g @pixelml/agenticflow-cli
131153
agenticflow --help
132154
```
133155

134-
The wrapper requires Python 3.10+ with `agenticflow-cli` installed or importable.
156+
The wrapper requires:
157+
- Node.js 18+
158+
- Python 3.10+ with `agenticflow-cli` installed or importable.
135159

136160
## Release Tags
137161

bin/agenticflow.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,33 @@ const { spawnSync } = require("child_process");
44
const path = require("path");
55
const fs = require("fs");
66

7+
function parseNodeMajorVersion() {
8+
const raw = process.versions && process.versions.node ? process.versions.node : "";
9+
const major = parseInt(String(raw).split(".")[0], 10);
10+
if (Number.isNaN(major)) {
11+
return null;
12+
}
13+
return major;
14+
}
15+
16+
const majorVersion = parseNodeMajorVersion();
17+
if (majorVersion === null || majorVersion < 18) {
18+
const rendered = process.versions && process.versions.node ? process.versions.node : "unknown";
19+
console.error(
20+
"[agenticflow wrapper] Node.js >= 18 is required. " +
21+
"Current runtime: " +
22+
rendered +
23+
". " +
24+
"Install a newer Node version and rerun."
25+
);
26+
process.exit(1);
27+
}
28+
729
const cliArgs = process.argv.slice(2);
830
const repoRoot = path.resolve(__dirname, "..");
931
const localVenvPython = path.join(repoRoot, ".venv", "bin", "python");
1032

1133
const candidates = [
12-
{ cmd: "agenticflow", args: cliArgs, env: { AGENTICFLOW_NODE_WRAPPER: "1" } },
1334
...(fs.existsSync(localVenvPython)
1435
? [{ cmd: localVenvPython, args: ["-m", "agenticflow_cli", ...cliArgs] }]
1536
: []),
@@ -32,7 +53,7 @@ for (const candidate of candidates) {
3253
process.exit(1);
3354
}
3455

35-
process.exit(result.status ?? 0);
56+
process.exit(typeof result.status === "number" ? result.status : 0);
3657
}
3758

3859
console.error(

docs/agenticflow_cli_skill_usage.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Use this sequence for production-safe automation:
3030
- `agenticflow ops show <operation_id>`
3131
- `agenticflow node-types search --query <topic>`
3232
5. Validate request shape before execution:
33+
- `agenticflow code execute --plan /path/to/operation_plan.json --dry-run`
3334
- `agenticflow call --operation-id ... --dry-run`
3435
- `agenticflow workflow validate --body @workflow.json --dry-run`
3536
6. Execute and verify:
@@ -54,9 +55,11 @@ These playbooks are distilled from the internal skill docs into CLI-first execut
5455
- `ops list --public-only`
5556
- `ops show <operation_id>`
5657
- `node-types search --query <q>`
58+
- `code search --task <goal>`
5759
- Execution:
5860
- `call --operation-id ...`
5961
- `call --method GET --path /v1/...`
62+
- `code execute --plan /path/to/operation_plan.json --dry-run`
6063
- `workflow create|get|update|run|run-status|validate`
6164
- `agent create|get|update|stream`
6265
- Operational safety:

docs/cli_secured_ops_baseline.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,38 @@ Use a curated bundled snapshot:
1313
- Add authenticated operations required by current CLI wrappers.
1414
- Exclude admin/internal endpoints from the bundled snapshot.
1515

16+
## Declared public API vs CLI-supported coverage baseline
17+
18+
- **Declared public API** is the bundled snapshot contract:
19+
- `71` operations total (`59` public/no-security + `12` authenticated wrapper-backed operations).
20+
- Exposed through `catalog`/`ops` and reflected in CLI command docs.
21+
- **CLI-supported coverage baseline** is the same operation set, with one `support_scope` per operation used by harness and release review.
22+
23+
## Support matrix (single source of truth)
24+
25+
The support scope baseline is stored in `src/agenticflow_cli/public_ops_manifest.json` on each operation record:
26+
27+
- `support_scope`: one of `executed`, `blocked-by-policy`, or `unsupported/out-of-scope`.
28+
- `support_rationale`: operator-facing reason this operation is in its class.
29+
30+
Current baseline totals:
31+
32+
- `34` `executed`
33+
- `17` `blocked-by-policy`
34+
- `20` `unsupported/out-of-scope`
35+
36+
Policy semantics:
37+
38+
- `executed`: safe read/query/validation/public wrappers that coverage attempts as live API calls.
39+
- `blocked-by-policy`: command intent exists, but execution is intentionally blocked in harness for safety/policy.
40+
- `unsupported/out-of-scope`: intentionally not part of the CLI-supported public surface (internal, unsupported workflow, or unimplemented wrapper contract).
41+
42+
## Release interpretation of support rows
43+
44+
- `executed`: release as supported/available behavior. These operations are expected to remain runnable in public smoke checks.
45+
- `blocked-by-policy`: keep listed as “declared public API, unavailable by policy” in release notes and include policy rationale.
46+
- `unsupported/out-of-scope`: do not promote as supported features; these are intentionally outside the CLI contract even if visible in discovery.
47+
1648
## Added authenticated operation IDs
1749

1850
- `create_workflow_model_v1_workspaces__workspace_id__workflows_post`

docs/n8n_translator_v2.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# n8n → AgenticFlow Translator v2
2+
3+
This repository ships a v2 translator implementation in `scripts/module/translator_v2.py`.
4+
It enforces explicit capability-state tracking to prevent silent degradations.
5+
6+
## Behavior
7+
8+
- The translator maps known source patterns to AgenticFlow node types with a
9+
`capability` status for each required source capability:
10+
- `equivalent` — required behavior is represented in translated nodes.
11+
- `partial` — translated output includes related behavior but not full parity.
12+
- `unsupported` — translation cannot represent the behavior.
13+
- Hard failure is enabled by default.
14+
- If any required critical capability (`tooling`, `memory`, plus any unsupported mapping)
15+
resolves to `unsupported` (or non-equivalent for critical capabilities),
16+
`translate_n8n_template(..., strict=True)` raises `TranslationFailure`.
17+
- Fail-loud is explicit in the returned/raised artifact:
18+
- `required_capabilities` includes each required capability and its state.
19+
- `node_results` tracks per-node mapping decisions.
20+
- `workflow_payload` contains the synthesized AgenticFlow workflow payload.
21+
22+
## Known tool-aware mappings
23+
24+
- LLM patterns
25+
- `@n8n/n8n-nodes-langchain.agent`
26+
- `@n8n/n8n-nodes-langchain.lmChat*`
27+
- `@n8n/n8n-nodes-langchain.chainLlm`
28+
- `@n8n/n8n-nodes-langchain.openAi`
29+
- `@n8n/n8n-nodes-langchain.googleGemini`
30+
to `llm`.
31+
32+
- Tool-like patterns
33+
- `n8n-nodes-base.httpRequest``api_call`
34+
- `n8n-nodes-base.gmail``mcp_run_action` (`gmail-send-email`)
35+
- `n8n-nodes-base.googleSheets``mcp_run_action` (`google_sheets-upsert-row`)
36+
- `n8n-nodes-base.googleDocs``mcp_run_action` (`google_docs-insert-text`)
37+
- `n8n-nodes-base.linkedIn``mcp_run_action` (`linkedin-create-text-post-user`)
38+
- `n8n-nodes-base.emailSend``send_email`
39+
40+
- Memory
41+
- `@n8n/n8n-nodes-langchain.memoryBufferWindow` is marked non-equivalent because
42+
there is no automatic AgenticFlow equivalent mapping in v2.
43+
44+
## Gap artifact format
45+
46+
`build_gap_report()` and `write_gap_report()` produce a QA-friendly JSON object with:
47+
48+
- `translator_version`
49+
- `source_template_id`
50+
- `required_capabilities`
51+
- `node_results`
52+
- `workflow_payload`
53+
54+
This is intentionally similar to the translation payload summaries previously produced
55+
for quick-win translation artifacts.
56+
57+
## Limits
58+
59+
- Non-semantic parser-style nodes are skipped when known non-essential patterns are
60+
encountered.
61+
- Unknown nodes are marked unsupported (`node:<node_type>` capability) so they are
62+
visible in gaps and never silently dropped.
63+
- No claim of semantic equivalence is made for tooling/memory omissions.
64+

0 commit comments

Comments
 (0)