@valkyrianlabs/payload-markdown-docs 0.1.0-canary.0
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 +195 -0
- package/dist/admin/DocsSetManager.d.ts +2 -0
- package/dist/admin/DocsSetManager.js +298 -0
- package/dist/admin/DocsSetManager.js.map +1 -0
- package/dist/admin/docsSetManagerData.d.ts +25 -0
- package/dist/admin/docsSetManagerData.js +266 -0
- package/dist/admin/docsSetManagerData.js.map +1 -0
- package/dist/admin/docsSetManagerTypes.d.ts +103 -0
- package/dist/admin/docsSetManagerTypes.js +3 -0
- package/dist/admin/docsSetManagerTypes.js.map +1 -0
- package/dist/admin/index.d.ts +3 -0
- package/dist/admin/index.js +4 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/cli/commands/install.d.ts +2 -0
- package/dist/cli/commands/install.js +211 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/keygen.d.ts +2 -0
- package/dist/cli/commands/keygen.js +89 -0
- package/dist/cli/commands/keygen.js.map +1 -0
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +50 -0
- package/dist/cli/commands/manifest.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.js +110 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/push.d.ts +3 -0
- package/dist/cli/commands/push.js +308 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.js +109 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/filesystem.d.ts +20 -0
- package/dist/cli/filesystem.js +96 -0
- package/dist/cli/filesystem.js.map +1 -0
- package/dist/cli/format.d.ts +35 -0
- package/dist/cli/format.js +76 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/http.d.ts +19 -0
- package/dist/cli/http.js +39 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +214 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parseArgs.d.ts +5 -0
- package/dist/cli/parseArgs.js +219 -0
- package/dist/cli/parseArgs.js.map +1 -0
- package/dist/cli/types.d.ts +51 -0
- package/dist/cli/types.js +3 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/collections/docs.d.ts +9 -0
- package/dist/collections/docs.js +168 -0
- package/dist/collections/docs.js.map +1 -0
- package/dist/collections/docsGroups.d.ts +5 -0
- package/dist/collections/docsGroups.js +57 -0
- package/dist/collections/docsGroups.js.map +1 -0
- package/dist/collections/docsSets.d.ts +8 -0
- package/dist/collections/docsSets.js +158 -0
- package/dist/collections/docsSets.js.map +1 -0
- package/dist/collections/index.d.ts +10 -0
- package/dist/collections/index.js +7 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/nonces.d.ts +6 -0
- package/dist/collections/nonces.js +57 -0
- package/dist/collections/nonces.js.map +1 -0
- package/dist/collections/syncRuns.d.ts +5 -0
- package/dist/collections/syncRuns.js +139 -0
- package/dist/collections/syncRuns.js.map +1 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.js +23 -0
- package/dist/constants.js.map +1 -0
- package/dist/endpoints/index.d.ts +2 -0
- package/dist/endpoints/index.js +3 -0
- package/dist/endpoints/index.js.map +1 -0
- package/dist/endpoints/sync.d.ts +47 -0
- package/dist/endpoints/sync.js +616 -0
- package/dist/endpoints/sync.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/next/PayloadMarkdownDocsPage.d.ts +7 -0
- package/dist/next/PayloadMarkdownDocsPage.js +142 -0
- package/dist/next/PayloadMarkdownDocsPage.js.map +1 -0
- package/dist/next/index.d.ts +9 -0
- package/dist/next/index.js +7 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/markdown.d.ts +14 -0
- package/dist/next/markdown.js +232 -0
- package/dist/next/markdown.js.map +1 -0
- package/dist/next/metadata.d.ts +3 -0
- package/dist/next/metadata.js +33 -0
- package/dist/next/metadata.js.map +1 -0
- package/dist/next/records.d.ts +14 -0
- package/dist/next/records.js +146 -0
- package/dist/next/records.js.map +1 -0
- package/dist/next/route.d.ts +6 -0
- package/dist/next/route.js +271 -0
- package/dist/next/route.js.map +1 -0
- package/dist/next/sidebar.d.ts +15 -0
- package/dist/next/sidebar.js +137 -0
- package/dist/next/sidebar.js.map +1 -0
- package/dist/next/types.d.ts +117 -0
- package/dist/next/types.js +3 -0
- package/dist/next/types.js.map +1 -0
- package/dist/payload/applyDocsSync.d.ts +54 -0
- package/dist/payload/applyDocsSync.js +176 -0
- package/dist/payload/applyDocsSync.js.map +1 -0
- package/dist/payload/docsConflicts.d.ts +12 -0
- package/dist/payload/docsConflicts.js +34 -0
- package/dist/payload/docsConflicts.js.map +1 -0
- package/dist/payload/docsData.d.ts +23 -0
- package/dist/payload/docsData.js +59 -0
- package/dist/payload/docsData.js.map +1 -0
- package/dist/payload/docsSets.d.ts +38 -0
- package/dist/payload/docsSets.js +57 -0
- package/dist/payload/docsSets.js.map +1 -0
- package/dist/payload/existingDocs.d.ts +43 -0
- package/dist/payload/existingDocs.js +97 -0
- package/dist/payload/existingDocs.js.map +1 -0
- package/dist/payload/index.d.ts +15 -0
- package/dist/payload/index.js +10 -0
- package/dist/payload/index.js.map +1 -0
- package/dist/payload/routeCollisions.d.ts +31 -0
- package/dist/payload/routeCollisions.js +104 -0
- package/dist/payload/routeCollisions.js.map +1 -0
- package/dist/payload/syncRuns.d.ts +60 -0
- package/dist/payload/syncRuns.js +53 -0
- package/dist/payload/syncRuns.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.js +165 -0
- package/dist/plugin.js.map +1 -0
- package/dist/routing/index.d.ts +3 -0
- package/dist/routing/index.js +4 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/paths.d.ts +7 -0
- package/dist/routing/paths.js +23 -0
- package/dist/routing/paths.js.map +1 -0
- package/dist/routing/reservations.d.ts +37 -0
- package/dist/routing/reservations.js +79 -0
- package/dist/routing/reservations.js.map +1 -0
- package/dist/security/canonical.d.ts +12 -0
- package/dist/security/canonical.js +24 -0
- package/dist/security/canonical.js.map +1 -0
- package/dist/security/githubOidc.d.ts +45 -0
- package/dist/security/githubOidc.js +177 -0
- package/dist/security/githubOidc.js.map +1 -0
- package/dist/security/headers.d.ts +22 -0
- package/dist/security/headers.js +44 -0
- package/dist/security/headers.js.map +1 -0
- package/dist/security/index.d.ts +15 -0
- package/dist/security/index.js +9 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/jwks.d.ts +20 -0
- package/dist/security/jwks.js +40 -0
- package/dist/security/jwks.js.map +1 -0
- package/dist/security/jwt.d.ts +10 -0
- package/dist/security/jwt.js +42 -0
- package/dist/security/jwt.js.map +1 -0
- package/dist/security/nonce.d.ts +34 -0
- package/dist/security/nonce.js +43 -0
- package/dist/security/nonce.js.map +1 -0
- package/dist/security/sign.d.ts +13 -0
- package/dist/security/sign.js +39 -0
- package/dist/security/sign.js.map +1 -0
- package/dist/security/verify.d.ts +28 -0
- package/dist/security/verify.js +54 -0
- package/dist/security/verify.js.map +1 -0
- package/dist/skills/codex/SKILL.md +173 -0
- package/dist/skills/codex/examples/docs-page.md +42 -0
- package/dist/skills/codex/examples/github-actions.md +64 -0
- package/dist/skills/codex/reference/admin.md +28 -0
- package/dist/skills/codex/reference/frontmatter.md +39 -0
- package/dist/skills/codex/reference/payload-markdown-directives.md +77 -0
- package/dist/skills/codex/reference/routing.md +35 -0
- package/dist/skills/codex/reference/sync.md +35 -0
- package/dist/skills/codex/reference/troubleshooting.md +53 -0
- package/dist/skills/codex/reference/workflow.md +39 -0
- package/dist/sync/aiExportManifest.d.ts +58 -0
- package/dist/sync/aiExportManifest.js +430 -0
- package/dist/sync/aiExportManifest.js.map +1 -0
- package/dist/sync/frontmatter.d.ts +28 -0
- package/dist/sync/frontmatter.js +210 -0
- package/dist/sync/frontmatter.js.map +1 -0
- package/dist/sync/hash.d.ts +1 -0
- package/dist/sync/hash.js +8 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +12 -0
- package/dist/sync/index.js +9 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/manifest.d.ts +58 -0
- package/dist/sync/manifest.js +21 -0
- package/dist/sync/manifest.js.map +1 -0
- package/dist/sync/paths.d.ts +16 -0
- package/dist/sync/paths.js +116 -0
- package/dist/sync/paths.js.map +1 -0
- package/dist/sync/plan.d.ts +29 -0
- package/dist/sync/plan.js +72 -0
- package/dist/sync/plan.js.map +1 -0
- package/dist/sync/validate.d.ts +26 -0
- package/dist/sync/validate.js +308 -0
- package/dist/sync/validate.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +143 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { runInstallCommand } from './commands/install.js';
|
|
5
|
+
import { runKeygenCommand } from './commands/keygen.js';
|
|
6
|
+
import { runManifestCommand } from './commands/manifest.js';
|
|
7
|
+
import { runPlanCommand } from './commands/plan.js';
|
|
8
|
+
import { runPushCommand } from './commands/push.js';
|
|
9
|
+
import { runValidateCommand } from './commands/validate.js';
|
|
10
|
+
import { getFlagString, parseCliArgs } from './parseArgs.js';
|
|
11
|
+
const helpText = `payload-markdown-docs
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
payload-markdown-docs validate <docs-root> [options]
|
|
15
|
+
payload-markdown-docs manifest <docs-root> [options]
|
|
16
|
+
payload-markdown-docs plan <docs-root> [options]
|
|
17
|
+
payload-markdown-docs push <docs-root> [options]
|
|
18
|
+
payload-markdown-docs keygen [options]
|
|
19
|
+
payload-markdown-docs install skill --codex [options]
|
|
20
|
+
|
|
21
|
+
Commands:
|
|
22
|
+
validate Validate a local Markdown docs directory.
|
|
23
|
+
manifest Print a JSON docs manifest for a local Markdown docs directory.
|
|
24
|
+
plan Build a dry sync plan against optional existing docs records.
|
|
25
|
+
push Sign and upload a docs manifest to a Payload sync endpoint.
|
|
26
|
+
keygen Generate Ed25519 keys for signed sync.
|
|
27
|
+
install Install local AI-agent guidance for docs maintenance.
|
|
28
|
+
`;
|
|
29
|
+
const commandHelp = {
|
|
30
|
+
install: `payload-markdown-docs install skill --codex
|
|
31
|
+
|
|
32
|
+
Aliases:
|
|
33
|
+
payload-markdown-docs install ai-skill --codex
|
|
34
|
+
payload-markdown-docs install skill --agent codex
|
|
35
|
+
|
|
36
|
+
Options:
|
|
37
|
+
--codex Install the Codex skill pack.
|
|
38
|
+
--agent <codex> Agent target. Currently only codex.
|
|
39
|
+
--out <path> Output directory. Defaults to .agents/skills/payload-markdown-docs.
|
|
40
|
+
--docs-root <path> Docs root to mention in installed guidance. Defaults to ./docs.
|
|
41
|
+
--package-manager <name> pnpm, npm, yarn, or bun. Auto-detected when omitted.
|
|
42
|
+
--force Overwrite existing skill files.
|
|
43
|
+
--dry-run Print planned files without writing.
|
|
44
|
+
--help Show this help.
|
|
45
|
+
|
|
46
|
+
Installs local AI-agent guidance only. It does not sync docs, call Payload, or run package manager commands.
|
|
47
|
+
`,
|
|
48
|
+
keygen: `payload-markdown-docs keygen
|
|
49
|
+
|
|
50
|
+
Options:
|
|
51
|
+
--format <pem|base64> Output key format. Defaults to pem.
|
|
52
|
+
--out <dir> Write docs-sync-public.pem and docs-sync-private.pem.
|
|
53
|
+
--force Overwrite existing key files when used with --out.
|
|
54
|
+
--help Show this help.
|
|
55
|
+
`,
|
|
56
|
+
manifest: `payload-markdown-docs manifest <docs-root>
|
|
57
|
+
|
|
58
|
+
Options:
|
|
59
|
+
--source <id> Manifest source id. Defaults to local-docs.
|
|
60
|
+
--root <path> Manifest source root label.
|
|
61
|
+
--route-base <route> Route base for validation. Defaults to /docs.
|
|
62
|
+
--repository <repo> Source repository metadata.
|
|
63
|
+
--branch <branch> Source branch metadata.
|
|
64
|
+
--commit <sha> Source commit metadata.
|
|
65
|
+
--pretty Pretty-print JSON.
|
|
66
|
+
--max-files <number> Maximum file count.
|
|
67
|
+
--max-file-bytes <number> Maximum single file size.
|
|
68
|
+
--max-total-bytes <number> Maximum total Markdown bytes.
|
|
69
|
+
--help Show this help.
|
|
70
|
+
`,
|
|
71
|
+
plan: `payload-markdown-docs plan <docs-root>
|
|
72
|
+
|
|
73
|
+
Options:
|
|
74
|
+
--existing <path> JSON array of existing docs records.
|
|
75
|
+
--delete-behavior <value> archive, delete, draft, or ignore.
|
|
76
|
+
--json Print full plan JSON.
|
|
77
|
+
--pretty Pretty-print JSON output.
|
|
78
|
+
--source <id> Manifest source id. Defaults to local-docs.
|
|
79
|
+
--root <path> Manifest source root label.
|
|
80
|
+
--route-base <route> Route base for validation. Defaults to /docs.
|
|
81
|
+
--repository <repo> Source repository metadata.
|
|
82
|
+
--branch <branch> Source branch metadata.
|
|
83
|
+
--commit <sha> Source commit metadata.
|
|
84
|
+
--max-files <number> Maximum file count.
|
|
85
|
+
--max-file-bytes <number> Maximum single file size.
|
|
86
|
+
--max-total-bytes <number> Maximum total Markdown bytes.
|
|
87
|
+
--help Show this help.
|
|
88
|
+
`,
|
|
89
|
+
push: `payload-markdown-docs push <docs-root>
|
|
90
|
+
|
|
91
|
+
Options:
|
|
92
|
+
--endpoint <url> Full Payload sync endpoint URL.
|
|
93
|
+
--key-id <id> Server-configured Ed25519 key id.
|
|
94
|
+
--private-key-file <path> PEM private key file from keygen.
|
|
95
|
+
--private-key-env <name> Environment variable containing the private key.
|
|
96
|
+
--github-oidc Use GitHub Actions OIDC bearer auth instead of Ed25519.
|
|
97
|
+
--oidc-audience <value> GitHub OIDC audience. Defaults to payload-markdown-docs.
|
|
98
|
+
--oidc-token-env <name> Environment variable containing an already-fetched OIDC token.
|
|
99
|
+
--dry-run Upload as dry-run mode. This is the default.
|
|
100
|
+
--sync Upload as sync mode. Requires server sync.allowWrites.
|
|
101
|
+
--publish Request published output. Server must allow publishing.
|
|
102
|
+
--delete-behavior <value> archive, delete, draft, or ignore. Defaults to archive.
|
|
103
|
+
--json Print structured JSON output.
|
|
104
|
+
--pretty Pretty-print JSON output with --json.
|
|
105
|
+
--source <id> Manifest source id. Defaults to local-docs.
|
|
106
|
+
--root <path> Manifest source root label.
|
|
107
|
+
--route-base <route> Route base for local validation. Defaults to /docs.
|
|
108
|
+
--repository <repo> Source repository metadata.
|
|
109
|
+
--branch <branch> Source branch metadata.
|
|
110
|
+
--commit <sha> Source commit metadata.
|
|
111
|
+
--max-files <number> Maximum file count.
|
|
112
|
+
--max-file-bytes <number> Maximum single file size.
|
|
113
|
+
--max-total-bytes <number> Maximum total Markdown bytes.
|
|
114
|
+
--help Show this help.
|
|
115
|
+
|
|
116
|
+
Examples:
|
|
117
|
+
Ed25519:
|
|
118
|
+
payload-markdown-docs push ./docs --endpoint "$DOCS_SYNC_ENDPOINT" --source main-docs --key-id github-actions-main --private-key-env DOCS_SYNC_PRIVATE_KEY --sync
|
|
119
|
+
|
|
120
|
+
GitHub OIDC:
|
|
121
|
+
payload-markdown-docs push ./docs --endpoint "$DOCS_SYNC_ENDPOINT" --source main-docs --github-oidc --oidc-audience payload-markdown-docs --sync
|
|
122
|
+
|
|
123
|
+
GitHub OIDC requires workflow permissions: id-token: write and contents: read.
|
|
124
|
+
Hard delete requires explicit server sync.allowHardDelete. Existing collection and block targets are not supported yet.
|
|
125
|
+
`,
|
|
126
|
+
validate: `payload-markdown-docs validate <docs-root>
|
|
127
|
+
|
|
128
|
+
Options:
|
|
129
|
+
--json Print validation JSON.
|
|
130
|
+
--pretty Pretty-print JSON output.
|
|
131
|
+
--source <id> Manifest source id. Defaults to local-docs.
|
|
132
|
+
--root <path> Manifest source root label.
|
|
133
|
+
--route-base <route> Route base for validation. Defaults to /docs.
|
|
134
|
+
--repository <repo> Source repository metadata.
|
|
135
|
+
--branch <branch> Source branch metadata.
|
|
136
|
+
--commit <sha> Source commit metadata.
|
|
137
|
+
--max-files <number> Maximum file count.
|
|
138
|
+
--max-file-bytes <number> Maximum single file size.
|
|
139
|
+
--max-total-bytes <number> Maximum total Markdown bytes.
|
|
140
|
+
--help Show this help.
|
|
141
|
+
`
|
|
142
|
+
};
|
|
143
|
+
const getHelpForArgs = (args)=>{
|
|
144
|
+
if (args.command !== 'help') {
|
|
145
|
+
return commandHelp[args.command];
|
|
146
|
+
}
|
|
147
|
+
const topic = getFlagString(args, 'topic') ?? args.positionals[0];
|
|
148
|
+
if (topic === 'keygen' || topic === 'install' || topic === 'manifest' || topic === 'plan' || topic === 'push' || topic === 'validate') {
|
|
149
|
+
return commandHelp[topic];
|
|
150
|
+
}
|
|
151
|
+
return helpText;
|
|
152
|
+
};
|
|
153
|
+
export const runCli = async (argv)=>{
|
|
154
|
+
try {
|
|
155
|
+
const parsed = parseCliArgs(argv);
|
|
156
|
+
if (!parsed.ok) {
|
|
157
|
+
return {
|
|
158
|
+
exitCode: 1,
|
|
159
|
+
stderr: `${parsed.error}\n`
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (parsed.args.command === 'help' || parsed.args.flags.help === true) {
|
|
163
|
+
return {
|
|
164
|
+
exitCode: 0,
|
|
165
|
+
stdout: getHelpForArgs(parsed.args)
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
if (parsed.args.command === 'keygen') {
|
|
169
|
+
return runKeygenCommand(parsed.args);
|
|
170
|
+
}
|
|
171
|
+
if (parsed.args.command === 'install') {
|
|
172
|
+
return runInstallCommand(parsed.args);
|
|
173
|
+
}
|
|
174
|
+
if (parsed.args.command === 'manifest') {
|
|
175
|
+
return runManifestCommand(parsed.args);
|
|
176
|
+
}
|
|
177
|
+
if (parsed.args.command === 'plan') {
|
|
178
|
+
return runPlanCommand(parsed.args);
|
|
179
|
+
}
|
|
180
|
+
if (parsed.args.command === 'push') {
|
|
181
|
+
return runPushCommand(parsed.args);
|
|
182
|
+
}
|
|
183
|
+
if (parsed.args.command === 'validate') {
|
|
184
|
+
return runValidateCommand(parsed.args);
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
exitCode: 1,
|
|
188
|
+
stderr: 'Unknown command.\n'
|
|
189
|
+
};
|
|
190
|
+
} catch (error) {
|
|
191
|
+
return {
|
|
192
|
+
exitCode: 2,
|
|
193
|
+
stderr: error instanceof Error ? `${error.message}\n` : 'Unexpected internal error.\n'
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
const isCliEntrypoint = ()=>{
|
|
198
|
+
if (!process.argv[1]) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
return fileURLToPath(import.meta.url) === path.resolve(process.argv[1]);
|
|
202
|
+
};
|
|
203
|
+
if (isCliEntrypoint()) {
|
|
204
|
+
const result = await runCli(process.argv.slice(2));
|
|
205
|
+
if (result.stdout) {
|
|
206
|
+
process.stdout.write(result.stdout);
|
|
207
|
+
}
|
|
208
|
+
if (result.stderr) {
|
|
209
|
+
process.stderr.write(result.stderr);
|
|
210
|
+
}
|
|
211
|
+
process.exitCode = result.exitCode;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport type { CliCommandName, CliResult, ParsedCliArgs } from './types.js'\n\nimport { runInstallCommand } from './commands/install.js'\nimport { runKeygenCommand } from './commands/keygen.js'\nimport { runManifestCommand } from './commands/manifest.js'\nimport { runPlanCommand } from './commands/plan.js'\nimport { runPushCommand } from './commands/push.js'\nimport { runValidateCommand } from './commands/validate.js'\nimport { getFlagString, parseCliArgs } from './parseArgs.js'\n\nconst helpText = `payload-markdown-docs\n\nUsage:\n payload-markdown-docs validate <docs-root> [options]\n payload-markdown-docs manifest <docs-root> [options]\n payload-markdown-docs plan <docs-root> [options]\n payload-markdown-docs push <docs-root> [options]\n payload-markdown-docs keygen [options]\n payload-markdown-docs install skill --codex [options]\n\nCommands:\n validate Validate a local Markdown docs directory.\n manifest Print a JSON docs manifest for a local Markdown docs directory.\n plan Build a dry sync plan against optional existing docs records.\n push Sign and upload a docs manifest to a Payload sync endpoint.\n keygen Generate Ed25519 keys for signed sync.\n install Install local AI-agent guidance for docs maintenance.\n`\n\nconst commandHelp: Record<Exclude<CliCommandName, 'help'>, string> = {\n install: `payload-markdown-docs install skill --codex\n\nAliases:\n payload-markdown-docs install ai-skill --codex\n payload-markdown-docs install skill --agent codex\n\nOptions:\n --codex Install the Codex skill pack.\n --agent <codex> Agent target. Currently only codex.\n --out <path> Output directory. Defaults to .agents/skills/payload-markdown-docs.\n --docs-root <path> Docs root to mention in installed guidance. Defaults to ./docs.\n --package-manager <name> pnpm, npm, yarn, or bun. Auto-detected when omitted.\n --force Overwrite existing skill files.\n --dry-run Print planned files without writing.\n --help Show this help.\n\nInstalls local AI-agent guidance only. It does not sync docs, call Payload, or run package manager commands.\n`,\n keygen: `payload-markdown-docs keygen\n\nOptions:\n --format <pem|base64> Output key format. Defaults to pem.\n --out <dir> Write docs-sync-public.pem and docs-sync-private.pem.\n --force Overwrite existing key files when used with --out.\n --help Show this help.\n`,\n manifest: `payload-markdown-docs manifest <docs-root>\n\nOptions:\n --source <id> Manifest source id. Defaults to local-docs.\n --root <path> Manifest source root label.\n --route-base <route> Route base for validation. Defaults to /docs.\n --repository <repo> Source repository metadata.\n --branch <branch> Source branch metadata.\n --commit <sha> Source commit metadata.\n --pretty Pretty-print JSON.\n --max-files <number> Maximum file count.\n --max-file-bytes <number> Maximum single file size.\n --max-total-bytes <number> Maximum total Markdown bytes.\n --help Show this help.\n`,\n plan: `payload-markdown-docs plan <docs-root>\n\nOptions:\n --existing <path> JSON array of existing docs records.\n --delete-behavior <value> archive, delete, draft, or ignore.\n --json Print full plan JSON.\n --pretty Pretty-print JSON output.\n --source <id> Manifest source id. Defaults to local-docs.\n --root <path> Manifest source root label.\n --route-base <route> Route base for validation. Defaults to /docs.\n --repository <repo> Source repository metadata.\n --branch <branch> Source branch metadata.\n --commit <sha> Source commit metadata.\n --max-files <number> Maximum file count.\n --max-file-bytes <number> Maximum single file size.\n --max-total-bytes <number> Maximum total Markdown bytes.\n --help Show this help.\n`,\n push: `payload-markdown-docs push <docs-root>\n\nOptions:\n --endpoint <url> Full Payload sync endpoint URL.\n --key-id <id> Server-configured Ed25519 key id.\n --private-key-file <path> PEM private key file from keygen.\n --private-key-env <name> Environment variable containing the private key.\n --github-oidc Use GitHub Actions OIDC bearer auth instead of Ed25519.\n --oidc-audience <value> GitHub OIDC audience. Defaults to payload-markdown-docs.\n --oidc-token-env <name> Environment variable containing an already-fetched OIDC token.\n --dry-run Upload as dry-run mode. This is the default.\n --sync Upload as sync mode. Requires server sync.allowWrites.\n --publish Request published output. Server must allow publishing.\n --delete-behavior <value> archive, delete, draft, or ignore. Defaults to archive.\n --json Print structured JSON output.\n --pretty Pretty-print JSON output with --json.\n --source <id> Manifest source id. Defaults to local-docs.\n --root <path> Manifest source root label.\n --route-base <route> Route base for local validation. Defaults to /docs.\n --repository <repo> Source repository metadata.\n --branch <branch> Source branch metadata.\n --commit <sha> Source commit metadata.\n --max-files <number> Maximum file count.\n --max-file-bytes <number> Maximum single file size.\n --max-total-bytes <number> Maximum total Markdown bytes.\n --help Show this help.\n\nExamples:\n Ed25519:\n payload-markdown-docs push ./docs --endpoint \"$DOCS_SYNC_ENDPOINT\" --source main-docs --key-id github-actions-main --private-key-env DOCS_SYNC_PRIVATE_KEY --sync\n\n GitHub OIDC:\n payload-markdown-docs push ./docs --endpoint \"$DOCS_SYNC_ENDPOINT\" --source main-docs --github-oidc --oidc-audience payload-markdown-docs --sync\n\nGitHub OIDC requires workflow permissions: id-token: write and contents: read.\nHard delete requires explicit server sync.allowHardDelete. Existing collection and block targets are not supported yet.\n`,\n validate: `payload-markdown-docs validate <docs-root>\n\nOptions:\n --json Print validation JSON.\n --pretty Pretty-print JSON output.\n --source <id> Manifest source id. Defaults to local-docs.\n --root <path> Manifest source root label.\n --route-base <route> Route base for validation. Defaults to /docs.\n --repository <repo> Source repository metadata.\n --branch <branch> Source branch metadata.\n --commit <sha> Source commit metadata.\n --max-files <number> Maximum file count.\n --max-file-bytes <number> Maximum single file size.\n --max-total-bytes <number> Maximum total Markdown bytes.\n --help Show this help.\n`,\n}\n\nconst getHelpForArgs = (args: ParsedCliArgs): string => {\n if (args.command !== 'help') {\n return commandHelp[args.command]\n }\n\n const topic = getFlagString(args, 'topic') ?? args.positionals[0]\n\n if (\n topic === 'keygen' ||\n topic === 'install' ||\n topic === 'manifest' ||\n topic === 'plan' ||\n topic === 'push' ||\n topic === 'validate'\n ) {\n return commandHelp[topic]\n }\n\n return helpText\n}\n\nexport const runCli = async (argv: string[]): Promise<CliResult> => {\n try {\n const parsed = parseCliArgs(argv)\n\n if (!parsed.ok) {\n return {\n exitCode: 1,\n stderr: `${parsed.error}\\n`,\n }\n }\n\n if (parsed.args.command === 'help' || parsed.args.flags.help === true) {\n return {\n exitCode: 0,\n stdout: getHelpForArgs(parsed.args),\n }\n }\n\n if (parsed.args.command === 'keygen') {\n return runKeygenCommand(parsed.args)\n }\n\n if (parsed.args.command === 'install') {\n return runInstallCommand(parsed.args)\n }\n\n if (parsed.args.command === 'manifest') {\n return runManifestCommand(parsed.args)\n }\n\n if (parsed.args.command === 'plan') {\n return runPlanCommand(parsed.args)\n }\n\n if (parsed.args.command === 'push') {\n return runPushCommand(parsed.args)\n }\n\n if (parsed.args.command === 'validate') {\n return runValidateCommand(parsed.args)\n }\n\n return {\n exitCode: 1,\n stderr: 'Unknown command.\\n',\n }\n } catch (error) {\n return {\n exitCode: 2,\n stderr: error instanceof Error ? `${error.message}\\n` : 'Unexpected internal error.\\n',\n }\n }\n}\n\nconst isCliEntrypoint = (): boolean => {\n if (!process.argv[1]) {\n return false\n }\n\n return fileURLToPath(import.meta.url) === path.resolve(process.argv[1])\n}\n\nif (isCliEntrypoint()) {\n const result = await runCli(process.argv.slice(2))\n\n if (result.stdout) {\n process.stdout.write(result.stdout)\n }\n\n if (result.stderr) {\n process.stderr.write(result.stderr)\n }\n\n process.exitCode = result.exitCode\n}\n"],"names":["path","fileURLToPath","runInstallCommand","runKeygenCommand","runManifestCommand","runPlanCommand","runPushCommand","runValidateCommand","getFlagString","parseCliArgs","helpText","commandHelp","install","keygen","manifest","plan","push","validate","getHelpForArgs","args","command","topic","positionals","runCli","argv","parsed","ok","exitCode","stderr","error","flags","help","stdout","Error","message","isCliEntrypoint","process","url","resolve","result","slice","write"],"mappings":";AAEA,OAAOA,UAAU,YAAW;AAC5B,SAASC,aAAa,QAAQ,WAAU;AAIxC,SAASC,iBAAiB,QAAQ,wBAAuB;AACzD,SAASC,gBAAgB,QAAQ,uBAAsB;AACvD,SAASC,kBAAkB,QAAQ,yBAAwB;AAC3D,SAASC,cAAc,QAAQ,qBAAoB;AACnD,SAASC,cAAc,QAAQ,qBAAoB;AACnD,SAASC,kBAAkB,QAAQ,yBAAwB;AAC3D,SAASC,aAAa,EAAEC,YAAY,QAAQ,iBAAgB;AAE5D,MAAMC,WAAW,CAAC;;;;;;;;;;;;;;;;;AAiBlB,CAAC;AAED,MAAMC,cAA+D;IACnEC,SAAS,CAAC;;;;;;;;;;;;;;;;;AAiBZ,CAAC;IACCC,QAAQ,CAAC;;;;;;;AAOX,CAAC;IACCC,UAAU,CAAC;;;;;;;;;;;;;;AAcb,CAAC;IACCC,MAAM,CAAC;;;;;;;;;;;;;;;;;AAiBT,CAAC;IACCC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,CAAC;IACCC,UAAU,CAAC;;;;;;;;;;;;;;;AAeb,CAAC;AACD;AAEA,MAAMC,iBAAiB,CAACC;IACtB,IAAIA,KAAKC,OAAO,KAAK,QAAQ;QAC3B,OAAOT,WAAW,CAACQ,KAAKC,OAAO,CAAC;IAClC;IAEA,MAAMC,QAAQb,cAAcW,MAAM,YAAYA,KAAKG,WAAW,CAAC,EAAE;IAEjE,IACED,UAAU,YACVA,UAAU,aACVA,UAAU,cACVA,UAAU,UACVA,UAAU,UACVA,UAAU,YACV;QACA,OAAOV,WAAW,CAACU,MAAM;IAC3B;IAEA,OAAOX;AACT;AAEA,OAAO,MAAMa,SAAS,OAAOC;IAC3B,IAAI;QACF,MAAMC,SAAShB,aAAae;QAE5B,IAAI,CAACC,OAAOC,EAAE,EAAE;YACd,OAAO;gBACLC,UAAU;gBACVC,QAAQ,GAAGH,OAAOI,KAAK,CAAC,EAAE,CAAC;YAC7B;QACF;QAEA,IAAIJ,OAAON,IAAI,CAACC,OAAO,KAAK,UAAUK,OAAON,IAAI,CAACW,KAAK,CAACC,IAAI,KAAK,MAAM;YACrE,OAAO;gBACLJ,UAAU;gBACVK,QAAQd,eAAeO,OAAON,IAAI;YACpC;QACF;QAEA,IAAIM,OAAON,IAAI,CAACC,OAAO,KAAK,UAAU;YACpC,OAAOjB,iBAAiBsB,OAAON,IAAI;QACrC;QAEA,IAAIM,OAAON,IAAI,CAACC,OAAO,KAAK,WAAW;YACrC,OAAOlB,kBAAkBuB,OAAON,IAAI;QACtC;QAEA,IAAIM,OAAON,IAAI,CAACC,OAAO,KAAK,YAAY;YACtC,OAAOhB,mBAAmBqB,OAAON,IAAI;QACvC;QAEA,IAAIM,OAAON,IAAI,CAACC,OAAO,KAAK,QAAQ;YAClC,OAAOf,eAAeoB,OAAON,IAAI;QACnC;QAEA,IAAIM,OAAON,IAAI,CAACC,OAAO,KAAK,QAAQ;YAClC,OAAOd,eAAemB,OAAON,IAAI;QACnC;QAEA,IAAIM,OAAON,IAAI,CAACC,OAAO,KAAK,YAAY;YACtC,OAAOb,mBAAmBkB,OAAON,IAAI;QACvC;QAEA,OAAO;YACLQ,UAAU;YACVC,QAAQ;QACV;IACF,EAAE,OAAOC,OAAO;QACd,OAAO;YACLF,UAAU;YACVC,QAAQC,iBAAiBI,QAAQ,GAAGJ,MAAMK,OAAO,CAAC,EAAE,CAAC,GAAG;QAC1D;IACF;AACF,EAAC;AAED,MAAMC,kBAAkB;IACtB,IAAI,CAACC,QAAQZ,IAAI,CAAC,EAAE,EAAE;QACpB,OAAO;IACT;IAEA,OAAOvB,cAAc,YAAYoC,GAAG,MAAMrC,KAAKsC,OAAO,CAACF,QAAQZ,IAAI,CAAC,EAAE;AACxE;AAEA,IAAIW,mBAAmB;IACrB,MAAMI,SAAS,MAAMhB,OAAOa,QAAQZ,IAAI,CAACgB,KAAK,CAAC;IAE/C,IAAID,OAAOP,MAAM,EAAE;QACjBI,QAAQJ,MAAM,CAACS,KAAK,CAACF,OAAOP,MAAM;IACpC;IAEA,IAAIO,OAAOX,MAAM,EAAE;QACjBQ,QAAQR,MAAM,CAACa,KAAK,CAACF,OAAOX,MAAM;IACpC;IAEAQ,QAAQT,QAAQ,GAAGY,OAAOZ,QAAQ;AACpC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CliParseResult, CliResult, ParsedCliArgs } from './types.js';
|
|
2
|
+
export declare const parseCliArgs: (argv: string[]) => CliParseResult;
|
|
3
|
+
export declare const getFlagString: (args: ParsedCliArgs, name: string) => string | undefined;
|
|
4
|
+
export declare const getFlagBoolean: (args: ParsedCliArgs, name: string) => boolean;
|
|
5
|
+
export declare const parseIntegerFlag: (args: ParsedCliArgs, name: string) => CliResult | number | undefined;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
const commands = new Set([
|
|
2
|
+
'help',
|
|
3
|
+
'install',
|
|
4
|
+
'keygen',
|
|
5
|
+
'manifest',
|
|
6
|
+
'plan',
|
|
7
|
+
'push',
|
|
8
|
+
'validate'
|
|
9
|
+
]);
|
|
10
|
+
const docsValueFlags = new Set([
|
|
11
|
+
'branch',
|
|
12
|
+
'commit',
|
|
13
|
+
'max-file-bytes',
|
|
14
|
+
'max-files',
|
|
15
|
+
'max-total-bytes',
|
|
16
|
+
'repository',
|
|
17
|
+
'root',
|
|
18
|
+
'route-base',
|
|
19
|
+
'source'
|
|
20
|
+
]);
|
|
21
|
+
const docsBooleanFlags = new Set([
|
|
22
|
+
'help',
|
|
23
|
+
'json',
|
|
24
|
+
'pretty'
|
|
25
|
+
]);
|
|
26
|
+
const planValueFlags = new Set([
|
|
27
|
+
'delete-behavior',
|
|
28
|
+
'existing',
|
|
29
|
+
...docsValueFlags
|
|
30
|
+
]);
|
|
31
|
+
const pushValueFlags = new Set([
|
|
32
|
+
'delete-behavior',
|
|
33
|
+
'endpoint',
|
|
34
|
+
'key-id',
|
|
35
|
+
'oidc-audience',
|
|
36
|
+
'oidc-token-env',
|
|
37
|
+
'private-key-env',
|
|
38
|
+
'private-key-file',
|
|
39
|
+
...docsValueFlags
|
|
40
|
+
]);
|
|
41
|
+
const pushBooleanFlags = new Set([
|
|
42
|
+
'dry-run',
|
|
43
|
+
'github-oidc',
|
|
44
|
+
'help',
|
|
45
|
+
'json',
|
|
46
|
+
'pretty',
|
|
47
|
+
'publish',
|
|
48
|
+
'sync'
|
|
49
|
+
]);
|
|
50
|
+
const installValueFlags = new Set([
|
|
51
|
+
'agent',
|
|
52
|
+
'docs-root',
|
|
53
|
+
'out',
|
|
54
|
+
'package-manager'
|
|
55
|
+
]);
|
|
56
|
+
const installBooleanFlags = new Set([
|
|
57
|
+
'codex',
|
|
58
|
+
'dry-run',
|
|
59
|
+
'force',
|
|
60
|
+
'help'
|
|
61
|
+
]);
|
|
62
|
+
const keygenValueFlags = new Set([
|
|
63
|
+
'format',
|
|
64
|
+
'out'
|
|
65
|
+
]);
|
|
66
|
+
const keygenBooleanFlags = new Set([
|
|
67
|
+
'force',
|
|
68
|
+
'help'
|
|
69
|
+
]);
|
|
70
|
+
const knownCommand = (command)=>commands.has(command);
|
|
71
|
+
const normalizeFlagName = (input)=>input.slice(2);
|
|
72
|
+
const allowedFlagsForCommand = (command)=>{
|
|
73
|
+
if (command === 'keygen') {
|
|
74
|
+
return {
|
|
75
|
+
boolean: keygenBooleanFlags,
|
|
76
|
+
value: keygenValueFlags
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (command === 'install') {
|
|
80
|
+
return {
|
|
81
|
+
boolean: installBooleanFlags,
|
|
82
|
+
value: installValueFlags
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (command === 'plan') {
|
|
86
|
+
return {
|
|
87
|
+
boolean: docsBooleanFlags,
|
|
88
|
+
value: planValueFlags
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (command === 'push') {
|
|
92
|
+
return {
|
|
93
|
+
boolean: pushBooleanFlags,
|
|
94
|
+
value: pushValueFlags
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (command === 'manifest' || command === 'validate') {
|
|
98
|
+
return {
|
|
99
|
+
boolean: docsBooleanFlags,
|
|
100
|
+
value: docsValueFlags
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
boolean: new Set([
|
|
105
|
+
'help'
|
|
106
|
+
]),
|
|
107
|
+
value: new Set()
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
export const parseCliArgs = (argv)=>{
|
|
111
|
+
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
112
|
+
return {
|
|
113
|
+
args: {
|
|
114
|
+
command: 'help',
|
|
115
|
+
flags: {
|
|
116
|
+
help: true
|
|
117
|
+
},
|
|
118
|
+
positionals: []
|
|
119
|
+
},
|
|
120
|
+
ok: true
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const [rawCommand, ...rest] = argv;
|
|
124
|
+
if (!rawCommand || rawCommand.startsWith('-')) {
|
|
125
|
+
return {
|
|
126
|
+
error: 'Missing command. Run payload-markdown-docs --help.',
|
|
127
|
+
ok: false
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (!knownCommand(rawCommand)) {
|
|
131
|
+
return {
|
|
132
|
+
error: `Unknown command "${rawCommand}". Run payload-markdown-docs --help.`,
|
|
133
|
+
ok: false
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (rawCommand === 'help') {
|
|
137
|
+
const [topic] = rest;
|
|
138
|
+
if (topic && !knownCommand(topic)) {
|
|
139
|
+
return {
|
|
140
|
+
error: `Unknown help topic "${topic}".`,
|
|
141
|
+
ok: false
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
args: {
|
|
146
|
+
command: 'help',
|
|
147
|
+
flags: topic ? {
|
|
148
|
+
topic
|
|
149
|
+
} : {},
|
|
150
|
+
positionals: topic ? [
|
|
151
|
+
topic
|
|
152
|
+
] : []
|
|
153
|
+
},
|
|
154
|
+
ok: true
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const allowedFlags = allowedFlagsForCommand(rawCommand);
|
|
158
|
+
const flags = {};
|
|
159
|
+
const positionals = [];
|
|
160
|
+
for(let index = 0; index < rest.length; index += 1){
|
|
161
|
+
const token = rest[index];
|
|
162
|
+
if (!token) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (!token.startsWith('--')) {
|
|
166
|
+
positionals.push(token);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const flagName = normalizeFlagName(token);
|
|
170
|
+
if (allowedFlags.boolean.has(flagName)) {
|
|
171
|
+
flags[flagName] = true;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (!allowedFlags.value.has(flagName)) {
|
|
175
|
+
return {
|
|
176
|
+
error: `Unknown flag "--${flagName}" for ${rawCommand}.`,
|
|
177
|
+
ok: false
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const value = rest[index + 1];
|
|
181
|
+
if (!value || value.startsWith('--')) {
|
|
182
|
+
return {
|
|
183
|
+
error: `Flag "--${flagName}" requires a value.`,
|
|
184
|
+
ok: false
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
flags[flagName] = value;
|
|
188
|
+
index += 1;
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
args: {
|
|
192
|
+
command: rawCommand,
|
|
193
|
+
flags,
|
|
194
|
+
positionals
|
|
195
|
+
},
|
|
196
|
+
ok: true
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
export const getFlagString = (args, name)=>{
|
|
200
|
+
const value = args.flags[name];
|
|
201
|
+
return typeof value === 'string' ? value : undefined;
|
|
202
|
+
};
|
|
203
|
+
export const getFlagBoolean = (args, name)=>args.flags[name] === true;
|
|
204
|
+
export const parseIntegerFlag = (args, name)=>{
|
|
205
|
+
const value = getFlagString(args, name);
|
|
206
|
+
if (value === undefined) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
const parsed = Number(value);
|
|
210
|
+
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
211
|
+
return {
|
|
212
|
+
exitCode: 1,
|
|
213
|
+
stderr: `Flag "--${name}" must be a non-negative integer.\n`
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return parsed;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
//# sourceMappingURL=parseArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/parseArgs.ts"],"sourcesContent":["import type {\n CliCommandName,\n CliFlagValue,\n CliParseResult,\n CliResult,\n ParsedCliArgs,\n} from './types.js'\n\nconst commands = new Set<CliCommandName>([\n 'help',\n 'install',\n 'keygen',\n 'manifest',\n 'plan',\n 'push',\n 'validate',\n])\n\nconst docsValueFlags = new Set([\n 'branch',\n 'commit',\n 'max-file-bytes',\n 'max-files',\n 'max-total-bytes',\n 'repository',\n 'root',\n 'route-base',\n 'source',\n])\n\nconst docsBooleanFlags = new Set(['help', 'json', 'pretty'])\nconst planValueFlags = new Set(['delete-behavior', 'existing', ...docsValueFlags])\nconst pushValueFlags = new Set([\n 'delete-behavior',\n 'endpoint',\n 'key-id',\n 'oidc-audience',\n 'oidc-token-env',\n 'private-key-env',\n 'private-key-file',\n ...docsValueFlags,\n])\nconst pushBooleanFlags = new Set([\n 'dry-run',\n 'github-oidc',\n 'help',\n 'json',\n 'pretty',\n 'publish',\n 'sync',\n])\nconst installValueFlags = new Set([\n 'agent',\n 'docs-root',\n 'out',\n 'package-manager',\n])\nconst installBooleanFlags = new Set(['codex', 'dry-run', 'force', 'help'])\nconst keygenValueFlags = new Set(['format', 'out'])\nconst keygenBooleanFlags = new Set(['force', 'help'])\n\nconst knownCommand = (command: string): command is CliCommandName =>\n commands.has(command as CliCommandName)\n\nconst normalizeFlagName = (input: string): string => input.slice(2)\n\nconst allowedFlagsForCommand = (\n command: CliCommandName,\n): {\n boolean: Set<string>\n value: Set<string>\n} => {\n if (command === 'keygen') {\n return {\n boolean: keygenBooleanFlags,\n value: keygenValueFlags,\n }\n }\n\n if (command === 'install') {\n return {\n boolean: installBooleanFlags,\n value: installValueFlags,\n }\n }\n\n if (command === 'plan') {\n return {\n boolean: docsBooleanFlags,\n value: planValueFlags,\n }\n }\n\n if (command === 'push') {\n return {\n boolean: pushBooleanFlags,\n value: pushValueFlags,\n }\n }\n\n if (command === 'manifest' || command === 'validate') {\n return {\n boolean: docsBooleanFlags,\n value: docsValueFlags,\n }\n }\n\n return {\n boolean: new Set(['help']),\n value: new Set(),\n }\n}\n\nexport const parseCliArgs = (argv: string[]): CliParseResult => {\n if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {\n return {\n args: {\n command: 'help',\n flags: {\n help: true,\n },\n positionals: [],\n },\n ok: true,\n }\n }\n\n const [rawCommand, ...rest] = argv\n\n if (!rawCommand || rawCommand.startsWith('-')) {\n return {\n error: 'Missing command. Run payload-markdown-docs --help.',\n ok: false,\n }\n }\n\n if (!knownCommand(rawCommand)) {\n return {\n error: `Unknown command \"${rawCommand}\". Run payload-markdown-docs --help.`,\n ok: false,\n }\n }\n\n if (rawCommand === 'help') {\n const [topic] = rest\n\n if (topic && !knownCommand(topic)) {\n return {\n error: `Unknown help topic \"${topic}\".`,\n ok: false,\n }\n }\n\n return {\n args: {\n command: 'help',\n flags: topic ? { topic } : {},\n positionals: topic ? [topic] : [],\n },\n ok: true,\n }\n }\n\n const allowedFlags = allowedFlagsForCommand(rawCommand)\n const flags: Record<string, CliFlagValue> = {}\n const positionals: string[] = []\n\n for (let index = 0; index < rest.length; index += 1) {\n const token = rest[index]\n\n if (!token) {\n continue\n }\n\n if (!token.startsWith('--')) {\n positionals.push(token)\n continue\n }\n\n const flagName = normalizeFlagName(token)\n\n if (allowedFlags.boolean.has(flagName)) {\n flags[flagName] = true\n continue\n }\n\n if (!allowedFlags.value.has(flagName)) {\n return {\n error: `Unknown flag \"--${flagName}\" for ${rawCommand}.`,\n ok: false,\n }\n }\n\n const value = rest[index + 1]\n\n if (!value || value.startsWith('--')) {\n return {\n error: `Flag \"--${flagName}\" requires a value.`,\n ok: false,\n }\n }\n\n flags[flagName] = value\n index += 1\n }\n\n return {\n args: {\n command: rawCommand,\n flags,\n positionals,\n },\n ok: true,\n }\n}\n\nexport const getFlagString = (\n args: ParsedCliArgs,\n name: string,\n): string | undefined => {\n const value = args.flags[name]\n\n return typeof value === 'string' ? value : undefined\n}\n\nexport const getFlagBoolean = (args: ParsedCliArgs, name: string): boolean =>\n args.flags[name] === true\n\nexport const parseIntegerFlag = (\n args: ParsedCliArgs,\n name: string,\n): CliResult | number | undefined => {\n const value = getFlagString(args, name)\n\n if (value === undefined) {\n return undefined\n }\n\n const parsed = Number(value)\n\n if (!Number.isInteger(parsed) || parsed < 0) {\n return {\n exitCode: 1,\n stderr: `Flag \"--${name}\" must be a non-negative integer.\\n`,\n }\n }\n\n return parsed\n}\n"],"names":["commands","Set","docsValueFlags","docsBooleanFlags","planValueFlags","pushValueFlags","pushBooleanFlags","installValueFlags","installBooleanFlags","keygenValueFlags","keygenBooleanFlags","knownCommand","command","has","normalizeFlagName","input","slice","allowedFlagsForCommand","boolean","value","parseCliArgs","argv","length","args","flags","help","positionals","ok","rawCommand","rest","startsWith","error","topic","allowedFlags","index","token","push","flagName","getFlagString","name","undefined","getFlagBoolean","parseIntegerFlag","parsed","Number","isInteger","exitCode","stderr"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { DocsDeleteBehavior } from '../sync/index.js';
|
|
2
|
+
export type CliCommandName = 'help' | 'install' | 'keygen' | 'manifest' | 'plan' | 'push' | 'validate';
|
|
3
|
+
export type CliFlagValue = boolean | string;
|
|
4
|
+
export type CliFlags = Record<string, CliFlagValue>;
|
|
5
|
+
export type ParsedCliArgs = {
|
|
6
|
+
command: CliCommandName;
|
|
7
|
+
flags: CliFlags;
|
|
8
|
+
positionals: string[];
|
|
9
|
+
};
|
|
10
|
+
export type CliParseResult = {
|
|
11
|
+
args: ParsedCliArgs;
|
|
12
|
+
ok: true;
|
|
13
|
+
} | {
|
|
14
|
+
error: string;
|
|
15
|
+
ok: false;
|
|
16
|
+
};
|
|
17
|
+
export type CliResult = {
|
|
18
|
+
exitCode: 0 | 1 | 2;
|
|
19
|
+
stderr?: string;
|
|
20
|
+
stdout?: string;
|
|
21
|
+
};
|
|
22
|
+
export type DocsCommandOptions = {
|
|
23
|
+
branch?: string;
|
|
24
|
+
commit?: string;
|
|
25
|
+
docsRoot: string;
|
|
26
|
+
maxFileBytes?: number;
|
|
27
|
+
maxFiles?: number;
|
|
28
|
+
maxTotalBytes?: number;
|
|
29
|
+
repository?: string;
|
|
30
|
+
routeBase?: string;
|
|
31
|
+
sourceId: string;
|
|
32
|
+
sourceRoot?: string;
|
|
33
|
+
};
|
|
34
|
+
export type PlanCommandOptions = {
|
|
35
|
+
deleteBehavior?: DocsDeleteBehavior;
|
|
36
|
+
existingPath?: string;
|
|
37
|
+
} & DocsCommandOptions;
|
|
38
|
+
export type PushCommandOptions = {
|
|
39
|
+
deleteBehavior?: DocsDeleteBehavior;
|
|
40
|
+
endpoint: string;
|
|
41
|
+
mode: 'dry-run' | 'sync';
|
|
42
|
+
publish: boolean;
|
|
43
|
+
} & ({
|
|
44
|
+
authMode: 'ed25519';
|
|
45
|
+
keyId: string;
|
|
46
|
+
privateKey: string;
|
|
47
|
+
} | {
|
|
48
|
+
authMode: 'github-oidc';
|
|
49
|
+
oidcAudience: string;
|
|
50
|
+
oidcTokenEnv?: string;
|
|
51
|
+
}) & DocsCommandOptions;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/types.ts"],"sourcesContent":["import type { DocsDeleteBehavior } from '../sync/index.js'\n\nexport type CliCommandName =\n | 'help'\n | 'install'\n | 'keygen'\n | 'manifest'\n | 'plan'\n | 'push'\n | 'validate'\n\nexport type CliFlagValue = boolean | string\n\nexport type CliFlags = Record<string, CliFlagValue>\n\nexport type ParsedCliArgs = {\n command: CliCommandName\n flags: CliFlags\n positionals: string[]\n}\n\nexport type CliParseResult =\n | {\n args: ParsedCliArgs\n ok: true\n }\n | {\n error: string\n ok: false\n }\n\nexport type CliResult = {\n exitCode: 0 | 1 | 2\n stderr?: string\n stdout?: string\n}\n\nexport type DocsCommandOptions = {\n branch?: string\n commit?: string\n docsRoot: string\n maxFileBytes?: number\n maxFiles?: number\n maxTotalBytes?: number\n repository?: string\n routeBase?: string\n sourceId: string\n sourceRoot?: string\n}\n\nexport type PlanCommandOptions = {\n deleteBehavior?: DocsDeleteBehavior\n existingPath?: string\n} & DocsCommandOptions\n\nexport type PushCommandOptions = {\n deleteBehavior?: DocsDeleteBehavior\n endpoint: string\n mode: 'dry-run' | 'sync'\n publish: boolean\n} & (\n | {\n authMode: 'ed25519'\n keyId: string\n privateKey: string\n }\n | {\n authMode: 'github-oidc'\n oidcAudience: string\n oidcTokenEnv?: string\n }\n) &\n DocsCommandOptions\n"],"names":[],"mappings":"AAuDA,WAiBoB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CollectionConfig } from 'payload';
|
|
2
|
+
export type CreateDocsCollectionOptions = {
|
|
3
|
+
docsSetsCollectionSlug?: string;
|
|
4
|
+
enableDrafts?: boolean;
|
|
5
|
+
markdownFieldName: string;
|
|
6
|
+
slug: string;
|
|
7
|
+
syncRunsCollectionSlug?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const createDocsCollection: ({ slug, docsSetsCollectionSlug, enableDrafts, markdownFieldName, syncRunsCollectionSlug, }: CreateDocsCollectionOptions) => CollectionConfig;
|