@chris1807/claude-kit 2.3.6 → 2.3.8
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/README.md +23 -7
- package/bin/cli.js +10 -1
- package/package.json +1 -1
- package/templates/agents/global/qa.md +135 -15
- package/templates/commands/autopilot.md +188 -0
- package/templates/commands/qa.md +100 -26
- package/templates/commands/repro.md +285 -0
- package/templates/hooks/uat-reminder.sh +1 -0
- package/templates/infrastructure/CLAUDE-WORKFLOW.md +86 -23
|
@@ -18,7 +18,7 @@ You (give task)
|
|
|
18
18
|
├── deployer → commits, pushes, triggers CD pipeline
|
|
19
19
|
├── db-admin → queries/fixes MongoDB data
|
|
20
20
|
├── test-runner → runs xUnit, Vitest, Playwright tests
|
|
21
|
-
├── qa → drives a real browser on a
|
|
21
|
+
├── qa → drives a real browser on a running environment: regression-tests a story's screens, reproduces a bug, verifies a fix
|
|
22
22
|
├── build-validator → confirms builds pass
|
|
23
23
|
├── lint-checker → runs ESLint and dotnet format
|
|
24
24
|
├── security-auditor → scans for secrets, vulnerabilities
|
|
@@ -53,6 +53,8 @@ Short, single-query operations (`/track`, `/explain`, `/close-orphan-tasks`) do
|
|
|
53
53
|
|
|
54
54
|
**`/implement` uses ultracode scaled to the change** — its code review always fans out (find → adversarially-verify), but exploration and per-AC coverage fan out only for non-trivial / full-stack stories; a one-line config change runs lean. It's the daily driver, so it doesn't blanket-fan-out like `/rework`.
|
|
55
55
|
|
|
56
|
+
**`/autopilot` always uses it**, at `/implement`'s scale — invoking the command is the opt-in. With no human approving the plan or choosing review fixes, the independent Architect Review agent and the find → adversarially-verify review are what stand in for that scrutiny.
|
|
57
|
+
|
|
56
58
|
**`/plan-backlog`, `/plan-sprint`, and `/quote-backlog` use it opt-in** — only when ultracode is on.
|
|
57
59
|
|
|
58
60
|
### Sensitive Data Policy
|
|
@@ -81,7 +83,7 @@ These run automatically — no action needed:
|
|
|
81
83
|
| Server | What It Does |
|
|
82
84
|
|--------|-------------|
|
|
83
85
|
| **Azure DevOps** *(core — drives every slash command)* | Work items, repos, pull requests, pipelines, wiki, test plans, advanced security |
|
|
84
|
-
| **Playwright** | Browser testing (navigate, click, fill, screenshot) — **required by `/qa`** |
|
|
86
|
+
| **Playwright** | Browser testing (navigate, click, fill, screenshot) — **required by `/qa` and `/repro`** |
|
|
85
87
|
| **MongoDB** | Direct database queries and updates |
|
|
86
88
|
| **Microsoft Teams** | Send/read team messages and notifications |
|
|
87
89
|
| **Stripe** | Payment management (when configured) |
|
|
@@ -205,7 +207,7 @@ Every environment in the chain has a work item state, so the board shows where e
|
|
|
205
207
|
| `staging` | Staging | `Ready for Staging` | `Staging` |
|
|
206
208
|
| `prod` | Production | `Ready to Deploy` | `Deployed` |
|
|
207
209
|
|
|
208
|
-
`/qa`
|
|
210
|
+
`/qa` and `/repro` are the exceptions that prove the rule: they test a work item in a browser and post a result comment, but they **never write a state** — not even `Ready for Testing`, and not even when `/repro` finds a bug `FIXED`.
|
|
209
211
|
|
|
210
212
|
Human-only transitions — no slash command ever makes these: `Code Review → Ready for Testing` (the developer confirms the change on Dev), `Testing → Ready for Staging` (QA sign-off), `Staging → Ready to Deploy` (stakeholder / UAT sign-off), `Deployed → Closed` (verified in production).
|
|
211
213
|
|
|
@@ -381,6 +383,7 @@ All deployment and release operations are available as slash commands:
|
|
|
381
383
|
| Command | Usage | What It Does |
|
|
382
384
|
|---|---|---|
|
|
383
385
|
| `/implement` | `/implement AB#1234` | Summarize work item → approve plan → ensure an open child Task with hours → implement → PR (closes the Task, logs hours). On a Feature: child stories in `Custom.Order` waves, same-order stories in parallel |
|
|
386
|
+
| `/autopilot` | `/autopilot AB#1234` | `/implement` end to end with no approval gates: Claude plans, runs an independent architect review, implements, fixes verified review findings, and opens the PR (labeled `autopilot`) with every decision logged in a PR thread and the UAT checklist for the reviewer. Never merges or deploys. Hard-stops only before code is written; if it can't finish cleanly, it opens a draft PR and leaves the item `Active` |
|
|
384
387
|
| `/review` | `/review 142` | Automated code review on a PR |
|
|
385
388
|
| `/resolve-feedback` | `/resolve-feedback 142` | Address unresolved PR comment threads, push fixes, reply + resolve threads |
|
|
386
389
|
| `/deploy` | `/deploy "commit message"` | Commit, push, trigger pipeline (only on `dev`/`test`/`staging`/`prod` — never on `main`) |
|
|
@@ -392,7 +395,8 @@ All deployment and release operations are available as slash commands:
|
|
|
392
395
|
| `/rollback` | `/rollback AB#1234 prod` | Revert commits on an environment |
|
|
393
396
|
| `/track` | `/track release 24` | Check release, pipeline, environment, or work item status; flags work items whose state lags their environment |
|
|
394
397
|
| `/where` | `/where AB#1234` | Show which environment branches contain a work item's commits |
|
|
395
|
-
| `/qa` | `/qa AB#1234 [env]` | Verify the item is fully deployed with a green pipeline → open the app in a real browser → sign in
|
|
398
|
+
| `/qa` | `/qa AB#1234 [env] [--as=<user>]` | Verify the item is fully deployed with a green pipeline → open the app in a real browser → sign in (app login form, or Microsoft) and optionally impersonate a user → full regression of the screens the story touched → pass/fail comment (never a state change) |
|
|
399
|
+
| `/repro` | `/repro AB#1234 [env] [--as=<user>]` | Follow a bug's repro steps in a real browser. Before the fix: confirm it reproduces and point at the code to read. After the fix is deployed: prove the bug is gone, against a control run on a build without the fix → result comment (never a state change) |
|
|
396
400
|
| `/plan-backlog` | `/plan-backlog [project]` | Sweep backlog for Dev Ready stories with points and no tasks → propose child tasks with hours |
|
|
397
401
|
| `/plan-sprint` | `/plan-sprint [project] [--next]` | Sweep the current sprint (or the next one with `--next`) for stories/bugs with no child tasks → propose one child task with hours per item |
|
|
398
402
|
| `/quote-backlog` | `/quote-backlog [project]` | Sweep backlog for unpointed items ready to estimate — stories in `Design Approved`, **bugs in `New`** (bugs have no design states) → review completeness, check for duplicates, suggest rewrites, propose points (+ Investment Category / Impact where unset) + creator comments (10 at a time, approval-gated). Pointed items move to Dev Ready; stories that can't be quoted move back to **Design Review**, bugs that can't be quoted get a **`needs-info`** tag, so the next sweep skips them. Every run also audits the drop-out queue (tagged bugs **and** stories bounced to Design Review) and reports any whose creator answered but which nobody returned to the sweep — neither mechanism expires, so those are otherwise invisible forever |
|
|
@@ -464,7 +468,7 @@ Glasswing and Monarch (not yet migrated — 1 environment):
|
|
|
464
468
|
|
|
465
469
|
### Environment URLs
|
|
466
470
|
|
|
467
|
-
`/qa`
|
|
471
|
+
`/qa` and `/repro` open the app in a real browser. They need to know where each environment is hosted, how sign-in works, and which test account to use. Without this section they report and stop rather than guessing a hostname.
|
|
468
472
|
|
|
469
473
|
Add this to your project's `CLAUDE.md` — **above the `## Claude Kit Workflow` heading.** Everything from that heading to the end of the file is replaced on each kit update, so configuration placed below it is lost.
|
|
470
474
|
|
|
@@ -478,35 +482,92 @@ Add this to your project's `CLAUDE.md` — **above the `## Claude Kit Workflow`
|
|
|
478
482
|
| test | Test | https://test.myapp.example.com | https://test.api.myapp.example.com |
|
|
479
483
|
| staging | Staging | https://staging.myapp.example.com | https://staging.api.myapp.example.com |
|
|
480
484
|
|
|
481
|
-
**Sign-in:** form at `/login` — app-issued JWT, no SSO. Signed-in landing: `/dashboard`.
|
|
485
|
+
**Sign-in:** `form` at `/login` — app-issued JWT, no SSO. Signed-in landing: `/dashboard`.
|
|
482
486
|
|
|
483
|
-
**Test accounts** — values
|
|
487
|
+
**Test accounts** — each developer sets the values on their own machine; never write a password here.
|
|
484
488
|
|
|
485
489
|
| Role | Username variable | Password variable | Default |
|
|
486
490
|
|------|-------------------|-------------------|---------|
|
|
487
491
|
| Admin | `MYAPP_QA_ADMIN_USERNAME` | `MYAPP_QA_ADMIN_PASSWORD` | yes |
|
|
488
492
|
| Provider | `MYAPP_QA_PROVIDER_USERNAME` | `MYAPP_QA_PROVIDER_PASSWORD` | |
|
|
493
|
+
|
|
494
|
+
**Impersonation:** local, dev, test. Sign in as the `Admin` test account first.
|
|
495
|
+
- Start: `/admin/impersonate` → type into "Search users" → "Search" → the row's "Impersonate" button → "Impersonate" in the confirm dialog.
|
|
496
|
+
- You're the target when: the target's landing route loads.
|
|
497
|
+
- End: "Logout" → `/login`. This ends the whole session; sign in again as the admin to continue.
|
|
498
|
+
|
|
499
|
+
| Persona | Search term | Role | Notes |
|
|
500
|
+
|---------|-------------|------|-------|
|
|
501
|
+
| Provider | `qa-provider@example.com` | Provider | profile complete |
|
|
489
502
|
```
|
|
490
503
|
|
|
491
504
|
**Rules for slash commands:**
|
|
492
505
|
- **Branch names must match the `## Pipeline Configuration` table** row for row. The two tables are joined on the branch column — `/qa` reads the URL here and the pipeline ID there. A mismatch is a configuration error worth reporting.
|
|
493
|
-
- **There is no `prod` row, deliberately.** `/qa`
|
|
494
|
-
- **Include the rows below the one you test.** The row immediately below the target serves the pre-change build
|
|
506
|
+
- **There is no `prod` row, deliberately.** `/qa` and `/repro` refuse production: an unattended run signs in and clicks through live member data.
|
|
507
|
+
- **Include the rows below the one you test.** The row immediately below the target serves the pre-change build. That is how `/qa` tells a regression this story caused from a bug that was already there, and how `/repro` runs its *control*: it proves the steps still trigger the bug on a build without the fix, so a clean run on the fixed build means **fixed**, not *never triggered*.
|
|
495
508
|
- **App URL is required; API URL is optional** — it is used to attribute a failing network call to the backend rather than the screen.
|
|
496
|
-
- **`Sign-in:`**
|
|
497
|
-
-
|
|
498
|
-
-
|
|
509
|
+
- **`Sign-in:`** starts with the method, then optional prose: the login route, the landing page, and an element that only exists once you're signed in.
|
|
510
|
+
- `` `form` `` — the app's own login form, with no MFA. If the developer has set the role's credential variables, the `qa` agent fills the form in itself. If not, the developer signs in by hand in the browser window — see Test accounts below.
|
|
511
|
+
- `` `microsoft` `` — Entra ID / MSAL redirect. Name the app's sign-in button and the signed-in marker. **By default the person running the command signs in by hand**, once, in the Chromium window Playwright opens. MFA is fine, and no credential enters any transcript. Playwright MCP keeps a persistent browser profile, so later runs reuse that session until it expires. For a fully unattended run, give the role's row credential variables **and** state on the `Sign-in:` line that the account is a cloud-only, **MFA-exempt** QA account. The agent then types them into the Microsoft page itself.
|
|
512
|
+
- A line naming neither method is read as `microsoft` only if it says sign-in goes through Microsoft / Entra ID, and as `form` otherwise. Name the method explicitly; that is less fragile than relying on this.
|
|
513
|
+
- **Test accounts** are used by `/qa` and `/repro` and nothing else. The table declares the variable **names**. **Each developer sets the values on their own machine** — usually for their own account, which must hold the row's role on the environment being tested.
|
|
514
|
+
- **Per environment:** `{VAR}_{ENV}` overrides `{VAR}`, where `{ENV}` is `LOCAL`, `DEV`, `TEST`, or `STAGING`. Use it when your account's password differs on an environment with its own database — for example `COMPASS_QA_ADMIN_PASSWORD_TEST`.
|
|
515
|
+
- **Not set?** Then `/qa` and `/repro` don't stop. They offer to let you **sign in yourself** in the browser window, and your password never passes through Claude. The cost: the agent can't sign in anywhere else on its own, so on a `form` app there is no re-check on the baseline environment, and no second role.
|
|
516
|
+
- **Which to choose:** when the agent fills a form, the password is a tool argument. It is stored in the session transcript on your machine and sent to the model with every other tool call. For a dedicated QA account that's fine. **For your own administrator account, prefer signing in yourself.**
|
|
517
|
+
- The `Default` column marks the row used when `--role` is not given; if no row is marked, the first row wins. A second role lets `/qa` verify that restricted controls are correctly *absent* — a class of bug a manual checklist rarely catches. Under `microsoft` with a hand-off, the variable columns can be `—`; the role still says which account to sign in with.
|
|
518
|
+
- **`Impersonation:`** is optional. Add it only if the app has a "sign in as another user" feature. It is what makes `--as=<user>` work, and it describes four things:
|
|
519
|
+
- **where** it's available — impersonation is often environment-gated;
|
|
520
|
+
- **which test account** can impersonate, and in which role;
|
|
521
|
+
- **how to start it**, using the visible labels of the controls;
|
|
522
|
+
- **how to end it** — say so if ending it signs you out completely.
|
|
523
|
+
|
|
524
|
+
The persona table names QA test users to impersonate by role. Use dedicated QA users, never a real person. `--as=<persona>` uses the row. Any other `--as` value is searched for literally, as an **ad-hoc user** — typically the person who reported a bug. The app records everything done while impersonating as that user, so an ad-hoc run is **read-only**: `/qa` submits nothing, and `/repro` asks you to approve each writing step.
|
|
525
|
+
- **Never put a credential in these tables.** Only variable names. The values belong in your shell profile — see Environment Setup below.
|
|
499
526
|
|
|
500
|
-
**
|
|
527
|
+
**Examples from actual projects:**
|
|
501
528
|
|
|
502
|
-
COMPASS:
|
|
529
|
+
COMPASS — `form` sign-in, plus impersonation:
|
|
503
530
|
```markdown
|
|
504
531
|
| Branch | Environment | App URL | API URL |
|
|
505
532
|
|--------|------------|---------|---------|
|
|
506
|
-
| (none) | local | http://localhost:
|
|
533
|
+
| (none) | local | http://localhost:3000 | http://localhost:5191 |
|
|
507
534
|
| dev | Dev | https://dev.compass.caresolutions.com | https://dev.api.compass.caresolutions.com |
|
|
508
535
|
| test | Test | https://test.compass.caresolutions.com | https://test.api.compass.caresolutions.com |
|
|
509
536
|
| staging | Staging | https://staging.compass.caresolutions.com | https://staging.api.compass.caresolutions.com |
|
|
537
|
+
|
|
538
|
+
**Sign-in:** `form` at `/login` — app-issued JWT, no SSO, no MFA. If the account holds several roles, the login page asks which one; choose the table's role. Admin lands on `/admin/dashboard`.
|
|
539
|
+
|
|
540
|
+
**Test accounts** — each developer uses **their own System Administrator account**, set on their own machine. Local and dev share a database; test has its own, so set `COMPASS_QA_ADMIN_PASSWORD_TEST` if your test password differs.
|
|
541
|
+
|
|
542
|
+
| Role | Username variable | Password variable | Default |
|
|
543
|
+
|------|-------------------|-------------------|---------|
|
|
544
|
+
| System Administrator | `COMPASS_QA_ADMIN_USERNAME` | `COMPASS_QA_ADMIN_PASSWORD` | yes |
|
|
545
|
+
|
|
546
|
+
**Impersonation:** local, dev, test — **not staging** (the API returns 404 there). Sign in as the `Admin` test account in the **System Administrator** role.
|
|
547
|
+
- Start: `/admin/impersonate` → type into "Search users" → "Search" → on the row, "Impersonate" (or "Impersonate as <Role>" for a multi-role user) → "Impersonate" in the "Impersonate this user?" dialog.
|
|
548
|
+
- You're the target when: the target's landing route loads. There is no impersonation banner.
|
|
549
|
+
- End: "Logout" (drawer bottom row, or the avatar menu) → `/login`. This signs you out completely; sign in again as the admin to continue.
|
|
550
|
+
- The token has no `impersonatedBy` claim — every action is recorded as the target.
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
CSIPay — `microsoft` sign-in, no impersonation:
|
|
554
|
+
```markdown
|
|
555
|
+
| Branch | Environment | App URL | API URL |
|
|
556
|
+
|--------|------------|---------|---------|
|
|
557
|
+
| (none) | local | http://localhost:3001 | https://localhost:5001/api |
|
|
558
|
+
| dev | Dev | https://dev.csipay.caresolutions.com | https://dev.api.csipay.caresolutions.com/api |
|
|
559
|
+
| test | Test | https://test.csipay.caresolutions.com | https://test.api.csipay.caresolutions.com/api |
|
|
560
|
+
| staging | Staging | https://staging.csipay.caresolutions.com | https://staging.api.csipay.caresolutions.com/api |
|
|
561
|
+
|
|
562
|
+
**Sign-in:** `microsoft` — Entra ID redirect via MSAL, single tenant. Any URL shows the "Sign in with Microsoft" button when signed out. Signed-in marker: the "Dashboard" heading at `/`. Roles are Entra app roles (`Admin`, `Developer`).
|
|
563
|
+
|
|
564
|
+
| Role | Username variable | Password variable | Default |
|
|
565
|
+
|------|-------------------|-------------------|---------|
|
|
566
|
+
| Developer | — | — | yes |
|
|
567
|
+
| Admin | — | — | |
|
|
568
|
+
| User (no app role) | — | — | |
|
|
569
|
+
|
|
570
|
+
Each developer signs in with their own Microsoft account. `Admin` and `Developer` see unmasked identifiers on Payees, which the sensitive-data hook blocks on sight. To test Payees content, sign in with an account that has no app role.
|
|
510
571
|
```
|
|
511
572
|
|
|
512
573
|
### Environment Setup
|
|
@@ -526,14 +587,16 @@ az login
|
|
|
526
587
|
# Microsoft Teams MCP — no env vars needed. First invocation prints a
|
|
527
588
|
# device code + URL to sign in via Microsoft Graph (OAuth device flow).
|
|
528
589
|
|
|
529
|
-
# QA
|
|
530
|
-
#
|
|
531
|
-
#
|
|
532
|
-
#
|
|
533
|
-
|
|
590
|
+
# QA sign-in for /qa and /repro — OPTIONAL. Set these only if you want the agent
|
|
591
|
+
# to sign in unattended. Leave them unset and you'll be asked to sign in yourself in
|
|
592
|
+
# the browser window, so your password never passes through Claude.
|
|
593
|
+
# The variable NAMES come from the project's `## Environment URLs` section. The
|
|
594
|
+
# VALUES are yours — usually your own account with the role the table names — and
|
|
595
|
+
# they live only here, never in any file. `_TEST` / `_DEV` / `_LOCAL` / `_STAGING`
|
|
596
|
+
# versions override the plain one on that environment.
|
|
597
|
+
export COMPASS_QA_ADMIN_USERNAME="you@caresolutions.com"
|
|
534
598
|
export COMPASS_QA_ADMIN_PASSWORD="..."
|
|
535
|
-
export
|
|
536
|
-
export COMPASS_QA_PROVIDER_PASSWORD="..."
|
|
599
|
+
export COMPASS_QA_ADMIN_PASSWORD_TEST="..." # only if your test password differs
|
|
537
600
|
```
|
|
538
601
|
|
|
539
|
-
`/qa`
|
|
602
|
+
When these are set, `/qa` and `/repro` read them **inside a subagent** and fill the login form directly. They never print a value, never write one to a file, and never include one in a report or a work item comment. The value is still a tool argument, so it lands in that subagent's local transcript. That is why signing in yourself is the better choice for a personal administrator account. Apps that sign in through Microsoft need no variables at all: you sign in once in the browser window, and the session persists in the Playwright profile.
|