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 CHANGED
@@ -66,7 +66,7 @@ LICENSE Apache-2.0
66
66
 
67
67
  ```sh
68
68
  pnpm install
69
- pnpm test # node --test (9 tests: scanner + real-registry mount)
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.0`. For a new version: bump `package.json#version`, stamp the
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. A missing block falls back to the full text as the 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
- if (!text.startsWith('---\n')) return { description: undefined, whenToUse: undefined, body: text }
46
- const end = text.indexOf('\n---', 4)
47
- if (end < 0) return { description: undefined, whenToUse: undefined, body: text }
48
- const meta = text.slice(4, end)
49
- const body = text.slice(end + 4).replace(/^\n+/, '')
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 text
67
+ let raw
65
68
  try {
66
- text = readFileSync(skillPath, 'utf8')
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.0",
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",