docspack 0.0.1 → 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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/bin/docspack.js +25 -0
  4. package/dist/build.d.ts +31 -0
  5. package/dist/build.d.ts.map +1 -0
  6. package/dist/build.js +435 -0
  7. package/dist/build.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +763 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/config.d.ts +41 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +118 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/db.d.ts +60 -0
  17. package/dist/db.d.ts.map +1 -0
  18. package/dist/db.js +204 -0
  19. package/dist/db.js.map +1 -0
  20. package/dist/discovery.d.ts +31 -0
  21. package/dist/discovery.d.ts.map +1 -0
  22. package/dist/discovery.js +126 -0
  23. package/dist/discovery.js.map +1 -0
  24. package/dist/doctor.d.ts +25 -0
  25. package/dist/doctor.d.ts.map +1 -0
  26. package/dist/doctor.js +276 -0
  27. package/dist/doctor.js.map +1 -0
  28. package/dist/document.d.ts +13 -0
  29. package/dist/document.d.ts.map +1 -0
  30. package/dist/document.js +47 -0
  31. package/dist/document.js.map +1 -0
  32. package/dist/errors.d.ts +9 -0
  33. package/dist/errors.d.ts.map +1 -0
  34. package/dist/errors.js +10 -0
  35. package/dist/errors.js.map +1 -0
  36. package/dist/exports.d.ts +20 -0
  37. package/dist/exports.d.ts.map +1 -0
  38. package/dist/exports.js +100 -0
  39. package/dist/exports.js.map +1 -0
  40. package/dist/feedback.d.ts +68 -0
  41. package/dist/feedback.d.ts.map +1 -0
  42. package/dist/feedback.js +0 -0
  43. package/dist/feedback.js.map +1 -0
  44. package/dist/html.d.ts +4 -0
  45. package/dist/html.d.ts.map +1 -0
  46. package/dist/html.js +23 -0
  47. package/dist/html.js.map +1 -0
  48. package/dist/http.d.ts +30 -0
  49. package/dist/http.d.ts.map +1 -0
  50. package/dist/http.js +144 -0
  51. package/dist/http.js.map +1 -0
  52. package/dist/index.d.ts +25 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +25 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/init/detect.d.ts +16 -0
  57. package/dist/init/detect.d.ts.map +1 -0
  58. package/dist/init/detect.js +120 -0
  59. package/dist/init/detect.js.map +1 -0
  60. package/dist/init/plan.d.ts +43 -0
  61. package/dist/init/plan.d.ts.map +1 -0
  62. package/dist/init/plan.js +145 -0
  63. package/dist/init/plan.js.map +1 -0
  64. package/dist/init/run.d.ts +28 -0
  65. package/dist/init/run.d.ts.map +1 -0
  66. package/dist/init/run.js +96 -0
  67. package/dist/init/run.js.map +1 -0
  68. package/dist/init/templates.d.ts +24 -0
  69. package/dist/init/templates.d.ts.map +1 -0
  70. package/dist/init/templates.js +181 -0
  71. package/dist/init/templates.js.map +1 -0
  72. package/dist/init/write.d.ts +20 -0
  73. package/dist/init/write.d.ts.map +1 -0
  74. package/dist/init/write.js +56 -0
  75. package/dist/init/write.js.map +1 -0
  76. package/dist/kinds.d.ts +14 -0
  77. package/dist/kinds.d.ts.map +1 -0
  78. package/dist/kinds.js +15 -0
  79. package/dist/kinds.js.map +1 -0
  80. package/dist/llms-txt.d.ts +25 -0
  81. package/dist/llms-txt.d.ts.map +1 -0
  82. package/dist/llms-txt.js +94 -0
  83. package/dist/llms-txt.js.map +1 -0
  84. package/dist/mcp.d.ts +15 -0
  85. package/dist/mcp.d.ts.map +1 -0
  86. package/dist/mcp.js +158 -0
  87. package/dist/mcp.js.map +1 -0
  88. package/dist/preview.d.ts +18 -0
  89. package/dist/preview.d.ts.map +1 -0
  90. package/dist/preview.js +72 -0
  91. package/dist/preview.js.map +1 -0
  92. package/dist/prompt.d.ts +27 -0
  93. package/dist/prompt.d.ts.map +1 -0
  94. package/dist/prompt.js +79 -0
  95. package/dist/prompt.js.map +1 -0
  96. package/dist/search.d.ts +41 -0
  97. package/dist/search.d.ts.map +1 -0
  98. package/dist/search.js +60 -0
  99. package/dist/search.js.map +1 -0
  100. package/dist/snippet.d.ts +20 -0
  101. package/dist/snippet.d.ts.map +1 -0
  102. package/dist/snippet.js +29 -0
  103. package/dist/snippet.js.map +1 -0
  104. package/dist/spec.d.ts +38 -0
  105. package/dist/spec.d.ts.map +1 -0
  106. package/dist/spec.js +105 -0
  107. package/dist/spec.js.map +1 -0
  108. package/dist/style.d.ts +33 -0
  109. package/dist/style.d.ts.map +1 -0
  110. package/dist/style.js +94 -0
  111. package/dist/style.js.map +1 -0
  112. package/dist/submit.d.ts +61 -0
  113. package/dist/submit.d.ts.map +1 -0
  114. package/dist/submit.js +111 -0
  115. package/dist/submit.js.map +1 -0
  116. package/dist/sync.d.ts +29 -0
  117. package/dist/sync.d.ts.map +1 -0
  118. package/dist/sync.js +73 -0
  119. package/dist/sync.js.map +1 -0
  120. package/dist/verify.d.ts +44 -0
  121. package/dist/verify.d.ts.map +1 -0
  122. package/dist/verify.js +291 -0
  123. package/dist/verify.js.map +1 -0
  124. package/package.json +61 -5
  125. package/src/build.ts +572 -0
  126. package/src/cli.ts +883 -0
  127. package/src/config.ts +158 -0
  128. package/src/db.ts +261 -0
  129. package/src/discovery.ts +161 -0
  130. package/src/doctor.ts +344 -0
  131. package/src/document.ts +59 -0
  132. package/src/errors.ts +10 -0
  133. package/src/exports.ts +120 -0
  134. package/src/feedback.ts +0 -0
  135. package/src/html.ts +24 -0
  136. package/src/http.ts +190 -0
  137. package/src/index.ts +132 -0
  138. package/src/init/detect.ts +142 -0
  139. package/src/init/plan.ts +215 -0
  140. package/src/init/run.ts +142 -0
  141. package/src/init/templates.ts +200 -0
  142. package/src/init/write.ts +83 -0
  143. package/src/kinds.ts +17 -0
  144. package/src/llms-txt.ts +116 -0
  145. package/src/mcp.ts +196 -0
  146. package/src/preview.ts +98 -0
  147. package/src/prompt.ts +103 -0
  148. package/src/search.ts +96 -0
  149. package/src/snippet.ts +30 -0
  150. package/src/spec.ts +138 -0
  151. package/src/style.ts +111 -0
  152. package/src/submit.ts +189 -0
  153. package/src/sync.ts +112 -0
  154. package/src/verify.ts +355 -0
  155. package/bin/cli.js +0 -2
