@capagents/forgeqe 2.4.0 → 2.4.2
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/HOW_TO_USE.md +28 -7
- package/README.md +4 -2
- package/dist/forgeqe.js +1041 -1007
- package/dist/web/assets/ApiTests-B-0nk720.js +2 -0
- package/dist/web/assets/Chat-Be6J6POH.js +3 -0
- package/dist/web/assets/{Data-Qolfhsd7.js → Data-BtcD7_T2.js} +4 -4
- package/dist/web/assets/Features-DHIGL43K.js +1 -0
- package/dist/web/assets/Jobs-C-cEyrrH.js +3 -0
- package/dist/web/assets/Quality-C6hKykoO.js +1 -0
- package/dist/web/assets/Record-B5395d_b.js +1 -0
- package/dist/web/assets/Regression-BS5g4T3v.js +2 -0
- package/dist/web/assets/Reports-CHqfhNR8.js +2 -0
- package/dist/web/assets/Response-P2oku3_B.js +8 -0
- package/dist/web/assets/Runs-DPmd5QPL.js +2 -0
- package/dist/web/assets/chevron-right-Cwpv0kJi.js +1 -0
- package/dist/web/assets/circle-dashed-COka5oNi.js +1 -0
- package/dist/web/assets/external-link-B9T-hxHX.js +1 -0
- package/dist/web/assets/file-chart-column-increasing-Ch7H145u.js +1 -0
- package/dist/web/assets/filters-C5e4Y0To.js +1 -0
- package/dist/web/assets/index-BI_5kNwE.css +2 -0
- package/dist/web/assets/index-KUNDUjo0.js +26 -0
- package/dist/web/assets/{markdown-GKy06efH.js → markdown-DclrGj2e.js} +7 -7
- package/dist/web/assets/rotate-ccw-BizUsxuR.js +1 -0
- package/dist/web/assets/sticky-note-CFIxnO7K.js +1 -0
- package/dist/web/assets/terminal-BnhGgg6d.js +1 -0
- package/dist/web/assets/trash-CtWVl2Xk.js +1 -0
- package/dist/web/assets/trending-up-BnzWZEhg.js +1 -0
- package/dist/web/assets/when-CHnpLdYw.js +1 -0
- package/dist/web/index.html +2 -3
- package/docs/ARCHITECTURE.md +5 -2
- package/docs/user-guide.html +32 -13
- package/evals/prompts/brain/browser-test-intent.yaml +30 -0
- package/forgeqe.example.yaml +4 -3
- package/package.json +1 -1
- package/prompts/brain.md +4 -1
- package/py/forgeqe_engine/flowmatch.py +72 -1
- package/py/forgeqe_engine/logins.py +17 -5
- package/py/forgeqe_engine/loops.py +26 -3
- package/py/forgeqe_engine/memory.py +11 -0
- package/py/forgeqe_engine/service.py +29 -1
- package/dist/web/assets/ApiTests-CSSed9hU.js +0 -2
- package/dist/web/assets/Chat-CFfiv7wI.js +0 -2
- package/dist/web/assets/Features-BM48eq6x.js +0 -1
- package/dist/web/assets/Jobs-BjVNQUaK.js +0 -3
- package/dist/web/assets/Quality-F0sKErYg.js +0 -1
- package/dist/web/assets/Record-CkwV9gN8.js +0 -1
- package/dist/web/assets/Regression-DKaNfFu1.js +0 -2
- package/dist/web/assets/Reports-o_82URX6.js +0 -3
- package/dist/web/assets/Response-YL9AIB8R.js +0 -8
- package/dist/web/assets/Runs-Dp-DzyW1.js +0 -2
- package/dist/web/assets/circle-dashed-DbpKfamm.js +0 -1
- package/dist/web/assets/external-link-pvVHJFAZ.js +0 -1
- package/dist/web/assets/file-chart-column-increasing-b-Yh6rmz.js +0 -1
- package/dist/web/assets/index-Bkx3fVbr.js +0 -21
- package/dist/web/assets/index-DSEYuBEd.css +0 -2
- package/dist/web/assets/rotate-ccw-BL6YOAPy.js +0 -1
- package/dist/web/assets/search-YLg3uzAx.js +0 -1
- package/dist/web/assets/status-CL_clA0J.js +0 -3
- package/dist/web/assets/sticky-note-DIQ2FWMw.js +0 -1
- package/dist/web/assets/terminal-BdTFlGZR.js +0 -1
- package/dist/web/assets/timer-NLZ0XmVl.js +0 -1
- package/dist/web/assets/trash-DIUJbRpw.js +0 -1
package/HOW_TO_USE.md
CHANGED
|
@@ -120,7 +120,7 @@ Everything ForgeQE can do, by area. ForgeQE's agent answers "can you…?" questi
|
|
|
120
120
|
| Release | **Reports you can share**: Writes up what the Orchestrator found, such as open defects across projects, release status, or pipeline health, as a page with filters (project, state, priority, assignee, …), charts, and a sortable table, plus Markdown and CSV. Every table is built from evidence: the results of the tool calls the agent made, or a read-only query ForgeQE runs itself, listed on the page's Sources with each raw result kept beside the report. | `write_report` | [docs](#reports-from-the-agent) |
|
|
121
121
|
| Operations | **CI pipelines**: Writes a GitHub Actions or Azure Pipelines workflow that runs ForgeQE, stores the secrets it needs, pushes a branch, and makes the pipeline green. | `push_branch`, `set_ci_secret` | [docs](#8-pipelines) |
|
|
122
122
|
| Systems | **Work with Azure DevOps, Jira, GitHub, and Confluence**: Reads anything in the configured systems (work items, issues, queries, boards, pages), makes changes the user asks for, puts run evidence (screenshots, reports) on work items and issues as attachments or comments, and builds Azure DevOps dashboards and wiki pages. | `read_confluence`, `create_ado_dashboard`, `write_ado_wiki_page`, `attach_to_work_item` | [docs](README.md#azure-devops-jira-and-other-systems) |
|
|
123
|
-
| Systems | **Read any data in Azure DevOps, Jira, Xray, and Confluence**: Reads through a system's REST API what its MCP tools do not cover: pull requests and repositories, test plans and suites, classic releases, and anything else in Azure DevOps, Jira, Xray, or Confluence. Given on every turn once a system is set up, so the agent never turns to the browser or the shell
|
|
123
|
+
| Systems | **Read any data in Azure DevOps, Jira, Xray, and Confluence, and open Azure DevOps pull requests**: Reads through a system's REST API what its MCP tools do not cover: pull requests and repositories, test plans and suites, classic releases, and anything else in Azure DevOps, Jira, Xray, or Confluence. Opens Azure DevOps pull requests, which the API reads cannot. Given on every turn once a system is set up, so the agent never turns to the browser or the shell for them. | `query_api`, `create_ado_pull_request` | [docs](README.md#azure-devops-jira-and-other-systems) |
|
|
124
124
|
| Setup | **What ForgeQE wrote**: Says how much of the code ForgeQE wrote is still in the repository, and gives the trailer and footer that mark a commit message or pull request description covering code it wrote. Works with any repository, whatever system the team uses. | `generated_attribution` | [docs](#generated-code) |
|
|
125
125
|
| Setup | **Every forgeqe command from the shell**: Runs the forgeqe commands no other tool covers when the user asks in words: the context budget, guardrails, prompts (show, diff, check, reset), the domain eval, skills on or off, session logs, saved API sets and packs, pack pipelines, the BI site, a test notification, desktop and mobile doctor and validate, and updating ForgeQE. Reading commands run at once; the others are shown and asked first. | `forgeqe_command` | [docs](#15-commands-cheat-sheet) |
|
|
126
126
|
| Setup | **Setup, skills, and documentation**: Shows the model profiles and MCP servers, installs or repairs the browser engine, creates a forgeqe.yaml, manages skills, and answers any question about ForgeQE from its documentation, this list, and its own code (the prompts, skills, and source it runs). | `forgeqe_setup`, `capabilities`, `playbook`, `use_capabilities` | [docs](#2-scaffold-config) |
|
|
@@ -389,6 +389,18 @@ GitHub Models, which ForgeQE used for the engine before, was [retired by GitHub]
|
|
|
389
389
|
|
|
390
390
|
**Prompts.** Each file has a short header (`name`, `description`, `used_by`, `kind`) and the prompt; `{{> name}}` includes another prompt (`test-rules` is included in the test, reviewer, and healing prompts, so one edit changes all three). ForgeQE looks in `prompts.dir`, then `.forgeqe/prompts/`, then `~/.forgeqe/prompts/` (for every project), then its own. Changes take effect on the next run or session.
|
|
391
391
|
|
|
392
|
+
**Your team's prompts.** Instructions of your own for chosen agents go in `.forgeqe/prompts/team/<name>.md` (or `~/.forgeqe/prompts/team/` for every project; a name in the project wins). The header has `name`, `description`, and `for`: the agents' prompts it joins (`brain` for ForgeQE's agent, `test-agent` for Scribe, `browser-extra` for the browser agent, and so on). Its text is added at the end of those prompts, under "Your team's instructions", as written: it is not a template and includes nothing. The web app's Prompts page adds, edits and removes them, and shows each agent's whole prompt with them included; `forgeqe prompts show <prompt>` shows it in the terminal.
|
|
393
|
+
|
|
394
|
+
```markdown
|
|
395
|
+
---
|
|
396
|
+
name: tag-work-items
|
|
397
|
+
description: "Tests carry the work item they cover"
|
|
398
|
+
for: test-agent, browser-extra
|
|
399
|
+
---
|
|
400
|
+
Tag every test with the Azure DevOps work item it covers.
|
|
401
|
+
If the request names no work item, ask for it.
|
|
402
|
+
```
|
|
403
|
+
|
|
392
404
|
```bash
|
|
393
405
|
forgeqe prompts # every prompt, what it is for, and where it comes from
|
|
394
406
|
forgeqe prompts show test-agent # the prompt as the agent gets it (includes expanded; --raw for the file)
|
|
@@ -523,7 +535,7 @@ A card says which it did and why (*Extending PracticeTests.Flow · covers 12 of
|
|
|
523
535
|
|
|
524
536
|
**Why a test failed.** When ForgeQE's run of Scribe's test fails, the ✗ line and the next attempt say why in the test's own words: dotnet test's Error Message, pytest's `E` lines, or the error with its Expected and Received values (Playwright, Jest, JUnit), not the runner's summary line.
|
|
525
537
|
|
|
526
|
-
**Keeping Scribe's cost down.** ForgeQE reads the repository's test setup itself before Scribe starts (stack, settings files and their browser values, the test id attribute, base classes, page objects and their methods, one test command) and hands it over, so Scribe does not discover it with dozens of file reads. Each attempt after the first starts a fresh session from a summary of the job (handoff, files changed, what each attempt did, the latest failure), so later attempts cost about what the first did. The summary has a "Tried already, and did not work" list: for each failed attempt, what Scribe said it did (it reports each change in `tried`), how it failed, the locator the test was waiting for and the element that covered it and took the click, both read from the test's output, and whether an earlier attempt already failed on that locator. Scribe must not try those again in the same form and must say what it does differently. `forgeqe heal` keeps the same list across its attempts. `code.max_attempts` (default 3) and `code.max_tokens` (default 1,500,000; `0` turns it off) cap a job, and the token budget is checked during an attempt too, so one long attempt is stopped when the total passes it. The reviewer sorts its issues into correctness (the test does not test what the goal says, or not reliably) and coding standards (test data or credentials in a page object, naming, hard waits, leftovers). Coding standards never fail a test that works: it is accepted, and the coding agent gets one more round (not counted in `max_attempts`) to fix them; if that round breaks the test, ForgeQE puts back the version that passed and lists the standards issues in the notes (`code.tidy: false` skips the round). A test the reviewer rejects twice for correctness stops the job with its issues, since that usually means the test case and the page disagree. When a test passed and the reviewer sent it back, and the changes for the review then break it (or the attempts or the token budget run out first), ForgeQE puts back the version that passed: the result is passed but not approved, with the reviewer's issues in the notes, so you get a working test to finish instead of none. Under each step, the handoff shows that step's part of the page (its section and neighbours, from the replay's page snapshot) instead of whole snapshots. When a test fails, ForgeQE shows the failing element on the test's page at the failure and on the replay's page, so most failures are fixed without opening a browser. Scribe's live browser is switched on only when the same failure repeats, and it does not send a page snapshot after every click or keystroke. `code.max_steps` (default 50) caps the tool calls in one of Scribe's turns. `code.review_profile` runs the reviewer on a cheaper llms.json profile.
|
|
538
|
+
**Keeping Scribe's cost down.** ForgeQE reads the repository's test setup itself before Scribe starts (stack, settings files and their browser values, the test id attribute, base classes, page objects and their methods, one test command) and hands it over, so Scribe does not discover it with dozens of file reads. Each attempt after the first starts a fresh session from a summary of the job (handoff, files changed, what each attempt did, the latest failure), so later attempts cost about what the first did. The summary has a "Tried already, and did not work" list: for each failed attempt, what Scribe said it did (it reports each change in `tried`), how it failed, the locator the test was waiting for and the element that covered it and took the click, both read from the test's output, and whether an earlier attempt already failed on that locator. Scribe must not try those again in the same form and must say what it does differently. `forgeqe heal` keeps the same list across its attempts. `code.max_attempts` (default 3) and `code.max_tokens` (default 1,500,000; `0` turns it off) cap a job, and the token budget is checked during an attempt too, so one long attempt is stopped when the total passes it. Cached input counts at its share of the profile's input price (a session re-reads its own context, and that is most of its input), and in full when no cached price is known, such as with another `code.model`. The reviewer sorts its issues into correctness (the test does not test what the goal says, or not reliably) and coding standards (test data or credentials in a page object, naming, hard waits, leftovers). Coding standards never fail a test that works: it is accepted, and the coding agent gets one more round (not counted in `max_attempts`) to fix them; if that round breaks the test, ForgeQE puts back the version that passed and lists the standards issues in the notes (`code.tidy: false` skips the round). A test the reviewer rejects twice for correctness stops the job with its issues, since that usually means the test case and the page disagree. When a test passed and the reviewer sent it back, and the changes for the review then break it (or the attempts or the token budget run out first), ForgeQE puts back the version that passed: the result is passed but not approved, with the reviewer's issues in the notes, so you get a working test to finish instead of none. Under each step, the handoff shows that step's part of the page (its section and neighbours, from the replay's page snapshot) instead of whole snapshots. When a test fails, ForgeQE shows the failing element on the test's page at the failure and on the replay's page, so most failures are fixed without opening a browser. Scribe's live browser is switched on only when the same failure repeats, and it does not send a page snapshot after every click or keystroke. `code.max_steps` (default 50) caps the tool calls in one of Scribe's turns. `code.review_profile` runs the reviewer on a cheaper llms.json profile.
|
|
527
539
|
|
|
528
540
|
**Scribe's rulebook: the same mistake once.** When a job passes after a failed test run or a reviewer's change, Scribe's report gives up to three one-line rules that would have avoided the mistake ("Wait for the cart badge with toHaveText before clicking Checkout; it updates after a request"). ForgeQE keeps them in `.forgeqe/scribe-rules.json` in the repository, and every attempt of later jobs, and every healing session, starts with them. A lesson from a job that did not pass, or that passed at once, is not kept: only a fix that worked becomes a rule. The book stays small, since it is sent with each model call: at most 15 rules of one line each; a lesson learned again is merged into its rule (shown as "learned 3 times") instead of added; when it is full, the rule confirmed least and longest ago goes, and a rule not learned again for 180 days expires. The rules are the coding agent's own words, so a rule with a link, something like a token, a destructive command, or wording that tells an agent to drop its instructions is refused, and the agents are told they are hints that never override their instructions or the team's guardrails. Commit the file to share the rules with the team and see each change in review; edit or delete a rule there (the agents cannot change `.forgeqe`). ForgeQE says each new rule as it learns it (`Learned for next time: …`). `code.rulebook: false` turns it off.
|
|
529
541
|
|
|
@@ -870,6 +882,7 @@ The process opens ForgeQE's agent on the first message and keeps it for every la
|
|
|
870
882
|
| `answer` | `id` (from an `ask`), `choice` (an option id, or `null` to cancel) | Answers the pending question |
|
|
871
883
|
| `continue` | `id` (from a `wait`), `ok` (`true` = Done, continue; `false` = Cancel) | Ends the pending wait |
|
|
872
884
|
| `stop` | | Stops the running turn (Esc or `/stop` in the shell). Nothing when idle |
|
|
885
|
+
| `settings` | `headed` and/or `writeTests` (each `true` or `false`, nothing else) | Changes the chat's choices from now on: whether browser runs are shown (as `--headed`), and whether passed runs become tests (as `--no-code`, off). The next browser run uses them; the agent is told of a change with your next message. Answered with `settings` |
|
|
873
886
|
| `close` | | Stops any turn, closes the agent, stops monitors and the containers it started, writes `closed`, exits 0 |
|
|
874
887
|
|
|
875
888
|
A line that is not JSON, has an unknown `type`, or misses a field gets `error` `bad_input` with the reason and the first 200 characters of the line; the process goes on. The end of stdin is the same as `close`.
|
|
@@ -878,8 +891,9 @@ A line that is not JSON, has an unknown `type`, or misses a field gets `error` `
|
|
|
878
891
|
|
|
879
892
|
| `type` | Fields | When |
|
|
880
893
|
|--------|--------|------|
|
|
881
|
-
| `ready` | `protocol` (1), `version`, `cwd`, `writeTests`, `profile` (`name` and `provider`, never a key) | Once, after the config is loaded and checked, before stdin is read |
|
|
894
|
+
| `ready` | `protocol` (1), `version`, `cwd`, `writeTests`, `headed`, `profile` (`name` and `provider`, never a key) | Once, after the config is loaded and checked, before stdin is read |
|
|
882
895
|
| `turn_start` | `id` | A message was accepted |
|
|
896
|
+
| `settings` | `headed`, `writeTests` | After a `settings` line: the choices now in force |
|
|
883
897
|
| `agent` | `id`, `event`: a `CodeEvent` (`stream`, `say`, `start`, `tool`, `plan`, `usage`, `context`, `test`, `info`, …) | While the turn runs |
|
|
884
898
|
| `tool` | `id`, `event`: a `ToolEvent` (`run-start`, `run-event`, `run-done`, `suite-*`, `card`, `info`, `agent`, `code-*`, …) | While the turn runs; `id` is `null` for a background monitor between turns |
|
|
885
899
|
| `ask` | `id` (`ask-N`), `turn`, `question` (`title`, `detail`, `lines`, `options[{id, label}]`) | A tool asks you to choose |
|
|
@@ -900,7 +914,7 @@ A line that is not JSON, has an unknown `type`, or misses a field gets `error` `
|
|
|
900
914
|
A complete exchange (`→` stdout, `←` stdin; `t` left out):
|
|
901
915
|
|
|
902
916
|
```text
|
|
903
|
-
→ {"v":1,"seq":1,"type":"ready","protocol":1,"version":"2.3.11","cwd":"/srv/studio/users/ana/workspace","writeTests":true,"profile":{"name":"copilot","provider":"github_copilot"}}
|
|
917
|
+
→ {"v":1,"seq":1,"type":"ready","protocol":1,"version":"2.3.11","cwd":"/srv/studio/users/ana/workspace","writeTests":true,"headed":false,"profile":{"name":"copilot","provider":"github_copilot"}}
|
|
904
918
|
← {"type":"message","id":"m1","text":"Run SHOP-12 on staging"}
|
|
905
919
|
→ {"v":1,"seq":2,"type":"turn_start","id":"m1"}
|
|
906
920
|
→ {"v":1,"seq":3,"type":"agent","id":"m1","event":{"type":"code","kind":"stream","id":"p1","text":"I'll run SHOP-12"}}
|
|
@@ -1019,7 +1033,7 @@ What happens after the run passes:
|
|
|
1019
1033
|
The Activities panel has one line for each verdict and attempt, and `forgeqe` commands outside the terminal UI print the same blocks.
|
|
1020
1034
|
|
|
1021
1035
|
Scribe cannot edit ForgeQE's files or run folders, and cannot run `git clean`, `git reset --hard`, `git stash`, `git restore`, or `git checkout -- <path>`. If it still removes a file that existed before the job, or reverts your uncommitted edits, ForgeQE puts the file back after that attempt and tells the agent.
|
|
1022
|
-
8. The job is done when ForgeQE's run passes with a browser and the
|
|
1036
|
+
8. The job is done when ForgeQE's run passes with a browser, the reviewer approves, and the test passes again unchanged until it has passed `code.confirm_runs` times in a row (default 3; `1` runs it once). A test that passes and then fails is flaky: the next attempt is told which run failed and why, and to make that step wait for the page. It stops as a failure after `max_attempts` attempts, when the job passes `code.max_tokens`, when the reviewer rejects a passing test twice, if the review cannot finish, when the test fails the same way three times in a row (the same output apart from numbers such as timings and line numbers; the second time, Scribe is told its change did not change the failure and to look at the failing step before changing code), or straight away on an auth, API, or context-limit error from the model.
|
|
1023
1037
|
|
|
1024
1038
|
`blocked` is a last resort. The first time the agent reports that the app blocks it, ForgeQE sends it back to compare its browser with ForgeQE's and fix the difference; only a second blocked report, with what it compared, ends the job as blocked.
|
|
1025
1039
|
|
|
@@ -2726,7 +2740,14 @@ On Windows, the dependency folders are linked into worktrees as junctions (no ad
|
|
|
2726
2740
|
|
|
2727
2741
|
When ForgeQE's agent starts, it connects to an MCP server for each system set up under `sources:`. The server settings come from the same place as everything else: the organization and project, the site URL, and the names of the environment variables that hold the tokens. You don't write MCP config for these.
|
|
2728
2742
|
|
|
2729
|
-
**
|
|
2743
|
+
**Every tool, without paying for every tool.** Each server is started with everything it has: Azure DevOps with all its tool groups, Jira and Confluence with `TOOLSETS=all`, GitHub with every toolset. Every tool given to the model is sent with each of its requests (GitHub's are about 79K tokens, Jira's and Confluence's about 29K, Azure DevOps' about 21K), so a turn gets only the groups of tools its request needs, the way it gets ForgeQE's own capabilities:
|
|
2744
|
+
|
|
2745
|
+
- ForgeQE asks each server for its tools when the session starts and keeps the list for a week (`~/.forgeqe/cache/mcp-tools`), then groups them by their names. No server needs a table of its own: tools named by prefix (`repo_…`, `wit_…`, `jira_…`) are grouped by prefix, and a large prefix again by what its tools are about (Jira's sprints, boards, versions); tools named verb first (`list_pull_requests`) by what they act on (pull requests, issues, Dependabot alerts). A group is named `<server>:<group>`, such as `github:pull-request` or `atlassian:jira-sprint`.
|
|
2746
|
+
- A turn gets a group when its request names what the group is about ("create a PR", "the current sprint", "dependabot alerts"), when its tools ran in the last turns, or when the agent asks for it with `use_capabilities`: every group is in the list of capabilities the agent has, so none is out of reach and the browser is never the way round a missing tool. A request that names a system ("the GitHub repository", "in Azure DevOps") gets that system's groups from its words, not another's.
|
|
2747
|
+
- A small server (under about 3K tokens) is one group, on every turn. A server ForgeQE could not ask keeps all its tools on every turn, as before.
|
|
2748
|
+
- `agent.capabilities.always` and `off` take group ids too: `always: [github:issue]`, `off: [github:copilot]`.
|
|
2749
|
+
|
|
2750
|
+
**Azure DevOps.** Microsoft's [Azure DevOps MCP server](https://github.com/microsoft/azure-devops-mcp), run with every tool group it has: projects and teams (`azure-devops:core`), iterations and boards (`azure-devops:work`), work items (`azure-devops:wit`), pipelines (`azure-devops:pipeline`), repositories and pull requests (`azure-devops:repo`), wiki (`azure-devops:wiki`), test plans (`azure-devops:testplan`), search (`azure-devops:search`), and security alerts (`azure-devops:advsec`). The first four are on every turn (about 21 tools, roughly 10.7K tokens); the others come as described above. ForgeQE's own tools cover dashboards, wiki pages in a project without a wiki, and opening pull requests (`create_ado_pull_request`) and reviewing them, and `query_api` reads anything else, such as classic releases. The organization comes from `org_url` (`https://dev.azure.com/acme` or `https://acme.visualstudio.com`). ForgeQE passes the PAT from `token_env` (default `ADO_PAT`) the way the server wants it; without a PAT it uses your `az login` session. Its tools are `azure_devops_*`. `mcp_domains` says which groups are on every turn (default `[core, work, work-items, pipelines]`; `[all]` for every group, at about 21K tokens a request); `agent.capabilities.off` switches a group off for good (`[azure-devops:advsec]`). It needs Node.js. Azure DevOps Server (on-premises) isn't supported by Microsoft's server, so it uses ForgeQE's API.
|
|
2730
2751
|
|
|
2731
2752
|
```yaml
|
|
2732
2753
|
sources:
|
|
@@ -2735,7 +2756,7 @@ sources:
|
|
|
2735
2756
|
# project: Shop # optional: limit ForgeQE's own API calls to one project
|
|
2736
2757
|
token_env: ADO_PAT
|
|
2737
2758
|
mcp: true # false: API only
|
|
2738
|
-
mcp_domains: [core, work, work-items, pipelines, repositories] # optional: the
|
|
2759
|
+
mcp_domains: [core, work, work-items, pipelines, repositories] # optional: groups on every turn; the others come when needed
|
|
2739
2760
|
```
|
|
2740
2761
|
|
|
2741
2762
|
Microsoft's server has no dashboard tools and can't save queries. Ask for a dashboard ("create a dashboard in QI-Payments with all defects in every state and the current sprint's stories") and ForgeQE's own `create_ado_dashboard` tool does it through the REST API with `ADO_PAT`: it runs each WIQL query once to check it, saves it as a shared query under `Shared Queries/ForgeQE` (updating one of the same name), and creates a team or project dashboard with a work item list or count tile per query, plus optional markdown text. The PAT needs Work Items (read and write) and permission to edit dashboards. Chart widgets are not made through the API; for those the agent uses the browser, which has to be signed in to `dev.azure.com` (`forgeqe login <name>` with a login for it under `logins:`).
|
package/README.md
CHANGED
|
@@ -408,10 +408,10 @@ ForgeQE's agent connects to each system's MCP server, configured from the same `
|
|
|
408
408
|
|
|
409
409
|
| System | MCP server | Needs |
|
|
410
410
|
|--------|------------|-------|
|
|
411
|
-
| Azure DevOps Services | Microsoft's [Azure DevOps MCP server](https://github.com/microsoft/azure-devops-mcp) (`npx @azure-devops/mcp`), with all its tools: work items, boards, test plans, pipelines, repos, wiki pages, search, and security alerts | Node.js, and `ADO_PAT` or `az login` |
|
|
411
|
+
| Azure DevOps Services | Microsoft's [Azure DevOps MCP server](https://github.com/microsoft/azure-devops-mcp) (`npx @azure-devops/mcp`), with all its tools, each turn getting the groups it needs: work items, boards, test plans, pipelines, repos, wiki pages, search, and security alerts | Node.js, and `ADO_PAT` or `az login` |
|
|
412
412
|
| Jira Cloud, Server/Data Center | [mcp-atlassian](https://github.com/sooperset/mcp-atlassian) (`uvx`), with issues, JQL search, comments, and transitions. `mcp: rovo` uses [Atlassian's hosted server](https://github.com/atlassian/atlassian-mcp-server) instead (Cloud, and an admin must allow API tokens) | uv; `JIRA_EMAIL` and `JIRA_API_TOKEN` (Cloud) or a personal access token (Server/DC) |
|
|
413
413
|
| Confluence | mcp-atlassian, shared with Jira (or its own when Jira isn't set up); Atlassian's hosted server covers it on the same site | `confluence: true` on a Jira Cloud site, or `confluence.url` + tokens |
|
|
414
|
-
| GitHub | GitHub's [hosted MCP server](https://github.com/github/github-mcp-server) with
|
|
414
|
+
| GitHub | GitHub's [hosted MCP server](https://github.com/github/github-mcp-server) with every toolset, each turn getting the groups of tools it needs (`sources.github.toolsets` limits them), on in a repository with a GitHub remote or when `sources.github` is set. GitHub issues are also a test case source (`github:#12`, `github:acme/shop#12,#13`, `github:label=login`, `github:q=login in:title`): results go back as issue comments, and `sources.bugs.system: github` files bugs as issues. GitHub has no API to upload a screenshot to an issue, so a bug names the run folder instead | `GITHUB_TOKEN`, or the GitHub CLI's sign-in (`forgeqe auth login github`) |
|
|
415
415
|
| Xray, TestRail, Zephyr Scale, qTest | none; ForgeQE's API | `XRAY_CLIENT_ID` / `XRAY_CLIENT_SECRET`, `TESTRAIL_EMAIL` / `TESTRAIL_API_KEY`, `ZEPHYR_API_TOKEN`, `QTEST_TOKEN` |
|
|
416
416
|
| Anything else | servers you add under `mcp:` | |
|
|
417
417
|
|
|
@@ -433,6 +433,8 @@ Microsoft's Azure DevOps server can't create dashboards, so "create a dashboard
|
|
|
433
433
|
|
|
434
434
|
Its wiki tools can only write into a wiki that already exists, so wiki pages go through ForgeQE's `write_ado_wiki_page`. If the project has no wiki yet, that tool creates the project wiki first, along with any missing parent pages. The PAT needs Wiki (read and write).
|
|
435
435
|
|
|
436
|
+
Pull requests are opened with ForgeQE's `create_ado_pull_request` ("create a PR from feature/cart to main in the shop repository"), since the `repositories` tool group is not loaded by default. It checks that both branches exist, and returns an active pull request between the same branches instead of opening a second one. The PAT needs Code (read and write).
|
|
437
|
+
|
|
436
438
|
Requirements work too: "write and run test cases for the checkout rules page in Confluence" makes the agent read the page, write one case per rule or acceptance criterion (with the main negative paths), show them, and run them. It saves them into a test system only when you ask.
|
|
437
439
|
|
|
438
440
|
The agent creates or changes items (a bug, a comment, a status change) only when you ask it to; bugs for failed cases come from `sources.bugs`, not from the agent.
|