dsh-plugin-upgrade 0.1.0 → 0.1.1
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/AGENTS.md +2 -2
- package/CHANGELOG.md +11 -0
- package/index.mjs +12 -8
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -66,7 +66,7 @@ LICENSE Apache-2.0
|
|
|
66
66
|
|
|
67
67
|
```sh
|
|
68
68
|
pnpm install
|
|
69
|
-
pnpm test # node --test (
|
|
69
|
+
pnpm test # node --test (11 tests: scanner + real-registry mount)
|
|
70
70
|
pnpm run verify:self-contained # dependency specs resolve from the registry
|
|
71
71
|
pnpm run verify:artifacts # shipped files present + entry importable from the tarball
|
|
72
72
|
pnpm run check:readmes # five-language README consistency
|
|
@@ -80,7 +80,7 @@ after every harness release.
|
|
|
80
80
|
|
|
81
81
|
## Release
|
|
82
82
|
|
|
83
|
-
Version is currently `0.1.
|
|
83
|
+
Version is currently `0.1.1`. For a new version: bump `package.json#version`, stamp the
|
|
84
84
|
CHANGELOG `[Unreleased]` section into `## [<x.y.z>] - <UTC date>`, re-run the full gate,
|
|
85
85
|
commit `chore(release): <x.y.z>`, and `git tag -a v<x.y.z>`. `git push origin main
|
|
86
86
|
--follow-tags` triggers `.github/workflows/release.yml`, which re-runs the gate, publishes to
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.1] - 2026-09-09
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **SKILL.md frontmatter on a CRLF checkout.** The parser required the `---\n`
|
|
15
|
+
delimiter, so a Windows checkout (`core.autocrlf=true`) mounted the skill with the
|
|
16
|
+
frontmatter leaked into the body and no description/`whenToUse`. Line endings are now
|
|
17
|
+
normalized before parsing, `.gitattributes` pins every text file to LF, and the suite
|
|
18
|
+
covers both a CRLF string and a CRLF-converted bundle on disk. Caught by the Windows
|
|
19
|
+
CI leg of v0.1.0.
|
|
20
|
+
|
|
10
21
|
## [0.1.0] - 2026-09-09
|
|
11
22
|
|
|
12
23
|
### Added
|
package/index.mjs
CHANGED
|
@@ -37,16 +37,19 @@ export const Config = Schema.object({
|
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
39
|
* Strip the YAML frontmatter block from SKILL.md and return its routing fields
|
|
40
|
-
* and body.
|
|
40
|
+
* and body. Line endings are normalized first: a Windows checkout with
|
|
41
|
+
* `core.autocrlf=true` hands us CRLF, and the frontmatter delimiters are `\n`.
|
|
42
|
+
* A missing block falls back to the full text as the body.
|
|
41
43
|
* @param text - raw SKILL.md content.
|
|
42
44
|
* @returns the parsed description/whenToUse (when present) and the instruction body.
|
|
43
45
|
*/
|
|
44
46
|
export function splitFrontmatter(text) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
47
|
+
const source = text.replace(/\r\n/g, '\n')
|
|
48
|
+
if (!source.startsWith('---\n')) return { description: undefined, whenToUse: undefined, body: source }
|
|
49
|
+
const end = source.indexOf('\n---', 4)
|
|
50
|
+
if (end < 0) return { description: undefined, whenToUse: undefined, body: source }
|
|
51
|
+
const meta = source.slice(4, end)
|
|
52
|
+
const body = source.slice(end + 4).replace(/^\n+/, '')
|
|
50
53
|
const scalar = (key) => new RegExp(`^${key}:\\s*(.+)$`, 'm').exec(meta)?.[1]?.trim()
|
|
51
54
|
return { description: scalar('description'), whenToUse: scalar('whenToUse'), body }
|
|
52
55
|
}
|
|
@@ -61,12 +64,13 @@ export function splitFrontmatter(text) {
|
|
|
61
64
|
*/
|
|
62
65
|
export function readSkillBundle(skillsRoot, skillName) {
|
|
63
66
|
const skillPath = join(skillsRoot, skillName, 'SKILL.md')
|
|
64
|
-
let
|
|
67
|
+
let raw
|
|
65
68
|
try {
|
|
66
|
-
|
|
69
|
+
raw = readFileSync(skillPath, 'utf8')
|
|
67
70
|
} catch (error) {
|
|
68
71
|
throw new Error(`dsh-plugin-upgrade: cannot read skill bundle at ${skillPath}: ${error instanceof Error ? error.message : String(error)}`)
|
|
69
72
|
}
|
|
73
|
+
const text = raw.replace(/\r\n/g, '\n')
|
|
70
74
|
const { description, whenToUse, body } = splitFrontmatter(text)
|
|
71
75
|
if (body.trim() === '') throw new Error(`dsh-plugin-upgrade: skill body is empty at ${skillPath}`)
|
|
72
76
|
const frontmatterName = /^name:\s*(\S+)\s*$/m.exec(text.slice(0, text.indexOf('\n---', 4) + 1))?.[1]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin-upgrade",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Plugin-author upgrade skill for DeepSeek Harness: a version-locked 0.1.3-alpha.1 -> 0.1.5-alpha.1 version card plus a zero-dependency seam scanner (V3 session format, assistant/message.stream, SessionHandleReadResult, ctx.agent, Inbox, SubprocessHandle.pid, SystemPrompt persona, PTC rename, EpochHeader.system, and the tsconfig stale-path false green), packaged as a bundle skill and an npx CLI.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|