@@ -0,0 +1,120 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const DOC_DIRS = ["docs", "documentation", "website/docs", "content/docs", "src/content/docs"];
4
+ const OPENAPI_FILES = [
5
+ "openapi.json",
6
+ "api/openapi.json",
7
+ "spec/openapi.json",
8
+ "docs/openapi.json",
9
+ ];
10
+ const LLMS_TXT_FILES = ["llms.txt", "public/llms.txt", "static/llms.txt"];
11
+ const MARKDOWN = /\.(md|mdx|markdown)$/i;
12
+ export async function detectProject(cwd) {
13
+ const manifest = await readJson(join(cwd, "package.json"));
14
+ const name = typeof manifest?.name === "string" ? manifest.name : undefined;
15
+ const version = typeof manifest?.version === "string" ? manifest.version : undefined;
16
+ const license = typeof manifest?.license === "string" ? manifest.license : undefined;
17
+ const docs = await findDocsDir(cwd);
18
+ const openapi = await findOpenApi(cwd);
19
+ const llmsTxt = await findFirstFile(cwd, LLMS_TXT_FILES);
20
+ const repository = await gitRemote(cwd);
21
+ return {
22
+ ...(name === undefined ? {} : { libraryName: name }),
23
+ ...(version === undefined ? {} : { libraryVersion: version }),
24
+ ...(docs === undefined ? {} : { docsDir: docs.dir, docsFiles: docs.files }),
25
+ ...(openapi === undefined ? {} : { openapi }),
26
+ ...(llmsTxt === undefined ? {} : { llmsTxt }),
27
+ ...(repository === undefined ? {} : { repository }),
28
+ ...(license === undefined ? {} : { license: await detectLicense(cwd, license) }),
29
+ packageManager: await detectPackageManager(cwd),
30
+ workspace: manifest?.workspaces !== undefined || (await exists(join(cwd, "pnpm-workspace.yaml"))),
31
+ };
32
+ }
33
+ async function findDocsDir(cwd) {
34
+ for (const candidate of DOC_DIRS) {
35
+ const dir = join(cwd, candidate);
36
+ const files = await countMarkdown(dir);
37
+ if (files > 0)
38
+ return { dir: candidate, files };
39
+ }
40
+ return undefined;
41
+ }
42
+ async function countMarkdown(dir) {
43
+ let found;
44
+ try {
45
+ found = await readdir(dir, { recursive: true, withFileTypes: true });
46
+ }
47
+ catch {
48
+ return 0;
49
+ }
50
+ return found.filter((entry) => entry.isFile() && MARKDOWN.test(entry.name)).length;
51
+ }
52
+ /** Only counts as an OpenAPI document if it actually declares itself as one. */
53
+ async function findOpenApi(cwd) {
54
+ for (const candidate of OPENAPI_FILES) {
55
+ const parsed = await readJson(join(cwd, candidate));
56
+ if (parsed === undefined)
57
+ continue;
58
+ if (typeof parsed.openapi === "string" || typeof parsed.swagger === "string")
59
+ return candidate;
60
+ }
61
+ return undefined;
62
+ }
63
+ async function findFirstFile(cwd, candidates) {
64
+ for (const candidate of candidates) {
65
+ if (await exists(join(cwd, candidate)))
66
+ return candidate;
67
+ }
68
+ return undefined;
69
+ }
70
+ async function detectPackageManager(cwd) {
71
+ if (await exists(join(cwd, "pnpm-lock.yaml")))
72
+ return "pnpm";
73
+ if ((await exists(join(cwd, "bun.lock"))) || (await exists(join(cwd, "bun.lockb"))))
74
+ return "bun";
75
+ if (await exists(join(cwd, "yarn.lock")))
76
+ return "yarn";
77
+ return "npm";
78
+ }
79
+ async function detectLicense(cwd, declared) {
80
+ return declared.length > 0 || (await exists(join(cwd, "LICENSE"))) ? declared : declared;
81
+ }
82
+ /** Reads the origin URL straight out of .git/config rather than spawning git. */
83
+ async function gitRemote(cwd) {
84
+ let config;
85
+ try {
86
+ config = await readFile(join(cwd, ".git", "config"), "utf8");
87
+ }
88
+ catch {
89
+ return undefined;
90
+ }
91
+ const section = /\[remote "origin"\]([\s\S]*?)(?:\n\[|$)/.exec(config);
92
+ const url = section?.[1] === undefined ? undefined : /url\s*=\s*(\S+)/.exec(section[1])?.[1];
93
+ if (url === undefined)
94
+ return undefined;
95
+ const ssh = /^git@([^:]+):(.+?)(?:\.git)?$/.exec(url);
96
+ if (ssh?.[1] !== undefined && ssh[2] !== undefined)
97
+ return `https://${ssh[1]}/${ssh[2]}`;
98
+ return url.replace(/\.git$/, "");
99
+ }
100
+ async function readJson(path) {
101
+ try {
102
+ const parsed = JSON.parse(await readFile(path, "utf8"));
103
+ return typeof parsed === "object" && parsed !== null
104
+ ? parsed
105
+ : undefined;
106
+ }
107
+ catch {
108
+ return undefined;
109
+ }
110
+ }
111
+ async function exists(path) {
112
+ try {
113
+ await stat(path);
114
+ return true;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/init/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { Detected } from "./detect.js";
2
+ export type InitMode = "standalone" | "in-repo";
3
+ export type InitTemplate = "full" | "minimal";
4
+ export type InputKind = "from" | "openapi" | "mirror" | "seeded";
5
+ export interface InitOptions {
6
+ readonly name?: string;
7
+ readonly version?: string;
8
+ readonly out?: string;
9
+ readonly mode?: InitMode;
10
+ readonly from?: string;
11
+ readonly openapi?: string;
12
+ readonly mirror?: string;
13
+ readonly community?: boolean;
14
+ readonly workflow?: boolean;
15
+ readonly template?: InitTemplate;
16
+ /** Version of docspack recorded as the package's devDependency. */
17
+ readonly docspackVersion: string;
18
+ }
19
+ export interface PlannedFile {
20
+ /** POSIX-style path relative to the package directory. */
21
+ readonly path: string;
22
+ readonly contents: string;
23
+ }
24
+ export interface InitPlan {
25
+ readonly name: string;
26
+ readonly version: string;
27
+ /** Package directory, relative to where init was run. */
28
+ readonly dir: string;
29
+ readonly input: {
30
+ readonly kind: InputKind;
31
+ readonly value: string;
32
+ };
33
+ readonly files: readonly PlannedFile[];
34
+ readonly notes: readonly string[];
35
+ }
36
+ /**
37
+ * Computes the whole scaffold from options and what was detected. Pure on purpose: `--dry-run`
38
+ * prints exactly what a real run would write, and tests can assert the file set without a disk.
39
+ */
40
+ export declare function planInit(options: InitOptions, detected: Detected): InitPlan;
41
+ /** `@acme/sdk` becomes `@acme/docspack`; an unscoped `acme` becomes `@acme/docspack`. */
42
+ export declare function proposePackageName(detected: Detected, community: boolean): string;
43
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/init/plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;AAC9C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAiE3E;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAiBjF"}
@@ -0,0 +1,145 @@
1
+ import { posix } from "node:path";
2
+ import { DocspackError } from "../errors.js";
3
+ import { isCommunityPackage, isDocsPackage } from "../spec.js";
4
+ import { docSeeds, gitignore, packageJson, readme, workflow } from "./templates.js";
5
+ const SLUG = /[^a-z0-9-]+/g;
6
+ /**
7
+ * Computes the whole scaffold from options and what was detected. Pure on purpose: `--dry-run`
8
+ * prints exactly what a real run would write, and tests can assert the file set without a disk.
9
+ */
10
+ export function planInit(options, detected) {
11
+ const community = options.community === true || (options.name !== undefined && isCommunityPackage(options.name));
12
+ const name = options.name ?? proposePackageName(detected, community);
13
+ assertPackageName(name);
14
+ const notes = [];
15
+ const version = options.version ?? detected.libraryVersion ?? "0.1.0";
16
+ if (options.version === undefined && detected.libraryVersion === undefined) {
17
+ notes.push("No library version was detected, so the package starts at 0.1.0.");
18
+ }
19
+ else if (options.version === undefined && detected.libraryVersion !== undefined) {
20
+ notes.push(`Version ${version} matches ${detected.libraryName ?? "the surrounding package"}; keep them in step on every release.`);
21
+ }
22
+ const mode = options.mode ?? "standalone";
23
+ const dir = options.out ?? (mode === "in-repo" ? "packages/docspack" : "docspack");
24
+ const input = resolveInput(options, detected, dir, notes);
25
+ const template = options.template ?? "full";
26
+ const files = [
27
+ {
28
+ path: "package.json",
29
+ contents: packageJson({
30
+ name,
31
+ version,
32
+ ...(detected.libraryName === undefined ? {} : { libraryName: detected.libraryName }),
33
+ ...(detected.repository === undefined ? {} : { repository: detected.repository }),
34
+ ...(detected.license === undefined ? {} : { license: detected.license }),
35
+ build: buildConfigFor(input),
36
+ docspackVersion: options.docspackVersion,
37
+ }),
38
+ },
39
+ { path: ".gitignore", contents: gitignore() },
40
+ ];
41
+ if (template === "full") {
42
+ files.push({
43
+ path: "README.md",
44
+ contents: readme(name, detected.libraryName),
45
+ });
46
+ }
47
+ if (input.kind === "seeded") {
48
+ files.push(...docSeeds(detected.libraryName ?? name));
49
+ notes.push("docs/ was seeded with three templates. Replace the TODO markers before publishing; `docspack doctor --strict` fails while they remain.");
50
+ }
51
+ if (options.workflow === true) {
52
+ files.push({
53
+ path: ".github/workflows/publish-docspack.yml",
54
+ contents: workflow(name, workflowArgs(input)),
55
+ });
56
+ notes.push("The release workflow needs an NPM_TOKEN secret with publish rights to the scope.");
57
+ }
58
+ if (!community) {
59
+ const scope = name.slice(0, name.indexOf("/"));
60
+ notes.push(`Publishing to ${scope} requires owning that npm scope.`);
61
+ }
62
+ return { name, version, dir, input, files, notes };
63
+ }
64
+ /** `@acme/sdk` becomes `@acme/docspack`; an unscoped `acme` becomes `@acme/docspack`. */
65
+ export function proposePackageName(detected, community) {
66
+ const library = detected.libraryName;
67
+ if (library === undefined) {
68
+ throw new DocspackError("Could not work out a package name", {
69
+ hint: "Run inside a project with a package.json, or pass --name @acme/docspack.",
70
+ });
71
+ }
72
+ const bare = library.startsWith("@") ? (library.split("/")[1] ?? library.slice(1)) : library;
73
+ const slug = bare
74
+ .toLowerCase()
75
+ .replace(SLUG, "-")
76
+ .replace(/^-+|-+$/g, "");
77
+ if (community)
78
+ return `@docspack-community/${slug}`;
79
+ const scope = library.startsWith("@") ? library.slice(1, library.indexOf("/")) : slug;
80
+ return `@${scope}/docspack`;
81
+ }
82
+ function assertPackageName(name) {
83
+ if (!isDocsPackage(name)) {
84
+ throw new DocspackError(`"${name}" is not a name docspack will discover`, {
85
+ hint: "Use @vendor/docspack for a package you own, or @docspack-community/<name> otherwise.",
86
+ });
87
+ }
88
+ }
89
+ function resolveInput(options, detected, dir, notes) {
90
+ const chosen = [options.from, options.openapi, options.mirror].filter((value) => value !== undefined);
91
+ if (chosen.length > 1) {
92
+ throw new DocspackError("Choose one input: --from, --openapi or --mirror");
93
+ }
94
+ if (options.mirror !== undefined) {
95
+ if (!isCommunityPackage(options.name ?? "")) {
96
+ notes.push("A mirror republishes someone else's documentation; publish it under @docspack-community rather than the vendor's scope.");
97
+ }
98
+ return { kind: "mirror", value: options.mirror };
99
+ }
100
+ if (options.openapi !== undefined)
101
+ return { kind: "openapi", value: relativeToPackage(options.openapi, dir) };
102
+ if (options.from !== undefined)
103
+ return { kind: "from", value: relativeToPackage(options.from, dir) };
104
+ if (detected.docsDir !== undefined) {
105
+ notes.push(`Found ${detected.docsFiles} Markdown files in ${detected.docsDir}/.`);
106
+ return { kind: "from", value: relativeToPackage(detected.docsDir, dir) };
107
+ }
108
+ if (detected.openapi !== undefined) {
109
+ notes.push(`Found an OpenAPI document at ${detected.openapi}.`);
110
+ return { kind: "openapi", value: relativeToPackage(detected.openapi, dir) };
111
+ }
112
+ return { kind: "seeded", value: "./docs" };
113
+ }
114
+ /**
115
+ * Build inputs are recorded relative to the package directory, because that is where
116
+ * `docspack build` runs from.
117
+ */
118
+ function relativeToPackage(target, dir) {
119
+ if (/^https?:\/\//i.test(target))
120
+ return target;
121
+ const normalized = target.replace(/\\/g, "/").replace(/^\.\//, "");
122
+ const relative = posix.relative(dir.replace(/\\/g, "/"), normalized);
123
+ return relative.startsWith(".") ? relative : `./${relative}`;
124
+ }
125
+ function buildConfigFor(input) {
126
+ switch (input.kind) {
127
+ case "openapi":
128
+ return { openapi: input.value };
129
+ case "mirror":
130
+ return { source: input.value };
131
+ default:
132
+ return { from: input.value, maxChunkTokens: 800 };
133
+ }
134
+ }
135
+ function workflowArgs(input) {
136
+ switch (input.kind) {
137
+ case "openapi":
138
+ return ` --openapi ${input.value}`;
139
+ case "mirror":
140
+ return ` ${input.value}`;
141
+ default:
142
+ return ` --from ${input.value}`;
143
+ }
144
+ }
145
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/init/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type BuildResult } from "../build.js";
2
+ import { type DoctorReport } from "../doctor.js";
3
+ import { Prompter } from "../prompt.js";
4
+ import { type Detected } from "./detect.js";
5
+ import { type InitOptions, type InitPlan } from "./plan.js";
6
+ import { type WrittenFile } from "./write.js";
7
+ export interface RunInitOptions extends InitOptions {
8
+ readonly cwd: string;
9
+ /** Skip every prompt and use flags plus detected defaults. */
10
+ readonly yes?: boolean;
11
+ readonly dryRun?: boolean;
12
+ readonly force?: boolean;
13
+ /** Run the first build after scaffolding. Defaults to true. */
14
+ readonly build?: boolean;
15
+ readonly prompter?: Prompter;
16
+ readonly onProgress?: (message: string) => void;
17
+ }
18
+ export interface InitResult {
19
+ readonly detected: Detected;
20
+ readonly plan: InitPlan;
21
+ readonly written: readonly WrittenFile[];
22
+ readonly build?: BuildResult;
23
+ readonly doctor?: DoctorReport;
24
+ readonly cancelled: boolean;
25
+ }
26
+ /** detect → propose → confirm → write → build → doctor. */
27
+ export declare function runInit(options: RunInitOptions): Promise<InitResult>;
28
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/init/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAgC,MAAM,WAAW,CAAC;AAC1F,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,2DAA2D;AAC3D,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAoC1E"}
@@ -0,0 +1,96 @@
1
+ import { join } from "node:path";
2
+ import { buildPackage } from "../build.js";
3
+ import { runDoctor } from "../doctor.js";
4
+ import { Prompter } from "../prompt.js";
5
+ import { detectProject } from "./detect.js";
6
+ import { planInit, proposePackageName } from "./plan.js";
7
+ import { applyPlan } from "./write.js";
8
+ /** detect → propose → confirm → write → build → doctor. */
9
+ export async function runInit(options) {
10
+ const detected = await detectProject(options.cwd);
11
+ const prompter = options.prompter ?? new Prompter();
12
+ const interactive = options.yes !== true && prompter.interactive;
13
+ const answers = interactive ? await ask(prompter, options, detected) : options;
14
+ const plan = planInit(answers, detected);
15
+ if (interactive) {
16
+ prompter.note("");
17
+ for (const note of plan.notes)
18
+ prompter.note(` · ${note}`);
19
+ prompter.note("");
20
+ if (!(await prompter.confirm(`Write ${plan.files.length} files to ${plan.dir}/?`))) {
21
+ prompter.close();
22
+ return { detected, plan, written: [], cancelled: true };
23
+ }
24
+ prompter.close();
25
+ }
26
+ const written = await applyPlan(options.cwd, plan, {
27
+ ...(options.force === undefined ? {} : { force: options.force }),
28
+ ...(options.dryRun === undefined ? {} : { dryRun: options.dryRun }),
29
+ });
30
+ if (options.dryRun === true || options.build === false) {
31
+ return { detected, plan, written, cancelled: false };
32
+ }
33
+ const dir = join(options.cwd, plan.dir);
34
+ const built = await buildPackage({
35
+ out: dir,
36
+ ...(options.onProgress === undefined ? {} : { onProgress: options.onProgress }),
37
+ });
38
+ const doctor = await runDoctor({ dir });
39
+ return { detected, plan, written, build: built, doctor, cancelled: false };
40
+ }
41
+ async function ask(prompter, options, detected) {
42
+ const community = options.community === true;
43
+ const proposed = options.name ??
44
+ (detected.libraryName === undefined ? undefined : proposePackageName(detected, community));
45
+ if (detected.libraryName !== undefined) {
46
+ const where = [
47
+ `${detected.libraryName}${detected.libraryVersion === undefined ? "" : `@${detected.libraryVersion}`}`,
48
+ detected.docsDir === undefined
49
+ ? undefined
50
+ : `${detected.docsDir}/ (${detected.docsFiles} files)`,
51
+ detected.openapi,
52
+ ].filter((part) => part !== undefined);
53
+ prompter.note(`Detected ${where.join(" · ")}\n`);
54
+ }
55
+ const name = await prompter.text("Package name", proposed ?? "@acme/docspack");
56
+ const version = await prompter.text("Version", options.version ?? detected.libraryVersion ?? "0.1.0");
57
+ const input = await selectInput(prompter, options, detected);
58
+ const out = await prompter.text("Directory", options.out ?? "docspack");
59
+ const workflow = await prompter.confirm("Add the release workflow?", options.workflow !== false);
60
+ return {
61
+ ...options,
62
+ name,
63
+ version,
64
+ out,
65
+ workflow,
66
+ ...input,
67
+ };
68
+ }
69
+ async function selectInput(prompter, options, detected) {
70
+ if (options.from !== undefined)
71
+ return { from: options.from };
72
+ if (options.openapi !== undefined)
73
+ return { openapi: options.openapi };
74
+ if (options.mirror !== undefined)
75
+ return { mirror: options.mirror };
76
+ const choices = [];
77
+ if (detected.docsDir !== undefined) {
78
+ choices.push({
79
+ value: { from: detected.docsDir },
80
+ label: `${detected.docsDir}/`,
81
+ hint: `${detected.docsFiles} Markdown files`,
82
+ });
83
+ }
84
+ if (detected.openapi !== undefined) {
85
+ choices.push({
86
+ value: { openapi: detected.openapi },
87
+ label: detected.openapi,
88
+ hint: "one chunk per operation",
89
+ });
90
+ }
91
+ choices.push({ value: {}, label: "start from templates", hint: "seeds docs/ with three files" });
92
+ if (choices.length === 1)
93
+ return {};
94
+ return prompter.select("Documentation source", choices);
95
+ }
96
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/init/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface PackageJsonInput {
2
+ readonly name: string;
3
+ readonly version: string;
4
+ readonly libraryName?: string;
5
+ readonly repository?: string;
6
+ readonly license?: string;
7
+ readonly build: Record<string, string | number>;
8
+ readonly docspackVersion: string;
9
+ }
10
+ /** Marker the doctor looks for, so a half-filled template cannot be published as documentation. */
11
+ export declare const PLACEHOLDER = "TODO:";
12
+ export declare function packageJson(input: PackageJsonInput): string;
13
+ export declare function readme(name: string, libraryName: string | undefined): string;
14
+ export declare function gitignore(): string;
15
+ /**
16
+ * Three seeds that map onto how retrieval works: one chunk should answer one question. The
17
+ * guidance in them is what `docspack doctor` checks, so following it keeps the package clean.
18
+ */
19
+ export declare function docSeeds(subject: string): {
20
+ path: string;
21
+ contents: string;
22
+ }[];
23
+ export declare function workflow(name: string, buildArgs: string): string;
24
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,mGAAmG;AACnG,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CA8B3D;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAkC5E;AAED,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAyD9E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA4ChE"}