@natjswenson/devlog 0.5.2 → 0.8.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/SKILL.md +112 -14
- package/bin/devlog.js +441 -7
- package/config.example.json +6 -0
- package/evals/fixtures/good-post.md +10 -6
- package/evals/fixtures/irreproducible-post.md +7 -3
- package/image-style/font.ttf +0 -0
- package/image-style/style-guide.example.md +107 -0
- package/lib/config_ops.mjs +5 -2
- package/lib/core.mjs +12 -1
- package/lib/cover_gen.mjs +124 -0
- package/lib/lint_post.mjs +48 -2
- package/lib/publish_entry.mjs +115 -3
- package/lib/render_cover.mjs +156 -0
- package/lib/scan.mjs +6 -0
- package/package.json +4 -1
- package/skill-invariants.json +26 -1
package/lib/scan.mjs
CHANGED
|
@@ -74,6 +74,7 @@ export function scanProject(project, { branch = 'main', fetch = true, existingFi
|
|
|
74
74
|
key: project.key,
|
|
75
75
|
label: project.label || project.key,
|
|
76
76
|
remote: project.remote,
|
|
77
|
+
private: !!project.private,
|
|
77
78
|
path: project.path,
|
|
78
79
|
pathFilter: project.pathFilter || null,
|
|
79
80
|
tagPrefix: project.tagPrefix || 'v',
|
|
@@ -107,6 +108,11 @@ export function scanProject(project, { branch = 'main', fetch = true, existingFi
|
|
|
107
108
|
const hasPublishedRef = git(project.path, ['rev-parse', '--verify', '--quiet', publishedRef]) !== null;
|
|
108
109
|
|
|
109
110
|
const isPublic = (rev) => {
|
|
111
|
+
// A private project has no safe commit surface, full stop — this bypasses
|
|
112
|
+
// remoteMatches/hasPublishedRef entirely rather than relying on them to
|
|
113
|
+
// happen to be false, since a private repo can still have origin configured
|
|
114
|
+
// correctly (remoteMatches true) and a normally-pushed branch.
|
|
115
|
+
if (project.private) return false;
|
|
110
116
|
if (!remoteMatches || !hasPublishedRef) return false;
|
|
111
117
|
return spawnArgs('git', ['-C', project.path, 'merge-base', '--is-ancestor', rev, publishedRef]).status === 0;
|
|
112
118
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@natjswenson/devlog",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "Release dev log generator \u2014 Claude Code skill + preview app for publishing version-release dev logs, written in your voice, to your site",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Nate Swenson",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"preview/",
|
|
34
34
|
"examples/",
|
|
35
35
|
"voice/",
|
|
36
|
+
"image-style/",
|
|
36
37
|
"SKILL.md",
|
|
37
38
|
"SECURITY.md",
|
|
38
39
|
"CHANGELOG.md",
|
|
@@ -50,11 +51,13 @@
|
|
|
50
51
|
"dependencies": {
|
|
51
52
|
"@vitejs/plugin-react": "6.0.1",
|
|
52
53
|
"kleur": "4.1.5",
|
|
54
|
+
"playwright": "1.61.1",
|
|
53
55
|
"prompts": "2.4.2",
|
|
54
56
|
"react": "18.3.1",
|
|
55
57
|
"react-dom": "18.3.1",
|
|
56
58
|
"react-markdown": "9.1.0",
|
|
57
59
|
"remark-gfm": "4.0.1",
|
|
60
|
+
"sharp": "0.35.3",
|
|
58
61
|
"vite": "8.0.16"
|
|
59
62
|
}
|
|
60
63
|
}
|
package/skill-invariants.json
CHANGED
|
@@ -60,7 +60,32 @@
|
|
|
60
60
|
"id": "no-push-retry",
|
|
61
61
|
"pattern": "do not retry automatically",
|
|
62
62
|
"rationale": "A failed push is surfaced to the user, not retried blind."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "private-project-no-links",
|
|
66
|
+
"pattern": "no post ever[\\s\\S]{0,10}links a commit for it",
|
|
67
|
+
"rationale": "A private project's commits must never scan as public just because remoteMatches + branch-contains happen to hold — losing this line reopens the dead-link-to-a-private-repo path."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "cover-composition-scope",
|
|
71
|
+
"pattern": "never the raw draft file, never[\\s\\S]{0,10}## Changelog",
|
|
72
|
+
"rationale": "Cover composition must draw only from title/tags/summary/## Shipped — never the raw draft or Changelog — losing this line reopens off-scope content leaking into an auto-composed image."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "cover-never-blocks-publish",
|
|
76
|
+
"pattern": "[Nn]ever block[\\s\\S]{0,10}publish on a missing style guide",
|
|
77
|
+
"rationale": "A missing/uninstalled style guide must degrade gracefully (no cover this run), never abort the whole publish."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "cover-review-gate",
|
|
81
|
+
"pattern": "this interactive review IS the quality gate for the cover",
|
|
82
|
+
"rationale": "The rendered cover must be shown to the user before push, the same way Step 4 gates the prose — losing this line reopens publishing an unreviewed cover."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "cover-custom-illustration",
|
|
86
|
+
"pattern": "cover that just re-renders the title in large text is a failure",
|
|
87
|
+
"rationale": "First shipped version of this feature produced a shared text-heavy template with a rotating stock shape — rejected as bland/repetitive. Losing this line reopens that regression."
|
|
63
88
|
}
|
|
64
89
|
],
|
|
65
|
-
"cli_commands_referenced": ["scan", "lint-post", "publish-entry", "add-project", "remove-project", "set", "config", "init"]
|
|
90
|
+
"cli_commands_referenced": ["scan", "lint-post", "publish-entry", "add-project", "remove-project", "set", "config", "init", "cover-context", "render-cover"]
|
|
66
91
|
}
|