@readme/cli 0.0.26
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/README.md +55 -0
- package/bin/readme.js +8 -0
- package/package.json +58 -0
- package/src/bootstrap.js +97 -0
- package/src/cli.js +189 -0
- package/src/commands/dev.js +119 -0
- package/src/commands/eyes.js +37 -0
- package/src/commands/import.js +2565 -0
- package/src/commands/lint.js +70 -0
- package/src/commands/oas-sync.js +364 -0
- package/src/commands/oas-validate.js +208 -0
- package/src/commands/play.js +17 -0
- package/src/commands/pretty.js +133 -0
- package/src/commands/setup.js +256 -0
- package/src/commands/versions.js +81 -0
- package/src/dev/.next/app-build-manifest.json +20 -0
- package/src/dev/.next/build-manifest.json +31 -0
- package/src/dev/.next/cache/.rscinfo +1 -0
- package/src/dev/.next/cache/next-devtools-config.json +1 -0
- package/src/dev/.next/cache/webpack/client-development/0.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/1.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/10.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/11.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/2.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/3.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/3.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/client-development/4.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/5.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/5.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/client-development/6.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/7.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/7.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/client-development/8.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/9.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development/index.pack.gz.old +0 -0
- package/src/dev/.next/cache/webpack/client-development-fallback/0.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development-fallback/1.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development-fallback/index.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/client-development-fallback/index.pack.gz.old +0 -0
- package/src/dev/.next/cache/webpack/edge-server-development/0.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/edge-server-development/1.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/edge-server-development/index.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/edge-server-development/index.pack.gz.old +0 -0
- package/src/dev/.next/cache/webpack/server-development/0.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/1.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/10.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/11.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/12.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/13.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/14.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/15.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/2.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/2.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/server-development/3.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/3.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/server-development/4.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/5.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/6.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/6.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/server-development/7.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/7.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/server-development/8.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/9.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/9.pack.gz_ +0 -0
- package/src/dev/.next/cache/webpack/server-development/index.pack.gz +0 -0
- package/src/dev/.next/cache/webpack/server-development/index.pack.gz.old +0 -0
- package/src/dev/.next/package.json +1 -0
- package/src/dev/.next/prerender-manifest.json +11 -0
- package/src/dev/.next/react-loadable-manifest.json +1 -0
- package/src/dev/.next/routes-manifest.json +1 -0
- package/src/dev/.next/server/app/[...slug]/page.js +360 -0
- package/src/dev/.next/server/app/[...slug]/page_client-reference-manifest.js +1 -0
- package/src/dev/.next/server/app/page.js +349 -0
- package/src/dev/.next/server/app/page_client-reference-manifest.js +1 -0
- package/src/dev/.next/server/app-paths-manifest.json +3 -0
- package/src/dev/.next/server/edge-runtime-webpack.js +1151 -0
- package/src/dev/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/src/dev/.next/server/middleware-build-manifest.js +33 -0
- package/src/dev/.next/server/middleware-manifest.json +32 -0
- package/src/dev/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/src/dev/.next/server/middleware.js +1113 -0
- package/src/dev/.next/server/next-font-manifest.js +1 -0
- package/src/dev/.next/server/next-font-manifest.json +1 -0
- package/src/dev/.next/server/pages-manifest.json +5 -0
- package/src/dev/.next/server/server-reference-manifest.js +1 -0
- package/src/dev/.next/server/server-reference-manifest.json +5 -0
- package/src/dev/.next/server/static/webpack/633457081244afec._.hot-update.json +1 -0
- package/src/dev/.next/server/vendor-chunks/@readme.js +25 -0
- package/src/dev/.next/server/vendor-chunks/@swc.js +55 -0
- package/src/dev/.next/server/vendor-chunks/next.js +3659 -0
- package/src/dev/.next/server/webpack-runtime.js +209 -0
- package/src/dev/.next/static/chunks/app/[...slug]/loading.js +28 -0
- package/src/dev/.next/static/chunks/app/[...slug]/page.js +28 -0
- package/src/dev/.next/static/chunks/app/layout.js +171 -0
- package/src/dev/.next/static/chunks/app/page.js +28 -0
- package/src/dev/.next/static/chunks/app-pages-internals.js +182 -0
- package/src/dev/.next/static/chunks/main-app.js +1882 -0
- package/src/dev/.next/static/chunks/polyfills.js +1 -0
- package/src/dev/.next/static/chunks/webpack.js +1393 -0
- package/src/dev/.next/static/css/app/layout.css +559 -0
- package/src/dev/.next/static/development/_buildManifest.js +1 -0
- package/src/dev/.next/static/development/_ssgManifest.js +1 -0
- package/src/dev/.next/static/webpack/633457081244afec._.hot-update.json +1 -0
- package/src/dev/.next/static/webpack/ec52a3fce0f78db0.webpack.hot-update.json +1 -0
- package/src/dev/.next/static/webpack/webpack.ec52a3fce0f78db0.hot-update.js +12 -0
- package/src/dev/.next/trace +21 -0
- package/src/dev/.next/types/app/[...slug]/page.ts +84 -0
- package/src/dev/.next/types/app/layout.ts +84 -0
- package/src/dev/.next/types/app/page.ts +84 -0
- package/src/dev/.next/types/cache-life.d.ts +141 -0
- package/src/dev/.next/types/package.json +1 -0
- package/src/dev/.next/types/routes.d.ts +55 -0
- package/src/dev/app/Sidebar.js +149 -0
- package/src/dev/app/[...slug]/loading.js +16 -0
- package/src/dev/app/[...slug]/page.js +43 -0
- package/src/dev/app/globals.css +167 -0
- package/src/dev/app/layout.js +73 -0
- package/src/dev/app/page.js +19 -0
- package/src/dev/lib/docs.js +337 -0
- package/src/dev/middleware.js +7 -0
- package/src/dev/next.config.mjs +22 -0
- package/src/index.js +12 -0
- package/src/prompts/index.js +352 -0
- package/src/utils/claude.js +15 -0
- package/src/utils/eyes.js +365 -0
- package/src/utils/git.js +143 -0
- package/src/utils/lint.js +99 -0
- package/src/utils/reporter.js +319 -0
- package/src/utils/setup-templates.js +323 -0
- package/src/utils/styles.js +50 -0
- package/src/utils/tamagotchi.js +1139 -0
- package/src/utils/tips.js +90 -0
- package/src/validators/components.js +230 -0
- package/src/validators/content.js +53 -0
- package/src/validators/duplicates.js +45 -0
- package/src/validators/frontmatter.js +247 -0
- package/src/validators/links.js +68 -0
- package/src/validators/nesting.js +50 -0
- package/src/validators/numbering.js +136 -0
- package/src/validators/oas-reference.js +126 -0
- package/src/validators/oas-schema.js +106 -0
- package/src/validators/ordering.js +121 -0
- package/src/validators/recipes.js +143 -0
- package/vendor/TOOLS.md +19 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
|
|
3
|
+
export const name = 'recipes';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parse fenced code blocks from the body. Returns an array of
|
|
7
|
+
* { lang, title, lines } where lang is the language identifier.
|
|
8
|
+
* Code blocks have the format: ```lang OptionalTitle
|
|
9
|
+
*/
|
|
10
|
+
function parseCodeBlocks(body) {
|
|
11
|
+
const blocks = [];
|
|
12
|
+
const pattern = /^```(\S+)(?:\s+(.+))?\n([\s\S]*?)^```$/gm;
|
|
13
|
+
let match;
|
|
14
|
+
while ((match = pattern.exec(body)) !== null) {
|
|
15
|
+
const lang = match[1];
|
|
16
|
+
const title = match[2] || null;
|
|
17
|
+
const code = match[3];
|
|
18
|
+
const lines = code.split('\n');
|
|
19
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();
|
|
20
|
+
blocks.push({ lang, title, lines });
|
|
21
|
+
}
|
|
22
|
+
return blocks;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Parse snippet references from the body.
|
|
27
|
+
* Canonical format from ReadMe's parser: <!-- language@lineSpec -->
|
|
28
|
+
* where lineSpec is 1-indexed: "1", "1-5", "1-5,10,15-20"
|
|
29
|
+
* Regex sourced from packages/api/src/mappings/recipe/util.ts
|
|
30
|
+
*/
|
|
31
|
+
function parseSnippetRefs(body) {
|
|
32
|
+
const refs = [];
|
|
33
|
+
const pattern = /<!--\s*([\w-]+)@(\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*)?\s*-->/g;
|
|
34
|
+
let match;
|
|
35
|
+
while ((match = pattern.exec(body)) !== null) {
|
|
36
|
+
refs.push({
|
|
37
|
+
lang: match[1],
|
|
38
|
+
lineSpec: match[2] || '',
|
|
39
|
+
raw: match[0],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return refs;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Parse a 1-indexed line spec and return the max line number (1-indexed).
|
|
47
|
+
* Handles: "1", "2-8", "1-5,10,15-20"
|
|
48
|
+
*/
|
|
49
|
+
function maxLineFromSpec(lineSpec) {
|
|
50
|
+
if (!lineSpec) return 0;
|
|
51
|
+
let max = 0;
|
|
52
|
+
for (const part of lineSpec.split(',')) {
|
|
53
|
+
const nums = part.split('-').map(Number);
|
|
54
|
+
for (const n of nums) {
|
|
55
|
+
if (n > max) max = n;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return max;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Parse h1 headings from the body.
|
|
63
|
+
*/
|
|
64
|
+
function parseSections(body) {
|
|
65
|
+
const sections = [];
|
|
66
|
+
const pattern = /^# (.+)$/gm;
|
|
67
|
+
let match;
|
|
68
|
+
while ((match = pattern.exec(body)) !== null) {
|
|
69
|
+
sections.push(match[1]);
|
|
70
|
+
}
|
|
71
|
+
return sections;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function validate({ content, relativePath }) {
|
|
75
|
+
if (!relativePath.startsWith('recipes/')) return null;
|
|
76
|
+
if (!relativePath.endsWith('.md')) return null;
|
|
77
|
+
|
|
78
|
+
const results = [];
|
|
79
|
+
let data;
|
|
80
|
+
let body;
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
({ data, content: body } = matter(content));
|
|
84
|
+
} catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!data.recipe) return null;
|
|
89
|
+
|
|
90
|
+
const codeBlocks = parseCodeBlocks(body);
|
|
91
|
+
const snippetRefs = parseSnippetRefs(body);
|
|
92
|
+
const sections = parseSections(body);
|
|
93
|
+
|
|
94
|
+
const blocksByLang = new Map();
|
|
95
|
+
for (const block of codeBlocks) {
|
|
96
|
+
blocksByLang.set(block.lang, block);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (codeBlocks.length === 0) {
|
|
100
|
+
results.push({
|
|
101
|
+
file: relativePath,
|
|
102
|
+
rule: name,
|
|
103
|
+
severity: 'warning',
|
|
104
|
+
message: 'No code blocks: recipe has no code snippets defined',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (sections.length === 0) {
|
|
109
|
+
results.push({
|
|
110
|
+
file: relativePath,
|
|
111
|
+
rule: name,
|
|
112
|
+
severity: 'warning',
|
|
113
|
+
message: 'No sections: recipe has no step headings (# Heading)',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
for (const ref of snippetRefs) {
|
|
118
|
+
const block = blocksByLang.get(ref.lang);
|
|
119
|
+
|
|
120
|
+
if (!block) {
|
|
121
|
+
const available = codeBlocks.map((b) => b.lang).join(', ');
|
|
122
|
+
results.push({
|
|
123
|
+
file: relativePath,
|
|
124
|
+
rule: name,
|
|
125
|
+
message: `Unknown snippet language: \`${ref.lang}\` does not match any code block${available ? ` (available: ${available})` : ''}`,
|
|
126
|
+
});
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Line spec is 1-indexed, so max line must be <= total lines.
|
|
131
|
+
const maxLine = maxLineFromSpec(ref.lineSpec);
|
|
132
|
+
if (maxLine > block.lines.length) {
|
|
133
|
+
results.push({
|
|
134
|
+
file: relativePath,
|
|
135
|
+
rule: name,
|
|
136
|
+
severity: 'warning',
|
|
137
|
+
message: `Snippet out of range: \`${ref.raw}\` references line ${maxLine} but \`${ref.lang}\` block has only ${block.lines.length} lines`,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return results.length > 0 ? results : null;
|
|
143
|
+
}
|
package/vendor/TOOLS.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# CLI Tools
|
|
2
|
+
|
|
3
|
+
The ReadMe CLI (`npx @readme/cli`) has several commands that can help fix issues automatically. Run these before trying to fix things by hand.
|
|
4
|
+
|
|
5
|
+
## `npx @readme/cli lint --fix`
|
|
6
|
+
|
|
7
|
+
Automatically fixes common linting issues: ordering problems, frontmatter cleanup, numbering suffixes, etc. Always try this first.
|
|
8
|
+
|
|
9
|
+
## `npx @readme/cli oas:sync`
|
|
10
|
+
|
|
11
|
+
Syncs reference pages with OpenAPI specs. Fixes many OAS-related issues automatically: creates missing endpoint pages, removes stale ones, updates titles/excerpts to match the spec, and maintains `_order.yaml` files. Run this whenever you see `oas-reference` errors.
|
|
12
|
+
|
|
13
|
+
## `npx @readme/cli lint`
|
|
14
|
+
|
|
15
|
+
Runs all validators and reports errors/warnings. Use this to check your work after making changes.
|
|
16
|
+
|
|
17
|
+
## `npx @readme/cli dev`
|
|
18
|
+
|
|
19
|
+
Starts a local dev server to preview docs. Useful for visually verifying changes.
|