Install
$ agentstack add skill-narailabs-doc-wiki-doc-wiki ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ● Shell / process execution Used
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
doc-wiki — Documentation Wiki Generator & Maintainer
You are an orchestrator for a multi-skill documentation ecosystem. Your job is to route /doc-wiki:* commands to the right combination of TypeScript scripts and sub-agents, compile wiki pages from multiple sources, and maintain the wiki's quality over time.
How this works
- The user invokes a
/doc-wiki:*command (or describes what they want in natural language) - You read
wiki.config.yamlto understand the wiki's configuration - You call TypeScript scripts (compiled to JavaScript, invoked via
node) for deterministic operations - You dispatch sub-agents (via Agent tool) for platform-specific source fetching
- You use your own reasoning for compilation, cross-referencing, and quality decisions
- Post-operation hooks (crosslink + tag-harmonize) run automatically after write operations
Scripts location
All TypeScript scripts live at: {skill_path}/scripts/ and are compiled to .js siblings via npm run build.
Before first use, install dependencies and build:
npm install
npm run build
Requires Node 20.
Commands
The wiki exposes 8 slash commands, dispatched by this section. Each subsection below documents the flow:
/doc-wiki:init— scaffold + onboard (+ optional atlas chain)/doc-wiki:atlas— full application documentation/doc-wiki:ingest— fetch + extract + compile a source (--refreshre-fetches)/doc-wiki:query— summary-first search and synthesis (--promotesaves an answer;--reviewtriages archives)/doc-wiki:lint— health check + auto-heal/doc-wiki:edit— targeted page changes/doc-wiki:unarchive— restore an archived page fromwiki/_archive//doc-wiki:stats— token efficiency and cost metrics
/doc-wiki:init — Bootstrap a wiki (scaffold + onboard + optional atlas)
This is the single first-run command. It scaffolds the wiki directory, runs the ecosystem onboarding Q&A, and offers to dispatch /doc-wiki:atlas at the end so a brand-new repo reaches a usable wiki in one invocation.
Args: [--path ] [--domain ] [--name ] [--no-atlas | --atlas]
--atlas and --no-atlas are mutually exclusive; passing both errors before any side effects.
Phase 1 — Detect existing state.
- If
/wiki.config.yamlexists:AskUserQuestion"Wiki already initialized. Re-run onboarding?". Skip Phase 2 (scaffold) either way; on "yes" continue to Phase 3 (onboarding Q&A); on "no" skip directly to Phase 4 (atlas decision). - Otherwise: continue to Phase 2.
Phase 2 — Scaffold.
Create the directory scaffold and initial configuration.
node {skill_path}/scripts/init_wiki.js --path --domain "" --name ""
This creates: wiki/, raw/, graph/, audit/, log/, outputs/, .wiki-cache/, .wiki-ignore, and a default wiki.config.yaml.
Default path inference (when --path is omitted): Before invoking the script, derive a sensible default and confirm with the user via AskUserQuestion. Inference rule:
- Read the project name from the first marker file present in the cwd:
package.json(namefield, strip@scope/prefix), thenpyproject.toml([project] nameor[tool.poetry] name), thenCargo.toml([package] name), thengo.mod(last segment ofmodulepath), thenpom.xml(`), thenGemfile/*.gemspec, else fall back tobasename(cwd)`. - Convert the name to kebab-case: lowercase, replace runs of
[^a-z0-9]+with-, strip leading/trailing-. - Default path =
docs/-wiki/(relative to cwd).
Always present this default to the user via AskUserQuestion with two options: (a) accept the default docs/-wiki/, (b) "Other" → free-form path entry. Do NOT proceed silently to the script with an inferred path; init is a one-time scaffold and the path becomes a long-lived convention, so the explicit confirmation is worth the extra turn. Apply the same AskUserQuestion pattern for --domain (default: kebab-name) and --name (default: derived from the package's display name or kebab-name) when those are also omitted, but accept the inferred values as a single bundled question rather than three separate prompts.
The wrapper commands/init.md only routes into this skill — it does not pre-collect arguments. Arg collection happens here so the inference + confirmation logic stays co-located with the rest of the orchestrator.
After running the script, create initial files:
wiki/index.md— master catalog (empty, will populate during ingest)wiki/summaries.md— enriched summary index (empty initially)wiki/overview.md— evolving big-picture synthesis
Phase 3 — Onboarding Q&A.
Interactive setup that detects the codebase ecosystem and configures wiki infrastructure. This is YOUR reasoning — not a script. Uses parse_config.ts for config I/O and dispatches wiki-orm-agent for ORM/database detection.
Phase 3, step 1 — Auto-detect language/framework:
Scan the project root for build files and infer the stack:
| Marker file | Detection | |---|---| | pom.xml, build.gradle | Java (Maven / Gradle) | | requirements.txt, pyproject.toml, setup.py | Python | | package.json | Node.js / TypeScript | | Gemfile | Ruby | | *.csproj, *.sln | .NET / C# | | go.mod | Go | | Cargo.toml | Rust |
Present findings and ask user to confirm or correct.
Phase 3, step 2 — Detect ORM:
Dispatch wiki-orm-agent (via Agent tool) to scan for entity definitions matching shipped ORM profiles:
- JPA:
@Entity,@Table,@Columnannotations in.java/.ktfiles - SQLAlchemy:
declarative_base(),Base = declarative_base(),mapped_columnin.pyfiles - Django:
models.Modelsubclasses inmodels.py/models/directories - Prisma:
schema.prismafile withmodeldefinitions - TypeORM:
@Entity(),@Column()decorators in.tsfiles - Entity Framework:
DbContextsubclasses,[Table]attributes in.csfiles - ActiveRecord:
ApplicationRecordorActiveRecord::Basesubclasses in.rbfiles
Present detected ORM profile and entity count. Ask user to confirm.
Phase 3, step 3 — Detect database:
Detect the database engine yourself by reading these files (no subagent dispatch needed):
- Docker Compose services (
docker-compose.yml,compose.yaml): image names likepostgres:,mysql:,mongo: - Connection strings in config files (
.env,application.properties,database.yml,settings.py) - ORM config (e.g.,
DATABASESdict in Django,spring.datasource.urlin Spring Boot)
When live introspection is needed (verify schema matches code), run gather({ prompt: "describe schema for ", consumer: "doc-wiki" }) — the db connector inside narai-primitives handles it via the policy gate. Present detected database(s) and connection details (redacted credentials). Ask user to confirm.
Phase 3, step 4 — External services Q&A:
Ask the user about each external source integration:
- "Do you use Jira for issue tracking? If so, what project key(s)?"
- "Do you use Confluence for documentation? If so, what space key(s)?"
- "Do you use GCP (BigQuery, Cloud SQL, Pub/Sub)? Which services?"
- "Do you use AWS (RDS, DynamoDB, S3)? Which services?"
- "Do you use Notion for documentation or knowledge base?"
- "Do you use GitHub wikis, discussions, or project boards?"
For each "yes", record the connector ID (e.g. jira, confluence) — these go into the enabled allowlist for consumers.doc-wiki in Phase 3, step 4b.
Phase 3, step 4b — Set up connector access:
/doc-wiki:ingest step 7 calls gather() from narai-primitives, which reads ~/.connectors/config.yaml (user-global) and ./.connectors/config.yaml (repo overlay) to know which connectors are enabled and how to authenticate. If neither file exists yet, walk the user through creating one.
- Check existence:
``bash ls -1 ~/.connectors/config.yaml ./.connectors/config.yaml 2>/dev/null ``
- If both are missing — bootstrap from the example:
- Tell the user: "Your wiki needs
~/.connectors/config.yamlto access the external services you enabled. I'll generate a starter from.connectors/config.example.yaml." - For each connector the user said "yes" to in Phase 3, step 4, ask one credential question:
- Jira/Confluence: "Where does your Atlassian API token live? (env var name, keychain label, or file path)"
- GitHub: "Where does your GitHub personal access token live?"
- Notion: "Where does your Notion integration token live?"
- AWS: "Use the default SDK credential chain (env /
~/.aws/credentials/ IAM role)? Or a specific profile?" - GCP: "Use Application Default Credentials? Or a service account key file?"
- Compose the YAML and write it to
~/.connectors/config.yaml. Include only the enabled connectors and aconsumers.doc-wikiblock listing them. - Verify the file parses by reading it back and looking for the expected
connectorskeys (no need to invokeloadResolvedConfig()from a one-shot script — a bad YAML file will be obvious).
- If at least one already exists — just confirm the enabled connectors line up with the user's Phase 3, step 4 answers. Suggest edits if there's a gap (e.g., user said "yes Confluence" but no
confluence:block exists). Never edit an existing config without explicit confirmation.
Once the file is in place, the user's /doc-wiki:ingest calls will resolve credentials automatically via the connector's own credential loader — doc-wiki never reads or stores the secrets directly.
Phase 3, step 5 — Choose autonomy mode:
Present the four autonomy modes and ask user to choose:
- conservative — ask before every write
- balanced — auto-fix safe changes, ask for structural
- autonomous — auto-fix everything, notify after
- auto — choose per-operation based on risk score
Default: balanced.
Phase 3, step 6a — README quickstart preference:
Ask the user via AskUserQuestion:
> "Do you want doc-wiki to maintain a quickstart block in your README.md? It'll be auto-generated from wiki/getting-started.md on every /doc-wiki:atlas run, with hand-edits salvaged via LLM merge. You can change this later in wiki.config.yaml."
| Choice | Effect on wiki.config.yaml | |---|---| | Yes — generous (~30 lines) | ecosystem.readme.{enabled: true, quickstart_depth: generous, insert_markers_on_init: true} | | Yes — standard (~15 lines) | ecosystem.readme.{enabled: true, quickstart_depth: standard, insert_markers_on_init: true} | | Yes — minimal (~5 lines) | ecosystem.readme.{enabled: true, quickstart_depth: minimal, insert_markers_on_init: true} | | No, skip | ecosystem.readme.enabled: false |
If the user picked any "Yes", dispatch Agent(wiki-readme-agent) with {action: "init", project_root, wiki_root, quickstart_depth} to insert markers into README.md if it exists and has none.
Phase 3, step 6 — Install hooks + scaffold:
- Offer to install PreToolUse always-on hooks for the detected platform
Phase 3, step 6b — Optional multimodal deps (Q&A):
Ask the user once, before writing the config:
> "Your wiki may ingest audio/video files (.mp4, .mp3, .wav, ...) or YouTube URLs later. The extraction uses two optional tools that aren't installed by default: > - faster-whisper for local audio transcription (≈100 MB model on first use) > - yt-dlp for downloading YouTube audio (single binary) > > Shall I help you set these up? > - Yes, both → record ecosystem.multimodal.enabled: on and print exact install commands for the user's OS > - Yes, yt-dlp only → record on; still print the yt-dlp install command (whisper will be skipped when triggered) > - No, skip for now → record ecosystem.multimodal.enabled: optional (default); multimodal ingests will warn-and-skip until the user installs the tools later > - Never ask again → record ecosystem.multimodal.enabled: off; multimodal ingests are silenced entirely"
When the user says yes, print the exact commands (but DO NOT run them — Claude cannot assume a package manager):
- macOS:
brew install yt-dlpandpipx install faster-whisper - Linux:
pipx install yt-dlp faster-whisper(or the distro's package manager) - Windows:
pipx install yt-dlp faster-whisper
- Generate/update
wiki.config.yamlwith all detected settings (including theecosystem.multimodal.enabledchoice from Phase 3, step 6b):
``bash node {skill_path}/scripts/parse_config.js --config /wiki.config.yaml ``
- If wiki scaffold does not exist, run
/doc-wiki:initautomatically:
``bash node {skill_path}/scripts/init_wiki.js --path --domain "" --name "" ``
Output of Phase 3: A fully configured wiki.config.yaml with language, framework, ORM profile, database, external sources, autonomy mode, and multimodal preference. Wiki scaffold created if it did not already exist.
Phase 4 — Atlas decision.
- If
--no-atlas: stop. - If
--atlas: dispatch/doc-wiki:atlaswith the default facet set. - Otherwise:
AskUserQuestion"Generate full documentation now with /doc-wiki:atlas? (Recommended for first-run.)" - Yes → dispatch
/doc-wiki:atlas. - No → stop, print "Run /doc-wiki:atlas later when ready."
/doc-wiki:atlas — Full application documentation
Generate a comprehensive wiki for the entire codebase in one orchestrated pass: discover topics, ingest curated sources per topic × facet, synthesize global aggregation pages, validate existing content against current source state, produce drift/cost audit artifacts.
This is a meta-orchestrator over /doc-wiki:ingest. It does not replace the per-source ingest workflow — it batches it across all detected topics and facets, then runs a synthesis pass for the three global pages (wiki/overview.md, wiki/integrations.md, wiki/deploy.md) that aggregate per-topic content.
Synopsis:
/doc-wiki:atlas [--facets ] [--scope ] [--yes] [--dry-run]
[--max-cost ] [--since ]
[--validate-mode shallow|full] [--resume]
[--wiki-root ]
| Flag | Default | Purpose | |---|---|---| | --facets | architecture,data-model,environments,api,operations | Per-topic facets to generate. Additive — never deletes pages outside this set from prior runs. | | --scope | (all detected) | Restrict to one topic for incremental runs. | | --yes | off | Skip phase confirmation gates (CI/unattended). | | --dry-run | off | Show planned ingests + cost estimate, write nothing. Validation pass still runs (read-only). | | --max-cost | 200.00 | Abort pre-write if estimate exceeds. Re-run with explicit higher value to override. | | --since | Smart default: timestamp of last op: atlas event in events.jsonl; else all-time (no git log --since). | Window for the gitlog drift scan. | | --validate-mode shallow\|full | shallow | shallow: structural + gitlog + semantic on sampled pages. full: semantic on every existing atlas page. | | --resume | off | Continue from .wiki-checkpoint.json (opName "atlas") without prompting. |
Phases:
- Detect state — call
node {skill_path}/scripts/atlas_orchestrator.js detect-state --wiki-root. Output JSON ({state, atlas_pages, all_pages, last_run_id}) drives the branch:
state == "fresh"→ wiki is empty or has** = exactly that token if present (at most one —--no-cross-servicewins if both somehow appear), or the empty string if neither was passed. Forward this **same** verbatim to Phase 1b (inventorygenerate) only. Phase 1b'sresolveCrossServicethen computes the decision (precedence:--no-cross-service>--cross-service>ecosystem.crossservice.enabled> AUTO ≥2 services) and **persists it into the manifest** ascrossservice_enabled`. That persisted boolean — NOT the flag (which is empty in the AUTO path) — is the single source of truth: Phase
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: narailabs
- Source: narailabs/doc-wiki
- License: Apache-2.0
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.