@thiaq/project-skill 0.1.0 → 0.1.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/README.md +3 -2
- package/SKILL.md +47 -11
- package/package.json +1 -1
- package/references/mcp-tools.md +282 -14
package/README.md
CHANGED
|
@@ -26,6 +26,7 @@ npx thiaq-project-skill install --agent codex
|
|
|
26
26
|
```text
|
|
27
27
|
Use the thiaq-project skill. Refresh the existing ThiaQ project additively:
|
|
28
28
|
read existing project context, scan the repo, use live discovery evidence if
|
|
29
|
-
available,
|
|
30
|
-
project name the
|
|
29
|
+
available, show me a draft three-level product tree for review, and only then
|
|
30
|
+
propose a reviewed product map without making the customer or project name the
|
|
31
|
+
root node.
|
|
31
32
|
```
|
package/SKILL.md
CHANGED
|
@@ -57,12 +57,15 @@ Jira, browser traces, tests, or other connected tools.
|
|
|
57
57
|
selector gaps, blocked paths, screenshots, and bug candidates.
|
|
58
58
|
8. Fuse static repo analysis with live discovery. Prefer names that match the
|
|
59
59
|
product's own docs, routes, UI labels, tests, and issue language.
|
|
60
|
-
9.
|
|
61
|
-
`Product Area -> Feature or Workflow -> Surface
|
|
62
|
-
project name is context, not the
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
9. Draft an explicit tree before any hierarchy write. It must have at least
|
|
61
|
+
three levels: `Product Area -> Feature or Workflow -> Surface`. Controls may
|
|
62
|
+
be fourth-level leaves. The customer or project name is context, not the
|
|
63
|
+
root tree node.
|
|
64
|
+
10. Show the proposed tree to the first user in the chat, using indentation or
|
|
65
|
+
bullets so the structure is visible. Ask what should be renamed, merged,
|
|
66
|
+
split, moved, marked uncertain, or treated as release-critical.
|
|
67
|
+
11. Only after the first user reviews or explicitly asks you to proceed, call
|
|
68
|
+
ThiaQ MCP tools to submit summaries and proposed changes.
|
|
66
69
|
12. After discovery, use ThiaQ test ideas and issue categories to propose
|
|
67
70
|
deterministic coverage work.
|
|
68
71
|
|
|
@@ -194,11 +197,35 @@ Use `get_project_context` first. Then call the smallest useful write operation:
|
|
|
194
197
|
- `propose_access_profile_changes` for test URL, role, auth, and secret refs.
|
|
195
198
|
- `propose_safety_policy_changes` for safe/unsafe action boundaries.
|
|
196
199
|
- `list_test_ideas` after discovery.
|
|
200
|
+
- `list_operational_state` to inspect the agent-manageable workspace backlog:
|
|
201
|
+
ideas, groups, issues, journey candidates, runner work, and proposals.
|
|
202
|
+
- `update_test_idea` to soft-triage, archive, restore, or annotate test ideas.
|
|
203
|
+
- `group_test_ideas` to dedupe or collect ideas into scenario, area, or review
|
|
204
|
+
groups.
|
|
205
|
+
- `merge_test_ideas` to archive duplicate ideas under a primary idea.
|
|
197
206
|
- `propose_test_idea_promotion` to create reviewable promotion work.
|
|
198
207
|
- `list_issue_categories` for UX confusion, selector, driver, assertion, and
|
|
199
208
|
safety gaps.
|
|
209
|
+
- `create_issue_category` to store an operational issue category from evidence.
|
|
210
|
+
- `update_issue_category` to close, reopen, archive, restore, relabel, or
|
|
211
|
+
reprioritize operational issue categories.
|
|
212
|
+
- `merge_issue_categories` to archive duplicate issues under a primary issue.
|
|
200
213
|
- `create_repair_proposal` when an issue needs product, adapter, selector, or
|
|
201
214
|
assertion repair.
|
|
215
|
+
- `update_journey_candidate` to reprioritize, archive, restore, or annotate
|
|
216
|
+
candidate journeys without approving executable coverage.
|
|
217
|
+
- `cancel_runner_job` for stale queued/running discovery or scenario work.
|
|
218
|
+
- `retry_runner_job` to clone failed/stale runner work without changing original
|
|
219
|
+
evidence.
|
|
220
|
+
- `update_proposal_status` to withdraw, archive, restore, or supersede draft
|
|
221
|
+
proposals. Do not use it for final accept/reject review gates.
|
|
222
|
+
- `bulk_archive_operational_records` to dry-run and then archive large noisy
|
|
223
|
+
operational backlogs by type, status, source run, and explicit keep IDs.
|
|
224
|
+
- `reconcile_operational_state` to dry-run or apply safe stale runner cleanup.
|
|
225
|
+
|
|
226
|
+
Use soft mutation statuses instead of deletion. Evidence, run artifacts,
|
|
227
|
+
approved flows, approved journeys, manifests, safety policy, and CI tier changes
|
|
228
|
+
remain review-gated.
|
|
202
229
|
|
|
203
230
|
For tool schemas and payload examples, read
|
|
204
231
|
`references/mcp-tools.md` only when preparing MCP calls.
|
|
@@ -216,9 +243,11 @@ When submitting repo evidence, keep findings structured:
|
|
|
216
243
|
"personas": [{ "name": "Workspace Admin", "evidence": ["docs/admin.md"] }],
|
|
217
244
|
"jobs": [{ "title": "Create and share a workflow", "personaName": "Analyst" }],
|
|
218
245
|
"hierarchy": {
|
|
219
|
-
"
|
|
220
|
-
|
|
221
|
-
|
|
246
|
+
"nodes": [
|
|
247
|
+
{ "nodeId": "area.dashboard", "parentId": null, "level": 1, "kind": "product_area", "name": "Dashboard" },
|
|
248
|
+
{ "nodeId": "feature.projects", "parentId": "area.dashboard", "level": 2, "kind": "feature", "name": "Projects" },
|
|
249
|
+
{ "nodeId": "surface.project-list", "parentId": "feature.projects", "level": 3, "kind": "surface", "name": "Project list" }
|
|
250
|
+
]
|
|
222
251
|
},
|
|
223
252
|
"accessProfile": {
|
|
224
253
|
"loginUrl": "https://staging.example.com",
|
|
@@ -240,13 +269,20 @@ should expose product behavior, not account metadata:
|
|
|
240
269
|
- Top visible level: product areas such as Dashboard, Canvas Authoring,
|
|
241
270
|
Collaboration, Admin, Billing, Reporting, or Workspace Organization.
|
|
242
271
|
- Second level: features or workflows inside each area.
|
|
243
|
-
- Third level: surfaces,
|
|
244
|
-
|
|
272
|
+
- Third level: surfaces, states, or canvas affordances that scenarios can
|
|
273
|
+
anchor to.
|
|
274
|
+
- Optional fourth level: controls only when the control is stable, named, and
|
|
275
|
+
useful as a scenario anchor.
|
|
245
276
|
- Scenario and issue counts should attach to the most specific useful node.
|
|
246
277
|
- Never use the customer, project, tenant, or product name as the visible root
|
|
247
278
|
node. Keep that as surrounding context.
|
|
248
279
|
- Carry evidence and confidence for inferred nodes so the first user can
|
|
249
280
|
rename, merge, split, or reject suggestions.
|
|
281
|
+
- Do not submit a flat list of sections as a hierarchy. The hierarchy proposal
|
|
282
|
+
must contain explicit tree nodes with stable `nodeId`, `parentId`, `level`,
|
|
283
|
+
`kind`, `name`, evidence, confidence, and review questions.
|
|
284
|
+
- Do not submit the hierarchy before showing the draft tree to the user unless
|
|
285
|
+
the user explicitly tells you to proceed without review.
|
|
250
286
|
|
|
251
287
|
Use repo structure alone only as a starting hypothesis. Prefer the fused view:
|
|
252
288
|
what users can see in live discovery, what code/routes/tests call it, and what
|
package/package.json
CHANGED
package/references/mcp-tools.md
CHANGED
|
@@ -111,12 +111,18 @@ but mark them as proposals that should be fused with live discovery.
|
|
|
111
111
|
## Product Hierarchy Proposal
|
|
112
112
|
|
|
113
113
|
Use `propose_product_hierarchy_changes` after fusing live discovery evidence
|
|
114
|
-
with static repo analysis.
|
|
115
|
-
|
|
114
|
+
with static repo analysis. Before calling it, show the proposed tree to the
|
|
115
|
+
first user and ask what should be renamed, merged, split, moved, marked
|
|
116
|
+
uncertain, or treated as release-critical. Do not treat inferred names as final.
|
|
116
117
|
|
|
117
118
|
The visible tree should start with product areas. Do not make the customer,
|
|
118
119
|
tenant, project, or product name the root node.
|
|
119
120
|
|
|
121
|
+
The proposal must include an explicit tree with at least three levels:
|
|
122
|
+
`Product Area -> Feature or Workflow -> Surface`. Controls may be fourth-level
|
|
123
|
+
leaves when they are stable scenario anchors. Flat sections or areas with nested
|
|
124
|
+
free-form metadata are not enough.
|
|
125
|
+
|
|
120
126
|
```json
|
|
121
127
|
{
|
|
122
128
|
"name": "propose_product_hierarchy_changes",
|
|
@@ -126,26 +132,29 @@ tenant, project, or product name the root node.
|
|
|
126
132
|
"summary": "Combines live UI discovery with repo routes, tests, and docs.",
|
|
127
133
|
"source": "discovery:job-id + repo-summary:main",
|
|
128
134
|
"payload": {
|
|
129
|
-
"
|
|
135
|
+
"nodes": [
|
|
130
136
|
{
|
|
131
|
-
"
|
|
137
|
+
"nodeId": "area.canvas-authoring",
|
|
138
|
+
"parentId": null,
|
|
139
|
+
"level": 1,
|
|
140
|
+
"kind": "product_area",
|
|
132
141
|
"name": "Canvas Authoring",
|
|
133
142
|
"evidenceRefs": ["discovery:screen.canvas", "app/routes/canvas.tsx"],
|
|
134
143
|
"confidence": 0.82
|
|
135
|
-
}
|
|
136
|
-
],
|
|
137
|
-
"features": [
|
|
144
|
+
},
|
|
138
145
|
{
|
|
139
|
-
"
|
|
140
|
-
"
|
|
146
|
+
"nodeId": "feature.canvas-shapes",
|
|
147
|
+
"parentId": "area.canvas-authoring",
|
|
148
|
+
"level": 2,
|
|
149
|
+
"kind": "feature",
|
|
141
150
|
"name": "Shapes",
|
|
142
151
|
"evidenceRefs": ["discovery:control.shape-toolbar", "tests/e2e/shapes.spec.ts"]
|
|
143
|
-
}
|
|
144
|
-
],
|
|
145
|
-
"surfaces": [
|
|
152
|
+
},
|
|
146
153
|
{
|
|
147
|
-
"
|
|
148
|
-
"
|
|
154
|
+
"nodeId": "surface.shape-toolbar",
|
|
155
|
+
"parentId": "feature.canvas-shapes",
|
|
156
|
+
"level": 3,
|
|
157
|
+
"kind": "surface",
|
|
149
158
|
"name": "Shape toolbar",
|
|
150
159
|
"evidenceRefs": ["discovery:control.shape-toolbar"]
|
|
151
160
|
}
|
|
@@ -231,3 +240,262 @@ flow code.
|
|
|
231
240
|
}
|
|
232
241
|
}
|
|
233
242
|
```
|
|
243
|
+
|
|
244
|
+
## Operational Workspace Mutations
|
|
245
|
+
|
|
246
|
+
Agents may directly manage living QA workspace state when the operation is
|
|
247
|
+
soft, reversible, and reasoned. Do not hard-delete evidence. Do not accept or
|
|
248
|
+
reject review gates. Do not mutate approved flow code, journey specs, manifests,
|
|
249
|
+
safety policy, access policy, or CI tiers.
|
|
250
|
+
|
|
251
|
+
### List Operational State
|
|
252
|
+
|
|
253
|
+
Use this before cleanup work to inspect all MCP-manageable backlog records in
|
|
254
|
+
one bounded payload.
|
|
255
|
+
|
|
256
|
+
```json
|
|
257
|
+
{
|
|
258
|
+
"name": "list_operational_state",
|
|
259
|
+
"arguments": {
|
|
260
|
+
"projectId": "project-id",
|
|
261
|
+
"limit": "50",
|
|
262
|
+
"status": "draft"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Update A Test Idea
|
|
268
|
+
|
|
269
|
+
Use this to triage, annotate, archive, restore, or reprioritize discovery
|
|
270
|
+
findings.
|
|
271
|
+
|
|
272
|
+
```json
|
|
273
|
+
{
|
|
274
|
+
"name": "update_test_idea",
|
|
275
|
+
"arguments": {
|
|
276
|
+
"projectId": "project-id",
|
|
277
|
+
"ideaId": "idea.dashboard.create",
|
|
278
|
+
"status": "archived",
|
|
279
|
+
"reason": "Covered by scenario group scenario.dashboard.create"
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Group Test Ideas
|
|
285
|
+
|
|
286
|
+
Use this to dedupe or collect findings into scenario, product-area, or review
|
|
287
|
+
groups.
|
|
288
|
+
|
|
289
|
+
```json
|
|
290
|
+
{
|
|
291
|
+
"name": "group_test_ideas",
|
|
292
|
+
"arguments": {
|
|
293
|
+
"projectId": "project-id",
|
|
294
|
+
"groupId": "scenario.dashboard.create",
|
|
295
|
+
"groupKind": "scenario",
|
|
296
|
+
"label": "Dashboard create path",
|
|
297
|
+
"ideaIds": ["idea.dashboard.create", "idea.dashboard.empty-state"],
|
|
298
|
+
"rationale": "These findings describe one scenario candidate."
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Merge Test Ideas
|
|
304
|
+
|
|
305
|
+
Use this when several findings describe the same coverage need. The primary is
|
|
306
|
+
kept; secondaries are archived with merge evidence.
|
|
307
|
+
|
|
308
|
+
```json
|
|
309
|
+
{
|
|
310
|
+
"name": "merge_test_ideas",
|
|
311
|
+
"arguments": {
|
|
312
|
+
"projectId": "project-id",
|
|
313
|
+
"primaryIdeaId": "idea.dashboard.create",
|
|
314
|
+
"secondaryIdeaIds": ["idea.dashboard.empty-state"],
|
|
315
|
+
"reason": "Both findings describe the same dashboard create scenario."
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Create An Issue Category
|
|
321
|
+
|
|
322
|
+
Use this to persist a new operational gap that the agent found in evidence.
|
|
323
|
+
|
|
324
|
+
```json
|
|
325
|
+
{
|
|
326
|
+
"name": "create_issue_category",
|
|
327
|
+
"arguments": {
|
|
328
|
+
"projectId": "project-id",
|
|
329
|
+
"categoryId": "selector-gap.dashboard-create",
|
|
330
|
+
"categoryType": "selector_gap",
|
|
331
|
+
"label": "Dashboard create selector gap",
|
|
332
|
+
"severity": "medium",
|
|
333
|
+
"sourceIds": ["idea.dashboard.create"],
|
|
334
|
+
"reason": "No stable role/test-id locator exists for the create action."
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Update An Issue Category
|
|
340
|
+
|
|
341
|
+
Use this to close, reopen, archive, restore, relabel, or reprioritize UX,
|
|
342
|
+
selector, driver, assertion, or safety gaps.
|
|
343
|
+
|
|
344
|
+
```json
|
|
345
|
+
{
|
|
346
|
+
"name": "update_issue_category",
|
|
347
|
+
"arguments": {
|
|
348
|
+
"projectId": "project-id",
|
|
349
|
+
"categoryId": "selector-gap.dashboard-create",
|
|
350
|
+
"status": "closed",
|
|
351
|
+
"reason": "Stable role locator added to the reviewed interaction contract."
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Merge Issue Categories
|
|
357
|
+
|
|
358
|
+
Use this when multiple issues describe the same gap. The primary issue remains;
|
|
359
|
+
secondaries are archived.
|
|
360
|
+
|
|
361
|
+
```json
|
|
362
|
+
{
|
|
363
|
+
"name": "merge_issue_categories",
|
|
364
|
+
"arguments": {
|
|
365
|
+
"projectId": "project-id",
|
|
366
|
+
"primaryCategoryId": "selector-gap.dashboard-create",
|
|
367
|
+
"secondaryCategoryIds": ["selector-gap.create-button"],
|
|
368
|
+
"reason": "Both point at the same missing create-button locator."
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Update A Journey Candidate
|
|
374
|
+
|
|
375
|
+
Use this for ranking and triage only. It does not approve executable coverage.
|
|
376
|
+
|
|
377
|
+
```json
|
|
378
|
+
{
|
|
379
|
+
"name": "update_journey_candidate",
|
|
380
|
+
"arguments": {
|
|
381
|
+
"projectId": "project-id",
|
|
382
|
+
"candidateId": "journey-candidate-id",
|
|
383
|
+
"priority": "high",
|
|
384
|
+
"status": "active",
|
|
385
|
+
"reason": "Matches release-critical onboarding path."
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### Cancel Runner Work
|
|
391
|
+
|
|
392
|
+
Use this for queued or running discovery/scenario jobs that are stale or unsafe.
|
|
393
|
+
Completed jobs are immutable.
|
|
394
|
+
|
|
395
|
+
```json
|
|
396
|
+
{
|
|
397
|
+
"name": "cancel_runner_job",
|
|
398
|
+
"arguments": {
|
|
399
|
+
"projectId": "project-id",
|
|
400
|
+
"runnerJobId": "runner-job-id",
|
|
401
|
+
"runnerJobRequestId": "runner-request-id",
|
|
402
|
+
"reason": "Superseded by discovery run with updated safety boundaries."
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Retry Runner Work
|
|
408
|
+
|
|
409
|
+
Use this to clone a failed or stale runner job/request into new queued work. The
|
|
410
|
+
original evidence remains unchanged.
|
|
411
|
+
|
|
412
|
+
```json
|
|
413
|
+
{
|
|
414
|
+
"name": "retry_runner_job",
|
|
415
|
+
"arguments": {
|
|
416
|
+
"projectId": "project-id",
|
|
417
|
+
"runnerJobId": "runner-job-id",
|
|
418
|
+
"reason": "Runner environment is now healthy."
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Withdraw Or Supersede A Proposal
|
|
424
|
+
|
|
425
|
+
Use this for draft proposal lifecycle cleanup. Final accept/reject remains a UI
|
|
426
|
+
review gate.
|
|
427
|
+
|
|
428
|
+
```json
|
|
429
|
+
{
|
|
430
|
+
"name": "update_proposal_status",
|
|
431
|
+
"arguments": {
|
|
432
|
+
"projectId": "project-id",
|
|
433
|
+
"proposalId": "proposal-id",
|
|
434
|
+
"status": "superseded",
|
|
435
|
+
"supersededById": "replacement-proposal-id",
|
|
436
|
+
"reason": "Merged into a broader repair proposal."
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Bulk Archive Operational Records
|
|
442
|
+
|
|
443
|
+
Use this for large discovery-noise resets when thousands of proposals or test
|
|
444
|
+
ideas would otherwise require one call per record. It is dry-run by default and
|
|
445
|
+
returns compact counts plus sample IDs, not full proposal or idea bodies.
|
|
446
|
+
|
|
447
|
+
By default, it targets only `proposals` and `test_ideas`. Add more record types
|
|
448
|
+
explicitly when clearing groups, issues, journey candidates, or stale runner
|
|
449
|
+
work. It never hard-deletes evidence, never archives accepted/rejected
|
|
450
|
+
proposals, never archives approved/promoted/implemented test ideas, and only
|
|
451
|
+
cancels queued/running runner work.
|
|
452
|
+
|
|
453
|
+
Preview first:
|
|
454
|
+
|
|
455
|
+
```json
|
|
456
|
+
{
|
|
457
|
+
"name": "bulk_archive_operational_records",
|
|
458
|
+
"arguments": {
|
|
459
|
+
"projectId": "project-id",
|
|
460
|
+
"recordTypes": ["proposals", "test_ideas"],
|
|
461
|
+
"sourceRunIds": ["runner.discovery.ffe22c16"],
|
|
462
|
+
"proposalTypes": ["coverage-gap", "candidate-pathway", "bug-candidate"],
|
|
463
|
+
"dryRun": "true",
|
|
464
|
+
"excludeIds": ["proposal-to-keep", "idea.to.keep"],
|
|
465
|
+
"reason": "Preview cleanup of superseded discovery noise."
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
Apply after reviewing the returned counts:
|
|
471
|
+
|
|
472
|
+
```json
|
|
473
|
+
{
|
|
474
|
+
"name": "bulk_archive_operational_records",
|
|
475
|
+
"arguments": {
|
|
476
|
+
"projectId": "project-id",
|
|
477
|
+
"recordTypes": ["proposals", "test_ideas"],
|
|
478
|
+
"sourceRunIds": ["runner.discovery.ffe22c16"],
|
|
479
|
+
"dryRun": "false",
|
|
480
|
+
"excludeIds": ["proposal-to-keep", "idea.to.keep"],
|
|
481
|
+
"reason": "Archive superseded discovery noise after preserving latest real findings."
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Reconcile Operational State
|
|
487
|
+
|
|
488
|
+
Use this to find stale queued/running runner work. It is dry-run by default.
|
|
489
|
+
Only set `dryRun` to `"false"` when the cancellation is safe.
|
|
490
|
+
|
|
491
|
+
```json
|
|
492
|
+
{
|
|
493
|
+
"name": "reconcile_operational_state",
|
|
494
|
+
"arguments": {
|
|
495
|
+
"projectId": "project-id",
|
|
496
|
+
"staleRunnerHours": "24",
|
|
497
|
+
"dryRun": "true",
|
|
498
|
+
"reason": "Nightly cleanup of stale queued discovery work."
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
```
|