drskill 0.1.0__tar.gz
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.
- drskill-0.1.0/.claude/scheduled_tasks.lock +1 -0
- drskill-0.1.0/.gitignore +5 -0
- drskill-0.1.0/LICENSE +21 -0
- drskill-0.1.0/PKG-INFO +130 -0
- drskill-0.1.0/README.md +116 -0
- drskill-0.1.0/docs/superpowers/plans/2026-07-19-drskill-v0.1.md +3125 -0
- drskill-0.1.0/docs/superpowers/plans/2026-07-20-detailed-scan-linked-provenance.md +528 -0
- drskill-0.1.0/docs/superpowers/specs/2026-07-19-drskill-v0.1-design.md +232 -0
- drskill-0.1.0/docs/superpowers/specs/2026-07-20-detailed-scan-and-linked-provenance-design.md +63 -0
- drskill-0.1.0/initial_design_doc.md +191 -0
- drskill-0.1.0/pyproject.toml +33 -0
- drskill-0.1.0/src/drskill/__init__.py +0 -0
- drskill-0.1.0/src/drskill/checks/__init__.py +69 -0
- drskill-0.1.0/src/drskill/checks/budget.py +40 -0
- drskill-0.1.0/src/drskill/checks/duplicates.py +103 -0
- drskill-0.1.0/src/drskill/checks/filesystem.py +36 -0
- drskill-0.1.0/src/drskill/checks/lockfile.py +129 -0
- drskill-0.1.0/src/drskill/checks/shadowing.py +64 -0
- drskill-0.1.0/src/drskill/checks/spec.py +108 -0
- drskill-0.1.0/src/drskill/cli.py +182 -0
- drskill-0.1.0/src/drskill/data/__init__.py +0 -0
- drskill-0.1.0/src/drskill/data/harnesses.toml +880 -0
- drskill-0.1.0/src/drskill/discovery.py +96 -0
- drskill-0.1.0/src/drskill/harnesses.py +58 -0
- drskill-0.1.0/src/drskill/ledger.py +79 -0
- drskill-0.1.0/src/drskill/models.py +67 -0
- drskill-0.1.0/src/drskill/pipeline.py +45 -0
- drskill-0.1.0/src/drskill/report.py +124 -0
- drskill-0.1.0/src/drskill/resolution.py +158 -0
- drskill-0.1.0/src/drskill/tokens.py +28 -0
- drskill-0.1.0/tests/__init__.py +0 -0
- drskill-0.1.0/tests/conformance/cases/clean-pair/expect.toml +7 -0
- drskill-0.1.0/tests/conformance/cases/clean-pair/tree/.claude/skills/docx-report/SKILL.md +5 -0
- drskill-0.1.0/tests/conformance/cases/clean-pair/tree/.claude/skills/git-helper/SKILL.md +5 -0
- drskill-0.1.0/tests/conformance/cases/exact-dup-cross-harness/expect.toml +3 -0
- drskill-0.1.0/tests/conformance/cases/exact-dup-cross-harness/tree/.claude/skills/fmt/SKILL.md +5 -0
- drskill-0.1.0/tests/conformance/cases/exact-dup-cross-harness/tree/.pi/skills/fmt/SKILL.md +5 -0
- drskill-0.1.0/tests/conformance/cases/near-dup-pair/expect.toml +3 -0
- drskill-0.1.0/tests/conformance/cases/near-dup-pair/tree/.claude/skills/report-writer/SKILL.md +7 -0
- drskill-0.1.0/tests/conformance/cases/near-dup-pair/tree/.claude/skills/status-writer/SKILL.md +7 -0
- drskill-0.1.0/tests/conformance/cases/near-dup-pair/tree/drskill.toml +2 -0
- drskill-0.1.0/tests/conformance/cases/over-budget/expect.toml +7 -0
- drskill-0.1.0/tests/conformance/cases/over-budget/tree/.claude/skills/chatty/SKILL.md +6 -0
- drskill-0.1.0/tests/conformance/cases/over-budget/tree/drskill.toml +3 -0
- drskill-0.1.0/tests/conformance/cases/spec-violations/expect.toml +7 -0
- drskill-0.1.0/tests/conformance/cases/spec-violations/tree/.claude/skills/no-desc/SKILL.md +4 -0
- drskill-0.1.0/tests/conformance/cases/spec-violations/tree/.claude/skills/wrong-name/SKILL.md +5 -0
- drskill-0.1.0/tests/conformance/test_conformance.py +33 -0
- drskill-0.1.0/tests/test_checks_budget.py +39 -0
- drskill-0.1.0/tests/test_checks_duplicates.py +143 -0
- drskill-0.1.0/tests/test_checks_filesystem.py +47 -0
- drskill-0.1.0/tests/test_checks_lockfile.py +125 -0
- drskill-0.1.0/tests/test_checks_shadowing.py +138 -0
- drskill-0.1.0/tests/test_checks_spec.py +95 -0
- drskill-0.1.0/tests/test_cli_commands.py +138 -0
- drskill-0.1.0/tests/test_cli_scan.py +160 -0
- drskill-0.1.0/tests/test_discovery.py +115 -0
- drskill-0.1.0/tests/test_harnesses.py +64 -0
- drskill-0.1.0/tests/test_ledger.py +86 -0
- drskill-0.1.0/tests/test_models.py +65 -0
- drskill-0.1.0/tests/test_report.py +169 -0
- drskill-0.1.0/tests/test_resolution.py +178 -0
- drskill-0.1.0/tests/test_smoke.py +21 -0
- drskill-0.1.0/tests/test_tokens.py +25 -0
- drskill-0.1.0/uv.lock +646 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"sessionId":"571cac5f-2305-47b0-b52f-d79460f2f086","pid":38755,"procStart":"Mon Jul 20 03:35:27 2026","acquiredAt":1784522584769}
|
drskill-0.1.0/.gitignore
ADDED
drskill-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Drew Breunig
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
drskill-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: drskill
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: brew doctor for your AI agent's skill loadout
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Requires-Dist: pydantic>=2
|
|
8
|
+
Requires-Dist: pyyaml>=6
|
|
9
|
+
Requires-Dist: rich>=13
|
|
10
|
+
Requires-Dist: tiktoken>=0.7
|
|
11
|
+
Requires-Dist: tomli-w>=1
|
|
12
|
+
Requires-Dist: typer>=0.12
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
|
|
15
|
+
### They Call Me Dr. Skill
|
|
16
|
+
|
|
17
|
+
drskill is `brew doctor` for your agent's skill loadout. It looks at every coding agent installed on your machine or configured in your repo, works out exactly which skills each one loads, and checks that set for problems: skills that shadow each other, skills loaded twice, duplicate or near-duplicate skills, skills that break the SKILL.md spec, broken symlinks, drift against your lockfile, and skills that burn too many tokens. Every problem it reports ends in a command: a fix command or a command to acknowledge the problem and move on. drskill only reads your files. It never installs, edits, or deletes a skill, and it makes zero calls to an LLM.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
uv tool install drskill
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick start
|
|
26
|
+
|
|
27
|
+
Run a scan from the root of a project:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
drskill scan
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This detects every coding agent it can find, resolves each one's effective skill set, and prints a report grouped by severity. Each finding names the harnesses it affects and ends in a fix command or an ack command.
|
|
34
|
+
|
|
35
|
+
Write a starter ledger file with default budgets and thresholds:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
drskill init
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Acknowledge a finding so it stops showing up until the skill's content changes:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
drskill ack near-duplicate docx-report documentation-writer
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
List every harness's effective skill set with token counts:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
drskill list --tokens
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Scan and also print each harness's skill table in one run:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
drskill scan --detailed
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Scope the scan to a single harness and see exactly what that harness sees:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
drskill scan --harness pi
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
An unknown harness id is an error that names the valid ids. Harnesses that are detected but load no skills are hidden from the tables by default; a closing line names them, and `--all` shows them.
|
|
66
|
+
|
|
67
|
+
Run in CI, where any unacknowledged warning should fail the build:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
drskill scan --ci
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Exit codes
|
|
74
|
+
|
|
75
|
+
| code | meaning |
|
|
76
|
+
|---|---|
|
|
77
|
+
| 0 | clean, or every finding is acknowledged |
|
|
78
|
+
| 1 | at least one error-level finding is active |
|
|
79
|
+
| 2 | only warnings are active, but `--ci` was passed |
|
|
80
|
+
|
|
81
|
+
Without `--ci`, warnings alone exit 0. This lets you run `drskill scan` locally without it failing your shell, while still failing CI on the same warnings.
|
|
82
|
+
|
|
83
|
+
## Checks
|
|
84
|
+
|
|
85
|
+
| check id | severity | fires when |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `name-shadow` | warning | Two skills share a name in one harness's set and one shadows the other. The message names the winner and the rule that picked it. |
|
|
88
|
+
| `double-load` | error | One harness loads the same logical skill twice through two directories. |
|
|
89
|
+
| `exact-duplicate` | warning | Two contributors have equal normalized content hashes under different names or paths. |
|
|
90
|
+
| `near-duplicate` | warning | Jaccard similarity of MinHash signatures over word shingles is at or above the threshold. The default threshold is 0.85 and can be changed in the ledger. |
|
|
91
|
+
| `spec-name-mismatch` | error | Frontmatter `name` does not match the folder name. |
|
|
92
|
+
| `spec-missing-description` | error | The description is absent or empty. |
|
|
93
|
+
| `spec-description-too-long` | error | The description exceeds 1024 characters. |
|
|
94
|
+
| `spec-invalid-frontmatter` | error | The frontmatter does not parse as YAML. |
|
|
95
|
+
| `frontmatter-angle-brackets` | warning | Frontmatter values contain angle brackets, which the spec flags as an injection vector. |
|
|
96
|
+
| `broken-symlink` | error | A symlink in a skill directory points at nothing. |
|
|
97
|
+
| `lockfile-drift` | warning | A skill's content hash does not match its `skills-lock.json` entry. The message attributes the likely cause, e.g. a `gh skill update` or a hand edit, and does not call it corruption. |
|
|
98
|
+
| `budget-catalog-tokens` | warning | A harness's total catalog tokens exceed `[budget] catalog_tokens_max`. |
|
|
99
|
+
| `budget-body-tokens` | warning | A skill's body tokens exceed `[budget] body_tokens_warn`. |
|
|
100
|
+
|
|
101
|
+
## The ledger
|
|
102
|
+
|
|
103
|
+
`drskill.toml` sits at the root of your repo and should be committed. It holds your budgets, your thresholds, and your decisions. When you run `drskill ack`, it appends an entry like this:
|
|
104
|
+
|
|
105
|
+
```toml
|
|
106
|
+
[[ack]]
|
|
107
|
+
check = "near-duplicate"
|
|
108
|
+
skills = ["docx-report", "documentation-writer"]
|
|
109
|
+
fingerprint = "sha256:..."
|
|
110
|
+
note = "docx is output format specific; keeping both"
|
|
111
|
+
date = 2026-07-19
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
A finding's fingerprint is a hash of the check id plus the content of every skill involved. An ack silences a finding only while that fingerprint still matches. If you edit one of the skills named in the ack, its content hash changes, the fingerprint no longer matches, and the finding comes back on the next scan. This is deliberate. An ack means "this exact situation is fine," not "never check this pair again."
|
|
115
|
+
|
|
116
|
+
In global mode (`--global`), the ledger lives at `~/.drskill.toml` instead.
|
|
117
|
+
|
|
118
|
+
The `source` column in `list` shows where a skill came from: `skills-lock` for skills named in a project's `skills-lock.json`, `gh-skill` for skills with `gh skill` provenance in their frontmatter, and `linked` for skills that live in or link into a `.agents/skills` store. The `linked` label means an installer arranged the layout; drskill does not guess which one. `unmanaged` means a plain directory with no known manager.
|
|
119
|
+
|
|
120
|
+
## Known limitations
|
|
121
|
+
|
|
122
|
+
Comments in `drskill.toml` are lost when `drskill ack` rewrites the file. The file is parsed and re-written as data, and the writer does not carry comments forward. If you rely on comments to explain a budget or a threshold, keep that explanation in a separate note, not inline in the file.
|
|
123
|
+
|
|
124
|
+
Claude Code skills bundled inside plugins are not scanned yet. drskill only walks the plain `.claude/skills` directories described in the harness table; it does not look inside installed plugin packages.
|
|
125
|
+
|
|
126
|
+
`skills-lock.json` hash verification is self-calibrating. Upstream `npx skills` computes its own content hashes, and drskill cannot always reproduce them exactly. If none of the hashes in a lockfile match what drskill computes, it will not accuse every skill of drift; instead it prints one warning saying the hashes could not be verified against that lockfile. Per-skill drift warnings only appear once drskill has confirmed, by matching at least one hash, that its hashing algorithm agrees with that lockfile's producer.
|
|
127
|
+
|
|
128
|
+
Harness rules have three levels of confidence. Claude Code, Pi, and Gemini CLI are verified against their own docs or source. Codex, Cursor, and Copilot are best effort. Codex in particular does not shadow skills the way drskill's precedence model assumes, since Codex keeps both copies visible on a name collision instead of picking a winner, and that behavior does not fit the model yet. About 66 further harnesses are vendored from the `vercel-labs/skills` project and are also best effort; drskill detects them and reports their findings, but their search paths have not been independently confirmed against each harness's own documentation. Reports label every finding from an unverified harness "best effort" so you know how much to trust it.
|
|
129
|
+
|
|
130
|
+
Token counts are approximate. drskill counts tokens with `tiktoken`'s `o200k_base` encoding, which is a reasonable estimate but will not match every harness's actual tokenizer or catalog rendering exactly.
|
drskill-0.1.0/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
### They Call Me Dr. Skill
|
|
2
|
+
|
|
3
|
+
drskill is `brew doctor` for your agent's skill loadout. It looks at every coding agent installed on your machine or configured in your repo, works out exactly which skills each one loads, and checks that set for problems: skills that shadow each other, skills loaded twice, duplicate or near-duplicate skills, skills that break the SKILL.md spec, broken symlinks, drift against your lockfile, and skills that burn too many tokens. Every problem it reports ends in a command: a fix command or a command to acknowledge the problem and move on. drskill only reads your files. It never installs, edits, or deletes a skill, and it makes zero calls to an LLM.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
uv tool install drskill
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick start
|
|
12
|
+
|
|
13
|
+
Run a scan from the root of a project:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
drskill scan
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This detects every coding agent it can find, resolves each one's effective skill set, and prints a report grouped by severity. Each finding names the harnesses it affects and ends in a fix command or an ack command.
|
|
20
|
+
|
|
21
|
+
Write a starter ledger file with default budgets and thresholds:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
drskill init
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Acknowledge a finding so it stops showing up until the skill's content changes:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
drskill ack near-duplicate docx-report documentation-writer
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
List every harness's effective skill set with token counts:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
drskill list --tokens
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Scan and also print each harness's skill table in one run:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
drskill scan --detailed
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Scope the scan to a single harness and see exactly what that harness sees:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
drskill scan --harness pi
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
An unknown harness id is an error that names the valid ids. Harnesses that are detected but load no skills are hidden from the tables by default; a closing line names them, and `--all` shows them.
|
|
52
|
+
|
|
53
|
+
Run in CI, where any unacknowledged warning should fail the build:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
drskill scan --ci
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Exit codes
|
|
60
|
+
|
|
61
|
+
| code | meaning |
|
|
62
|
+
|---|---|
|
|
63
|
+
| 0 | clean, or every finding is acknowledged |
|
|
64
|
+
| 1 | at least one error-level finding is active |
|
|
65
|
+
| 2 | only warnings are active, but `--ci` was passed |
|
|
66
|
+
|
|
67
|
+
Without `--ci`, warnings alone exit 0. This lets you run `drskill scan` locally without it failing your shell, while still failing CI on the same warnings.
|
|
68
|
+
|
|
69
|
+
## Checks
|
|
70
|
+
|
|
71
|
+
| check id | severity | fires when |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| `name-shadow` | warning | Two skills share a name in one harness's set and one shadows the other. The message names the winner and the rule that picked it. |
|
|
74
|
+
| `double-load` | error | One harness loads the same logical skill twice through two directories. |
|
|
75
|
+
| `exact-duplicate` | warning | Two contributors have equal normalized content hashes under different names or paths. |
|
|
76
|
+
| `near-duplicate` | warning | Jaccard similarity of MinHash signatures over word shingles is at or above the threshold. The default threshold is 0.85 and can be changed in the ledger. |
|
|
77
|
+
| `spec-name-mismatch` | error | Frontmatter `name` does not match the folder name. |
|
|
78
|
+
| `spec-missing-description` | error | The description is absent or empty. |
|
|
79
|
+
| `spec-description-too-long` | error | The description exceeds 1024 characters. |
|
|
80
|
+
| `spec-invalid-frontmatter` | error | The frontmatter does not parse as YAML. |
|
|
81
|
+
| `frontmatter-angle-brackets` | warning | Frontmatter values contain angle brackets, which the spec flags as an injection vector. |
|
|
82
|
+
| `broken-symlink` | error | A symlink in a skill directory points at nothing. |
|
|
83
|
+
| `lockfile-drift` | warning | A skill's content hash does not match its `skills-lock.json` entry. The message attributes the likely cause, e.g. a `gh skill update` or a hand edit, and does not call it corruption. |
|
|
84
|
+
| `budget-catalog-tokens` | warning | A harness's total catalog tokens exceed `[budget] catalog_tokens_max`. |
|
|
85
|
+
| `budget-body-tokens` | warning | A skill's body tokens exceed `[budget] body_tokens_warn`. |
|
|
86
|
+
|
|
87
|
+
## The ledger
|
|
88
|
+
|
|
89
|
+
`drskill.toml` sits at the root of your repo and should be committed. It holds your budgets, your thresholds, and your decisions. When you run `drskill ack`, it appends an entry like this:
|
|
90
|
+
|
|
91
|
+
```toml
|
|
92
|
+
[[ack]]
|
|
93
|
+
check = "near-duplicate"
|
|
94
|
+
skills = ["docx-report", "documentation-writer"]
|
|
95
|
+
fingerprint = "sha256:..."
|
|
96
|
+
note = "docx is output format specific; keeping both"
|
|
97
|
+
date = 2026-07-19
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
A finding's fingerprint is a hash of the check id plus the content of every skill involved. An ack silences a finding only while that fingerprint still matches. If you edit one of the skills named in the ack, its content hash changes, the fingerprint no longer matches, and the finding comes back on the next scan. This is deliberate. An ack means "this exact situation is fine," not "never check this pair again."
|
|
101
|
+
|
|
102
|
+
In global mode (`--global`), the ledger lives at `~/.drskill.toml` instead.
|
|
103
|
+
|
|
104
|
+
The `source` column in `list` shows where a skill came from: `skills-lock` for skills named in a project's `skills-lock.json`, `gh-skill` for skills with `gh skill` provenance in their frontmatter, and `linked` for skills that live in or link into a `.agents/skills` store. The `linked` label means an installer arranged the layout; drskill does not guess which one. `unmanaged` means a plain directory with no known manager.
|
|
105
|
+
|
|
106
|
+
## Known limitations
|
|
107
|
+
|
|
108
|
+
Comments in `drskill.toml` are lost when `drskill ack` rewrites the file. The file is parsed and re-written as data, and the writer does not carry comments forward. If you rely on comments to explain a budget or a threshold, keep that explanation in a separate note, not inline in the file.
|
|
109
|
+
|
|
110
|
+
Claude Code skills bundled inside plugins are not scanned yet. drskill only walks the plain `.claude/skills` directories described in the harness table; it does not look inside installed plugin packages.
|
|
111
|
+
|
|
112
|
+
`skills-lock.json` hash verification is self-calibrating. Upstream `npx skills` computes its own content hashes, and drskill cannot always reproduce them exactly. If none of the hashes in a lockfile match what drskill computes, it will not accuse every skill of drift; instead it prints one warning saying the hashes could not be verified against that lockfile. Per-skill drift warnings only appear once drskill has confirmed, by matching at least one hash, that its hashing algorithm agrees with that lockfile's producer.
|
|
113
|
+
|
|
114
|
+
Harness rules have three levels of confidence. Claude Code, Pi, and Gemini CLI are verified against their own docs or source. Codex, Cursor, and Copilot are best effort. Codex in particular does not shadow skills the way drskill's precedence model assumes, since Codex keeps both copies visible on a name collision instead of picking a winner, and that behavior does not fit the model yet. About 66 further harnesses are vendored from the `vercel-labs/skills` project and are also best effort; drskill detects them and reports their findings, but their search paths have not been independently confirmed against each harness's own documentation. Reports label every finding from an unverified harness "best effort" so you know how much to trust it.
|
|
115
|
+
|
|
116
|
+
Token counts are approximate. drskill counts tokens with `tiktoken`'s `o200k_base` encoding, which is a reasonable estimate but will not match every harness's actual tokenizer or catalog rendering exactly.
|