thachvd-kit 1.0.26 → 1.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/docs/getting-started.md +92 -0
- package/.agent/docs/project.md +13 -1
- package/.agent/docs/tooling.md +7 -13
- package/.agent/docs/workflow.md +43 -1
- package/.agent/rules/GEMINI.md +23 -7
- package/.agent/workflows/release.md +42 -0
- package/.agent/workflows/simple.md +42 -0
- package/.agent/workflows/task.md +59 -0
- package/README.md +98 -15
- package/bin/cli.js +354 -40
- package/package.json +4 -1
- package/prompts/debug.md +11 -0
- package/prompts/release.md +11 -0
- package/prompts/simple.md +11 -0
- package/prompts/spec.md +11 -0
- package/prompts/task.md +12 -0
- package/workflows/release.md +42 -0
- package/workflows/simple.md +42 -0
- package/workflows/task.md +59 -0
package/bin/cli.js
CHANGED
|
@@ -144,23 +144,34 @@ ${pc.bold('What gets generated:')}
|
|
|
144
144
|
~/.codex/skills/ Selected Codex skills copied to global user dir (shows in $ menu)
|
|
145
145
|
.claude/skills/ Selected Claude Code project skills copied from .agent/skills
|
|
146
146
|
|
|
147
|
-
${pc.bold('Workflow guide:')}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
147
|
+
${pc.bold('Workflow guide:')}
|
|
148
|
+
Every task /prompts:task Classify request and select workflow, skill, and agent
|
|
149
|
+
Small obvious fix /prompts:simple Fast path; skips spec/plan/review but still verifies
|
|
150
|
+
Idea is fuzzy /brainstorm Explore options, tradeoffs, and recommended direction
|
|
151
|
+
Scope needs a contract /prompts:spec Define requirements and acceptance criteria; no code yet
|
|
152
|
+
New app from scratch /create Turn an app idea into plan + implementation flow
|
|
153
|
+
Feature is clear /plan Create docs/PLAN-*.md first, no code yet
|
|
154
|
+
Existing app update /enhance Add or change a feature in an existing codebase
|
|
155
|
+
Bug or failing behavior /prompts:debug Investigate symptoms, root cause, fix
|
|
153
156
|
UI / UX work ui-ux-pro-max, frontend-specialist, $frontend-design, $webapp-testing
|
|
154
157
|
Run or add tests /test Generate tests, run tests, check coverage
|
|
155
158
|
Preview locally /preview Start, stop, restart, or health-check dev server
|
|
156
|
-
Deploy / infra /deploy Release, hosting, Docker, cloud, environment setup
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
Deploy / infra /deploy Release, hosting, Docker, cloud, environment setup
|
|
160
|
+
Pre-merge review /review Run the five-axis review before calling work complete
|
|
161
|
+
Npm package release /prompts:release Verify, version, tag, publish, and verify the package
|
|
162
|
+
Project state /status Summarize stack, progress, preview, pending work
|
|
163
|
+
Multi-domain work /orchestrate Coordinate frontend, backend, data, security, QA
|
|
164
|
+
|
|
165
|
+
${pc.bold('Common explicit skill prompts:')}
|
|
166
|
+
In Codex, use /prompts:task to route this request before editing.
|
|
167
|
+
In Codex, use /prompts:simple for a one-file fix with no behavior or contract change.
|
|
168
|
+
Use /brainstorm for this feature idea before planning.
|
|
169
|
+
In Codex, use /prompts:spec when requirements or scope need an explicit contract.
|
|
170
|
+
Use /plan for this feature; do not write code yet.
|
|
171
|
+
Use /enhance to implement this planned feature.
|
|
172
|
+
In Codex, use /prompts:debug for this failing behavior and find the root cause before editing.
|
|
173
|
+
Use /review before claiming this feature/refactor complete.
|
|
174
|
+
In Codex, use /prompts:release for npm versioning and publishing.
|
|
164
175
|
Use $clean-code before editing this module.
|
|
165
176
|
Use $systematic-debugging to investigate this bug.
|
|
166
177
|
Use $webapp-testing to verify the UI with Playwright.
|
|
@@ -906,14 +917,40 @@ Shared operating instructions for Codex, Antigravity, Claude Code, and Cursor.
|
|
|
906
917
|
|
|
907
918
|
If any \`.agent/docs/*.md\` file still contains \`TODO: refine\`, update the docs by scanning the project before making product code changes.
|
|
908
919
|
|
|
909
|
-
## Task Flow
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
-
|
|
914
|
-
-
|
|
915
|
-
-
|
|
916
|
-
|
|
920
|
+
## Task Flow
|
|
921
|
+
|
|
922
|
+
Route every task before editing. In Codex, use \`/prompts:task <request>\`; other clients can read the matching file under \`.agent/workflows/\`.
|
|
923
|
+
|
|
924
|
+
- Questions and analysis: answer directly, cite relevant files when useful, and do not edit code.
|
|
925
|
+
- Simple fix: use Codex \`/prompts:simple <request>\` only for one-file, unambiguous changes with no behavior or contract change.
|
|
926
|
+
- Bug or failing behavior: use Codex \`/prompts:debug <symptom>\` and follow the evidence-first root-cause flow.
|
|
927
|
+
- Feature or refactor: use \`/brainstorm\` for discovery, Codex \`/prompts:spec\` for ambiguous or multi-file scope, then \`/plan\`, wait for approval, implement, test, and \`/review\`.
|
|
928
|
+
- Pre-merge review: use \`/review\` even when the implementation itself was done by another client or member.
|
|
929
|
+
- Release or npm publish: use Codex \`/prompts:release\`; release work never uses the simple fast path.
|
|
930
|
+
- Multi-domain work: use \`.agent/workflows/orchestrate.md\` and route to the relevant specialist docs.
|
|
931
|
+
- UI work: read \`.agent/agents/frontend-specialist.md\` and applicable design skills before editing.
|
|
932
|
+
|
|
933
|
+
### Fast Path (Codex \`/prompts:simple\`)
|
|
934
|
+
|
|
935
|
+
The fast path intentionally bypasses only Spec, Plan, and the feature/refactor Review gate for a trivial change. It never bypasses inspection, focused verification, or reporting evidence. The agent must state this protocol before editing:
|
|
936
|
+
|
|
937
|
+
\`\`\`text
|
|
938
|
+
FAST_PATH: simple-fix
|
|
939
|
+
REASON: [why the change is one-file and unambiguous]
|
|
940
|
+
SCOPE: [file or narrow area]
|
|
941
|
+
\`\`\`
|
|
942
|
+
|
|
943
|
+
If the scope expands, stop and re-route with Codex \`/prompts:task\`. Do not silently skip gates for work that changes behavior, APIs, schemas, security, CI, dependencies, workflows, or release state.
|
|
944
|
+
|
|
945
|
+
### Gated Flow (feature or refactor)
|
|
946
|
+
|
|
947
|
+
1. **Spec** — run \`.agent/workflows/spec.md\` when scope is ambiguous, touches multiple files, or would take more than ~30 minutes. Skip only for single-line/self-contained fixes. Stop at its exit criteria and wait for human confirmation before moving on.
|
|
948
|
+
2. **Plan** — run \`.agent/workflows/plan.md\` (project-planner agent, no code writing). Wait for explicit user approval of the plan file before implementing.
|
|
949
|
+
3. **Implement** — smallest coherent change per the approved plan, with focused tests for changed behavior.
|
|
950
|
+
4. **Review** — run \`.agent/workflows/review.md\` (five-axis review) before the change is considered done. All 🔴 BLOCKING items must be resolved or explicitly accepted with rationale.
|
|
951
|
+
|
|
952
|
+
A feature/refactor task is not "done" until step 4's exit criteria are met — passing tests alone does not satisfy the gate. Simple fixes use the explicit Codex \`/prompts:simple\` fast path above. See \`.agent/docs/getting-started.md\` for the complete route guide.
|
|
953
|
+
|
|
917
954
|
## Skill Loading
|
|
918
955
|
|
|
919
956
|
- Treat \`.agent/skills/\` as the shared source of truth for all kit skills.
|
|
@@ -968,7 +1005,7 @@ Read AGENTS.md first, then follow the shared docs under .agent/docs/.
|
|
|
968
1005
|
}
|
|
969
1006
|
|
|
970
1007
|
function generateSharedCursorrules(data) {
|
|
971
|
-
return `# Cursor Rules
|
|
1008
|
+
return `# Cursor Rules
|
|
972
1009
|
|
|
973
1010
|
This repository uses AGENTS.md as the shared cross-agent entry file. Follow the instructions in AGENTS.md and keep Cursor-specific notes here only when they cannot apply to Codex, Antigravity, or Claude Code.
|
|
974
1011
|
|
|
@@ -976,8 +1013,8 @@ Read AGENTS.md first, then follow the shared docs under .agent/docs/.
|
|
|
976
1013
|
|
|
977
1014
|
---
|
|
978
1015
|
|
|
979
|
-
${generateSharedAgentsMd(data)}
|
|
980
|
-
`;
|
|
1016
|
+
${generateSharedAgentsMd(data).trimEnd()}
|
|
1017
|
+
`;
|
|
981
1018
|
}
|
|
982
1019
|
|
|
983
1020
|
function resolveCommands(data) {
|
|
@@ -1148,9 +1185,23 @@ function generateWorkflowDoc() {
|
|
|
1148
1185
|
|
|
1149
1186
|
1. Read AGENTS.md.
|
|
1150
1187
|
2. Read .agent/docs/project.md.
|
|
1151
|
-
3.
|
|
1152
|
-
4. Read only the relevant docs under .agent/agents, .agent/skills, .claude/skills, and .agent/workflows.
|
|
1153
|
-
5. Check if MCP servers (like \`codegraph\`) are active/available and prioritize using them as the primary entry point to search and locate files, symbols, and code blocks.
|
|
1188
|
+
3. Route the request with Codex \`/prompts:task <request>\` when the path is not obvious; otherwise read \`.agent/workflows/task.md\` directly.
|
|
1189
|
+
4. Read only the relevant docs under .agent/agents, .agent/skills, .claude/skills, and .agent/workflows.
|
|
1190
|
+
5. Check if MCP servers (like \`codegraph\`) are active/available and prioritize using them as the primary entry point to search and locate files, symbols, and code blocks.
|
|
1191
|
+
|
|
1192
|
+
## Route Matrix
|
|
1193
|
+
|
|
1194
|
+
| Situation | Command | Workflow / gate |
|
|
1195
|
+
|---|---|---|
|
|
1196
|
+
| Question or analysis only | direct answer | no edits |
|
|
1197
|
+
| One obvious local fix | Codex \`/prompts:simple\` | \`.agent/workflows/simple.md\`, fast-path |
|
|
1198
|
+
| Bug, regression, failing test, or unknown error | Codex \`/prompts:debug\` | \`.agent/workflows/debug.md\`, evidence-first |
|
|
1199
|
+
| New behavior, multi-file change, or unclear scope | \`/brainstorm\` -> Codex \`/prompts:spec\` when needed -> \`/plan\` | spec/plan approval -> implement -> review |
|
|
1200
|
+
| Pre-merge review | \`/review\` | \`.agent/workflows/review.md\`, five-axis |
|
|
1201
|
+
| npm version, tag, publish, or deployment | Codex \`/prompts:release\` | \`.agent/workflows/release.md\`, release gate |
|
|
1202
|
+
| Several specialist domains | \`/orchestrate\` | plan -> approval -> parallel work -> integration verify |
|
|
1203
|
+
|
|
1204
|
+
If a task is not clearly simple, use the standard flow. Never use the fast path for behavior, API, schema, security, CI, dependency, workflow, or release changes.
|
|
1154
1205
|
|
|
1155
1206
|
## Skill Selection
|
|
1156
1207
|
|
|
@@ -1165,6 +1216,16 @@ function generateWorkflowDoc() {
|
|
|
1165
1216
|
|
|
1166
1217
|
## Implementation Flow
|
|
1167
1218
|
|
|
1219
|
+
For Codex \`/prompts:simple\` fixes, state the fast-path decision before editing:
|
|
1220
|
+
|
|
1221
|
+
\`\`\`text
|
|
1222
|
+
FAST_PATH: simple-fix
|
|
1223
|
+
REASON: [why Spec/Plan/Review are not needed]
|
|
1224
|
+
SCOPE: [file or narrow area]
|
|
1225
|
+
\`\`\`
|
|
1226
|
+
|
|
1227
|
+
Then:
|
|
1228
|
+
|
|
1168
1229
|
1. State assumptions and success criteria when the task is not trivial.
|
|
1169
1230
|
2. Inspect dependent files before editing.
|
|
1170
1231
|
3. Make the smallest coherent change.
|
|
@@ -1172,6 +1233,24 @@ function generateWorkflowDoc() {
|
|
|
1172
1233
|
5. Run verification (prioritize using Playwright MCP for web/UI changes to automate verification and capture screenshots).
|
|
1173
1234
|
6. Summarize changed files and verification evidence.
|
|
1174
1235
|
|
|
1236
|
+
For bugs, use Codex \`/prompts:debug\` with \`$systematic-debugging\`, the \`debugger\` agent, and \`testing-patterns\`: reproduce, isolate the root cause, add regression protection, make the smallest fix, and verify.
|
|
1237
|
+
|
|
1238
|
+
For features or refactors, this flow runs *inside* the gated flow defined in AGENTS.md (spec -> plan -> implement -> review) — steps 3-5 above are the "Implement" phase, and step 6 is not a substitute for the mandatory \`.agent/workflows/review.md\` gate.
|
|
1239
|
+
|
|
1240
|
+
## Definition of Done (feature or refactor)
|
|
1241
|
+
|
|
1242
|
+
A feature/refactor task is only complete when all of the following hold — not when code compiles or tests pass:
|
|
1243
|
+
|
|
1244
|
+
The Spec checkbox may be skipped only when the documented Codex \`/prompts:simple\` fast-path protocol is stated and its criteria are met.
|
|
1245
|
+
|
|
1246
|
+
- [ ] \`.agent/workflows/spec.md\` exit criteria met (or explicitly skipped as a trivial/self-contained change)
|
|
1247
|
+
- [ ] \`.agent/workflows/plan.md\` produced a plan file, approved by the user
|
|
1248
|
+
- [ ] Tests added/updated for the changed behavior and passing
|
|
1249
|
+
- [ ] \`.agent/workflows/review.md\` five-axis review completed with all 🔴 BLOCKING items resolved or accepted with rationale
|
|
1250
|
+
- [ ] Changed files and verification evidence summarized to the user
|
|
1251
|
+
|
|
1252
|
+
Do not report a feature/refactor task as done if any box above is unchecked — say explicitly which gate is still open.
|
|
1253
|
+
|
|
1175
1254
|
## When To Update Docs
|
|
1176
1255
|
|
|
1177
1256
|
- Update .agent/docs/architecture.md when structure, boundaries, or entry points change.
|
|
@@ -1181,6 +1260,102 @@ function generateWorkflowDoc() {
|
|
|
1181
1260
|
`;
|
|
1182
1261
|
}
|
|
1183
1262
|
|
|
1263
|
+
function generateGettingStartedDoc() {
|
|
1264
|
+
return `# Getting Started With This Kit
|
|
1265
|
+
|
|
1266
|
+
Read this after \`thachvd-kit init\`. The kit gives every member one entry point, then selects only the process and expertise the task needs.
|
|
1267
|
+
|
|
1268
|
+
## Client Command Map
|
|
1269
|
+
|
|
1270
|
+
| Client | Task router | Simple fix | Bug fix | Feature spec | Release |
|
|
1271
|
+
|---|---|---|---|---|---|
|
|
1272
|
+
| Codex | \`/prompts:task\` | \`/prompts:simple\` | \`/prompts:debug\` | \`/prompts:spec\` | \`/prompts:release\` |
|
|
1273
|
+
| Antigravity | \`/task\` | \`/simple\` | \`/debug\` | \`/spec\` | \`/release\` |
|
|
1274
|
+
| Claude Code | \`/task\` | \`/simple\` | \`/debug\` | \`/spec\` | \`/release\` |
|
|
1275
|
+
| Cursor | \`/task\` | \`/simple\` | \`/debug\` | \`/spec\` | \`/release\` |
|
|
1276
|
+
|
|
1277
|
+
Codex reads custom prompts from \`~/.codex/prompts\`. Antigravity reads workspace workflows from \`.agent/workflows\`. Claude Code reads project skills from \`.claude/skills/<name>/SKILL.md\`. Cursor reads commands from \`.cursor/commands\`.
|
|
1278
|
+
|
|
1279
|
+
## Start Every Task With The Router
|
|
1280
|
+
|
|
1281
|
+
In Codex, use \`/prompts:task <request>\` before editing whenever the route is not already obvious. Other clients can read \`.agent/workflows/task.md\` directly. It must produce:
|
|
1282
|
+
|
|
1283
|
+
\`\`\`text
|
|
1284
|
+
ROUTE: question | simple | feature | bug | review | release | multi-domain
|
|
1285
|
+
WORKFLOW: [exact .agent/workflows/<name>.md file]
|
|
1286
|
+
SKILLS: [matching skills, or none]
|
|
1287
|
+
AGENTS: [matching specialist agents, or none]
|
|
1288
|
+
GATE: fast-path | standard
|
|
1289
|
+
NEXT: [the next command or action]
|
|
1290
|
+
\`\`\`
|
|
1291
|
+
|
|
1292
|
+
A workflow is the process and its gates. A skill is the method or checklist. An agent is the specialist role. Chat alone is not a route: the member must select the route and invoke the matching workflow or explicitly choose the question path.
|
|
1293
|
+
|
|
1294
|
+
## Route Matrix
|
|
1295
|
+
|
|
1296
|
+
| Situation | Command | Gate | Required next step |
|
|
1297
|
+
|---|---|---|---|
|
|
1298
|
+
| Explain, inspect, or brainstorm only | direct answer or \`/brainstorm\` | none | no code until the request becomes actionable |
|
|
1299
|
+
| One obvious local fix | \`/prompts:simple <request>\` in Codex | fast-path | inspect -> edit -> focused verify |
|
|
1300
|
+
| New behavior, multi-file change, unclear scope, or >~30 min | \`/prompts:task\` -> \`/brainstorm\` -> \`/prompts:spec\` when needed -> \`/plan\` | standard | wait for approval before implementation |
|
|
1301
|
+
| Bug, regression, failing test, or unknown error | \`/prompts:debug <symptom>\` in Codex | bug | reproduce -> isolate -> regression test -> fix -> verify |
|
|
1302
|
+
| Pre-merge or independent review | \`/review\` | review | five-axis review; resolve blocking findings |
|
|
1303
|
+
| Version, tag, npm publish, or deployment | \`/prompts:release\` in Codex | release | release checklist; never fast-path |
|
|
1304
|
+
| Frontend + backend + data/security together | \`/orchestrate\` | standard | plan -> approval -> specialist work -> integration verify |
|
|
1305
|
+
|
|
1306
|
+
## Standard Feature Flow
|
|
1307
|
+
|
|
1308
|
+
The gated sequence is Spec -> Plan -> Implement -> Review: \`/prompts:task\` -> \`/brainstorm\` -> \`/prompts:spec\` when scope is ambiguous or multi-file -> \`/plan\` -> user approves the plan -> implementation -> \`/test\` -> \`/review\` -> final verification -> commit/push.
|
|
1309
|
+
|
|
1310
|
+
The plan is a gate, not a suggestion. Do not start product-code implementation before explicit approval. Load only the relevant specialist agent and skills, such as \`$frontend-design\`, \`$api-design\`, or \`$webapp-testing\`.
|
|
1311
|
+
|
|
1312
|
+
## Bug Fix Flow
|
|
1313
|
+
|
|
1314
|
+
Use Codex \`/prompts:debug <symptom>\`, not the feature flow, when something is failing or the root cause is unknown:
|
|
1315
|
+
|
|
1316
|
+
1. Capture the exact symptom, environment, reproduction, and expected result.
|
|
1317
|
+
2. Inspect the relevant code path with MCP/codegraph when available.
|
|
1318
|
+
3. Form and test a small number of hypotheses; do not patch by guesswork.
|
|
1319
|
+
4. Add or update a regression test that fails before the fix when practical.
|
|
1320
|
+
5. Make the smallest root-cause fix.
|
|
1321
|
+
6. Run focused tests, then broader verification when the blast radius is shared.
|
|
1322
|
+
7. Use \`/review\` when the fix touches multiple files, contracts, security, or release behavior.
|
|
1323
|
+
|
|
1324
|
+
Load \`$systematic-debugging\`, the \`debugger\` agent, and \`testing-patterns\` for this route.
|
|
1325
|
+
|
|
1326
|
+
## Simple Fast Path
|
|
1327
|
+
|
|
1328
|
+
Use Codex \`/prompts:simple <request>\` only when the change is one obvious file, the result is unambiguous, and it changes no behavior, API, schema, security, CI, dependency, workflow, or release contract. Before editing, state:
|
|
1329
|
+
|
|
1330
|
+
\`\`\`text
|
|
1331
|
+
FAST_PATH: simple-fix
|
|
1332
|
+
REASON: [why Spec/Plan/Review are not needed]
|
|
1333
|
+
SCOPE: [file or narrow area]
|
|
1334
|
+
\`\`\`
|
|
1335
|
+
|
|
1336
|
+
This bypasses only Spec, Plan, and the feature/refactor Review gate. It never bypasses inspection, focused verification, or reporting evidence. If the scope expands, stop and re-route with Codex \`/prompts:task\`.
|
|
1337
|
+
|
|
1338
|
+
## Command And Skill Map
|
|
1339
|
+
|
|
1340
|
+
- \`/brainstorm\`: clarify intent and tradeoffs; no code.
|
|
1341
|
+
- Codex \`/prompts:spec\`: define requirements and acceptance criteria; no code.
|
|
1342
|
+
- \`/plan\`: create an approved implementation plan; no code before approval.
|
|
1343
|
+
- \`/enhance\` or \`/create\`: implement an approved feature with the relevant specialist agent.
|
|
1344
|
+
- Codex \`/prompts:debug\`: systematic root-cause investigation and regression protection.
|
|
1345
|
+
- \`/test\`: add or run tests and assess coverage.
|
|
1346
|
+
- \`/review\`: five-axis review before completion or merge.
|
|
1347
|
+
- Codex \`/prompts:release\`: verify, version, tag, publish, and verify npm output.
|
|
1348
|
+
- \`$clean-code\` and \`$verification-before-completion\`: default implementation hygiene.
|
|
1349
|
+
- \`$webapp-testing\`: browser/UI verification; use Playwright when available.
|
|
1350
|
+
|
|
1351
|
+
## Enforcement
|
|
1352
|
+
|
|
1353
|
+
Claude Code has a project Stop hook in \`.claude/settings.json\` for standard feature/refactor work. An explicit \`FAST_PATH: simple-fix\` is accepted only when the simple criteria are met; it still requires verification. Codex, Antigravity, and Cursor use the same written rules through \`AGENTS.md\`, \`.cursorrules\`, and \`.agent/rules/GEMINI.md\`.
|
|
1354
|
+
|
|
1355
|
+
Full details live in \`AGENTS.md\`, \`.agent/docs/workflow.md\`, and the matching file under \`.agent/workflows/\`.
|
|
1356
|
+
`;
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1184
1359
|
function resolveToolingSetup(data) {
|
|
1185
1360
|
const primaryLang = data.primary_language || 'javascript';
|
|
1186
1361
|
const packageManager = data.package_manager || 'npm';
|
|
@@ -1372,7 +1547,7 @@ function copyAgentFolder() {
|
|
|
1372
1547
|
return { copied, skipped: 0 };
|
|
1373
1548
|
}
|
|
1374
1549
|
|
|
1375
|
-
function copySelectedSkillFolders(data, assumeYes) {
|
|
1550
|
+
function copySelectedSkillFolders(data, assumeYes) {
|
|
1376
1551
|
const srcSkills = path.join(sourceDir, '.agent', 'skills');
|
|
1377
1552
|
if (!fs.existsSync(srcSkills)) return { copied: 0, skipped: 0, missing: 0, skills: [] };
|
|
1378
1553
|
|
|
@@ -1415,8 +1590,55 @@ function copySelectedSkillFolders(data, assumeYes) {
|
|
|
1415
1590
|
}
|
|
1416
1591
|
}
|
|
1417
1592
|
|
|
1418
|
-
return { copied, skipped: 0, missing, skills: selectedSkills };
|
|
1419
|
-
}
|
|
1593
|
+
return { copied, skipped: 0, missing, skills: selectedSkills };
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
function copyCodexPrompts() {
|
|
1597
|
+
const srcPrompts = path.join(sourceDir, 'prompts');
|
|
1598
|
+
const codexPromptsDir = homePath('.codex', 'prompts');
|
|
1599
|
+
if (!fs.existsSync(srcPrompts) || !codexPromptsDir) {
|
|
1600
|
+
return { copied: 0, prompts: [] };
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
let copied = 0;
|
|
1604
|
+
const prompts = [];
|
|
1605
|
+
fs.mkdirSync(codexPromptsDir, { recursive: true });
|
|
1606
|
+
for (const entry of fs.readdirSync(srcPrompts, { withFileTypes: true })) {
|
|
1607
|
+
if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
|
|
1608
|
+
fs.copyFileSync(path.join(srcPrompts, entry.name), path.join(codexPromptsDir, entry.name));
|
|
1609
|
+
copied++;
|
|
1610
|
+
prompts.push(path.basename(entry.name, '.md'));
|
|
1611
|
+
}
|
|
1612
|
+
return { copied, prompts };
|
|
1613
|
+
}
|
|
1614
|
+
|
|
1615
|
+
function copyClientWorkflowCommands() {
|
|
1616
|
+
const srcPrompts = path.join(sourceDir, 'prompts');
|
|
1617
|
+
const claudeSkillsDir = path.join(targetDir, '.claude', 'skills');
|
|
1618
|
+
const cursorCommandsDir = path.join(targetDir, '.cursor', 'commands');
|
|
1619
|
+
if (!fs.existsSync(srcPrompts)) {
|
|
1620
|
+
return { claude: 0, cursor: 0, prompts: [] };
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1623
|
+
let claude = 0;
|
|
1624
|
+
let cursor = 0;
|
|
1625
|
+
const prompts = [];
|
|
1626
|
+
for (const entry of fs.readdirSync(srcPrompts, { withFileTypes: true })) {
|
|
1627
|
+
if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
|
|
1628
|
+
const name = path.basename(entry.name, '.md');
|
|
1629
|
+
const sourcePath = path.join(srcPrompts, entry.name);
|
|
1630
|
+
const sourceContent = fs.readFileSync(sourcePath, 'utf8');
|
|
1631
|
+
const cursorContent = sourceContent.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n/, '');
|
|
1632
|
+
fs.mkdirSync(path.join(claudeSkillsDir, name), { recursive: true });
|
|
1633
|
+
fs.copyFileSync(sourcePath, path.join(claudeSkillsDir, name, 'SKILL.md'));
|
|
1634
|
+
fs.mkdirSync(cursorCommandsDir, { recursive: true });
|
|
1635
|
+
fs.writeFileSync(path.join(cursorCommandsDir, entry.name), cursorContent, 'utf8');
|
|
1636
|
+
claude++;
|
|
1637
|
+
cursor++;
|
|
1638
|
+
prompts.push(name);
|
|
1639
|
+
}
|
|
1640
|
+
return { claude, cursor, prompts };
|
|
1641
|
+
}
|
|
1420
1642
|
|
|
1421
1643
|
async function writeGeneratedFile(relativePath, content, assumeYes) {
|
|
1422
1644
|
const outputPath = path.join(targetDir, relativePath);
|
|
@@ -1560,6 +1782,78 @@ tool_timeout_sec = 120
|
|
|
1560
1782
|
return { ok: true, message: `configured context7, codegraph, playwright MCP in ${filePath}` };
|
|
1561
1783
|
}
|
|
1562
1784
|
|
|
1785
|
+
const DOD_HOOK_MARKER = 'feature/refactor Definition-of-Done gate';
|
|
1786
|
+
|
|
1787
|
+
function generateDodStopHookPrompt() {
|
|
1788
|
+
return `Input JSON (Stop hook payload): $ARGUMENTS\n\nCheck this project's ${DOD_HOOK_MARKER} (defined in AGENTS.md "Gated Flow" and .agent/docs/workflow.md "Definition of Done"). Use the \`last_assistant_message\` field as the authoritative final response. Use \`transcript_path\` only for additional context because the transcript may not contain the final response yet.\n\nFor a feature or refactor (multi-file change, new behavior, or non-trivial refactor), the work must go through spec -> plan -> implement -> review before being reported as complete:\n- spec: \`.agent/workflows/spec.md\` (skip allowed for trivial/self-contained changes)\n- plan: \`.agent/workflows/plan.md\`, with a plan artifact such as \`docs/PLAN-*.md\` and explicit user approval\n- review: \`.agent/workflows/review.md\` five-axis review, with blocking issues resolved\n\nSimple/self-contained fixes (single-line, typo, or unambiguous one-file change) may use /simple and are explicitly exempt from spec+plan+review only when the final response states FAST_PATH: simple-fix, its reason, and its narrow scope. They should never be blocked when those criteria are met. Verification is still mandatory.\n\nSteps:\n1. If the input JSON has \`stop_hook_active: true\`, allow stopping immediately (already checked once this cycle; never block twice in a row).\n2. Inspect the changed files and the \`last_assistant_message\` field.\n3. If no source files changed, the final response does not claim the task is done/complete, or the final response explicitly contains FAST_PATH: simple-fix and the changed scope is clearly a simple/self-contained fix, allow stopping.\n4. If it is a feature/refactor-scale change and the final response claims completion, verify that a plan artifact exists with evidence of user approval and that a review pass was completed. If either gate is missing, block; a generic statement that the task was simple is not enough.\n5. Return exactly JSON: {"ok": true} to allow stopping, or {"ok": false, "reason": "..."} to block.\n\nWhen blocking, name exactly which gate is missing and instruct the assistant to run the relevant workflow or explicitly state why the task qualifies as a simple fix.`;
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
function isDefinitionOfDoneHook(hook) {
|
|
1792
|
+
const prompt = hook && typeof hook.prompt === 'string' ? hook.prompt : '';
|
|
1793
|
+
return prompt.includes(DOD_HOOK_MARKER) || (
|
|
1794
|
+
prompt.includes('Input JSON (Stop hook payload)') &&
|
|
1795
|
+
prompt.includes('.agent/workflows/spec.md') &&
|
|
1796
|
+
prompt.includes('.agent/workflows/review.md')
|
|
1797
|
+
);
|
|
1798
|
+
}
|
|
1799
|
+
|
|
1800
|
+
function mergeClaudeProjectHooks(filePath) {
|
|
1801
|
+
const data = readJsonFile(filePath);
|
|
1802
|
+
if (data === null) {
|
|
1803
|
+
return { ok: false, message: `${filePath} is not valid JSON; skipped hook setup` };
|
|
1804
|
+
}
|
|
1805
|
+
if (!data.hooks || typeof data.hooks !== 'object') data.hooks = {};
|
|
1806
|
+
if (!Array.isArray(data.hooks.Stop)) data.hooks.Stop = [];
|
|
1807
|
+
|
|
1808
|
+
let primaryHook = null;
|
|
1809
|
+
let definitionHookCount = 0;
|
|
1810
|
+
for (const entry of data.hooks.Stop) {
|
|
1811
|
+
for (const hook of Array.isArray(entry?.hooks) ? entry.hooks : []) {
|
|
1812
|
+
if (isDefinitionOfDoneHook(hook)) {
|
|
1813
|
+
definitionHookCount++;
|
|
1814
|
+
if (!primaryHook) primaryHook = hook;
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
if (primaryHook) {
|
|
1820
|
+
primaryHook.prompt = generateDodStopHookPrompt();
|
|
1821
|
+
primaryHook.timeout = 60;
|
|
1822
|
+
primaryHook.statusMessage = 'Checking feature/refactor Definition-of-Done gate...';
|
|
1823
|
+
|
|
1824
|
+
if (definitionHookCount > 1) {
|
|
1825
|
+
data.hooks.Stop = data.hooks.Stop
|
|
1826
|
+
.map(entry => ({
|
|
1827
|
+
...entry,
|
|
1828
|
+
hooks: (Array.isArray(entry?.hooks) ? entry.hooks : [])
|
|
1829
|
+
.filter(hook => !isDefinitionOfDoneHook(hook) || hook === primaryHook)
|
|
1830
|
+
}))
|
|
1831
|
+
.filter(entry => entry.hooks.length > 0);
|
|
1832
|
+
}
|
|
1833
|
+
|
|
1834
|
+
writeJsonFile(filePath, data);
|
|
1835
|
+
return {
|
|
1836
|
+
ok: true,
|
|
1837
|
+
message: definitionHookCount > 1
|
|
1838
|
+
? `consolidated Definition-of-Done Stop hooks in ${filePath}`
|
|
1839
|
+
: `updated Definition-of-Done Stop hook in ${filePath}`
|
|
1840
|
+
};
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
data.hooks.Stop.push({
|
|
1844
|
+
hooks: [
|
|
1845
|
+
{
|
|
1846
|
+
type: 'agent',
|
|
1847
|
+
prompt: generateDodStopHookPrompt(),
|
|
1848
|
+
timeout: 60,
|
|
1849
|
+
statusMessage: 'Checking feature/refactor Definition-of-Done gate...'
|
|
1850
|
+
}
|
|
1851
|
+
]
|
|
1852
|
+
});
|
|
1853
|
+
writeJsonFile(filePath, data);
|
|
1854
|
+
return { ok: true, message: `configured Definition-of-Done Stop hook in ${filePath}` };
|
|
1855
|
+
}
|
|
1856
|
+
|
|
1563
1857
|
function setupMcpServers() {
|
|
1564
1858
|
const results = [];
|
|
1565
1859
|
results.push(ensureCodegraphCli());
|
|
@@ -1677,12 +1971,22 @@ async function main() {
|
|
|
1677
1971
|
console.log(` ${pc.yellow('~')} ${pc.bold('.agent/')} already exists - ${skipped} file${skipped !== 1 ? 's' : ''} skipped (no overwrite)`);
|
|
1678
1972
|
}
|
|
1679
1973
|
|
|
1680
|
-
const nativeSkills = copySelectedSkillFolders(data, assumeYes);
|
|
1974
|
+
const nativeSkills = copySelectedSkillFolders(data, assumeYes);
|
|
1681
1975
|
if (nativeSkills.copied > 0) {
|
|
1682
1976
|
console.log(` ${pc.green('OK')} Copied native skills to ${pc.bold('~/.codex/skills/')} and ${pc.bold('.claude/skills/')} (${nativeSkills.skills.join(', ')})`);
|
|
1683
1977
|
} else if (nativeSkills.skipped > 0) {
|
|
1684
1978
|
console.log(` ${pc.yellow('~')} Native skills already exist - ${nativeSkills.skipped} file${nativeSkills.skipped !== 1 ? 's' : ''} skipped`);
|
|
1685
|
-
}
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
const codexPrompts = copyCodexPrompts();
|
|
1982
|
+
if (codexPrompts.copied > 0) {
|
|
1983
|
+
console.log(` ${pc.green('OK')} Installed Codex custom prompts in ${pc.bold('~/.codex/prompts/')} (${codexPrompts.prompts.map(name => `/prompts:${name}`).join(', ')})`);
|
|
1984
|
+
}
|
|
1985
|
+
|
|
1986
|
+
const clientCommands = copyClientWorkflowCommands();
|
|
1987
|
+
if (clientCommands.claude > 0 || clientCommands.cursor > 0) {
|
|
1988
|
+
console.log(` ${pc.green('OK')} Installed workflow commands for Claude Code (${clientCommands.claude}) and Cursor (${clientCommands.cursor})`);
|
|
1989
|
+
}
|
|
1686
1990
|
|
|
1687
1991
|
|
|
1688
1992
|
const generatedFiles = [
|
|
@@ -1694,7 +1998,8 @@ async function main() {
|
|
|
1694
1998
|
[path.join('.agent', 'docs', 'architecture.md'), generateArchitectureDoc(data)],
|
|
1695
1999
|
[path.join('.agent', 'docs', 'conventions.md'), generateConventionsDoc(data)],
|
|
1696
2000
|
[path.join('.agent', 'docs', 'workflow.md'), generateWorkflowDoc()],
|
|
1697
|
-
[path.join('.agent', 'docs', 'tooling.md'), generateToolingDoc(data)]
|
|
2001
|
+
[path.join('.agent', 'docs', 'tooling.md'), generateToolingDoc(data)],
|
|
2002
|
+
[path.join('.agent', 'docs', 'getting-started.md'), generateGettingStartedDoc()]
|
|
1698
2003
|
];
|
|
1699
2004
|
|
|
1700
2005
|
for (const [relativePath, content] of generatedFiles) {
|
|
@@ -1703,6 +2008,10 @@ async function main() {
|
|
|
1703
2008
|
else console.log(` ${pc.yellow('~')} Skipped ${pc.bold(relativePath)}`);
|
|
1704
2009
|
}
|
|
1705
2010
|
|
|
2011
|
+
console.log(`\n${pc.bold(pc.cyan('Configuring Claude Code hooks'))}`);
|
|
2012
|
+
const hookResult = mergeClaudeProjectHooks(path.join(targetDir, '.claude', 'settings.json'));
|
|
2013
|
+
console.log(` ${hookResult.ok ? pc.green('OK') : pc.yellow('~')} ${hookResult.message}`);
|
|
2014
|
+
|
|
1706
2015
|
if (shouldSetupMcp) {
|
|
1707
2016
|
console.log(`\n${pc.bold(pc.cyan('Configuring MCP'))}`);
|
|
1708
2017
|
for (const result of setupMcpServers()) {
|
|
@@ -1721,10 +2030,14 @@ async function main() {
|
|
|
1721
2030
|
- ${pc.bold('CLAUDE.md')} Claude Code entry that imports AGENTS.md
|
|
1722
2031
|
- ${pc.bold('GEMINI.md')} Antigravity entry
|
|
1723
2032
|
- ${pc.bold('.cursorrules')} Cursor entry
|
|
1724
|
-
- ${pc.bold('.agent/docs/')} scan-based project rules
|
|
2033
|
+
- ${pc.bold('.agent/docs/')} scan-based project rules, including ${pc.bold('getting-started.md')} (standard flow vs fast path)
|
|
1725
2034
|
- ${pc.bold('.agent/')} skills, workflows, agents, and rules
|
|
1726
|
-
- ${pc.bold('~/.codex/skills/')} selected Codex skills installed globally (visible in $ menu)
|
|
1727
|
-
- ${pc.bold('
|
|
2035
|
+
- ${pc.bold('~/.codex/skills/')} selected Codex skills installed globally (visible in $ menu)
|
|
2036
|
+
- ${pc.bold('~/.codex/prompts/')} Codex custom prompts (visible as /prompts:<name> after restart)
|
|
2037
|
+
- ${pc.bold('.claude/skills/')} selected Claude Code native skills
|
|
2038
|
+
- ${pc.bold('.claude/skills/{task,simple,debug,spec,release}/')} workflow skills (visible as /task, /simple, /debug, /spec, /release)
|
|
2039
|
+
- ${pc.bold('.cursor/commands/')} Cursor workflow commands (visible as /task, /simple, /debug, /spec, /release)
|
|
2040
|
+
- ${pc.bold('.claude/settings.json')} Definition-of-Done Stop hook (Claude Code only — blocks reporting a feature/refactor "done" without a plan + review pass)
|
|
1728
2041
|
|
|
1729
2042
|
${pc.bold('MCP/tooling setup:')}
|
|
1730
2043
|
- Codegraph CLI checked or installed; MCP configured for Codex, Gemini/Antigravity, and Claude Code
|
|
@@ -1734,9 +2047,10 @@ async function main() {
|
|
|
1734
2047
|
- Codegraph index hint: run ${pc.bold('codegraph init -i')} when a project index is missing, then keep ${pc.bold('.codegraph/')} uncommitted
|
|
1735
2048
|
|
|
1736
2049
|
${pc.bold('Next steps:')}
|
|
1737
|
-
1.
|
|
1738
|
-
2.
|
|
1739
|
-
3.
|
|
2050
|
+
1. Read ${pc.bold('.agent/docs/getting-started.md')} for the standard flow vs fast path
|
|
2051
|
+
2. Copy the prompt below into your AI editor and describe what the project does
|
|
2052
|
+
3. Commit ${pc.bold('AGENTS.md')}, ${pc.bold('CLAUDE.md')}, ${pc.bold('GEMINI.md')}, ${pc.bold('.cursorrules')}, ${pc.bold('.agent/')}, and ${pc.bold('.claude/settings.json')}
|
|
2053
|
+
4. Open the project in Codex, Antigravity, Claude Code, or Cursor
|
|
1740
2054
|
|
|
1741
2055
|
${pc.bold('Copy this prompt into your AI editor:')}
|
|
1742
2056
|
${pc.dim('---')}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thachvd-kit",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.28",
|
|
4
4
|
"description": "Cross-agent project rules bootstrap kit for Codex, Antigravity, and Claude Code",
|
|
5
5
|
"bin": {
|
|
6
6
|
"thachvd-kit": "./bin/cli.js"
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"rules",
|
|
14
14
|
"scripts",
|
|
15
15
|
"skills",
|
|
16
|
+
"prompts",
|
|
16
17
|
"workflows",
|
|
17
18
|
"README.md",
|
|
18
19
|
"LICENSE"
|
|
@@ -23,6 +24,8 @@
|
|
|
23
24
|
},
|
|
24
25
|
"scripts": {
|
|
25
26
|
"test": "node test/cli.test.js",
|
|
27
|
+
"release:verify": "npm test && node --check bin/cli.js && npm pack --dry-run",
|
|
28
|
+
"preversion": "npm run release:verify",
|
|
26
29
|
"release:patch": "npm version patch",
|
|
27
30
|
"release:dry-run": "npm pack --dry-run",
|
|
28
31
|
"release:publish": "npm publish"
|
package/prompts/debug.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Investigate a bug with evidence, root-cause analysis, regression protection, and verification.
|
|
3
|
+
argument-hint: [SYMPTOM]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read and follow `.agent/workflows/debug.md` in the current repository.
|
|
7
|
+
|
|
8
|
+
Bug or symptom:
|
|
9
|
+
$ARGUMENTS
|
|
10
|
+
|
|
11
|
+
Use `$systematic-debugging`, the `debugger` agent, and `testing-patterns` when available. Reproduce and isolate the root cause before editing.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Run the npm release workflow with verification, versioning, tagging, publishing, and registry checks.
|
|
3
|
+
argument-hint: [RELEASE_REQUEST]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read and follow `.agent/workflows/release.md` in the current repository.
|
|
7
|
+
|
|
8
|
+
Release request:
|
|
9
|
+
$ARGUMENTS
|
|
10
|
+
|
|
11
|
+
Do not publish until the release gate and `npm run release:verify` pass.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Run the fast path for one-file, unambiguous fixes with verification.
|
|
3
|
+
argument-hint: [TASK]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read and follow `.agent/workflows/simple.md` in the current repository.
|
|
7
|
+
|
|
8
|
+
Request:
|
|
9
|
+
$ARGUMENTS
|
|
10
|
+
|
|
11
|
+
Use the fast path only when its criteria are met. State `FAST_PATH: simple-fix`, `REASON`, and `SCOPE` before editing. Never skip verification.
|
package/prompts/spec.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Define requirements and acceptance criteria before planning or implementation.
|
|
3
|
+
argument-hint: [REQUEST]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read and follow `.agent/workflows/spec.md` in the current repository.
|
|
7
|
+
|
|
8
|
+
Request:
|
|
9
|
+
$ARGUMENTS
|
|
10
|
+
|
|
11
|
+
Do not write product code. Stop at the spec gate and wait for human confirmation.
|
package/prompts/task.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Route the current request to the smallest safe workflow before editing.
|
|
3
|
+
argument-hint: [TASK]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read and follow `.agent/workflows/task.md` in the current repository.
|
|
7
|
+
|
|
8
|
+
Route this request before editing:
|
|
9
|
+
|
|
10
|
+
$ARGUMENTS
|
|
11
|
+
|
|
12
|
+
Return the required ROUTE, WORKFLOW, SKILLS, AGENTS, GATE, and NEXT fields. Do not edit code while routing.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Release the thachvd-kit npm package with verification, versioning, tagging, publishing, and registry checks.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /release - Npm Release
|
|
6
|
+
|
|
7
|
+
Use this workflow only after the implementation workflow is complete and the release commit is the only intended change.
|
|
8
|
+
|
|
9
|
+
## Release Gate
|
|
10
|
+
|
|
11
|
+
- [ ] Working tree is clean before starting.
|
|
12
|
+
- [ ] Change is already reviewed and pushed to `main`.
|
|
13
|
+
- [ ] `npm run release:verify` passes.
|
|
14
|
+
- [ ] The next version is correct and has not been published.
|
|
15
|
+
- [ ] npm authentication is available with `npm whoami`.
|
|
16
|
+
- [ ] Rollback/response plan is known: npm versions cannot be overwritten or reused.
|
|
17
|
+
|
|
18
|
+
## Commands
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
git status --short --branch
|
|
22
|
+
npm run release:verify
|
|
23
|
+
npm run release:patch
|
|
24
|
+
git push origin main --follow-tags
|
|
25
|
+
npm whoami
|
|
26
|
+
npm run release:publish
|
|
27
|
+
npm view thachvd-kit version
|
|
28
|
+
npx thachvd-kit@<published-version> --help
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`npm run release:patch` runs `preversion`, which executes the release verification, then `npm version patch` updates the package metadata and creates the version commit/tag. Do not run `npm publish` until the version and dry-run contents are correct.
|
|
32
|
+
|
|
33
|
+
## Version Rules
|
|
34
|
+
|
|
35
|
+
- Patch: backward-compatible fixes, docs, tests, and internal workflow improvements.
|
|
36
|
+
- Minor: backward-compatible new CLI behavior or user-facing capability.
|
|
37
|
+
- Major: breaking CLI, configuration, package, or generated-artifact contract.
|
|
38
|
+
- Beta/prerelease: publish with a non-`latest` dist-tag, for example `npm publish --tag beta`.
|
|
39
|
+
|
|
40
|
+
## Bypass Rules
|
|
41
|
+
|
|
42
|
+
Questions and simple fixes bypass Spec/Plan/Review only when they do not change behavior or a shared contract. Publishing never bypasses `release:verify`, versioning, tagging, authentication, or registry verification.
|