Skip to content
0designPublic

About

Run agent workflows end-to-end, without skipping instructions. Local engine behind QFactory: versioned workflows with checks and human gates for Claude Code, Codex and Cursor.

Topics

Resources

Contributing

Stars

6 stars

Watchers

0 watching

Forks

Repository files navigation

Use QFactory.io — just ask your ChatGPT, Claude or Cursor

Run agent workflows end-to-end, without skipping instructions. Starts in one prompt in your Claude, ChatGPT, Cursor, etc.

This repository holds Q-Core, the engine that runs QFactory workflows on your computer, and the Registry with the workflows themselves.

Quick start ↓

Start with a workflow template

Open the template's page, copy its start prompt and paste it into your agent.

Template What it does Needs
SDD: agree on the result before changing code Define the change, scope and acceptance criteria first. Approve the specification, then let your agent implement it and verify the allowed files. Your Claude/Codex subscription; no separate model bill
Make sense of the news with your coding agent Build the same source-linked Ukrainian digest through Claude or Codex, review its claims and approve delivery; no OpenRouter key. Your Claude/Codex subscription; no separate model bill
Summarize a podcast with your coding agent Use Claude or Codex to turn two transcript parts into a Ukrainian summary with checked timestamps; no OpenRouter key. Your Claude/Codex subscription; no separate model bill
Make sense of the news across your sources Group related stories into a Ukrainian digest, check claims against linked articles, then approve the text before delivery. OpenRouter key, ~$0.30
Find the key ideas in a podcast transcript Turn two transcript parts into a Ukrainian summary with checked timestamps, kept locally for your approval. OpenRouter key, ≤$0.25
Move JSON between your tools · example Read a JSON endpoint and forward its payload to a webhook, with no AI model call. $0
Check how your workflow handles too many items · example A fan-out example: read up to 60 feed items, forward the first 12 and report how many were skipped. $0
Check your spending cap before real work · example A budget-stop example: a zero-dollar cap should halt the run before a paid model call or outgoing message. $0
Know what the news says about your brand · example Filter a brand-search feed into linked mentions and an overall tone report, ready for your webhook. OpenRouter key; agent route needs adaptation
Get the useful news from your feed · example Turn an RSS feed into a short digest of worthwhile items and send it to Telegram. Telegram bot; OpenRouter key; agent route needs adaptation
See why each feed item matters · example Summarize up to five feed items individually and send each as a separate webhook message. OpenRouter key; agent route needs adaptation
Give your tools a structured feed summary · example Create a JSON feed summary, reject invalid JSON, and send its item count to your webhook. OpenRouter key; agent route needs adaptation
Spot important changes in GitHub releases · example Summarize a repository's releases and flag reported breaking changes, deprecations and security fixes. OpenRouter key; agent route needs adaptation
Turn your sources into a post you approve · example Draft a Telegram post from source material, check its rules, and review the exact text before publishing. OpenRouter key, Telegram bot
Review a currency-rate alert before sending · example Have a model check USD/UAH against a threshold, then approve the alert before it reaches your webhook. OpenRouter key
Stop a rate alert that fails your rule · example A model-review example: continue when the currency rate passes its rubric, or stop the run on failure. OpenRouter key

Contribute

You can add your own workflow or component to the Registry, fix something in Q-Core, or suggest an idea.

  1. Fork the repository and make a branch.
  2. Add your files and run the local checks from the contribution guide. The rules for Registry entries are in CONTRIBUTING.md.
  3. Open a pull request. The checks run automatically; before merging, we run your workflow for real.

Have an idea for a workflow? Open an issue and describe what result you want.

Links

Quick start

With your agent

  1. Open your project folder in Claude Code, Codex or Cursor.
  2. Write Use qfactory.io, or copy a template's start prompt from the table above.
  3. The agent connects QFactory, explains what it will do and waits for your "ok" before installing anything.

Approving from your agent chat

On a Mac with Touch ID and the Swift compiler, register your local approver once:

q-core approver add touchid

