@atollhq/skill-claude 0.4.26 → 0.4.28

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atollhq/skill-claude",
3
- "version": "0.4.26",
3
+ "version": "0.4.28",
4
4
  "description": "Install the Atoll project management skill for Claude Code",
5
5
  "bin": {
6
6
  "skill-claude": "bin/install.mjs"
package/skill/SKILL.md CHANGED
@@ -38,6 +38,18 @@ Read only the references required for the current task:
38
38
  - Request and response fields, enums, and validation:
39
39
  [api-fields.md](references/api-fields.md)
40
40
 
41
+ For automation rule V1 actions (including create issue), explicit project or
42
+ organization scope, CI create-only rules, event conditions, validation, safe
43
+ disabling, repair, and example-only CI dry runs, read [Automation Rule Fields](references/api-fields.md#automation-rule-fields).
44
+ Use `atoll automation` for rule management, previews, and run history; see
45
+ [CLI operations](references/cli-operations.md#automation-rules).
46
+ Rule creates require an explicit `project_id`: use a project UUID for project
47
+ scope or `null` for organization scope. Partial updates preserve the saved
48
+ scope when `project_id` is omitted; include it only when intentionally changing
49
+ scope. An invalid rule executes no actions. Repair an invalid rule with
50
+ separate `disable`, `update` while it is disabled, `test`, and `enable`
51
+ operations. Enable only after the latest saved revision passes the dry run.
52
+
41
53
  Do not load every reference by default. Start with this entrypoint and load a
42
54
  topic reference only when the requested operation needs it.
43
55
 
@@ -729,7 +729,24 @@ receive projectless work. An inaccessible explicit `projectId` is concealed as
729
729
  | GET | `/api/orgs/{id}/automation-rules/{ruleId}/activity` | Rule execution history (owner/admin; latest 100 runs) |
730
730
  | POST | `/api/orgs/{id}/automation-rules/{ruleId}/test` | Dry-run test |
731
731
 
732
- Trigger events: `issue.created`, `issue.status_changed`, `issue.assigned`, `issue.priority_changed`.
732
+ V1 definitions validate on create, merged partial updates, dry runs, and runtime.
733
+ On create, `project_id` must be explicit: use a project UUID for project scope
734
+ or `null` for organization scope. Partial updates preserve the saved scope
735
+ when `project_id` is omitted; include it only when intentionally changing
736
+ scope. A concurrent edit during validation returns `409`; reload before
737
+ retrying. An enabled rule must be
738
+ disabled with a separate exact `{ "enabled": false }` update before changing
739
+ scope or repairing an invalid definition. A disabled invalid rule can be
740
+ repaired while remaining disabled; run `test` on that saved revision before a
741
+ separate `enable` update.
742
+ GET/list preserve invalid rows with optional `validation: { valid, issues }`
743
+ (`issues` contain `path`, `code`, and `message`). Owner/admin callers can disable
744
+ an invalid rule with only `{ "enabled": false }`. Change-condition dry runs
745
+ require a canonical `event`; snapshots cannot establish transitions. See
746
+ [Automation Rule Fields](api-fields.md#automation-rule-fields) for the grammar
747
+ and legacy normalization. No public MCP tool is added.
748
+
749
+ Trigger events: `issue.created`, `issue.status_changed`, `issue.assigned`, `issue.priority_changed`, `pr.merged`, `ci.run.completed`.
733
750
  Create and update requests reject unsupported action types or malformed action
734
751
  values before persistence. Activity returns safe durable run/action history;
735
752
  non-matches, dry runs, and rules without executable actions create no history,
@@ -938,3 +955,5 @@ not a hosted API or MCP surface. Its browser projection excludes credentials,
938
955
  raw configuration, prompts, and model output. Local bindings use `repo_ref` but
939
956
  do not grant project/repository access. Intake is read-only locally; hosted
940
957
  Workspace Settings → Runners owns pause/resume. See the CLI local-runner guide.
958
+
959
+ Automation rule create/update accepts the core action set including one `create_issue` per rule. See [Automation Rule Fields](api-fields.md#automation-rule-fields) for required fields, original-issue targets, replay results, and external-event limits.
@@ -483,22 +483,101 @@ multiple exact-name milestones already exist, upsert returns a structured
483
483
 
484
484
  ```json
485
485
  {
486
+ "schema_version": 1,
486
487
  "name": "Auto-assign urgent bugs",
487
488
  "trigger_event": "issue.created",
488
- "conditions": [{ "field": "priority", "operator": "eq", "value": 0 }],
489
+ "conditions": [{ "kind": "field", "field": "priority", "operator": "eq", "value": 0 }],
489
490
  "actions": [{ "type": "set_assignee", "value": "member-uuid" }],
490
491
  "enabled": true,
491
492
  "project_id": "project-uuid"
492
493
  }
493
494
  ```
494
495
 
495
- Supported action values are: `set_status` (lowercase status key using letters,
496
- digits, and underscores), `set_assignee` (member UUID or `null`),
497
- `set_priority` (integer `0` through `3`), `add_label` (label UUID),
498
- `post_comment` (non-empty text), and `close_issue` (no value or `null`).
496
+ Supported action values are: `set_status` (canonical project status key),
497
+ `set_assignee` (replace the full assignee set with one member UUID, or `null` to
498
+ clear it), `add_assignee` (add a member UUID without removing others), `unassign`
499
+ (omit `value`), `set_priority` (integer `0` through `3`), `add_label` and
500
+ `remove_label` (label UUID), `post_comment` (non-empty text, at most 10,000
501
+ characters), and legacy `close_issue` (omit `value`, targets the valid `done` key).
502
+ Already satisfied assignments, priorities, statuses, and label relationships
503
+ succeed without duplicate mutation events. Invalid references still fail.
499
504
  Unsupported action types or malformed values return `400` and are not saved.
500
505
 
501
- **Dry-run test**: Send `{ "issue_id": "uuid" }` or `{ "issue": { "status": "todo", "priority": 2 } }`. Returns `{ matched, actions_that_would_run }`.
506
+ `create_issue` requires `project_id` (UUID), `status` (that project's column key),
507
+ and `title` (1–500 characters). Optional fields are `description` (up to 10,000
508
+ characters), `priority` (0–3), `assignee_ids` (member UUID array), and `label_ids`
509
+ (label UUID array). The member and label arrays accept at most 100 entries each.
510
+ At most one create action is allowed per rule. Configure the new issue inside
511
+ this action; later actions still target the original issue. Target-project access,
512
+ references, limits, and normal creation rules remain authoritative.
513
+
514
+ Creation content supports fixed text and approved `{{repository}}`, `{{workflow}}`,
515
+ `{{conclusion}}`, and `{{run_url}}` fields only. Missing event fields and invalid or
516
+ oversized rendered content fail before creation. Current issue triggers do not
517
+ provide those external fields; use fixed text for issue triggers. The
518
+ `ci.run.completed` trigger supplies them from a signed GitHub completion event.
519
+ CI rules require organization scope (`project_id: null`) and support only
520
+ `create_issue`. CI rules accept only event conditions. Issue triggers reject event conditions.
521
+ Event conditions use `kind: "event"`, `eq` or `neq`, and fields
522
+ `conclusion`, `repository`, `workflow`, `branch` (strings), `has_pr`, or
523
+ `has_linked_issue` (booleans). Use conclusion `failure` and
524
+ `has_linked_issue: false` to create an issue only for an unlinked failed run.
525
+ The first receipt freezes link state; duplicate repository/run/attempt deliveries
526
+ reuse it. A new run attempt is a distinct event. CI dry runs use marked example
527
+ values and never execute actions.
528
+
529
+ A durable action result records `created_issue_id` in the same transaction as
530
+ canonical creation. Repeated execution of that action cannot create another issue.
531
+ If a process stops after creation but before effects finish, the created ID remains
532
+ visible and the interrupted action fails closed; this does not prove all effects
533
+ completed. Deleting the created issue does not permit automatic recreation.
534
+ Dry runs create no issue and fail clearly when required content fields are missing.
535
+
536
+ **CI dry-run test:** Send `{}` with no event or issue overrides. The result has
537
+ `preview_source: "example"`, fixed `test_ci` values, and `test_issue: null`.
538
+ Custom repository or branch conditions can fail to match this example; a preview
539
+ does not verify a live run.
540
+
541
+ **Issue dry-run test**: Send `{ "issue_id": "uuid" }` or `{ "issue": { "status": "todo", "priority": 2 } }`. Returns `{ matched, actions_that_would_run }`.
542
+
543
+ **Rule definition V1:** `schema_version` defaults to `1`. Conditions are ANDed;
544
+ actions run in array order. A field condition uses `kind: "field"`, a field
545
+ (`status`, `priority`, or `assignee_id`), `eq` or `neq`, and a typed `value`.
546
+ A change condition uses `kind: "change"` with `changed` (omit `value`),
547
+ `changed_from`, or `changed_to` (require a typed `value`). Change conditions
548
+ require an issue change trigger; `issue.created` and `pr.merged` reject them.
549
+ Priority values are integers `0`–`3`; status values are lowercase workflow keys;
550
+ assignee values are organization member UUIDs or `null`.
551
+
552
+ Create and partial `PUT` requests reject unknown keys, unsupported versions,
553
+ malformed conditions/actions, and invalid references with `400` and
554
+ `issues: [{ path, code, message }]`. A partial update is merged with the stored
555
+ definition and the complete result is validated. If another edit changes the rule
556
+ during validation, `PUT` returns `409`; reload the rule before retrying. An enabled
557
+ rule must be disabled by a separate exact `{ "enabled": false }` request before
558
+ changing `project_id`; combining disable with a scope change is rejected. An
559
+ enabled invalid rule must also be disabled separately before repair. A disabled
560
+ invalid rule accepts a valid repair only while remaining disabled; repair and
561
+ enable must be separate. Project-scoped status values
562
+ must exist in that workflow; project, member, and label references must belong
563
+ to the organization. A request containing only `{ "enabled": false }` can
564
+ disable an invalid rule without changing its definition; owner/admin access
565
+ is still required. Enabling requires a valid definition.
566
+
567
+ GET/list rules can include `validation: { valid, issues: [{ path, code, message }] }`.
568
+ Invalid saved rows remain readable. Runtime validation rejects the whole invalid
569
+ rule before any action; valid actions are not salvaged from a malformed rule.
570
+ Legacy missing `schema_version` and condition `kind` normalize to `1` and `field`;
571
+ priority strings `"0"`–`"3"` normalize to integers. Stored legacy `close_issue`
572
+ with `value: null` normalizes to no value, and stored empty `set_assignee` values
573
+ normalize to `null`. New writes must omit `close_issue.value`. Prefer `unassign` to clear all
574
+ assignees; legacy `set_assignee` with `null` remains supported.
575
+
576
+ **Change-condition dry runs:** Send `{ "event": <canonical IssueDomainEventV1> }`
577
+ to the existing `/test` endpoint. The event must match the organization and rule
578
+ project scope. Its derived triggers and before/after change map determine the
579
+ result. An issue snapshot alone returns `400` for a change-aware rule. Dry runs
580
+ perform no actions and create no run history.
502
581
 
503
582
  **Automation run history**: `GET /api/orgs/{id}/automation-rules/{ruleId}/activity`
504
583
  returns `{ runs }` to owner/admin members, newest first and limited to the
@@ -919,7 +998,7 @@ metadata are never returned by the public API.
919
998
  | Status update | `status` | `on_track`, `at_risk`, `off_track` |
920
999
  | Member | `role` | `owner`, `admin`, `member`, `guest` |
921
1000
  | Project member | `accessLevel` | `view`, `edit`, `admin` |
922
- | Automation | `trigger_event` | `issue.created`, `issue.status_changed`, `issue.assigned`, `issue.priority_changed` |
1001
+ | Automation | `trigger_event` | `issue.created`, `issue.status_changed`, `issue.assigned`, `issue.priority_changed`, `pr.merged`, `ci.run.completed` |
923
1002
  | Heartbeat signal | `type` | `kpi_off_pace`, `kpi_stale`, `issue_stale`, `issue_blocked`, `milestone_overdue`, `initiative_stalled`, `initiative_target_due_soon`, `initiative_target_overdue`, `initiative_target_blocked`, `webhook_failing` |
924
1003
  | Heartbeat signal | `severity` | `info`, `warning`, `critical` |
925
1004
  | Custom view | `display_mode` | `board`, `list` |
@@ -193,3 +193,29 @@ CLI JSON conventions:
193
193
  ### Bulk create tasks from a plan
194
194
 
195
195
  `POST /api/orgs/{id}/issues/bulk` with `{ "issues": [{...}, ...] }` (max 50).
196
+
197
+ ## Automation rules
198
+
199
+ Use `atoll automation list`, `get <rule-uuid>`, `create --file rule.json`,
200
+ `update <rule-uuid> --file patch.json`, `test <rule-uuid> [--file preview.json]`,
201
+ `runs <rule-uuid> --limit 20`, `enable`, `disable`, and `delete --force`.
202
+ Use `delete <rule-uuid> --dry-run` to preview deletion. Use `--json`
203
+ for machine-readable results and `--file -` for standard input. Create defaults
204
+ to disabled when `enabled` is omitted, but the JSON must include an explicit
205
+ `project_id` UUID or `null` for Organization-wide scope; update preserves omitted
206
+ fields.
207
+ List uses the selected organization and applies a project filter only with
208
+ explicit `--project`; it does not inherit the default project.
209
+
210
+ Rule files use the canonical Automation Rule Fields contract. CI rules require
211
+ `project_id: null`, only `create_issue` actions, and event conditions. Use
212
+ conclusion `failure` and `has_linked_issue: false` for unlinked CI failures.
213
+ The action chooses its target project/status and accepts approved
214
+ `{{repository}}`, `{{workflow}}`, `{{conclusion}}`, `{{run_url}}` substitutions.
215
+ CI `test` sends `{}` by default, uses marked fixed examples, rejects overrides,
216
+ and executes no actions. Inspect the preview before explicitly enabling.
217
+ Rule writes, tests, and run history require owner/admin access; CLI does not bypass it.
218
+ `runs` preserves created issue IDs and interrupted-action evidence. For an invalid
219
+ rule, use separate `disable`, `update` while disabled, `test`, and `enable`
220
+ operations. Human `get` output includes invalid state and validation paths;
221
+ `--json` preserves the API response.