software-factory
Set up an OpenHands "software factory" on GitHub fast: ask only for the repositories and where tickets live (GitHub issues, Jira or Linear), create a working…
Skill by OpenHands
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/openhands-software-factory
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: testing, devops, data
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/software-factory
What's inside
- Skill name
software-factory- Description
- Set up an OpenHands "software factory" on GitHub fast: ask only for the repositories and where tickets live (GitHub issues, Jira or Linear), create a working issue-to-PR and PR-review pipeline from the automation catalog with defaults, show what runs, then let the user stop or extend it one step at a time (tune settings, AGENTS.md maintainer, auto-merge, stale-CI and QA add-ons).
- License
- MIT
- Instructions
- 222 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (7)
- .claude-plugin
- .codex-plugin
- plugin.json · .plugin/
- README.md
- SKILL.md
- software-factory.md · commands/
- factory.py · scripts/
SKILL.md (first lines)
# Software Factory
Build a GitHub software factory from the automation plugin specs in
`plugins/<id>/.plugin/plugin.json`, with setup defaults still read from
`automations/catalog/<id>/manifest.json`; a Jira or Linear station is created
by its own skill. This skill adds no automation logic.
Two phases: **Phase 1** gets a working factory after one question. **Phase 2**
extends it in short rounds, only as far as the user wants. After Phase 1 and
after every round, the **Checkpoint** shows what exists and lets the user stop.
Code lives on GitHub. Tickets can come from GitHub issues (default), Jira or
Linear: only the issue to PR station changes (see "Ticket source"). GitLab and
Bitbucket code hosts are not part of this flow.
## Stations
| Station | Catalog id | Phase | Agent profile |
|---|---|---|---|
| Issue to PR | `github-issue-to-pr`, or the Jira or Linear station | 1 | `default` (GitHub issues only) |
| PR reviewer | `github-pr-reviewer` | 1 | `default` |
| Issue triage | `github-issue-triage`, or `linear-triage-assistant` | 1 | `default` (GitHub issues only) |
| AGENTS.md maintainer | `github-agents-md-maintainer` | add-on | `default` |
| Auto-merge watchdog | `github-delivery-watchdog` | add-on | none |
| Stale-CI PR closer | `github-stale-ci-pr-closer` | add-on | none |
| QA changes | `qa-changes` | add-on | none |
## Helper script
`scripts/factory.py` in this skill's directory does every catalog and API step
and prints one JSON document; it exits non-zero with `{"error": ...}` on
failure. Its usage is below: do not read its source, and do not load the
`openhands-automation` skill for Phase 1.
Set `OPENHANDS_HOST` to the **Ingress** URL in `<RUNTIME_SERVICES>` on a local
Agent Canvas (it serves both `/api/automation` and `/api`; the automation
backend URL does not), or to `<HOST>` on OpenHands Cloud. Run every command as:
```bash
GITHUB_PERSONAL_ACCESS_TOKEN="$GITHUB_PERSONAL_ACCESS_TOKEN" \
OPENHANDS_AUTOMATION_API_KEY="$OPENHANDS_AUTOMATION_API_KEY" \
OPENHANDS_API_KEY="$OPENHANDS_API_KEY" \
python3 <this skill's directory>/scripts/factory.py <command> ...
```
`$F` below stands for that whole line. Keep the secret names in it: the agent
server passes a saved secret into a command only when the command names it.
The script reads the token and never prints it.
| Command | Does |
|---|---|
| `$F preflight --repos a/b,c/d` | Which stations this deployment supports, the agent profile, the GitHub login, push access per repository. |
| `$F create --repos a/b --ids ID,ID [--set FIELD=VALUE] [--set ID.FIELD=VALUE]` | Creates disabled plugin-spec stations with the `software-factory` tag where supported. Reports existing stations separately and tags them where possible. |
| `$F tune --repos a/b --ids ID,ID [--set schedule=...|timezone=...] [--set ID.schedule=...]` | Updates schedule or timezone in place; other plugin config requires recreating the station until config patching is supported. |
| `$F tag ID...` | Adds the `software-factory` tag to automations created by other skills, reporting failures under `not_tagged`. |
| `$F verify ID... [--no-wait ID...]` | Dispatches once, enables the ones whose run `COMPLETED` and disables the rest, reporting their `error_detail`. `--no-wait` enables without waiting. |
| `$F status ID...` | The latest run of each. |
| `$F prs --repos a/b [--branch-prefix P]` | Open pull requests whose branch starts with `P` (default `openhands/agents-md`, the AGENTS.md maintainer's). |
| `$F reset-token` | Deletes the saved `GITHUB_PERSONAL_ACCESS_TOKEN` (local Agent Canvas), so `request_secret` opens its form again. |
`create` and `verify` return each automation's `url`, its page in Agent Canvas.
Trust the script's output: do not open pages in the browser to check them, and
do not use the task tracker for this flow.
Plugin-spec stations use the agent profile named `default`. Keep `--profile`
omitted unless you are explicitly checking that same profile name. Remote plugin
sources use the installed `openhands-extensions` version tag when available, or
`main` for unreleased source checkouts. Set `FACTORY_EXTENSIONS_REF` to pin a
specific tag or branch.
## Rules
- **Supported stations**: create only those `preflight` reports `ok`; say why
the others are skipped.
- **Derived values** (the script fills them; never ask): every
`githubTokenSecret` is `GITHUB_PERSONAL_ACCESS_TOKEN`. The watchdog's
`branchPrefix` must equal issue to PR's: when it was changed, pass
`--set github-delivery-watchdog.branchPrefix=<same value>`.
- **Agent profile**: plugin-spec stations that launch agents use the profile
named `default`. If `preflight` reports a profile error, skip the stations
that need one and ask the user to create or fix the `default` profile.
- **Token**: never ask for its value in chat, echo it, or put it in a tool
argument or file.
- **Failures**: if `create` fails, its output lists the stations it already
created; report them with the error and ask whether to retry or delete them
(`DELETE ${OPENHANDS_HOST}/api/automation/v1/{id}`).
- **Existing stations**: a station `create` reports under `existing` was already
set up by an earlier run. Say so rather than presenting it as new. Use `$F tune`
only for schedule or timezone changes; delete and recreate for other plugin
settings until config patching is supported.
- **Factory tag**: every station carries the `software-factory` tag where
supported. `create` adds it; for stations created by other skills (Jira or
Linear issue to PR, Linear triage, QA changes), run `$F tag <id>`. If a station
is `not_tagged`, report its reason: only its creator may change tags, or the
deployment does not support tags yet.
## Phase 1 - Working factory
1. Ask, in one message: "Which GitHub repositories (`owner/repo`)? Where do
tickets live: GitHub issues (default), Jira or Linear?" Say that everything
else uses defaults that can be changed afterwards. If the answer names only
repositories, use GitHub issues; do not ask again.
2. Run `$F preflight --repos <repos>`. Drop repositories without `push`, and
say which.
3. If `github_login` is null, act on `token_error`:
- `not_set`, and the `request_secret` tool is available: call it once with
`name: "GITHUB_PERSONAL_ACCESS_TOKEN"` and a `reason` asking for Contents,
Issues, Pull requests and Workflows read and write (classic PAT: `repo`,
`workflow`), and saying a token can be created at
https://github.com/settings/personal-access-tokens. End your turn, wait
for the `[secret-request]` message, then rerun `preflight`.
- `rejected`: GitHub refuses the saved token (invalid or expired), and
`request_secret` cannot replace it: it answers `saved` at once for a name
that exists. Say so in one sentence and ask "Shall I remove it and open
the form for a new one?" On yes, run `$F reset-token`, then handle it as
`not_set`. If `reset-token` fails, tell the user to create a token at
https://github.com/settings/personal-access-tokens, replace it in
Settings -> Secrets, and say when done.
- `not_set` without the tool: tell the user to create a token atFrom OpenHands/extensions, MIT.
More from OpenHands/extensions
- 0.721score
deno
OpenHands
If the project uses deno, use this skill.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
discord
OpenHands
Build and automate Discord integrations (bots, webhooks, slash commands, and REST API workflows).
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
code-simplifier
OpenHands
Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
datadog
OpenHands
Query and analyze Datadog logs, metrics, APM traces, and monitors using the Datadog API.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
add-skill
OpenHands
Import an existing skill from a GitHub repository URL into the current workspace.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
add-javadoc
OpenHands
Add comprehensive JavaDoc documentation to Java classes and methods.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
runtime-api-configs
OpenHands
Manage warm sandbox pools on OpenHands Enterprise by driving the runtime-api admin endpoints (list, save, delete warm runtime configurations) from a Python CLI.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
agent-creator
OpenHands
Create file-based sub-agents as Markdown files following the OpenHands SDK format.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
openhands
OpenHands
Unified OpenHands plugin — bundles the OpenHands Cloud CLI, Cloud REST API (openhands-api), Automations (openhands-automation), and Software Agent SDK…
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
agent-readiness-report
OpenHands
Evaluate how well a codebase supports autonomous AI-assisted development.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
release-notes
OpenHands
Generate consistent, well-structured release notes from git history.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
github
OpenHands
Interact with GitHub repositories, pull requests, issues, and workflows using the GITHUB_TOKEN environment variable and GitHub CLI.
SkillAFreshness: A★ 173Claude Code +9
Signals
- Stars
- 173
- Forks
- 118
- Open issues
- 84
- Last commit (this folder)
- Oct 22, 2026 (6 days ago)
- Last release
- Oct 23, 2026 (6 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/OpenHands/extensions
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from OpenHands
- 0.721score
release-notes
OpenHands
Generate consistent, well-structured release notes from git history.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
add-javadoc
OpenHands
Add comprehensive JavaDoc documentation to Java classes and methods.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
agent-readiness-report
OpenHands
Evaluate how well a codebase supports autonomous AI-assisted development.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
openhands
OpenHands
Unified OpenHands plugin — bundles the OpenHands Cloud CLI, Cloud REST API (openhands-api), Automations (openhands-automation), and Software Agent SDK…
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
runtime-api-configs
OpenHands
Manage warm sandbox pools on OpenHands Enterprise by driving the runtime-api admin endpoints (list, save, delete warm runtime configurations) from a Python CLI.
SkillAFreshness: A★ 173Claude Code +9 - 0.721score
add-skill
OpenHands
Import an existing skill from a GitHub repository URL into the current workspace.
SkillAFreshness: A★ 173Claude Code +9
Cite this page
software-factory skill. Agent Mart. https://agentmart.dev/skills/openhands-software-factory (last updated 2026-10-24)