Setup builds the bundled Swift helper and creates a P-256 private key in the Secure Enclave, restricted to the currently enrolled biometrics. Node stores only the public key in ~/.q-core/approvers/touchid.json. The native helper retains an opaque, hardware-wrapped key representation in ~/Library/Application Support/q-core-touchid-approve/; only the issuing Secure Enclave can use it, subject to the biometric access control. There is no software signing fallback. Changing enrolled fingerprints invalidates the key; re-enrollment requires explicitly removing the old helper enrollment and public-key registration before setup.

Connect the local approval server to an MCP client that supports form elicitation:

{
  "mcpServers": {
    "q-core-approval": {
      "command": "node",
      "args": ["/absolute/path/to/q-core/bin/q-core-mcp.mjs", "/absolute/path/to/workflow.yaml"]
    }
  }
}

When a workflow reaches waiting_human, ask your agent to call request_approval with run_id and gate_id (the gate's rowId, or its unique stepId). The client shows the full subject, available delivery bodies and destinations, and their SHA-256. Choose approve or reject in that preview, then confirm that decision with the macOS Touch ID prompt. The form alone cannot approve. Touch ID signs the run, gate, exact content hash, decision, single-use nonce and issue time. A verified approval continues the run; a verified rejection fails the gate. Approval is never a tool argument.

Content must be ready before the gate: if a later step still needs to generate delivery content, the server refuses. Changed content requires a fresh request. Nonces expire after two minutes and cannot be reused; an expired nonce, changed hash or wrong key is refused. Closing or declining the form leaves the run waiting. Clients without form elicitation or a registered approver receive an error. The existing q-core approve terminal command and its one-time code remain available. This local server is separate from the hosted, read-only Registry MCP.

The ApprovalAnchor interface verifies signed decisions through a registered anchor; an arbitrary callback returning true is not registration. A phone confirmation through a Telegram button is coming: its adapter will require server-verified signatures or callbacks. Telegram is not implemented yet. Protect the installed helper, Q-Core code and approver registration from modification: signature verification assumes those local files remain trustworthy. Plaintext private key material never leaves the Secure Enclave.

What this protects, and what it does not. Touch ID makes sure an agent cannot get a gate approved through Q-Core's own interfaces (MCP tools, CLI commands, tool arguments, the chat form, replays) without your finger on the sensor. It guards against an agent that approves by mistake, hallucinates an approval, or follows injected instructions. It is not a boundary against code that already runs with your user rights and is willing to modify Q-Core, ~/.q-core, or the helper — such code could also deliver content without Q-Core at all. Protection against that needs the irreversible step to run outside your machine, with credentials and the approver key held by a server.

Without an agent

You need Node.js 20.3 or newer. In an empty folder this installs Q-Core and the SDD pipeline and shows its steps without running them. On Linux, use sha256sum instead of shasum -a 256.

set -eu
BASE=https://registry.qfactory.io
curl -fsS -o current.json "$BASE/current.json"
REL=$(node -p 'require("./current.json").release')
SHA=$(node -p 'require("./current.json").catalogSha256')
curl -fsS -o catalog.json "$BASE/releases/$REL/catalog.json"
[ "$(shasum -a 256 catalog.json | cut -d' ' -f1)" = "$SHA" ] || { echo "catalog check failed" >&2; exit 1; }
curl -fsS -o q-core.tgz "$BASE/releases/$REL/$(node -p 'require("./catalog.json").core.artifact')"
[ "$(shasum -a 256 q-core.tgz | cut -d' ' -f1)" = "$(node -p 'require("./catalog.json").core.artifactSha256')" ] || { echo "Q-Core check failed" >&2; exit 1; }
npm install --silent --prefix .qfactory/tools ./q-core.tgz
printf '*\n' > .qfactory/.gitignore
Q=./.qfactory/tools/node_modules/.bin/q-core
$Q install "$BASE/releases/$REL" "$SHA" sdd-pipeline 0.1.0 ./workflow.yaml
$Q run ./workflow.yaml --dry-run

You should see SUCCESS: Planned 7/7 steps. For another template, use its id and its version from catalog.json. $Q doctor checks your machine. All commands are in the reference.

About

Run agent workflows end-to-end, without skipping instructions. Local engine behind QFactory: versioned workflows with checks and human gates for Claude Code, Codex and Cursor.

Topics

Resources

Contributing

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages