@inditextech/docouture-cli 0.1.0-SNAPSHOT.40.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 (94) hide show
  1. package/build/bin.js +321 -0
  2. package/build/commands/build.js +22 -0
  3. package/build/commands/completion.js +69 -0
  4. package/build/commands/dev.js +67 -0
  5. package/build/commands/doctor.js +156 -0
  6. package/build/commands/eject.js +71 -0
  7. package/build/commands/new.js +512 -0
  8. package/build/commands/publish.js +111 -0
  9. package/build/commands/teardown.js +66 -0
  10. package/build/commands/upgrade.js +156 -0
  11. package/build/commands/version.js +60 -0
  12. package/build/lib/agents-md.js +67 -0
  13. package/build/lib/antora-log.js +36 -0
  14. package/build/lib/antora-yml.js +47 -0
  15. package/build/lib/args.js +26 -0
  16. package/build/lib/cli-context.js +17 -0
  17. package/build/lib/cli-info.js +20 -0
  18. package/build/lib/config-resolver.js +23 -0
  19. package/build/lib/copy-template.js +162 -0
  20. package/build/lib/debug-log.js +21 -0
  21. package/build/lib/detect-package-manager.js +79 -0
  22. package/build/lib/dev-server.js +337 -0
  23. package/build/lib/doctor-checks.js +240 -0
  24. package/build/lib/global-flags.js +31 -0
  25. package/build/lib/kroki-compose.js +54 -0
  26. package/build/lib/playbook-yml.js +90 -0
  27. package/build/lib/repo-root.js +21 -0
  28. package/build/lib/run-script.js +50 -0
  29. package/build/lib/theme.js +51 -0
  30. package/build/templates/agent-support/.claude/skills/docs-internals/SKILL.md +53 -0
  31. package/build/templates/agent-support/.claude/skills/docs-internals/reference/antora-extensions.md +54 -0
  32. package/build/templates/agent-support/.claude/skills/docs-internals/reference/naming.md +41 -0
  33. package/build/templates/agent-support/.claude/skills/docs-internals/reference/page-patterns.md +238 -0
  34. package/build/templates/agent-support/.claude/skills/docs-versioning.versioned/SKILL.md +37 -0
  35. package/build/templates/agent-support/.claude/skills/docs-versioning.versioned/reference/releasing.md +106 -0
  36. package/build/templates/agent-support/.claude/skills/documenting-your-repo/SKILL.md +55 -0
  37. package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/content-sourcing.md +55 -0
  38. package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/maintenance-loop.md +68 -0
  39. package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/structure-planning.md +102 -0
  40. package/build/templates/agent-support/.claude/skills/writing-docs-pages/SKILL.md +112 -0
  41. package/build/templates/agent-support/.claude/skills/writing-docs-pages/reference/docouture-blocks.md +170 -0
  42. package/build/templates/agent-support/.claude/skills/writing-docs-pages/reference/language-basics.md +402 -0
  43. package/build/templates/agent-support/.opencode/skills/docs-internals/SKILL.md +53 -0
  44. package/build/templates/agent-support/.opencode/skills/docs-internals/reference/antora-extensions.md +54 -0
  45. package/build/templates/agent-support/.opencode/skills/docs-internals/reference/naming.md +41 -0
  46. package/build/templates/agent-support/.opencode/skills/docs-internals/reference/page-patterns.md +238 -0
  47. package/build/templates/agent-support/.opencode/skills/docs-versioning.versioned/SKILL.md +37 -0
  48. package/build/templates/agent-support/.opencode/skills/docs-versioning.versioned/reference/releasing.md +106 -0
  49. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/SKILL.md +55 -0
  50. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/content-sourcing.md +55 -0
  51. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/maintenance-loop.md +68 -0
  52. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/structure-planning.md +102 -0
  53. package/build/templates/agent-support/.opencode/skills/writing-docs-pages/SKILL.md +112 -0
  54. package/build/templates/agent-support/.opencode/skills/writing-docs-pages/reference/docouture-blocks.md +170 -0
  55. package/build/templates/agent-support/.opencode/skills/writing-docs-pages/reference/language-basics.md +402 -0
  56. package/build/templates/agent-support/AGENTS.md +72 -0
  57. package/build/templates/starter/antora-playbook.local.yml +99 -0
  58. package/build/templates/starter/antora-playbook.versioned.yml +167 -0
  59. package/build/templates/starter/antora-playbook.yml +189 -0
  60. package/build/templates/starter/gitignore +3 -0
  61. package/build/templates/starter/package.json +37 -0
  62. package/build/templates/starter/scripts/check-links.mjs +178 -0
  63. package/build/templates/starter/src/antora.yml +85 -0
  64. package/build/templates/starter/src/modules/ROOT/images/card-placeholder.png +0 -0
  65. package/build/templates/starter/src/modules/ROOT/images/feature-placeholder-dark.png +0 -0
  66. package/build/templates/starter/src/modules/ROOT/images/feature-placeholder.png +0 -0
  67. package/build/templates/starter/src/modules/ROOT/images/hero-placeholder.png +0 -0
  68. package/build/templates/starter/src/modules/ROOT/pages/index.adoc +124 -0
  69. package/build/templates/starter/src/modules/main/nav.adoc +19 -0
  70. package/build/templates/starter/src/modules/main/pages/app.adoc +5 -0
  71. package/build/templates/starter/src/modules/main/pages/architecture.adoc +6 -0
  72. package/build/templates/starter/src/modules/main/pages/changelog/index.adoc +9 -0
  73. package/build/templates/starter/src/modules/main/pages/components.adoc +701 -0
  74. package/build/templates/starter/src/modules/main/pages/contributing.adoc +6 -0
  75. package/build/templates/starter/src/modules/main/pages/getting-started.adoc +169 -0
  76. package/build/templates/starter/src/modules/main/pages/glossary.adoc +8 -0
  77. package/build/templates/starter/src/modules/main/pages/index.adoc +9 -0
  78. package/build/templates/starter/src/modules/main/pages/prerequisites.adoc +55 -0
  79. package/build/templates/starter/src/modules/main/pages/quickstart.adoc +21 -0
  80. package/build/templates/starter/src/modules/main/pages/release-notes/index.adoc +9 -0
  81. package/build/templates/starter/src/modules/main/pages/requirements.adoc +8 -0
  82. package/build/templates/starter/src/modules/main/pages/roadmap.adoc +4 -0
  83. package/build/templates/starter/src/modules/main/pages/structure.adoc +5 -0
  84. package/build/templates/starter/src/release-version.versioned +1 -0
  85. package/build/templates/starter/supplemental-ui/favicon.ico +0 -0
  86. package/build/templates/starter/supplemental-ui/product-logo-dark.png +0 -0
  87. package/build/templates/starter/supplemental-ui/product-logo.png +0 -0
  88. package/build/templates/workflows/docouture-kroki-cache-warm.yml +101 -0
  89. package/build/templates/workflows/docouture-pr-verify.yml +120 -0
  90. package/build/templates/workflows/docouture-publish-prerelease.yml +122 -0
  91. package/build/templates/workflows/docouture-publish.yml +138 -0
  92. package/build/templates/workflows/docouture-release-preview.yml +198 -0
  93. package/build/templates/workflows/docouture-release.yml +414 -0
  94. package/package.json +38 -0
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env node
2
+ 'use strict'
3
+
4
+ // Checks the built site (build/site) for broken links, but only ever FAILS
5
+ // on a broken EXTERNAL (http/https) link — a raw link in content Antora
6
+ // itself can't see, which is the whole reason this check exists (Antora's
7
+ // own strict mode, runtime.log.failure_level: warn, already fails the build
8
+ // on a broken xref before this script ever runs).
9
+ //
10
+ // A broken LOCAL link is reported as a warning, never a failure. Two
11
+ // reasons a local link can legitimately show up BROKEN here even though
12
+ // nothing is actually wrong:
13
+ //
14
+ // 1. docouture-pr-verify.yml and docouture-release.yml both build with
15
+ // antora-playbook.local.yml (branches: HEAD only) rather than the real,
16
+ // multi-source antora-playbook.yml — content generated from config
17
+ // rather than an xref (the module switcher, the footer, a
18
+ // urls.latest_version_segment alias) can point at another version or
19
+ // component that simply isn't part of this reduced, single-source
20
+ // build. Antora doesn't fail on these (they're not xrefs it resolves),
21
+ // but linkinator, crawling the actual rendered HTML, will.
22
+ // 2. Any other local-link false positive linkinator produces against
23
+ // content Antora itself is satisfied with.
24
+ //
25
+ // A broken link matching an IGNORE pattern (see IGNORE_PATTERNS below) is
26
+ // also only a warning — same reasoning, different cause: it starts with
27
+ // http(s):// so it looks external, but it isn't a real third-party
28
+ // dependency an author is vouching for.
29
+ //
30
+ // Uses linkinator's own JS API (see @inditextech/docouture-*'s own
31
+ // devDependency on it in package.json) rather than shelling out to its CLI:
32
+ // the CLI's own --skip flag can only exclude a link from being checked
33
+ // altogether (see linkinator's own source, LinkChecker#crawl: a skipped URL
34
+ // is never fetched, so it can neither be validated NOR recursed into) — it
35
+ // cannot express "fetch and recurse through this page, just don't fail the
36
+ // whole job over IT specifically". Classifying results after the fact, via
37
+ // the API, is the only way to get both: a full recursive crawl of every
38
+ // generated page (so a raw external link buried three pages deep still gets
39
+ // found), and a pass/fail decision that only external links get to make.
40
+ import { readFile } from 'node:fs/promises'
41
+ import { check } from 'linkinator'
42
+
43
+ const SKIP = ['^(mailto:|tel:)']
44
+
45
+ // linkinator's own mapUrl() (see its src/index.ts) strips the local static
46
+ // server's http://127.0.0.1:<port> prefix from every local result before
47
+ // it's reported — the port is random per run, so this is the only stable
48
+ // way to tell a local link from an external one after the fact: whatever's
49
+ // left over either still starts with http(s):// (a real external URL) or
50
+ // doesn't (a local one, already rewritten to a bare path).
51
+ const isExternal = (url) => /^https?:\/\//.test(url)
52
+
53
+ // A simple shell-style glob, not a regex: `*` matches any run of characters
54
+ // (including none), `?` matches exactly one, everything else is literal —
55
+ // most people writing "which links to ignore" think in terms of a host or a
56
+ // path shape, not regex syntax, and a literal `.` (as in every hostname) is
57
+ // far more likely to be meant literally than as "any character". Escapes
58
+ // every other regex metacharacter so the rest of the string is matched
59
+ // verbatim.
60
+ function globToRegExp(glob) {
61
+ const escaped = glob.replace(/[.+^${}()|[\]\\]/g, '\\$&')
62
+ return new RegExp(escaped.replace(/\*/g, '.*').replace(/\?/g, '.'))
63
+ }
64
+
65
+ // `package.json`'s own "docouture" config block (see the scaffolded stub, next
66
+ // to "docouture.publish") is this project's existing place for a local,
67
+ // site-specific override — `docouture.checkLinks.ignore` is a list of globs
68
+ // (see globToRegExp above), tested the same way linkinator's own
69
+ // `--skip`/`linksToSkip` are, but warned rather than silently dropped so an
70
+ // ignored link that starts failing for a REAL reason still shows up
71
+ // somewhere. Scaffolded with these default entries already in it (see
72
+ // package.json's own comment... it's JSON, so there isn't one — this is
73
+ // that comment):
74
+ //
75
+ // - `*/edit/HEAD/*` — the footer's "Propose a change" link
76
+ // (edit-this-page.hbs) renders `page.editUrl`, which Antora builds from
77
+ // whatever ref it detects checked out. docouture-pr-verify.yml and
78
+ // docouture-release.yml both build from a detached-HEAD checkout (a PR
79
+ // merge commit, or a one-off commit on top of main — see those
80
+ // workflows' own comments), so Antora has no real branch name to put
81
+ // there and falls back to the literal string `HEAD` — a path GitHub's
82
+ // web UI never resolves. This is deterministic, not flaky: it will be
83
+ // "broken" on every single PR-verify/release run of every scaffolded
84
+ // site, regardless of content, so it carries no signal worth failing a
85
+ // build over.
86
+ // - `https://<org>.github.io/<repo>` — getting-started.adoc's own
87
+ // "Publish the docs" section mentions this literal, illustrative
88
+ // placeholder as an example of what `site.url` should look like for a
89
+ // GitHub Pages project page. Asciidoctor auto-links any bare http(s)
90
+ // URL it finds, including inside monospace text, so this example ends
91
+ // up as a real (and obviously never-resolving) link in the built HTML.
92
+ // - this site's own repo link (repo-link.hbs renders `site.keys.repoUrl`,
93
+ // or absent that Antora's own `page.origin.webUrl` — same URL either
94
+ // way, computed by `docouture new` from `git remote get-url origin` at
95
+ // scaffold time; see new.ts's own repoIgnoreGlob()), shown once per page
96
+ // so a single broken link here would otherwise report once per page in
97
+ // the results. There's a real, principled reason it can 404 to an
98
+ // anonymous CI crawler even when nothing is actually wrong: GitHub
99
+ // returns 404 (not 403) for a private repo when unauthenticated,
100
+ // indistinguishable from one that doesn't exist, and plenty of docs
101
+ // sites publish before (or without ever) making their source repo
102
+ // public. A harmless sentinel glob that can never match a real URL
103
+ // fills this slot instead when there was no `origin` remote configured
104
+ // yet at scaffold time — never an empty string, which would silently
105
+ // ignore every link. Baked in once, at scaffold
106
+ // time, rather than recomputed here on every run: if this repo's remote
107
+ // is later renamed or moved, this entry goes stale along with it, the
108
+ // same as any other config a site owner would need to update by hand.
109
+ async function ignorePatterns() {
110
+ let pkg
111
+ try {
112
+ pkg = JSON.parse(await readFile('package.json', 'utf8'))
113
+ } catch {
114
+ return []
115
+ }
116
+ const ignore = pkg?.docouture?.checkLinks?.ignore
117
+ return Array.isArray(ignore) ? ignore.map(globToRegExp) : []
118
+ }
119
+
120
+ const IGNORE_PATTERNS = await ignorePatterns()
121
+
122
+ // An absolute link whose host is `localhost` or `127.0.0.1` — a
123
+ // self-referential `site.url` (or similar absolute-URL config) that happens
124
+ // to point at wherever someone's local dev server runs. That address is
125
+ // never actually serving anything while this script runs its own,
126
+ // unrelated throwaway static server, so the link is "broken" as a pure
127
+ // artifact of running the check at all, not because the site's content is
128
+ // wrong. Kept as its own structural check (not a package.json default)
129
+ // since it applies to every site unconditionally, with nothing to
130
+ // configure.
131
+ const isNonRepresentative = (url) =>
132
+ /^https?:\/\/(localhost|127\.0\.0\.1)(:|\/|$)/.test(url) || IGNORE_PATTERNS.some((pattern) => pattern.test(url))
133
+
134
+ const result = await check({
135
+ path: 'build/site',
136
+ recurse: true,
137
+ linksToSkip: SKIP,
138
+ // A plain 403/429 from a real external host (most commonly GitHub's own
139
+ // bot/rate-limit protection kicking in on repo links, hit repeatedly
140
+ // across every page of a freshly built site) can't be told apart from a
141
+ // genuinely dead link — linkinator's own README documents the same
142
+ // reasoning for its built-in 403 (Cloudflare)/999 (LinkedIn) handling.
143
+ // Treating these as a warning rather than a failure extends that same
144
+ // policy to any host, not just the two it special-cases already.
145
+ statusCodes: {
146
+ 403: 'warn',
147
+ 429: 'warn',
148
+ },
149
+ })
150
+
151
+ const broken = result.links.filter((link) => link.state === 'BROKEN')
152
+ const local = broken.filter((link) => !isExternal(link.url))
153
+ const nonRepresentative = broken.filter((link) => isExternal(link.url) && isNonRepresentative(link.url))
154
+ const external = broken.filter((link) => isExternal(link.url) && !isNonRepresentative(link.url))
155
+
156
+ for (const link of local) {
157
+ console.log(`::warning::local link reported broken (ignored): ${link.url} (parent: ${link.parent ?? 'unknown'})`)
158
+ }
159
+
160
+ for (const link of nonRepresentative) {
161
+ console.log(
162
+ `::warning::non-representative link reported broken (ignored — see this script's own comment): ${link.url} (parent: ${link.parent ?? 'unknown'})`
163
+ )
164
+ }
165
+
166
+ if (external.length > 0) {
167
+ for (const link of external) {
168
+ console.log(`::error::broken external link: ${link.url} (parent: ${link.parent ?? 'unknown'})`)
169
+ }
170
+ console.error(`\n${external.length} broken external link(s) found.`)
171
+ process.exit(1)
172
+ }
173
+
174
+ const ignored = local.length + nonRepresentative.length
175
+ console.log(
176
+ `Checked ${result.links.length} link(s): 0 broken external link(s)` +
177
+ (ignored > 0 ? `, ${ignored} local/non-representative link(s) ignored (see warnings above).` : '.')
178
+ )
@@ -0,0 +1,85 @@
1
+ # Component descriptor. Every directory Antora treats as documentation needs
2
+ # one of these. See https://docs.antora.org/antora/latest/component-version/
3
+ #
4
+ # `name` is either this site's own name (a real URL path segment on
5
+ # publish) or Antora's reserved `ROOT` (contributes no segment at all) —
6
+ # decided by the `docouture new` wizard's "extra URL path segment" question (or
7
+ # `--url-segment`), default off/ROOT. See antora-playbook.yml's own
8
+ # site.url comment for the full GitHub Pages URL shape either way.
9
+ name: __DOCOUTURE_COMPONENT_NAME__
10
+ title: __DOCOUTURE_TITLE__
11
+ # This descriptor is identical for BOTH versioning modes — see the docouture
12
+ # docs-site-package skill's reference/versioning-modes.md. `main` permanently
13
+ # says `version: prerelease`, `prerelease: true`, regardless of whether this
14
+ # site was scaffolded standalone or versioned (`docouture new --mode versioned`).
15
+ # What differs between the two modes is only antora-playbook.yml's
16
+ # content.sources[] tags (`stable` vs `v*`) and what a release tag's own copy
17
+ # of this file ends up saying: standalone's `stable` tag says
18
+ # `version: stable`, `prerelease: false`; a versioned release tag (v1.2.0,
19
+ # ...) says `version: '1.2.0'`, `prerelease: false`. Until the first release
20
+ # this site has just the one (prerelease) version — that is expected.
21
+ version: prerelease
22
+ prerelease: true
23
+ # The site's landing page: modules/ROOT/pages/index.adoc, rendered through
24
+ # the UI bundle's `home` layout. Naming it here (rather than relying on
25
+ # Antora's own default) is what stops it fabricating a synthetic
26
+ # component-root "previous" URL for the first nav entry — a page that
27
+ # doesn't exist — which would otherwise break the pagination footer's
28
+ # "previous" link on the very first page of the site.
29
+ #
30
+ # ROOT is deliberately absent from the `nav` list below: the landing is
31
+ # reached from the header's product name and the side menu's brand block,
32
+ # not as a row in the navigation tree, and it borrows `main`'s navigation
33
+ # for its own side menu (`:page-nav-module: main` in that page's own header).
34
+ start_page: ROOT:index.adoc
35
+ nav:
36
+ - modules/main/nav.adoc
37
+
38
+ # Per-module navigation metadata, read by @inditextech/docouture-antora-extensions
39
+ # (registered under `antora.extensions` in the playbook) and attached to the
40
+ # navigation trees Antora builds from the `nav` list above. It is what lets
41
+ # the UI show one module's navigation at a time, with a switcher between
42
+ # modules once there is more than one — this scaffold starts with a single
43
+ # placeholder module (`main`); add another entry here, alongside a second
44
+ # `modules/<name>/nav.adoc` in the `nav` list above, to see the switcher
45
+ # itself appear.
46
+ #
47
+ # A LIST, not a map keyed by module — deliberately, and it must stay one. See
48
+ # @inditextech/docouture-antora-extensions's own docs for why: a map's keys get
49
+ # silently camelCased by Antora's content aggregator, which breaks any module
50
+ # slug containing a hyphen.
51
+ #
52
+ # `icon` is `<group>/<name>` from the UI bundle's own vendored sprite
53
+ # (packages/ui-bundle/src/img/icons.yml) — an icon name is not free-form.
54
+ nav_modules:
55
+ - module: main
56
+ title: Documentation
57
+ description: Placeholder documentation module — replace with your own content.
58
+ icon: design/grid-outlined
59
+
60
+ # Which module's navigation the generated 404 page's side menu shows, read
61
+ # by @inditextech/docouture-antora-extensions. With a single module there is
62
+ # only one sensible value; update this alongside nav_modules above if a
63
+ # second module is added and the 404 page should point somewhere else.
64
+ not_found_module: main
65
+
66
+ # Site footer link groups (read by @inditextech/docouture-antora-extensions and
67
+ # attached to this component version as `footer`). Authored here rather than
68
+ # in the playbook because `site.keys` is a flat primitive map and cannot
69
+ # carry a list.
70
+ #
71
+ # A footer.groups list is positional (index 0 → column 2, 1 → column 3's
72
+ # fallback — used only when this component has fewer than two switchable
73
+ # modules, which is the case here with just `main` above — 2 → column 4), not
74
+ # keyed. `url` is either a page ID — the same string xref:...[] accepts — or
75
+ # a literal URL; one that resolves to no page is dropped with a warning
76
+ # rather than rendered dead. `title` is optional per group; omit it for a
77
+ # column with no heading.
78
+ footer:
79
+ groups:
80
+ - title: Resources
81
+ links:
82
+ - text: Home
83
+ url: ROOT:index.adoc
84
+ - text: Getting started
85
+ url: main:getting-started.adoc
@@ -0,0 +1,124 @@
1
+ = __DOCOUTURE_TITLE__
2
+ :page-layout: home
3
+ :page-nav-module: main
4
+ :description: Replace this with a one-line description of __DOCOUTURE_TITLE__ — it feeds page metadata as well as the hero.
5
+ :page-tags: replace, these, tags
6
+ :page-action: Get started
7
+ :page-action-url: main:getting-started.adoc
8
+ :page-action-secondary: About
9
+ :page-action-secondary-url: main:index.adoc
10
+ :page-hero-image: hero-placeholder.png
11
+ :page-hero-image-alt: Placeholder standing in for a product screenshot or diagram.
12
+
13
+ Replace this preamble with a short lead-in for __DOCOUTURE_TITLE__ — one or two
14
+ sentences, no heading of its own. It sits above the `Get started` row below
15
+ and is the first thing a reader sees beside the hero.
16
+
17
+ == Get started
18
+
19
+ [cards,type=image-square,columns="1 s:2 m:4",width=container]
20
+ ====
21
+ [card,subheader="Start here"]
22
+ .xref:main:getting-started.adoc[Getting started]
23
+ --
24
+ image::card-placeholder.png[Placeholder card image]
25
+
26
+ Add a page, build the site, publish it.
27
+ --
28
+
29
+ [card,subheader="Overview"]
30
+ .xref:main:index.adoc[About]
31
+ --
32
+ image::card-placeholder.png[Placeholder card image]
33
+
34
+ What this placeholder module is, and how to replace it with real content.
35
+ --
36
+
37
+ [card,subheader="Reference"]
38
+ .xref:main:quickstart.adoc[Quickstart]
39
+ --
40
+ image::card-placeholder.png[Placeholder card image]
41
+
42
+ The smallest path to a working result, as concrete steps.
43
+ --
44
+
45
+ [card,subheader="Design"]
46
+ .xref:main:architecture.adoc[Architecture]
47
+ --
48
+ image::card-placeholder.png[Placeholder card image]
49
+
50
+ Where to describe the system's major components and how they fit together.
51
+ --
52
+ ====
53
+
54
+ == Key features
55
+
56
+ Replace this `[feature-tabs]` block with __DOCOUTURE_TITLE__'s own — each slide
57
+ is a media still, a short paragraph, and an optional call to action.
58
+
59
+ [feature-tabs]
60
+ ====
61
+ [feature,label="Replace me"]
62
+ --
63
+ image::feature-placeholder.png[Placeholder feature image]
64
+ image::feature-placeholder-dark.png[role=dark]
65
+
66
+ Describe the first thing worth knowing about __DOCOUTURE_TITLE__ here.
67
+
68
+ [.cta]
69
+ xref:main:index.adoc[Learn more]
70
+ --
71
+
72
+ [feature,label="Replace me too"]
73
+ --
74
+ image::feature-placeholder.png[Placeholder feature image]
75
+ image::feature-placeholder-dark.png[role=dark]
76
+
77
+ A second slide, same shape — media, prose, an optional call to action.
78
+
79
+ [.cta]
80
+ xref:main:architecture.adoc[Learn more]
81
+ --
82
+
83
+ [feature,label="And this one"]
84
+ --
85
+ image::feature-placeholder.png[Placeholder feature image]
86
+ image::feature-placeholder-dark.png[role=dark]
87
+
88
+ A third slide. A slide with no call to action is fine too — it is optional.
89
+ --
90
+ ====
91
+
92
+ == Free & open source
93
+
94
+ Replace or remove this `[cta]` block — a flat one-line pitch plus a single
95
+ primary action, styled apart from the ordinary body copy above it.
96
+
97
+ [cta]
98
+ ====
99
+ Replace this with a short pitch for __DOCOUTURE_TITLE__ — why it is worth a
100
+ reader's attention.
101
+
102
+ [.primary]
103
+ https://github.com[Replace with a real link]
104
+ ====
105
+
106
+ == Frequently asked questions
107
+
108
+ Replace this `[accordion]` block with __DOCOUTURE_TITLE__'s own real questions —
109
+ this is a placeholder shape, not sample copy to keep.
110
+
111
+ [accordion,aria-label="Frequently asked questions"]
112
+ --
113
+ .Replace this with a real question?
114
+ [%collapsible]
115
+ ====
116
+ Replace this with a real answer.
117
+ ====
118
+
119
+ .And a second one?
120
+ [%collapsible]
121
+ ====
122
+ Answers can be as short or as long as the question needs.
123
+ ====
124
+ --
@@ -0,0 +1,19 @@
1
+ * Welcome to docouture
2
+ * xref:main:prerequisites.adoc[Prerequisites]
3
+ * xref:main:getting-started.adoc[Getting started]
4
+ * xref:main:components.adoc[AsciiDoc components]
5
+ * Overview
6
+ * xref:main:index.adoc[About]
7
+ * xref:main:architecture.adoc[Architecture]
8
+ * xref:main:structure.adoc[Structure]
9
+ * xref:main:glossary.adoc[Glossary]
10
+ * Getting started
11
+ * xref:main:requirements.adoc[Requirements]
12
+ * xref:main:quickstart.adoc[Quickstart]
13
+ * App
14
+ * xref:main:app.adoc[Overview]
15
+ * Additional information
16
+ * xref:main:release-notes/index.adoc[Release notes]
17
+ * xref:main:changelog/index.adoc[Changelog]
18
+ * xref:main:roadmap.adoc[Roadmap]
19
+ * xref:main:contributing.adoc[Contributing]
@@ -0,0 +1,5 @@
1
+ = Overview
2
+
3
+ Describe the application (or product, or API) this module documents — what
4
+ it does, and the shape of the reference material a reader will find under
5
+ this section as it grows.
@@ -0,0 +1,6 @@
1
+ = Architecture
2
+
3
+ Describe the system's architecture here — its major components, how they
4
+ fit together, and the boundaries between them. A diagram is often the most
5
+ useful thing on this page; AsciiDoc's `image::` macro embeds one from
6
+ `modules/main/images/`.
@@ -0,0 +1,9 @@
1
+ = Changelog
2
+
3
+ The unabridged, commit-level record of changes — in contrast to
4
+ xref:main:release-notes/index.adoc[Release notes], which summarizes what
5
+ matters to users.
6
+
7
+ == v0.1.0
8
+
9
+ * Placeholder entry. Replace with the real changelog.