@thiaq/project-skill 0.1.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/README.md +31 -0
- package/SKILL.md +263 -0
- package/agents/openai.yaml +4 -0
- package/bin/install.mjs +67 -0
- package/bin/validate.mjs +29 -0
- package/package.json +26 -0
- package/references/mcp-tools.md +233 -0
package/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# @thiaq/project-skill
|
|
2
|
+
|
|
3
|
+
npm distribution for the ThiaQ project setup skill.
|
|
4
|
+
|
|
5
|
+
The package installs the `thiaq-project` skill into local agent skill folders so
|
|
6
|
+
Codex or Claude Code can refresh a ThiaQ project from live discovery plus static
|
|
7
|
+
repo analysis.
|
|
8
|
+
|
|
9
|
+
## Install From npm
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install --save-dev @thiaq/project-skill
|
|
13
|
+
npx thiaq-project-skill install --agent codex --agent claude-code
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Install From A Packed Tarball
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm pack ./skills/thiaq-project
|
|
20
|
+
npm install --save-dev ./thiaq-project-skill-0.1.0.tgz
|
|
21
|
+
npx thiaq-project-skill install --agent codex
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Agent Prompt
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
Use the thiaq-project skill. Refresh the existing ThiaQ project additively:
|
|
28
|
+
read existing project context, scan the repo, use live discovery evidence if
|
|
29
|
+
available, and propose a reviewed product map without making the customer or
|
|
30
|
+
project name the root node.
|
|
31
|
+
```
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: thiaq-project
|
|
3
|
+
description: Set up or refresh a ThiaQ project using hosted ThiaQ MCP tools. Use when an agent is asked to understand a product for ThiaQ, install or connect the runner/extension, run safe discovery, summarize repo/docs/GitHub/Jira/tests, fuse live UI evidence with static code analysis, infer personas and jobs, identify product areas/features/surfaces/controls, propose product map naming, propose access and safety policy, group test ideas, create issue/repair proposals, or prepare deterministic QA coverage without making the user fill long forms.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ThiaQ Project
|
|
7
|
+
|
|
8
|
+
Use this skill to populate ThiaQ from both live product discovery and static
|
|
9
|
+
repo evidence. Treat ThiaQ as a hosted control plane: submit summaries and
|
|
10
|
+
reviewable change sets through MCP, then let the first user confirm naming,
|
|
11
|
+
module boundaries, and critical paths in the UI.
|
|
12
|
+
|
|
13
|
+
This is a generic ThiaQ skill. It tells the harness what ThiaQ needs to know;
|
|
14
|
+
the harness decides how to collect that context from repo files, docs, GitHub,
|
|
15
|
+
Jira, browser traces, tests, or other connected tools.
|
|
16
|
+
|
|
17
|
+
## Core Rules
|
|
18
|
+
|
|
19
|
+
- Keep ThiaQ core product-agnostic. Put product-specific mechanics in the
|
|
20
|
+
customer repo, product adapter, or repo summary.
|
|
21
|
+
- Do not change customer application code unless the user explicitly asks for
|
|
22
|
+
an app-code change. Treat setup as outside-in QA/tooling work.
|
|
23
|
+
- Create or update ThiaQ files only under the repo's existing QA/test/tooling
|
|
24
|
+
conventions, such as `qa/thiaq`, `tests/thiaq`, `test/thiaq`, `e2e/thiaq`,
|
|
25
|
+
`playwright/thiaq`, or `cypress/thiaq`.
|
|
26
|
+
- Ensure repo-local ThiaQ runtime state is ignored by Git. At minimum,
|
|
27
|
+
`.gitignore` should contain `.thiaq/`; runner token configs such as
|
|
28
|
+
`thiaq.runner.json` should also stay uncommitted unless the team has a safe
|
|
29
|
+
secret-management pattern.
|
|
30
|
+
- Never send secrets, production customer data, broad raw source, or token
|
|
31
|
+
values to ThiaQ.
|
|
32
|
+
- Submit additive findings. Do not overwrite confirmed product knowledge.
|
|
33
|
+
- MCP writes must create change sets, proposals, or runner job requests.
|
|
34
|
+
- Approved CI still requires reviewed Git-backed flows, journeys, manifests,
|
|
35
|
+
interaction contracts, and assertions.
|
|
36
|
+
- Coordinate/browser-agent actions are discovery evidence until reviewed into a
|
|
37
|
+
deterministic selector or product-driver contract.
|
|
38
|
+
|
|
39
|
+
## Workflow
|
|
40
|
+
|
|
41
|
+
1. Identify the ThiaQ project id and hosted MCP endpoint.
|
|
42
|
+
2. Confirm the runner or browser extension is installed and connected, or help
|
|
43
|
+
the user create the smallest repo-local adapter needed to run safely.
|
|
44
|
+
3. Read available static product context: repo docs, connected issues,
|
|
45
|
+
existing tests, routes, labels, fixtures, naming, product language, feature
|
|
46
|
+
folders, stories, scripts, registries, manifests, and QA tooling.
|
|
47
|
+
4. Check whether the repo has a ThiaQ adapter in a repo-local tooling folder:
|
|
48
|
+
`qa/thiaq/adapter.ts`, `tests/thiaq/adapter.ts`,
|
|
49
|
+
`test/thiaq/adapter.ts`, `e2e/thiaq/adapter.ts`,
|
|
50
|
+
`playwright/thiaq/adapter.ts`, `cypress/thiaq/adapter.ts`,
|
|
51
|
+
`.thiaq/adapter.ts`, or `thiaq.adapter.ts`.
|
|
52
|
+
5. If no adapter exists, propose a small repo-local adapter before discovery.
|
|
53
|
+
6. Ask the user only for missing high-risk setup facts: safe URL, test role,
|
|
54
|
+
auth/session method, and destructive-action boundaries.
|
|
55
|
+
7. Start safe live discovery when access and safety boundaries are clear. Use
|
|
56
|
+
discovery to capture screens, surfaces, controls, canvas affordances,
|
|
57
|
+
selector gaps, blocked paths, screenshots, and bug candidates.
|
|
58
|
+
8. Fuse static repo analysis with live discovery. Prefer names that match the
|
|
59
|
+
product's own docs, routes, UI labels, tests, and issue language.
|
|
60
|
+
9. Propose a reviewable product map shaped like
|
|
61
|
+
`Product Area -> Feature or Workflow -> Surface or Control`. The customer or
|
|
62
|
+
project name is context, not the root tree node.
|
|
63
|
+
10. Ask the first user to review naming, split/merge areas, confirm critical
|
|
64
|
+
paths, and flag anything ThiaQ should never automate.
|
|
65
|
+
11. Call ThiaQ MCP tools to submit summaries and proposed changes.
|
|
66
|
+
12. After discovery, use ThiaQ test ideas and issue categories to propose
|
|
67
|
+
deterministic coverage work.
|
|
68
|
+
|
|
69
|
+
## What To Inspect
|
|
70
|
+
|
|
71
|
+
Prefer targeted reads over broad dumps:
|
|
72
|
+
|
|
73
|
+
- product docs: `README`, `docs/`, `product/`, onboarding guides;
|
|
74
|
+
- routes and navigation: router files, app shell, route manifests;
|
|
75
|
+
- surface labels and naming: page titles, route names, test IDs, visible labels,
|
|
76
|
+
domain nouns, workflow names, issue labels;
|
|
77
|
+
- tests: Playwright/Cypress specs, fixtures, page objects, selectors;
|
|
78
|
+
- adapters: product drivers, canvas/test bridges, helper registries;
|
|
79
|
+
- implementation shape: feature folders, components, stories, scripts,
|
|
80
|
+
registries, manifests, permissions, and data models that explain product
|
|
81
|
+
boundaries;
|
|
82
|
+
- discovery artifacts: visited URLs, screenshots, controls, accessibility
|
|
83
|
+
snapshots, selector gaps, blocked paths, canvas object evidence, and
|
|
84
|
+
bug-candidate ideas;
|
|
85
|
+
- issue context: GitHub/Jira labels, bug reports, UX notes when available;
|
|
86
|
+
- existing manifests: capabilities, use cases, journeys, flow registries.
|
|
87
|
+
|
|
88
|
+
Preserve evidence as short references such as `docs/product.md:12`,
|
|
89
|
+
`app/routes/dashboard.tsx`, `tests/e2e/create-project.spec.ts`, or issue URLs.
|
|
90
|
+
|
|
91
|
+
## Repo-Local Adapter
|
|
92
|
+
|
|
93
|
+
The customer's repo should own product-specific setup, test helpers, drivers,
|
|
94
|
+
naming standards, and secret references. ThiaQ Cloud owns orchestration, review
|
|
95
|
+
state, findings, and artifacts; it should not bake customer adapters into the
|
|
96
|
+
platform.
|
|
97
|
+
|
|
98
|
+
When an adapter is missing, pick the folder that matches the repo's existing
|
|
99
|
+
test/tooling style. Prefer an existing top-level `qa/`, `tests/`, `test/`,
|
|
100
|
+
`e2e/`, `playwright/`, or `cypress/` folder. Fall back to `qa/thiaq`. Do not
|
|
101
|
+
place ThiaQ setup under `src/`, `app/`, `pages/`, `routes/`, `components/`, or
|
|
102
|
+
other application-code roots.
|
|
103
|
+
|
|
104
|
+
Propose a file like `tests/thiaq/adapter.ts` or `qa/thiaq/adapter.ts`:
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
const defineThiaQAdapter = (adapter) => adapter;
|
|
108
|
+
|
|
109
|
+
export default defineThiaQAdapter({
|
|
110
|
+
id: "example-product",
|
|
111
|
+
name: "Example Product",
|
|
112
|
+
capabilities: {
|
|
113
|
+
capabilities: ["discovery", "recipe_run", "visual_anchors"],
|
|
114
|
+
jobTypes: ["discovery", "recipe_run"],
|
|
115
|
+
labels: ["dashboard", "admin", "workflow"]
|
|
116
|
+
},
|
|
117
|
+
doctor(context) {
|
|
118
|
+
return {
|
|
119
|
+
checks: [
|
|
120
|
+
{
|
|
121
|
+
id: "base-url",
|
|
122
|
+
label: "Safe test URL is configured",
|
|
123
|
+
status: context.baseUrl ? "passed" : "failed",
|
|
124
|
+
message: context.baseUrl ?? "Set runner baseUrl"
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
ok: Boolean(context.baseUrl)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Use the inline helper for a zero-dependency first setup. If the repo can add
|
|
134
|
+
developer dependencies, install `@thiaq/adapter-contract` and import
|
|
135
|
+
`defineThiaQAdapter` for stricter TypeScript typing.
|
|
136
|
+
|
|
137
|
+
Add product-specific methods only when the generic runner is insufficient:
|
|
138
|
+
|
|
139
|
+
- `runDiscovery(context, job)` for custom login, seed data, app startup, or
|
|
140
|
+
product-specific screenshot/anchor capture.
|
|
141
|
+
- `runRecipe(context, job)` for repo-owned deterministic recipe execution.
|
|
142
|
+
- `runSuite(context, job)` for existing Playwright/Cypress suite integration.
|
|
143
|
+
- `summarizeRepo(context)` for repo-local product summaries.
|
|
144
|
+
|
|
145
|
+
Prefer adapter code that calls existing test helpers, page objects, fixtures,
|
|
146
|
+
and product drivers. Do not duplicate working test infrastructure just to fit
|
|
147
|
+
ThiaQ.
|
|
148
|
+
|
|
149
|
+
The runner config may point at the adapter:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"adapter": "example-product",
|
|
154
|
+
"adapterPath": "tests/thiaq/adapter.ts",
|
|
155
|
+
"baseUrl": "http://localhost:5174",
|
|
156
|
+
"repoPath": "/path/to/customer/repo"
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`thiaq runner setup` should add `.thiaq/` and `thiaq.runner.json` to
|
|
161
|
+
`.gitignore` so local artifacts and runner tokens do not get committed.
|
|
162
|
+
|
|
163
|
+
Run `thiaq runner doctor` before discovery. Treat failed adapter checks as
|
|
164
|
+
setup blockers and warnings as explicit caveats in the ThiaQ project summary.
|
|
165
|
+
|
|
166
|
+
## Required User Questions
|
|
167
|
+
|
|
168
|
+
Ask only when the answer cannot be inferred safely:
|
|
169
|
+
|
|
170
|
+
- What safe test URL should ThiaQ open?
|
|
171
|
+
- What test role/account should discovery use?
|
|
172
|
+
- What actions are safe to perform automatically?
|
|
173
|
+
- What data must never be created, edited, deleted, transmitted, or persisted?
|
|
174
|
+
- Which environment stores secrets, and what reference name should ThiaQ use?
|
|
175
|
+
|
|
176
|
+
Do not ask the user to paste long product forms if repo evidence can answer the
|
|
177
|
+
question.
|
|
178
|
+
|
|
179
|
+
## MCP Tool Use
|
|
180
|
+
|
|
181
|
+
Use the hosted MCP endpoint in Code Mode/search-and-execute when available. In
|
|
182
|
+
that mode, first call `query` to find the typed ThiaQ operation, then call
|
|
183
|
+
`execute` with the smallest useful operation and arguments.
|
|
184
|
+
|
|
185
|
+
Use `get_project_context` first. Then call the smallest useful write operation:
|
|
186
|
+
|
|
187
|
+
- `submit_repo_summary` for repo/docs/tests/Jira/GitHub summaries.
|
|
188
|
+
- `propose_product_profile_changes` for product basics.
|
|
189
|
+
- `propose_persona_changes` for additive personas.
|
|
190
|
+
- `propose_job_changes` for persona-linked jobs.
|
|
191
|
+
- `start_discovery_run` after runner or extension setup and safety review.
|
|
192
|
+
- `propose_product_hierarchy_changes` for reviewable product maps that fuse
|
|
193
|
+
static repo analysis with live discovery evidence.
|
|
194
|
+
- `propose_access_profile_changes` for test URL, role, auth, and secret refs.
|
|
195
|
+
- `propose_safety_policy_changes` for safe/unsafe action boundaries.
|
|
196
|
+
- `list_test_ideas` after discovery.
|
|
197
|
+
- `propose_test_idea_promotion` to create reviewable promotion work.
|
|
198
|
+
- `list_issue_categories` for UX confusion, selector, driver, assertion, and
|
|
199
|
+
safety gaps.
|
|
200
|
+
- `create_repair_proposal` when an issue needs product, adapter, selector, or
|
|
201
|
+
assertion repair.
|
|
202
|
+
|
|
203
|
+
For tool schemas and payload examples, read
|
|
204
|
+
`references/mcp-tools.md` only when preparing MCP calls.
|
|
205
|
+
|
|
206
|
+
## Summary Shape
|
|
207
|
+
|
|
208
|
+
When submitting repo evidence, keep findings structured:
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"productProfile": {
|
|
213
|
+
"productName": "Example",
|
|
214
|
+
"productBrief": "Short product description"
|
|
215
|
+
},
|
|
216
|
+
"personas": [{ "name": "Workspace Admin", "evidence": ["docs/admin.md"] }],
|
|
217
|
+
"jobs": [{ "title": "Create and share a workflow", "personaName": "Analyst" }],
|
|
218
|
+
"hierarchy": {
|
|
219
|
+
"areas": [{ "areaId": "area.dashboard", "name": "Dashboard" }],
|
|
220
|
+
"features": [{ "featureId": "feature.projects", "areaId": "area.dashboard", "name": "Projects" }],
|
|
221
|
+
"surfaces": [{ "surfaceId": "surface.project-list", "featureId": "feature.projects", "name": "Project list" }]
|
|
222
|
+
},
|
|
223
|
+
"accessProfile": {
|
|
224
|
+
"loginUrl": "https://staging.example.com",
|
|
225
|
+
"testRole": "Primary test user",
|
|
226
|
+
"secretReference": "THIAQ_STAGING_SESSION"
|
|
227
|
+
},
|
|
228
|
+
"safetyPolicy": {
|
|
229
|
+
"safeActions": ["create test data"],
|
|
230
|
+
"unsafeActions": ["delete real customer data"]
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Product Map Guidance
|
|
236
|
+
|
|
237
|
+
Build a product map that a QA-oriented user can navigate immediately. The tree
|
|
238
|
+
should expose product behavior, not account metadata:
|
|
239
|
+
|
|
240
|
+
- Top visible level: product areas such as Dashboard, Canvas Authoring,
|
|
241
|
+
Collaboration, Admin, Billing, Reporting, or Workspace Organization.
|
|
242
|
+
- Second level: features or workflows inside each area.
|
|
243
|
+
- Third level: surfaces, controls, states, or canvas affordances that scenarios
|
|
244
|
+
can anchor to.
|
|
245
|
+
- Scenario and issue counts should attach to the most specific useful node.
|
|
246
|
+
- Never use the customer, project, tenant, or product name as the visible root
|
|
247
|
+
node. Keep that as surrounding context.
|
|
248
|
+
- Carry evidence and confidence for inferred nodes so the first user can
|
|
249
|
+
rename, merge, split, or reject suggestions.
|
|
250
|
+
|
|
251
|
+
Use repo structure alone only as a starting hypothesis. Prefer the fused view:
|
|
252
|
+
what users can see in live discovery, what code/routes/tests call it, and what
|
|
253
|
+
docs or issues say the product team calls it.
|
|
254
|
+
|
|
255
|
+
## Completion Criteria
|
|
256
|
+
|
|
257
|
+
Finish with a short status:
|
|
258
|
+
|
|
259
|
+
- summaries submitted,
|
|
260
|
+
- change sets created,
|
|
261
|
+
- missing setup facts,
|
|
262
|
+
- recommended next ThiaQ action,
|
|
263
|
+
- any safety caveats.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "ThiaQ Project Setup"
|
|
3
|
+
short_description: "Set up ThiaQ from live discovery plus repo analysis."
|
|
4
|
+
default_prompt: "Use this skill to connect my runner or extension, discover my app, scan my repo, and propose a reviewed ThiaQ product map through the hosted MCP tools."
|
package/bin/install.mjs
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { cp, mkdir, rm } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
|
|
7
|
+
const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
8
|
+
const args = process.argv.slice(2);
|
|
9
|
+
|
|
10
|
+
function hasFlag(flag) {
|
|
11
|
+
return args.includes(flag);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function valuesFor(flag) {
|
|
15
|
+
const values = [];
|
|
16
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
17
|
+
if (args[index] === flag && args[index + 1]) values.push(args[index + 1]);
|
|
18
|
+
}
|
|
19
|
+
return values;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (hasFlag("--help") || hasFlag("-h")) {
|
|
23
|
+
console.log(`Usage:
|
|
24
|
+
thiaq-project-skill install [--agent codex] [--agent claude-code] [--target /path/to/skills]
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
thiaq-project-skill install --agent codex
|
|
28
|
+
thiaq-project-skill install --agent codex --agent claude-code
|
|
29
|
+
thiaq-project-skill install --target ./.codex/skills
|
|
30
|
+
`);
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const command = args[0] ?? "install";
|
|
35
|
+
if (command !== "install") {
|
|
36
|
+
throw new Error(`Unsupported command: ${command}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const explicitTargets = valuesFor("--target").map((target) => resolve(target));
|
|
40
|
+
const agents = valuesFor("--agent");
|
|
41
|
+
const selectedAgents =
|
|
42
|
+
agents.length > 0 || explicitTargets.length === 0 ? agents : [];
|
|
43
|
+
const defaultAgents =
|
|
44
|
+
agents.length > 0 || explicitTargets.length > 0 ? selectedAgents : ["codex"];
|
|
45
|
+
|
|
46
|
+
const agentTargets = defaultAgents.map((agent) => {
|
|
47
|
+
if (agent === "codex") return join(homedir(), ".codex", "skills");
|
|
48
|
+
if (agent === "claude-code" || agent === "claude") {
|
|
49
|
+
return join(homedir(), ".claude", "skills");
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`Unsupported agent: ${agent}`);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const targets = [...new Set([...explicitTargets, ...agentTargets])];
|
|
55
|
+
|
|
56
|
+
for (const target of targets) {
|
|
57
|
+
const destination = join(target, "thiaq-project");
|
|
58
|
+
await mkdir(target, { recursive: true });
|
|
59
|
+
await rm(destination, { recursive: true, force: true });
|
|
60
|
+
await cp(packageRoot, destination, {
|
|
61
|
+
recursive: true,
|
|
62
|
+
filter(source) {
|
|
63
|
+
return !source.includes(`${packageRoot}/node_modules`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
console.log(`Installed thiaq-project skill to ${destination}`);
|
|
67
|
+
}
|
package/bin/validate.mjs
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { access, readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
|
|
6
|
+
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
7
|
+
const requiredFiles = [
|
|
8
|
+
"SKILL.md",
|
|
9
|
+
"README.md",
|
|
10
|
+
"agents/openai.yaml",
|
|
11
|
+
"references/mcp-tools.md"
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
for (const file of requiredFiles) {
|
|
15
|
+
await access(join(root, file));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const skill = await readFile(join(root, "SKILL.md"), "utf8");
|
|
19
|
+
if (!skill.startsWith("---\n")) {
|
|
20
|
+
throw new Error("SKILL.md must start with YAML frontmatter");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
for (const required of ["name: thiaq-project", "description:"]) {
|
|
24
|
+
if (!skill.includes(required)) {
|
|
25
|
+
throw new Error(`SKILL.md missing required frontmatter: ${required}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
console.log("thiaq-project skill package is valid");
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thiaq/project-skill",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"private": false,
|
|
6
|
+
"description": "ThiaQ project setup skill for Codex and Claude Code agents.",
|
|
7
|
+
"license": "UNLICENSED",
|
|
8
|
+
"bin": {
|
|
9
|
+
"thiaq-project-skill": "./bin/install.mjs"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"SKILL.md",
|
|
13
|
+
"README.md",
|
|
14
|
+
"agents",
|
|
15
|
+
"references",
|
|
16
|
+
"bin",
|
|
17
|
+
"package.json"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "node ./bin/validate.mjs",
|
|
24
|
+
"prepack": "node ./bin/validate.mjs"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# ThiaQ MCP Tool Reference
|
|
2
|
+
|
|
3
|
+
Endpoint shape:
|
|
4
|
+
|
|
5
|
+
```http
|
|
6
|
+
POST /api/mcp?optimize_context=search_and_execute
|
|
7
|
+
Authorization: Bearer <thiaq api token>
|
|
8
|
+
Content-Type: application/json
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Prefer Code Mode/search-and-execute for hosted commercial use. Search first:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"jsonrpc": "2.0",
|
|
16
|
+
"id": "search-1",
|
|
17
|
+
"method": "tools/call",
|
|
18
|
+
"params": {
|
|
19
|
+
"name": "query",
|
|
20
|
+
"arguments": {
|
|
21
|
+
"projectId": "project-id",
|
|
22
|
+
"query": "personas jobs product hierarchy"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Then execute typed calls:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"jsonrpc": "2.0",
|
|
33
|
+
"id": "execute-1",
|
|
34
|
+
"method": "tools/call",
|
|
35
|
+
"params": {
|
|
36
|
+
"name": "execute",
|
|
37
|
+
"arguments": {
|
|
38
|
+
"projectId": "project-id",
|
|
39
|
+
"calls": [
|
|
40
|
+
{
|
|
41
|
+
"name": "get_project_context",
|
|
42
|
+
"arguments": { "projectId": "project-id" }
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Native JSON-RPC tools are also available for development and small tool catalogs:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"jsonrpc": "2.0",
|
|
55
|
+
"id": "call-1",
|
|
56
|
+
"method": "tools/call",
|
|
57
|
+
"params": {
|
|
58
|
+
"name": "get_project_context",
|
|
59
|
+
"arguments": { "projectId": "project-id" }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Read Context
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"name": "get_project_context",
|
|
69
|
+
"arguments": { "projectId": "project-id" }
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Submit Repo Summary
|
|
74
|
+
|
|
75
|
+
Use this for structured static analysis from docs, routes, tests, feature
|
|
76
|
+
folders, stories, fixtures, registries, manifests, issue trackers, and existing
|
|
77
|
+
QA tooling. Include product-map suggestions when the repo provides evidence,
|
|
78
|
+
but mark them as proposals that should be fused with live discovery.
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"name": "submit_repo_summary",
|
|
83
|
+
"arguments": {
|
|
84
|
+
"projectId": "project-id",
|
|
85
|
+
"source": {
|
|
86
|
+
"sourceId": "repo.main",
|
|
87
|
+
"sourceType": "repo",
|
|
88
|
+
"label": "Main product repo",
|
|
89
|
+
"uri": "https://github.com/org/repo"
|
|
90
|
+
},
|
|
91
|
+
"title": "Repo product summary",
|
|
92
|
+
"summaryMarkdown": "Concise static findings with evidence refs.",
|
|
93
|
+
"evidenceRefs": ["README.md", "app/routes/dashboard.tsx", "tests/e2e/create.spec.ts"],
|
|
94
|
+
"findings": {
|
|
95
|
+
"productProfile": {},
|
|
96
|
+
"personas": [],
|
|
97
|
+
"jobs": [],
|
|
98
|
+
"hierarchy": {
|
|
99
|
+
"areas": [],
|
|
100
|
+
"features": [],
|
|
101
|
+
"surfaces": [],
|
|
102
|
+
"namingAssumptions": []
|
|
103
|
+
},
|
|
104
|
+
"accessProfile": {},
|
|
105
|
+
"safetyPolicy": {}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Product Hierarchy Proposal
|
|
112
|
+
|
|
113
|
+
Use `propose_product_hierarchy_changes` after fusing live discovery evidence
|
|
114
|
+
with static repo analysis. The proposal should be reviewable by the first user;
|
|
115
|
+
do not treat inferred names as final.
|
|
116
|
+
|
|
117
|
+
The visible tree should start with product areas. Do not make the customer,
|
|
118
|
+
tenant, project, or product name the root node.
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"name": "propose_product_hierarchy_changes",
|
|
123
|
+
"arguments": {
|
|
124
|
+
"projectId": "project-id",
|
|
125
|
+
"title": "Review discovered product map",
|
|
126
|
+
"summary": "Combines live UI discovery with repo routes, tests, and docs.",
|
|
127
|
+
"source": "discovery:job-id + repo-summary:main",
|
|
128
|
+
"payload": {
|
|
129
|
+
"areas": [
|
|
130
|
+
{
|
|
131
|
+
"areaId": "area.canvas-authoring",
|
|
132
|
+
"name": "Canvas Authoring",
|
|
133
|
+
"evidenceRefs": ["discovery:screen.canvas", "app/routes/canvas.tsx"],
|
|
134
|
+
"confidence": 0.82
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"features": [
|
|
138
|
+
{
|
|
139
|
+
"featureId": "feature.canvas-shapes",
|
|
140
|
+
"areaId": "area.canvas-authoring",
|
|
141
|
+
"name": "Shapes",
|
|
142
|
+
"evidenceRefs": ["discovery:control.shape-toolbar", "tests/e2e/shapes.spec.ts"]
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"surfaces": [
|
|
146
|
+
{
|
|
147
|
+
"surfaceId": "surface.shape-toolbar",
|
|
148
|
+
"featureId": "feature.canvas-shapes",
|
|
149
|
+
"name": "Shape toolbar",
|
|
150
|
+
"evidenceRefs": ["discovery:control.shape-toolbar"]
|
|
151
|
+
}
|
|
152
|
+
],
|
|
153
|
+
"reviewQuestions": [
|
|
154
|
+
"Should Shapes and Connectors stay separate, or merge under Canvas Editing?"
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Propose Changes
|
|
162
|
+
|
|
163
|
+
Use the same shape for:
|
|
164
|
+
|
|
165
|
+
- `propose_product_profile_changes`
|
|
166
|
+
- `propose_persona_changes`
|
|
167
|
+
- `propose_job_changes`
|
|
168
|
+
- `propose_product_hierarchy_changes`
|
|
169
|
+
- `propose_access_profile_changes`
|
|
170
|
+
- `propose_safety_policy_changes`
|
|
171
|
+
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"name": "propose_job_changes",
|
|
175
|
+
"arguments": {
|
|
176
|
+
"projectId": "project-id",
|
|
177
|
+
"title": "Review persona jobs from repo",
|
|
178
|
+
"summary": "Adds jobs inferred from docs and E2E specs.",
|
|
179
|
+
"source": "repo-summary:main",
|
|
180
|
+
"payload": {
|
|
181
|
+
"jobs": [
|
|
182
|
+
{
|
|
183
|
+
"jobId": "job.create.workflow",
|
|
184
|
+
"personaName": "Process Analyst",
|
|
185
|
+
"title": "Create a workflow from the dashboard",
|
|
186
|
+
"description": "Open the dashboard, create a process map, and reach an editable canvas."
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Start Discovery Request
|
|
195
|
+
|
|
196
|
+
This creates a runner job request. It does not execute approved CI.
|
|
197
|
+
Run it after the runner or extension is connected, auth/session handling is
|
|
198
|
+
available, and safe/unsafe action boundaries are known. Discovery should
|
|
199
|
+
capture live UI evidence: screens, surfaces, controls, selector gaps, blocked
|
|
200
|
+
paths, screenshots, canvas affordances, and bug candidates.
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
{
|
|
204
|
+
"name": "start_discovery_run",
|
|
205
|
+
"arguments": {
|
|
206
|
+
"projectId": "project-id",
|
|
207
|
+
"targetUrl": "https://staging.example.com/dashboard",
|
|
208
|
+
"safetyPolicyId": "change-set-or-policy-id",
|
|
209
|
+
"budget": {
|
|
210
|
+
"maxStates": 8,
|
|
211
|
+
"maxActionsPerState": 12,
|
|
212
|
+
"timeLimitMinutes": 20
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Promote Test Ideas
|
|
219
|
+
|
|
220
|
+
This creates a reviewable promotion change set. It does not write approved
|
|
221
|
+
flow code.
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"name": "propose_test_idea_promotion",
|
|
226
|
+
"arguments": {
|
|
227
|
+
"projectId": "project-id",
|
|
228
|
+
"ideaIds": ["idea.dashboard.create"],
|
|
229
|
+
"tier": "release_gate",
|
|
230
|
+
"summary": "Promote the dashboard create path into a draft recipe."
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|