@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.
- package/build/bin.js +321 -0
- package/build/commands/build.js +22 -0
- package/build/commands/completion.js +69 -0
- package/build/commands/dev.js +67 -0
- package/build/commands/doctor.js +156 -0
- package/build/commands/eject.js +71 -0
- package/build/commands/new.js +512 -0
- package/build/commands/publish.js +111 -0
- package/build/commands/teardown.js +66 -0
- package/build/commands/upgrade.js +156 -0
- package/build/commands/version.js +60 -0
- package/build/lib/agents-md.js +67 -0
- package/build/lib/antora-log.js +36 -0
- package/build/lib/antora-yml.js +47 -0
- package/build/lib/args.js +26 -0
- package/build/lib/cli-context.js +17 -0
- package/build/lib/cli-info.js +20 -0
- package/build/lib/config-resolver.js +23 -0
- package/build/lib/copy-template.js +162 -0
- package/build/lib/debug-log.js +21 -0
- package/build/lib/detect-package-manager.js +79 -0
- package/build/lib/dev-server.js +337 -0
- package/build/lib/doctor-checks.js +240 -0
- package/build/lib/global-flags.js +31 -0
- package/build/lib/kroki-compose.js +54 -0
- package/build/lib/playbook-yml.js +90 -0
- package/build/lib/repo-root.js +21 -0
- package/build/lib/run-script.js +50 -0
- package/build/lib/theme.js +51 -0
- package/build/templates/agent-support/.claude/skills/docs-internals/SKILL.md +53 -0
- package/build/templates/agent-support/.claude/skills/docs-internals/reference/antora-extensions.md +54 -0
- package/build/templates/agent-support/.claude/skills/docs-internals/reference/naming.md +41 -0
- package/build/templates/agent-support/.claude/skills/docs-internals/reference/page-patterns.md +238 -0
- package/build/templates/agent-support/.claude/skills/docs-versioning.versioned/SKILL.md +37 -0
- package/build/templates/agent-support/.claude/skills/docs-versioning.versioned/reference/releasing.md +106 -0
- package/build/templates/agent-support/.claude/skills/documenting-your-repo/SKILL.md +55 -0
- package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/content-sourcing.md +55 -0
- package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/maintenance-loop.md +68 -0
- package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/structure-planning.md +102 -0
- package/build/templates/agent-support/.claude/skills/writing-docs-pages/SKILL.md +112 -0
- package/build/templates/agent-support/.claude/skills/writing-docs-pages/reference/docouture-blocks.md +170 -0
- package/build/templates/agent-support/.claude/skills/writing-docs-pages/reference/language-basics.md +402 -0
- package/build/templates/agent-support/.opencode/skills/docs-internals/SKILL.md +53 -0
- package/build/templates/agent-support/.opencode/skills/docs-internals/reference/antora-extensions.md +54 -0
- package/build/templates/agent-support/.opencode/skills/docs-internals/reference/naming.md +41 -0
- package/build/templates/agent-support/.opencode/skills/docs-internals/reference/page-patterns.md +238 -0
- package/build/templates/agent-support/.opencode/skills/docs-versioning.versioned/SKILL.md +37 -0
- package/build/templates/agent-support/.opencode/skills/docs-versioning.versioned/reference/releasing.md +106 -0
- package/build/templates/agent-support/.opencode/skills/documenting-your-repo/SKILL.md +55 -0
- package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/content-sourcing.md +55 -0
- package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/maintenance-loop.md +68 -0
- package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/structure-planning.md +102 -0
- package/build/templates/agent-support/.opencode/skills/writing-docs-pages/SKILL.md +112 -0
- package/build/templates/agent-support/.opencode/skills/writing-docs-pages/reference/docouture-blocks.md +170 -0
- package/build/templates/agent-support/.opencode/skills/writing-docs-pages/reference/language-basics.md +402 -0
- package/build/templates/agent-support/AGENTS.md +72 -0
- package/build/templates/starter/antora-playbook.local.yml +99 -0
- package/build/templates/starter/antora-playbook.versioned.yml +167 -0
- package/build/templates/starter/antora-playbook.yml +189 -0
- package/build/templates/starter/gitignore +3 -0
- package/build/templates/starter/package.json +37 -0
- package/build/templates/starter/scripts/check-links.mjs +178 -0
- package/build/templates/starter/src/antora.yml +85 -0
- package/build/templates/starter/src/modules/ROOT/images/card-placeholder.png +0 -0
- package/build/templates/starter/src/modules/ROOT/images/feature-placeholder-dark.png +0 -0
- package/build/templates/starter/src/modules/ROOT/images/feature-placeholder.png +0 -0
- package/build/templates/starter/src/modules/ROOT/images/hero-placeholder.png +0 -0
- package/build/templates/starter/src/modules/ROOT/pages/index.adoc +124 -0
- package/build/templates/starter/src/modules/main/nav.adoc +19 -0
- package/build/templates/starter/src/modules/main/pages/app.adoc +5 -0
- package/build/templates/starter/src/modules/main/pages/architecture.adoc +6 -0
- package/build/templates/starter/src/modules/main/pages/changelog/index.adoc +9 -0
- package/build/templates/starter/src/modules/main/pages/components.adoc +701 -0
- package/build/templates/starter/src/modules/main/pages/contributing.adoc +6 -0
- package/build/templates/starter/src/modules/main/pages/getting-started.adoc +169 -0
- package/build/templates/starter/src/modules/main/pages/glossary.adoc +8 -0
- package/build/templates/starter/src/modules/main/pages/index.adoc +9 -0
- package/build/templates/starter/src/modules/main/pages/prerequisites.adoc +55 -0
- package/build/templates/starter/src/modules/main/pages/quickstart.adoc +21 -0
- package/build/templates/starter/src/modules/main/pages/release-notes/index.adoc +9 -0
- package/build/templates/starter/src/modules/main/pages/requirements.adoc +8 -0
- package/build/templates/starter/src/modules/main/pages/roadmap.adoc +4 -0
- package/build/templates/starter/src/modules/main/pages/structure.adoc +5 -0
- package/build/templates/starter/src/release-version.versioned +1 -0
- package/build/templates/starter/supplemental-ui/favicon.ico +0 -0
- package/build/templates/starter/supplemental-ui/product-logo-dark.png +0 -0
- package/build/templates/starter/supplemental-ui/product-logo.png +0 -0
- package/build/templates/workflows/docouture-kroki-cache-warm.yml +101 -0
- package/build/templates/workflows/docouture-pr-verify.yml +120 -0
- package/build/templates/workflows/docouture-publish-prerelease.yml +122 -0
- package/build/templates/workflows/docouture-publish.yml +138 -0
- package/build/templates/workflows/docouture-release-preview.yml +198 -0
- package/build/templates/workflows/docouture-release.yml +414 -0
- 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
|
|
Binary file
|
|
@@ -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]
|