@elnora-ai/linear 1.0.1 → 2.0.0
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/.claude-plugin/marketplace.json +7 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +25 -1
- package/README.md +275 -25
- package/agents/linear-issue-creator.md +135 -17
- package/agents/linear-issue-reviewer.md +122 -23
- package/agents/linear-issue-updater.md +137 -25
- package/agents/linear-state-curator.md +173 -0
- package/agents/linear-url-to-issues.md +190 -26
- package/commands/linear-cleanup.md +64 -29
- package/dist/cli.js +69 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/auth.d.ts +10 -0
- package/dist/client/auth.d.ts.map +1 -1
- package/dist/client/auth.js +50 -3
- package/dist/client/auth.js.map +1 -1
- package/dist/client/linear-client.d.ts +7 -0
- package/dist/client/linear-client.d.ts.map +1 -1
- package/dist/client/linear-client.js +13 -1
- package/dist/client/linear-client.js.map +1 -1
- package/dist/commands/agent-activities.d.ts +3 -0
- package/dist/commands/agent-activities.d.ts.map +1 -0
- package/dist/commands/agent-activities.js +144 -0
- package/dist/commands/agent-activities.js.map +1 -0
- package/dist/commands/agent-sessions.d.ts +3 -0
- package/dist/commands/agent-sessions.d.ts.map +1 -0
- package/dist/commands/agent-sessions.js +132 -0
- package/dist/commands/agent-sessions.js.map +1 -0
- package/dist/commands/attachments.d.ts +3 -0
- package/dist/commands/attachments.d.ts.map +1 -0
- package/dist/commands/attachments.js +265 -0
- package/dist/commands/attachments.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +73 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/comments.d.ts +3 -0
- package/dist/commands/comments.d.ts.map +1 -0
- package/dist/commands/comments.js +107 -0
- package/dist/commands/comments.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +62 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +94 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/curator.d.ts +14 -0
- package/dist/commands/curator.d.ts.map +1 -1
- package/dist/commands/curator.js +97 -19
- package/dist/commands/curator.js.map +1 -1
- package/dist/commands/customer-needs.d.ts +3 -0
- package/dist/commands/customer-needs.d.ts.map +1 -0
- package/dist/commands/customer-needs.js +198 -0
- package/dist/commands/customer-needs.js.map +1 -0
- package/dist/commands/customers.d.ts +5 -0
- package/dist/commands/customers.d.ts.map +1 -0
- package/dist/commands/customers.js +201 -0
- package/dist/commands/customers.js.map +1 -0
- package/dist/commands/cycles.d.ts +3 -0
- package/dist/commands/cycles.d.ts.map +1 -0
- package/dist/commands/cycles.js +67 -0
- package/dist/commands/cycles.js.map +1 -0
- package/dist/commands/documents.d.ts +3 -0
- package/dist/commands/documents.d.ts.map +1 -0
- package/dist/commands/documents.js +105 -0
- package/dist/commands/documents.js.map +1 -0
- package/dist/commands/favorites.d.ts +3 -0
- package/dist/commands/favorites.d.ts.map +1 -0
- package/dist/commands/favorites.js +101 -0
- package/dist/commands/favorites.js.map +1 -0
- package/dist/commands/index.d.ts +30 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +30 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/initiatives.d.ts +3 -0
- package/dist/commands/initiatives.d.ts.map +1 -0
- package/dist/commands/initiatives.js +106 -0
- package/dist/commands/initiatives.js.map +1 -0
- package/dist/commands/issues.d.ts +21 -0
- package/dist/commands/issues.d.ts.map +1 -0
- package/dist/commands/issues.js +1083 -0
- package/dist/commands/issues.js.map +1 -0
- package/dist/commands/labels.d.ts +3 -0
- package/dist/commands/labels.d.ts.map +1 -0
- package/dist/commands/labels.js +111 -0
- package/dist/commands/labels.js.map +1 -0
- package/dist/commands/milestones.d.ts +3 -0
- package/dist/commands/milestones.d.ts.map +1 -0
- package/dist/commands/milestones.js +94 -0
- package/dist/commands/milestones.js.map +1 -0
- package/dist/commands/notifications.d.ts +3 -0
- package/dist/commands/notifications.d.ts.map +1 -0
- package/dist/commands/notifications.js +130 -0
- package/dist/commands/notifications.js.map +1 -0
- package/dist/commands/project-labels.d.ts +3 -0
- package/dist/commands/project-labels.d.ts.map +1 -0
- package/dist/commands/project-labels.js +80 -0
- package/dist/commands/project-labels.js.map +1 -0
- package/dist/commands/project-relations.d.ts +3 -0
- package/dist/commands/project-relations.d.ts.map +1 -0
- package/dist/commands/project-relations.js +96 -0
- package/dist/commands/project-relations.js.map +1 -0
- package/dist/commands/projects.d.ts +3 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +263 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/quota.d.ts +3 -0
- package/dist/commands/quota.d.ts.map +1 -0
- package/dist/commands/quota.js +28 -0
- package/dist/commands/quota.js.map +1 -0
- package/dist/commands/reactions.d.ts +7 -0
- package/dist/commands/reactions.d.ts.map +1 -0
- package/dist/commands/reactions.js +53 -0
- package/dist/commands/reactions.js.map +1 -0
- package/dist/commands/relations.d.ts +3 -0
- package/dist/commands/relations.d.ts.map +1 -0
- package/dist/commands/relations.js +73 -0
- package/dist/commands/relations.js.map +1 -0
- package/dist/commands/states.d.ts +3 -0
- package/dist/commands/states.d.ts.map +1 -0
- package/dist/commands/states.js +52 -0
- package/dist/commands/states.js.map +1 -0
- package/dist/commands/status-updates.d.ts +3 -0
- package/dist/commands/status-updates.d.ts.map +1 -0
- package/dist/commands/status-updates.js +117 -0
- package/dist/commands/status-updates.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +58 -18
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/teams.d.ts +3 -0
- package/dist/commands/teams.d.ts.map +1 -0
- package/dist/commands/teams.js +135 -0
- package/dist/commands/teams.js.map +1 -0
- package/dist/commands/templates.d.ts +3 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +76 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/users.d.ts +3 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +40 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/commands/views.d.ts +3 -0
- package/dist/commands/views.d.ts.map +1 -0
- package/dist/commands/views.js +177 -0
- package/dist/commands/views.js.map +1 -0
- package/dist/commands/webhooks.d.ts +3 -0
- package/dist/commands/webhooks.d.ts.map +1 -0
- package/dist/commands/webhooks.js +234 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +3 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +15 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/curator/dispatch.d.ts +52 -0
- package/dist/curator/dispatch.d.ts.map +1 -0
- package/dist/curator/dispatch.js +144 -0
- package/dist/curator/dispatch.js.map +1 -0
- package/dist/curator/index.d.ts +5 -0
- package/dist/curator/index.d.ts.map +1 -0
- package/dist/curator/index.js +5 -0
- package/dist/curator/index.js.map +1 -0
- package/dist/curator/llm.d.ts +70 -0
- package/dist/curator/llm.d.ts.map +1 -0
- package/dist/curator/llm.js +107 -0
- package/dist/curator/llm.js.map +1 -0
- package/dist/curator/snapshot.d.ts +34 -0
- package/dist/curator/snapshot.d.ts.map +1 -0
- package/dist/curator/snapshot.js +127 -0
- package/dist/curator/snapshot.js.map +1 -0
- package/dist/curator/state.d.ts +50 -0
- package/dist/curator/state.d.ts.map +1 -0
- package/dist/curator/state.js +125 -0
- package/dist/curator/state.js.map +1 -0
- package/dist/lib/bulk-graphql.d.ts +144 -0
- package/dist/lib/bulk-graphql.d.ts.map +1 -0
- package/dist/lib/bulk-graphql.js +380 -0
- package/dist/lib/bulk-graphql.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/output/cli.d.ts +17 -0
- package/dist/output/cli.d.ts.map +1 -0
- package/dist/output/cli.js +252 -0
- package/dist/output/cli.js.map +1 -0
- package/dist/output/formatter.d.ts +6 -0
- package/dist/output/formatter.d.ts.map +1 -1
- package/dist/output/formatter.js +10 -0
- package/dist/output/formatter.js.map +1 -1
- package/dist/output/index.d.ts +1 -0
- package/dist/output/index.d.ts.map +1 -1
- package/dist/output/index.js +1 -0
- package/dist/output/index.js.map +1 -1
- package/dist/scripts/sync-linear-templates.d.ts +26 -0
- package/dist/scripts/sync-linear-templates.d.ts.map +1 -0
- package/dist/scripts/sync-linear-templates.js +115 -0
- package/dist/scripts/sync-linear-templates.js.map +1 -0
- package/dist/signals/github-commits.d.ts +31 -0
- package/dist/signals/github-commits.d.ts.map +1 -0
- package/dist/signals/github-commits.js +127 -0
- package/dist/signals/github-commits.js.map +1 -0
- package/dist/signals/github-pr.d.ts +16 -0
- package/dist/signals/github-pr.d.ts.map +1 -0
- package/dist/signals/github-pr.js +98 -0
- package/dist/signals/github-pr.js.map +1 -0
- package/dist/signals/index.d.ts +4 -0
- package/dist/signals/index.d.ts.map +1 -1
- package/dist/signals/index.js +4 -0
- package/dist/signals/index.js.map +1 -1
- package/dist/signals/linear-issues.d.ts +20 -0
- package/dist/signals/linear-issues.d.ts.map +1 -0
- package/dist/signals/linear-issues.js +115 -0
- package/dist/signals/linear-issues.js.map +1 -0
- package/dist/signals/registry.d.ts +4 -3
- package/dist/signals/registry.d.ts.map +1 -1
- package/dist/signals/registry.js +33 -11
- package/dist/signals/registry.js.map +1 -1
- package/dist/signals/slack-messages.d.ts +20 -0
- package/dist/signals/slack-messages.d.ts.map +1 -0
- package/dist/signals/slack-messages.js +129 -0
- package/dist/signals/slack-messages.js.map +1 -0
- package/dist/utils/errors.d.ts +81 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +110 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/label-policy.d.ts +60 -0
- package/dist/utils/label-policy.d.ts.map +1 -0
- package/dist/utils/label-policy.js +103 -0
- package/dist/utils/label-policy.js.map +1 -0
- package/dist/utils/parse.d.ts +48 -0
- package/dist/utils/parse.d.ts.map +1 -0
- package/dist/utils/parse.js +133 -0
- package/dist/utils/parse.js.map +1 -0
- package/dist/utils/project-status.d.ts +6 -0
- package/dist/utils/project-status.d.ts.map +1 -0
- package/dist/utils/project-status.js +33 -0
- package/dist/utils/project-status.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +24 -0
- package/dist/utils/rate-limit.d.ts.map +1 -0
- package/dist/utils/rate-limit.js +89 -0
- package/dist/utils/rate-limit.js.map +1 -0
- package/dist/utils/resolve.d.ts +84 -0
- package/dist/utils/resolve.d.ts.map +1 -0
- package/dist/utils/resolve.js +172 -0
- package/dist/utils/resolve.js.map +1 -0
- package/dist/utils/sleep.d.ts +2 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +4 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/webhook-verify.d.ts +42 -0
- package/dist/utils/webhook-verify.d.ts.map +1 -0
- package/dist/utils/webhook-verify.js +65 -0
- package/dist/utils/webhook-verify.js.map +1 -0
- package/package.json +7 -2
- package/references/agent-description-template.md +31 -0
- package/references/cli-reference.md +227 -0
- package/references/curator-tiering-rules.md +78 -0
- package/references/label-policy.example.json +37 -0
- package/references/label-policy.placeholder.json +6 -0
- package/references/settings-template.md +30 -0
- package/references/signal-sources.example.json +0 -8
- package/references/sla-reference.md +70 -0
- package/references/template-index.md +34 -0
- package/references/workspace-labels.md +124 -0
- package/references/workspace-projects.md +56 -0
- package/references/workspace-routing.md +58 -0
- package/schemas/label-policy.json +72 -0
- package/scripts/postinstall.mjs +195 -0
- package/skills/linear-workspace/SKILL.md +65 -4
- package/templates/ACC-PRO-provision.md +74 -0
- package/templates/ACC-PRV-privileged.md +66 -0
- package/templates/ACC-QTR-review.md +77 -0
- package/templates/ACC-REV-revoke.md +67 -0
- package/templates/AI-USE-capability.md +111 -0
- package/templates/AUD-CAP-corrective.md +89 -0
- package/templates/AUD-INT-internal.md +92 -0
- package/templates/AUD-MGT-management.md +110 -0
- package/templates/CHG-MAJ-major.md +110 -0
- package/templates/CHG-SIG-significant.md +83 -0
- package/templates/CHG-STD-standard.md +47 -0
- package/templates/LRN-DOC-lessons.md +75 -0
- package/templates/OPS-BCK-backup.md +99 -0
- package/templates/OPS-DAT-data-mod.md +98 -0
- package/templates/RCA-DOC-root-cause.md +105 -0
- package/templates/RSK-ASS-assessment.md +87 -0
- package/templates/RSK-VND-vendor.md +113 -0
- package/templates/SEC-INC-incident.md +76 -0
- package/templates/SEC-PEN-pentest.md +58 -0
- package/templates/SEC-VLN-vulnerability.md +69 -0
- package/templates/SLA-AVL-availability.md +86 -0
- package/templates/SLA-OPS-operational.md +70 -0
- package/templates/agent-server-template/README.md +88 -0
- package/templates/agent-server-template/server.example.ts +185 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# elnora-linear CLI Reference
|
|
2
|
+
|
|
3
|
+
All Linear operations use the `elnora-linear` CLI. Commands output JSON to stdout. Auth via `LINEAR_API_KEY` env var (already set).
|
|
4
|
+
|
|
5
|
+
**CLI path:** `elnora-linear`
|
|
6
|
+
|
|
7
|
+
## Commands
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Issues
|
|
11
|
+
issues search "terms" [--limit N]
|
|
12
|
+
issues list [--team "Team"] [--project "Project"] [--state "State"]
|
|
13
|
+
issues get ENG-123
|
|
14
|
+
issues create "Title" --team "Team" [--description "md"] [--project "P"] \
|
|
15
|
+
[--labels "L1,L2"] [--priority 0-4] [--assignee "name"|"me"|"none"] \
|
|
16
|
+
[--state "Todo"|"Backlog"] [--due-date "YYYY-MM-DD"] [--parent "ENG-123"]
|
|
17
|
+
issues update ENG-123 [--title "T"] [--description "md"] [--state "S"] \
|
|
18
|
+
[--assignee "name"] [--priority 0-4] [--labels "L1,L2"] [--project "P"] \
|
|
19
|
+
[--due-date "YYYY-MM-DD"] [--team "Team"]
|
|
20
|
+
|
|
21
|
+
# Comments
|
|
22
|
+
comments create ENG-123 --body "text"
|
|
23
|
+
comments list ENG-123
|
|
24
|
+
comments update <commentId> --body "text"
|
|
25
|
+
comments delete <commentId>
|
|
26
|
+
|
|
27
|
+
# Projects
|
|
28
|
+
projects list [--team "Team"] [--state "planned|started|paused|completed|canceled"]
|
|
29
|
+
projects get "Project Name"
|
|
30
|
+
projects create "Name" --team "Team" [--description "md"] [--priority 0-4] \
|
|
31
|
+
[--lead "name"|"me"] [--start-date "YYYY-MM-DD"] [--target-date "YYYY-MM-DD"] \
|
|
32
|
+
[--color "#hex"] [--icon "emoji"]
|
|
33
|
+
projects update <nameOrId> [--name "N"] [--description "md"] [--priority 0-4] \
|
|
34
|
+
[--lead "name"|"me"|"none"] [--start-date "YYYY-MM-DD"] [--target-date "YYYY-MM-DD"] \
|
|
35
|
+
[--color "#hex"] [--icon "emoji"] [--state "planned|started|paused|completed|canceled|backlog"]
|
|
36
|
+
projects delete <nameOrId> [--permanent]
|
|
37
|
+
projects restore <nameOrId>
|
|
38
|
+
|
|
39
|
+
# Teams & States
|
|
40
|
+
teams list
|
|
41
|
+
teams get "Team"
|
|
42
|
+
teams create "Name" --key "KEY" [--description "desc"] [--color "#hex"] \
|
|
43
|
+
[--icon "emoji"] [--timezone "tz"]
|
|
44
|
+
teams update <nameOrId> [--name "N"] [--key "KEY"] [--description "desc"] \
|
|
45
|
+
[--color "#hex"] [--icon "emoji"] [--timezone "tz"]
|
|
46
|
+
teams delete <nameOrId>
|
|
47
|
+
teams restore <nameOrId>
|
|
48
|
+
states list --team "Team"
|
|
49
|
+
|
|
50
|
+
# Labels
|
|
51
|
+
labels list [--team "Team"]
|
|
52
|
+
labels create "Name" [--color "#hex"] [--team "Team"]
|
|
53
|
+
labels update <id> [--name "N"] [--color "#hex"] [--description "desc"]
|
|
54
|
+
labels delete <id>
|
|
55
|
+
|
|
56
|
+
# Users
|
|
57
|
+
users list
|
|
58
|
+
users me
|
|
59
|
+
users get "Name or email"
|
|
60
|
+
|
|
61
|
+
# Documents
|
|
62
|
+
documents list [--project "Project"] [--limit N]
|
|
63
|
+
documents get <id>
|
|
64
|
+
documents create --title "Title" [--content "md"] [--project "Project"]
|
|
65
|
+
documents update <id> [--title "T"] [--content "md"]
|
|
66
|
+
documents delete <id>
|
|
67
|
+
documents restore <id>
|
|
68
|
+
|
|
69
|
+
# Cycles
|
|
70
|
+
cycles list --team "Team" [--type current|previous|next]
|
|
71
|
+
cycles get <id>
|
|
72
|
+
|
|
73
|
+
# Initiatives
|
|
74
|
+
initiatives list
|
|
75
|
+
initiatives get "Name or ID"
|
|
76
|
+
initiatives create "Name" [--description "desc"] [--status Planned|Active|Completed] [--owner "name"]
|
|
77
|
+
initiatives update "Name or ID" [--name "N"] [--status "S"] [--description "D"]
|
|
78
|
+
initiatives delete "Name or ID" [--permanent]
|
|
79
|
+
initiatives restore "Name or ID"
|
|
80
|
+
|
|
81
|
+
# Milestones
|
|
82
|
+
milestones list --project "Project"
|
|
83
|
+
milestones get "Name or ID" --project "Project"
|
|
84
|
+
milestones create "Name" --project "Project" [--description "D"] [--target-date "YYYY-MM-DD"]
|
|
85
|
+
milestones update <id> [--name "N"] [--description "D"] [--target-date "YYYY-MM-DD"]
|
|
86
|
+
milestones delete <id>
|
|
87
|
+
|
|
88
|
+
# Status Updates
|
|
89
|
+
status-updates list --type project --project "Project" [--limit N]
|
|
90
|
+
status-updates create --type project --project "Project" [--body "md"] [--health onTrack|atRisk|offTrack]
|
|
91
|
+
status-updates update <id> [--body "md"] [--health onTrack|atRisk|offTrack]
|
|
92
|
+
status-updates delete <id> [--permanent]
|
|
93
|
+
status-updates restore <id>
|
|
94
|
+
|
|
95
|
+
# Attachments
|
|
96
|
+
attachments list ENG-123
|
|
97
|
+
attachments get <id>
|
|
98
|
+
attachments create ENG-123 --url "URL" --title "Title" [--subtitle "S"] [--icon "emoji"]
|
|
99
|
+
attachments upload ENG-123 --file "path" --filename "name" --content-type "mime" [--title "T"]
|
|
100
|
+
attachments delete <id>
|
|
101
|
+
|
|
102
|
+
# Relations
|
|
103
|
+
relations create ENG-123 ENG-456 [--type related|blocks|duplicate|similar] # default: related
|
|
104
|
+
relations list ENG-123
|
|
105
|
+
relations delete <relationId>
|
|
106
|
+
|
|
107
|
+
# Project Labels
|
|
108
|
+
project-labels list
|
|
109
|
+
project-labels create "Name" [--color "#hex"] [--description "D"]
|
|
110
|
+
project-labels update <id> [--name "N"] [--color "#hex"] [--description "D"]
|
|
111
|
+
project-labels delete <id>
|
|
112
|
+
|
|
113
|
+
# Issues — atomic label edits and batch ops (v2.2)
|
|
114
|
+
issues subscribe ENG-123
|
|
115
|
+
issues unsubscribe ENG-123
|
|
116
|
+
issues add-label ENG-123 "Type: feature"
|
|
117
|
+
issues remove-label ENG-123 "Layer: frontend"
|
|
118
|
+
issues batch-create <jsonFile|-> # Array of IssueCreateInput; cap 50; --yes when N>=10. NOTE: requires raw UUIDs (teamId, labelIds, stateId) — does NOT resolve names like single-issue create. Look up IDs first via teams/labels/states list.
|
|
119
|
+
issues batch-update <ids> <jsonPatchFile|-> # ids = comma-separated ENG-X or UUIDs
|
|
120
|
+
|
|
121
|
+
# Comments resolve / unresolve (v2.2)
|
|
122
|
+
comments resolve <commentId>
|
|
123
|
+
comments unresolve <commentId>
|
|
124
|
+
|
|
125
|
+
# Reactions (v2.2)
|
|
126
|
+
react <ENG-X|commentUUID> "<emoji>" [--issue] # --issue forces UUID -> issueId
|
|
127
|
+
unreact <reactionId>
|
|
128
|
+
|
|
129
|
+
# Reactions notes:
|
|
130
|
+
# - Linear normalizes shortcodes server-side (e.g. "thumbsup" → "+1"). The
|
|
131
|
+
# returned reaction.emoji reflects the normalized form. Pass either the
|
|
132
|
+
# literal Unicode glyph (👍) or a known shortcode (:eyes:); both work.
|
|
133
|
+
# - --issue is implied when the target matches ENG-N. Passing it on an
|
|
134
|
+
# ENG-N target is a no-op and now emits a stderr warning.
|
|
135
|
+
|
|
136
|
+
# Quota (v2.2)
|
|
137
|
+
quota # Remaining rate-limit budget — allowed/remaining/requested/period/resetAt
|
|
138
|
+
|
|
139
|
+
# Audit (v2.2 — read-only)
|
|
140
|
+
audit entries [--limit N] [--since "ISO"] [--type "AuditEntryType"]
|
|
141
|
+
audit types
|
|
142
|
+
|
|
143
|
+
# Notifications (v2.2)
|
|
144
|
+
notifications list [--limit N] [--unread]
|
|
145
|
+
notifications get <id>
|
|
146
|
+
notifications archive <id> --yes
|
|
147
|
+
notifications mark-read --issue|--initiative|--initiative-update <id> [--at "ISO"]
|
|
148
|
+
notifications mark-unread --issue|--initiative|--initiative-update <id>
|
|
149
|
+
notifications snooze --issue|--initiative|--initiative-update <id> --until "ISO"
|
|
150
|
+
|
|
151
|
+
# Customers (v2.2 — Linear's customer-feedback feature)
|
|
152
|
+
customers list [--query "text"] [--limit N]
|
|
153
|
+
customers get <idOrName>
|
|
154
|
+
customers create "Name" [--domains "csv"] [--external-ids "csv"] [--owner "userOrMe"] [--revenue N] [--size N] [--logo-url URL]
|
|
155
|
+
customers update <idOrName> [--name "N"] [--domains "csv"] [--external-ids "csv"] [--owner "userOrMe|none"] [--revenue N] [--size N] [--logo-url URL]
|
|
156
|
+
customers upsert --external-id <id>|--id <uuid> [--name "N"] [--domains "csv"] [--owner "u"] [--revenue N] [--size N]
|
|
157
|
+
|
|
158
|
+
customer-needs list [--customer "idOrName"] [--project "Name"] [--limit N]
|
|
159
|
+
customer-needs get <id>
|
|
160
|
+
customer-needs create --body "md" (--customer <idOrName>|--customer-external-id <id>) (--issue ENG-X|--project "Name") [--priority 0|1] [--attachment <id>|--attachment-url <url>] # Linear API: priority is 0 or 1 only (not 0-4 like issues)
|
|
161
|
+
customer-needs from-attachment <attachmentId>
|
|
162
|
+
customer-needs update <id> [--body "md"] [--customer "X"] [--issue ENG-X|--project "Name"] [--priority 0-4]
|
|
163
|
+
customer-needs archive <id> --yes
|
|
164
|
+
|
|
165
|
+
# Templates (v2.2)
|
|
166
|
+
templates list [--type issue|project|document] [--team "Name"]
|
|
167
|
+
templates sync --team "<your-team>" [--dry-run] [--templates-dir <path>] [--yes]
|
|
168
|
+
|
|
169
|
+
# Webhooks (v2.2 — agent framework)
|
|
170
|
+
webhooks list [--limit N]
|
|
171
|
+
webhooks get <id>
|
|
172
|
+
webhooks create --url <https-url> --resource-types "Issue,AgentSessionEvent" (--team "Name"|--all-public-teams) [--label "L"] [--secret <s>] [--disabled]
|
|
173
|
+
webhooks update <id> [--url <https-url>] [--resource-types "csv"] [--label "L"] [--enabled|--disabled]
|
|
174
|
+
webhooks delete <id> --yes
|
|
175
|
+
webhooks rotate-secret <id> --yes # Secret shown ONCE
|
|
176
|
+
webhooks verify <signatureFile> --body <bodyFile> [--secret <s>]
|
|
177
|
+
|
|
178
|
+
# Agent sessions (v2.2)
|
|
179
|
+
agent-sessions list [--limit N]
|
|
180
|
+
agent-sessions get <id>
|
|
181
|
+
agent-sessions create-on-issue <ENG-X|UUID> [--external-link <url>]
|
|
182
|
+
agent-sessions create-on-comment <commentUUID> [--external-link <url>]
|
|
183
|
+
agent-sessions update <id> [--external-link <url>] [--plan '<jsonString>']
|
|
184
|
+
agent-sessions update-external-url <id> [--external-link <url>] [--add <url>] [--remove <url>]
|
|
185
|
+
|
|
186
|
+
# Agent activities (v2.2)
|
|
187
|
+
agent-activities list <sessionId> [--limit N]
|
|
188
|
+
agent-activities get <id>
|
|
189
|
+
agent-activities create <sessionId> --type thought|action|elicitation|response|error \
|
|
190
|
+
[--body "text"] [--action "name"] [--parameter "p"] [--result '<json>'] \
|
|
191
|
+
[--signal select|auth|continue|stop] [--signal-metadata <jsonFile>] [--ephemeral]
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Priority values:** 0=None, 1=Urgent, 2=High, 3=Normal, 4=Low
|
|
195
|
+
|
|
196
|
+
**Note:** `--labels` replaces existing labels. To preserve, first read from `issues get`, then include all in `--labels`.
|
|
197
|
+
|
|
198
|
+
## Argument Style — Positional vs Flag
|
|
199
|
+
|
|
200
|
+
Some commands take a value as a flag (`--body "text"`) and others as a positional. The conventions:
|
|
201
|
+
|
|
202
|
+
| Command | Style | Example |
|
|
203
|
+
|---------|-------|---------|
|
|
204
|
+
| `comments create <issueId> --body "text"` | Flag — body is multi-line and optional in syntax | `comments create ENG-1 --body "Looks good"` |
|
|
205
|
+
| `comments update <id> --body "text"` | Flag — same reason | `comments update <uuid> --body "Updated"` |
|
|
206
|
+
| `issues add-label <id> <label>` | Positional — single label, atomic | `issues add-label ENG-1 "Type: bug"` |
|
|
207
|
+
| `issues remove-label <id> <label>` | Positional — single label, atomic | `issues remove-label ENG-1 "Type: bug"` |
|
|
208
|
+
| `issues update <id> --labels "L1,L2"` | Flag — REPLACES the full set, plural | `issues update ENG-1 --labels "Type: bug,Layer: frontend"` |
|
|
209
|
+
| `react <target> <emoji>` | Two positionals | `react ENG-1 "🚀"` |
|
|
210
|
+
| `unreact <reactionId>` | One positional (UUID only) | `unreact <uuid>` |
|
|
211
|
+
|
|
212
|
+
The label commands are intentionally asymmetric: `add-label`/`remove-label` are atomic single-label edits, while `--labels` on `issues update` is a full-set replacement (use it when you mean "set the labels to exactly this list").
|
|
213
|
+
|
|
214
|
+
## Common Mistakes
|
|
215
|
+
|
|
216
|
+
| Wrong | Correct | Why |
|
|
217
|
+
|-------|---------|-----|
|
|
218
|
+
| `--assign` | `--assignee` | Full flag name required |
|
|
219
|
+
| `--labels "X"` on `issues list` | `--label "X"` (singular) | `list` filters by ONE label; `create`/`update` set MANY |
|
|
220
|
+
| `--desc` | `--description` | Full flag name required |
|
|
221
|
+
| `--body` (on issues) | `--description` | `--body` is for `comments create` only |
|
|
222
|
+
| `add-label ENG-1 "a,b"` | Two calls, or `update --labels "current,a,b"` | `add-label` rejects comma-containing values |
|
|
223
|
+
| `--project "X" --team "Y"` where X belongs to Z | Match project to its owning team | Projects are team-scoped — check `workspace-routing.md` |
|
|
224
|
+
| `batch-create` with `teamName`/`labelNames` | Pass raw UUIDs (`teamId`, `labelIds`) | Batch ops skip name resolution by design |
|
|
225
|
+
|
|
226
|
+
**Label flag convention:** `--label` (singular) for `issues list` filtering. `--labels "L1,L2"` (plural, comma-separated) for `create`/`update` to SET the full label set.
|
|
227
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Linear State Curator — Tiering Rules
|
|
2
|
+
|
|
3
|
+
Edit this file to tune the curator's behavior. Loaded at runtime by the curator and embedded into the LLM snapshot. The JSON copy of these rules lives in `workflows.json` (loaded by the rule engine); this file is the human-readable contract.
|
|
4
|
+
|
|
5
|
+
The curator scores every open issue (Todo / In Progress / Backlog) on the teams listed in `teams.json` against the rules below and picks the highest-confidence tier that fires.
|
|
6
|
+
|
|
7
|
+
> **Implementation status (2026-05):** the HIGH tier (auto-apply) and LOW tier (report only) are fully wired. The MEDIUM tier currently stages questions in `~/.config/elnora-linear/state/curator-state.json` only — the Slack-posting and DM-back paths described below (top-level channel posts, threaded LLM-classified replies, label-allowlist DMs) are part of the design contract but **not yet shipped**. The orchestrator that posts to Slack, classifies replies, and applies the result is a follow-up release. Treat the Slack language as planned behavior; today, a human reads the state file (or the `linear-state-curator` agent does).
|
|
8
|
+
|
|
9
|
+
## HIGH — auto-apply state changes (cap: 20 per run)
|
|
10
|
+
|
|
11
|
+
Any one of these fires the HIGH tier. The curator updates state via `elnora-linear issues update`, posts a rationale comment on the issue with cited signals, and lists the action in the daily summary.
|
|
12
|
+
|
|
13
|
+
- **H1 — Todo + merged PR.** Issue state is `Todo` AND a linked GitHub PR is merged within the last 7 days AND the merge commit message contains the issue ID (e.g. `ENG-123`). → set state `Done`.
|
|
14
|
+
- **H2 — In Progress + merged PR by assignee.** Issue state is `In Progress` AND a linked PR is merged AND the PR author's email matches the assignee's email. → set state `Done`.
|
|
15
|
+
- **H3 — Duplicate of recently closed issue.** Issue title fingerprint (lowercased, stopwords removed, top 5 keywords) matches a `Done` issue from the last 30 days in the same project. → set state `Canceled` with comment `Duplicate of <ID>`.
|
|
16
|
+
- **H4 — External compliance signal passed.** Issue description references an external compliance check (e.g. a vendor test ID) that has been `PASSED` for >7 days. → set state `Done`. (Connect your compliance tooling via the `external_command` signal source.)
|
|
17
|
+
- **H5 — Customer milestone signal.** Issue is in `customer-onboarding`-style project AND a corresponding customer milestone signal (from `slack_messages` or `external_command`) confirms completion. → set state `Done`.
|
|
18
|
+
- **H6 — Backlog rot.** Issue state is `Backlog` AND no activity (comments, edits, label changes) in 60+ days AND no labels AND no assignee. → set state `Canceled` with comment `Canceled by curator: 60d+ inactive, no signal of intent.`
|
|
19
|
+
|
|
20
|
+
## MEDIUM — ask in Slack (cap: 10 per run)
|
|
21
|
+
|
|
22
|
+
Any one fires MEDIUM. The curator posts a top-level message in a configured channel (see `slack.json` `allowed_channels`) with `@mention` of the assignee — anyone allowed can reply in the thread.
|
|
23
|
+
|
|
24
|
+
**Reply formats:**
|
|
25
|
+
- Keywords: `done` / `close` / `yes` → apply. `skip` / `keep` / `hold` → leave. `cancel` / `wontfix` → cancel.
|
|
26
|
+
- Free-form: *"yeah ship it"*, *"hold off, customer asked us to wait"*, *"first one done, second still open"*, *"actually ISSUE-235 is the one that's done, not this"* — the curator runs all replies through a single batched Claude call per run that sees ALL pending threads + ALL replies together. So:
|
|
27
|
+
- Multi-issue replies are routed correctly.
|
|
28
|
+
- References to issues NOT in the pending list are captured as out-of-band mentions and surfaced next run.
|
|
29
|
+
- Ambiguous replies trigger a follow-up question in the same thread instead of dropping silently.
|
|
30
|
+
|
|
31
|
+
For label-blocked issues (rule M6 below), the curator instead **DMs an allow-listed user privately** so compliance/customer info stays out of public threads. See `slack.json` `allowed_dm_users`.
|
|
32
|
+
|
|
33
|
+
**Reply processing cadence:** configurable per deployment. Typical setups:
|
|
34
|
+
- Hourly during working hours — `resolve-only` mode processes pending replies (no full sweep).
|
|
35
|
+
- Daily — full sweep including new HIGH/MEDIUM/LOW evaluation.
|
|
36
|
+
- Manual: `elnora-linear curator-run --apply` triggers immediate processing.
|
|
37
|
+
|
|
38
|
+
The curator posts a confirmation reply in the same thread once it acts (or asks a follow-up if it needs clarification).
|
|
39
|
+
|
|
40
|
+
- **M1 — Commits without merged PR.** Commits in configured repos reference an issue ID in their message but no linked PR is merged yet. Question: "should I move this to In Progress?"
|
|
41
|
+
- **M2 — Stalled In Progress.** Issue state is `In Progress` AND zero commits referencing it AND zero comments in 14+ days. Question: "still active, or should I move it back to Todo?"
|
|
42
|
+
- **M3 — External email/thread match.** Issue title overlaps with a recent external thread (>=3 keyword match) AND no Linear comment in 7+ days. Question: "have you handled this off-ticket?"
|
|
43
|
+
- **M4 — PR closed unmerged.** Linked PR was closed without merging AND issue is still open. Question: "abandoned, or new PR coming?"
|
|
44
|
+
- **M5 — Title near-duplicate, both open.** Two issues in the same project with >=85% title similarity, both Todo. Question: "merge into one — which is the canonical?"
|
|
45
|
+
- **M6 — Label allowlist override.** Any HIGH-tier rule that fires on an issue carrying a label in the workspace's "never-touch" set (`customer:*`, `compliance:*`, `security:critical`, `sla:*`) is automatically downgraded to MEDIUM and routed to a specific user via DM. The label allowlist exists to prevent silent state changes on customer- or compliance-sensitive work.
|
|
46
|
+
|
|
47
|
+
## LOW — channel report only
|
|
48
|
+
|
|
49
|
+
No action, no DM. Listed in the daily summary post under "Needs human triage".
|
|
50
|
+
|
|
51
|
+
- **L1 — Pure stale Todo.** No HIGH or MEDIUM signal AND last activity >30 days AND state is Todo.
|
|
52
|
+
- **L2 — Inactive assignee.** Assignee has zero Linear activity >60 days. Curator can't reach them on Slack. Surface in the channel.
|
|
53
|
+
- **L3 — Unverifiable external reference.** Issue description references an external URL the curator cannot validate. Surface so a human can check.
|
|
54
|
+
|
|
55
|
+
## Hard caps
|
|
56
|
+
|
|
57
|
+
- `MAX_MUTATIONS=20` per run (HIGH actions).
|
|
58
|
+
- `MAX_QUESTIONS_PER_DAY=10` (new MEDIUM DMs).
|
|
59
|
+
- Excess HIGH and MEDIUM candidates roll over to the next run, prioritized by oldest `updatedAt`.
|
|
60
|
+
|
|
61
|
+
## Never-touch labels
|
|
62
|
+
|
|
63
|
+
Issues carrying any of these labels are never auto-mutated. Any HIGH match is downgraded to MEDIUM and DM'd to an allow-listed user, not the assignee.
|
|
64
|
+
|
|
65
|
+
- `customer:*` — anything customer-facing
|
|
66
|
+
- `compliance:*` — SOC 2, ISO 27001, GDPR, audit work
|
|
67
|
+
- `security:critical` — critical-severity security
|
|
68
|
+
- `sla:*` — items with explicit SLA commitments
|
|
69
|
+
|
|
70
|
+
You can customize this allowlist in `workflows.json` under `never_touch_labels`.
|
|
71
|
+
|
|
72
|
+
## Outbound surface
|
|
73
|
+
|
|
74
|
+
Configured in `slack.json`:
|
|
75
|
+
- `allowed_channels`: the only channels the curator may post in.
|
|
76
|
+
- `allowed_dm_users`: the only users the curator may DM.
|
|
77
|
+
|
|
78
|
+
Anything outside this surface is rejected as a bug — the curator is forbidden from messaging customers or external parties under any circumstance.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../schemas/label-policy.json",
|
|
3
|
+
"_example": true,
|
|
4
|
+
"policies": {
|
|
5
|
+
"ENG": {
|
|
6
|
+
"name": "Engineering",
|
|
7
|
+
"required": [
|
|
8
|
+
{
|
|
9
|
+
"prefixes": ["Type:"],
|
|
10
|
+
"min": 1,
|
|
11
|
+
"max": 1,
|
|
12
|
+
"description": "exactly one Type: label (feature | bug | improvement | research)"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"prefixes": ["Layer:"],
|
|
16
|
+
"min": 1,
|
|
17
|
+
"max": null,
|
|
18
|
+
"description": "one or more Layer: labels (frontend | backend | ops)"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"allowedPrefixes": ["Type:", "Layer:", "Flag:", "Template:"],
|
|
22
|
+
"requiresProject": true
|
|
23
|
+
},
|
|
24
|
+
"OPS": {
|
|
25
|
+
"name": "Operations",
|
|
26
|
+
"required": [
|
|
27
|
+
{
|
|
28
|
+
"prefixes": ["Type:", "Template:"],
|
|
29
|
+
"min": 1,
|
|
30
|
+
"description": "at least one Type: label OR a Template: label for compliance work"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"allowedPrefixes": ["Type:", "Template:", "Cadence:", "Flag:"],
|
|
34
|
+
"requiresProject": true
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# elnora-linear — Settings Template
|
|
2
|
+
|
|
3
|
+
Copy this file to `.claude/elnora-linear.local.md` in your project root to customize the plugin.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
---
|
|
7
|
+
enabled: true
|
|
8
|
+
default_team: "<your-default-team>"
|
|
9
|
+
strict_validation: true
|
|
10
|
+
ask_before_creating: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# elnora-linear Configuration
|
|
14
|
+
|
|
15
|
+
## Default Team
|
|
16
|
+
Issues are created in the default_team unless specified otherwise.
|
|
17
|
+
Options: see your `teams.json` reference for valid team keys/names.
|
|
18
|
+
|
|
19
|
+
## Strict Validation
|
|
20
|
+
When true, blocks issues missing required labels per your `label-policy.json` (e.g. Type + Layer on engineering teams).
|
|
21
|
+
When false, creates with warnings.
|
|
22
|
+
|
|
23
|
+
## Ask Before Creating
|
|
24
|
+
When true, asks user to confirm project/labels when detection is uncertain.
|
|
25
|
+
When false, uses best-effort detection.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## After Creating
|
|
29
|
+
|
|
30
|
+
Restart Claude Code for changes to take effect.
|
|
@@ -29,14 +29,6 @@
|
|
|
29
29
|
"command": "ci-cli list-failing-builds --json",
|
|
30
30
|
"parse_as": "json",
|
|
31
31
|
"issue_match_field": "linear_issue_id"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"type": "mcp_tool",
|
|
35
|
-
"name": "stripe-payment-failures",
|
|
36
|
-
"enabled": false,
|
|
37
|
-
"server": "stripe-cli",
|
|
38
|
-
"tool": "list_failed_payments",
|
|
39
|
-
"args": { "lookback_hours": 24 }
|
|
40
32
|
}
|
|
41
33
|
]
|
|
42
34
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# SLA Reference
|
|
2
|
+
|
|
3
|
+
Due date = today + SLA days (ISO format YYYY-MM-DD).
|
|
4
|
+
|
|
5
|
+
## Template SLA Mapping
|
|
6
|
+
|
|
7
|
+
### Immediate Response (Same Day / 24 Hours)
|
|
8
|
+
|
|
9
|
+
| Template Label | SLA | Due Date Calculation |
|
|
10
|
+
|----------------|-----|---------------------|
|
|
11
|
+
| `Template: Access-Provision` | Same day | Today |
|
|
12
|
+
| `Template: Privileged-Access` | Same day | Today |
|
|
13
|
+
| `Template: Access-Revoke` | 24 hours | Today + 1 day |
|
|
14
|
+
| `Template: Security-Incident` (Sev 0) | 15 minutes | Immediate |
|
|
15
|
+
| `Template: Security-Incident` (Sev 1) | 1 hour | Today |
|
|
16
|
+
| `Template: Availability-Incident` (Critical) | 1 hour | Today |
|
|
17
|
+
|
|
18
|
+
### Short-Term (1-5 Days)
|
|
19
|
+
|
|
20
|
+
| Template Label | SLA | Due Date Calculation |
|
|
21
|
+
|----------------|-----|---------------------|
|
|
22
|
+
| `Template: Change-Standard` | 1-2 days | Today + 2 days |
|
|
23
|
+
| `Template: Data-Modification` | 1-2 days | Today + 2 days |
|
|
24
|
+
| `Template: RCA` (Sev 0) | 3 days | Today + 3 days |
|
|
25
|
+
| `Template: Availability-Incident` (Medium) | 3 days | Today + 3 days |
|
|
26
|
+
|
|
27
|
+
### Medium-Term (5-30 Days)
|
|
28
|
+
|
|
29
|
+
| Template Label | SLA | Due Date Calculation |
|
|
30
|
+
|----------------|-----|---------------------|
|
|
31
|
+
| `Template: Change-Significant` | 5-10 days | Today + 10 days |
|
|
32
|
+
| `Template: AI-Use-Case` | 5-10 days | Today + 10 days |
|
|
33
|
+
| `Template: Corrective-Action` (Minor) | 5-30 days | Today + 30 days |
|
|
34
|
+
| `Template: RCA` (Sev 1) | 5 days | Today + 5 days |
|
|
35
|
+
| `Template: RCA` (Sev 2) | 10 days | Today + 10 days |
|
|
36
|
+
| `Template: Lessons-Learned` | 10-20 days | Today + 20 days |
|
|
37
|
+
| `Template: Availability-Incident` (Low) | 14 days | Today + 14 days |
|
|
38
|
+
| `Template: Change-Major` | 15-30 days | Today + 30 days |
|
|
39
|
+
| `Template: Operational-Request` | 3-14 days | Today + 14 days |
|
|
40
|
+
| `Template: RCA` (Sev 3) | 20 days | Today + 20 days |
|
|
41
|
+
|
|
42
|
+
### Long-Term (30+ Days)
|
|
43
|
+
|
|
44
|
+
| Template Label | SLA | Due Date Calculation |
|
|
45
|
+
|----------------|-----|---------------------|
|
|
46
|
+
| `Template: Access-Review` | 30 days | Today + 30 days |
|
|
47
|
+
| `Template: Management-Review` | 30 days | Today + 30 days |
|
|
48
|
+
| `Template: Risk-Assessment` | 30 days | Today + 30 days |
|
|
49
|
+
| `Template: Vendor-Assessment` | 30 days | Today + 30 days |
|
|
50
|
+
| `Template: Vulnerability` | 30-90 days | Based on severity |
|
|
51
|
+
| `Template: Pentest-Finding` | 30-90 days | Based on severity |
|
|
52
|
+
| `Template: Internal-Audit` | 60 days | Today + 60 days |
|
|
53
|
+
| `Template: Backup-Test` | RTO: 2 hours | Scheduled quarterly |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Severity-Based SLAs
|
|
58
|
+
|
|
59
|
+
For security issues, SLA depends on severity:
|
|
60
|
+
|
|
61
|
+
| Severity | Vulnerability SLA | Pentest SLA | Security Incident SLA |
|
|
62
|
+
|----------|------------------|-------------|----------------------|
|
|
63
|
+
| Critical | 7 days | 7 days | 15 minutes |
|
|
64
|
+
| High | 14 days | 14 days | 1 hour |
|
|
65
|
+
| Medium | 60 days | 60 days | 4 hours |
|
|
66
|
+
| Low | 90 days | 90 days | 24 hours |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
Calendar days unless specified. SLA breach → create linked AUD-CAP issue.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Template Index
|
|
2
|
+
|
|
3
|
+
Compliance templates for an ISO 27001 / SOC 2 audit trail. Templates route to a compliance team for documentation; actual fixes go to your engineering or security teams.
|
|
4
|
+
|
|
5
|
+
**Usage:** Match keywords below → load ONE template → check `sla-reference.md` for due date.
|
|
6
|
+
|
|
7
|
+
## Routing Table
|
|
8
|
+
|
|
9
|
+
| Keywords | Template | File | Project |
|
|
10
|
+
|----------|----------|------|---------|
|
|
11
|
+
| incident, breach, attack, compromise | SEC-INC | `templates/SEC-INC-incident.md` | Security Incidents |
|
|
12
|
+
| vulnerability, CVE, dependabot, codeql, security scan | SEC-VLN | `templates/SEC-VLN-vulnerability.md` | Vulnerability Management |
|
|
13
|
+
| pentest, penetration test finding | SEC-PEN | `templates/SEC-PEN-pentest.md` | Pentest Remediation |
|
|
14
|
+
| minor update, documentation fix, clarification | CHG-STD | `templates/CHG-STD-standard.md` | Standard Changes |
|
|
15
|
+
| control change, procedure change, risk treatment | CHG-SIG | `templates/CHG-SIG-significant.md` | Significant Changes |
|
|
16
|
+
| scope change, policy change, organizational change | CHG-MAJ | `templates/CHG-MAJ-major.md` | Major Changes |
|
|
17
|
+
| new hire, onboarding, new access, grant access | ACC-PRO | `templates/ACC-PRO-provision.md` | Access Provisioning |
|
|
18
|
+
| termination, offboarding, remove access, revoke | ACC-REV | `templates/ACC-REV-revoke.md` | Access Revocation |
|
|
19
|
+
| access review, quarterly review, permission audit | ACC-QTR | `templates/ACC-QTR-review.md` | Quarterly Access Reviews |
|
|
20
|
+
| admin access, root, elevated permissions, privileged | ACC-PRV | `templates/ACC-PRV-privileged.md` | Privileged Access |
|
|
21
|
+
| internal audit, audit planning, control audit | AUD-INT | `templates/AUD-INT-internal.md` | Internal Audits |
|
|
22
|
+
| management review, ISMS review, governance meeting | AUD-MGT | `templates/AUD-MGT-management.md` | Management Reviews |
|
|
23
|
+
| nonconformity, NC, corrective action, audit finding | AUD-CAP | `templates/AUD-CAP-corrective.md` | Corrective Actions |
|
|
24
|
+
| risk assessment, threat assessment, risk analysis | RSK-ASS | `templates/RSK-ASS-assessment.md` | Risk Assessments |
|
|
25
|
+
| vendor assessment, supplier review, third-party risk | RSK-VND | `templates/RSK-VND-vendor.md` | Vendor Assessments |
|
|
26
|
+
| AI use case, new AI capability, AI capability scope, model family change, foundation model swap | AI-USE | `templates/AI-USE-capability.md` | AI Governance |
|
|
27
|
+
| backup test, restore test, DR test | OPS-BCK | `templates/OPS-BCK-backup.md` | Backup & DR Testing |
|
|
28
|
+
| production data, data fix, database correction | OPS-DAT | `templates/OPS-DAT-data-mod.md` | Data Modifications |
|
|
29
|
+
| outage, downtime, service unavailable | SLA-AVL | `templates/SLA-AVL-availability.md` | Availability Incidents |
|
|
30
|
+
| infrastructure request, operational request | SLA-OPS | `templates/SLA-OPS-operational.md` | Operational Requests |
|
|
31
|
+
| RCA, root cause, post-mortem | RCA-DOC | `templates/RCA-DOC-root-cause.md` | Root Cause Analysis |
|
|
32
|
+
| lessons learned, retrospective, incident review | LRN-DOC | `templates/LRN-DOC-lessons.md` | Lessons Learned |
|
|
33
|
+
|
|
34
|
+
No match? Route per `workspace-routing.md` with standard Type + Layer labels.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Workspace Labels Reference
|
|
2
|
+
|
|
3
|
+
> **Source of truth note:** the *required-label policy* per team is enforced
|
|
4
|
+
> by the CLI (see `references/label-policy.json` + `elnora-linear issues
|
|
5
|
+
> create` validation). The full *label catalog* is fetched live via
|
|
6
|
+
> `elnora-linear context --team "<Team>"`. This file is human-only
|
|
7
|
+
> documentation kept around for browsing the taxonomy at a glance — agents
|
|
8
|
+
> no longer read it.
|
|
9
|
+
|
|
10
|
+
The labels below are the suggested taxonomy this plugin assumes when you wire up label policies and templates. Replace with your own conventions; the structure (Type / Layer / Severity / Flag / Source / Cadence / Repo / Template) is the load-bearing piece.
|
|
11
|
+
|
|
12
|
+
## Required Labels (example for an engineering team)
|
|
13
|
+
|
|
14
|
+
### Type Labels (pick one)
|
|
15
|
+
|
|
16
|
+
| Label | Keywords | When to Use |
|
|
17
|
+
|-------|----------|-------------|
|
|
18
|
+
| `Type: feature` | add, implement, build, create, new | New functionality |
|
|
19
|
+
| `Type: improvement` | improve, optimize, refactor, enhance | Enhance existing |
|
|
20
|
+
| `Type: bug` | fix, broken, error, crash, not working | Defects |
|
|
21
|
+
| `Type: research` | research, explore, investigate, spike | Investigation |
|
|
22
|
+
| `Type: compliance-task` | compliance, audit, evidence, documentation | Compliance work |
|
|
23
|
+
|
|
24
|
+
### Layer Labels (pick one or more)
|
|
25
|
+
|
|
26
|
+
| Label | When to Use |
|
|
27
|
+
|-------|-------------|
|
|
28
|
+
| `Layer: frontend` | UI code (React, Vue, Svelte, etc.) |
|
|
29
|
+
| `Layer: backend` | API, database, server-side |
|
|
30
|
+
| `Layer: ai-server` | Python, LLM, agents, ML pipelines |
|
|
31
|
+
| `Layer: devops` | Cloud, CI/CD, Docker, infrastructure |
|
|
32
|
+
| `Layer: operations` | Internal processes, audits, compliance |
|
|
33
|
+
|
|
34
|
+
## Severity Labels
|
|
35
|
+
|
|
36
|
+
| Label | When to Use |
|
|
37
|
+
|-------|-------------|
|
|
38
|
+
| `Severity: Critical` | System down, data breach, security emergency |
|
|
39
|
+
| `Severity: High` | Major functionality broken, significant security |
|
|
40
|
+
| `Severity: Medium` | Moderate impact, workaround exists |
|
|
41
|
+
| `Severity: Low` | Minor issue, cosmetic, nice-to-have |
|
|
42
|
+
|
|
43
|
+
**SLAs:** See `sla-reference.md` for due date calculation.
|
|
44
|
+
|
|
45
|
+
## Flag Labels (optional)
|
|
46
|
+
|
|
47
|
+
| Label | When to Use |
|
|
48
|
+
|-------|-------------|
|
|
49
|
+
| `Flag: security` | Security-related — vulnerabilities, auth, encryption |
|
|
50
|
+
| `Flag: compliance` | SOC2, ISO27001, audit requirements |
|
|
51
|
+
| `Flag: Risk Accepted` | Security issues where the risk has been accepted |
|
|
52
|
+
| `Flag: AI-Incident` | AI-specific incident — hallucination causing harm, refusal failure, prompt-injection breach, model regression, AI-pathway data handling failure, or bias-related complaint. Used in conjunction with `Template: Security-Incident` on the Security Incidents project. Replaces a separate AI Incident Register and a separate bias-complaint log. |
|
|
53
|
+
|
|
54
|
+
## Source Labels (track origin)
|
|
55
|
+
|
|
56
|
+
| Label | When to Use |
|
|
57
|
+
|-------|-------------|
|
|
58
|
+
| `Source: Vulnerability Scan` | Automated scanning (Dependabot, Inspector) |
|
|
59
|
+
| `Source: CodeQL` | GitHub CodeQL alerts |
|
|
60
|
+
| `Source: Penetration Test` | External pentest findings |
|
|
61
|
+
| `Source: Internal Discovery` | Found by team internally |
|
|
62
|
+
| `Source: Customer Report` | Security issue from customer |
|
|
63
|
+
| `Source: Support Request` | General support request |
|
|
64
|
+
| `Source: Feature Request` | Customer feature request |
|
|
65
|
+
| `Source: Bug Report` | Customer bug report |
|
|
66
|
+
|
|
67
|
+
## Cadence Labels (recurring tasks)
|
|
68
|
+
|
|
69
|
+
| Label | When to Use |
|
|
70
|
+
|-------|-------------|
|
|
71
|
+
| `Cadence: Annual` | Recurring tasks every 12 months |
|
|
72
|
+
| `Cadence: Quarterly` | Recurring tasks every 3 months |
|
|
73
|
+
|
|
74
|
+
## Repo Labels (link issue to source repo)
|
|
75
|
+
|
|
76
|
+
Apply when an issue is scoped to one of your configured repos (see `repos.json`). Used by the curator and PR-linking automations.
|
|
77
|
+
|
|
78
|
+
| Label | Repo |
|
|
79
|
+
|-------|------|
|
|
80
|
+
| `Repo: <repo-name>` | `github.com/<your-org>/<repo>` |
|
|
81
|
+
|
|
82
|
+
## Access Labels
|
|
83
|
+
|
|
84
|
+
| Label | When to Use |
|
|
85
|
+
|-------|-------------|
|
|
86
|
+
| `Account Setup` | New user account provisioning |
|
|
87
|
+
| `Access Request` | New access requests |
|
|
88
|
+
| `Access Revocation` | User termination/offboarding |
|
|
89
|
+
| `Infrastructure` | DevOps work |
|
|
90
|
+
|
|
91
|
+
**SLAs:** See `sla-reference.md` for due date calculation.
|
|
92
|
+
|
|
93
|
+
## Template Labels (compliance workflows)
|
|
94
|
+
|
|
95
|
+
| Label | Template File |
|
|
96
|
+
|-------|---------------|
|
|
97
|
+
| `Template: Security-Incident` | SEC-INC-incident.md |
|
|
98
|
+
| `Template: Vulnerability` | SEC-VLN-vulnerability.md |
|
|
99
|
+
| `Template: Pentest-Finding` | SEC-PEN-pentest.md |
|
|
100
|
+
| `Template: Change-Standard` | CHG-STD-standard.md |
|
|
101
|
+
| `Template: Change-Significant` | CHG-SIG-significant.md |
|
|
102
|
+
| `Template: Change-Major` | CHG-MAJ-major.md |
|
|
103
|
+
| `Template: Access-Provision` | ACC-PRO-provision.md |
|
|
104
|
+
| `Template: Access-Revoke` | ACC-REV-revoke.md |
|
|
105
|
+
| `Template: Access-Review` | ACC-QTR-review.md |
|
|
106
|
+
| `Template: Privileged-Access` | ACC-PRV-privileged.md |
|
|
107
|
+
| `Template: Internal-Audit` | AUD-INT-internal.md |
|
|
108
|
+
| `Template: Management-Review` | AUD-MGT-management.md |
|
|
109
|
+
| `Template: Corrective-Action` | AUD-CAP-corrective.md |
|
|
110
|
+
| `Template: Risk-Assessment` | RSK-ASS-assessment.md |
|
|
111
|
+
| `Template: Vendor-Assessment` | RSK-VND-vendor.md |
|
|
112
|
+
| `Template: AI-Use-Case` | AI-USE-capability.md |
|
|
113
|
+
| `Template: Backup-Test` | OPS-BCK-backup.md |
|
|
114
|
+
| `Template: Data-Modification` | OPS-DAT-data-mod.md |
|
|
115
|
+
| `Template: Availability-Incident` | SLA-AVL-availability.md |
|
|
116
|
+
| `Template: Operational-Request` | SLA-OPS-operational.md |
|
|
117
|
+
| `Template: RCA` | RCA-DOC-root-cause.md |
|
|
118
|
+
| `Template: Lessons-Learned` | LRN-DOC-lessons.md |
|
|
119
|
+
|
|
120
|
+
**SLAs:** See `sla-reference.md` for due date calculation by template.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
*Routing: `workspace-routing.md` | SLAs: `sla-reference.md`*
|