# Datamitsu > Your toolchain deserves a home. This file contains all documentation content in a single document following the llmstxt.org standard. ## About datamitsu ## Your toolchain deserves a home Stop setting up the same tools in every repository. Linters, formatters, git hooks and the runtimes they need go into one `datamitsu.config.js` you carry from project to project. **Define them once. Inherit them everywhere.** Not a boilerplate, not scattered across projects, not reinvented from scratch every time. datamitsu gives your toolchain one home — versioned, composable, and always one command away. ## Why it exists > Dozens of repositories, all on different stacks — a Typst document with scripts, a frontend, a backend, a CLI, a slide deck. Every new project meant weeks of setting up the same tools, and every setup came out slightly different. Updating twenty repositories was hell, so they went years without updating their linters — until eslint started getting in the way of the product. > > — Alexander Svinarev, author of datamitsu ## What is datamitsu? datamitsu is a **platform for building reproducible, security-first development tool distributions.** It's NOT just another task runner or runtime manager. It's a **foundation** for creating standardized tool configurations that teams can distribute as packages (npm, rubygem, pypi, etc). Think of it as **"lefthook for linting/tooling ecosystems"**: - Core binary provides secure tool delivery (SHA-256 verification) - Wrappers provide opinionated configs for different ecosystems - Teams install one package, get everything configured ## The Two-Level Architecture datamitsu operates on a two-level architecture that separates the platform from the content: ### Level 1: The Core (datamitsu) The `datamitsu` binary provides the platform capabilities: - Binary management with SHA-256 verification - Programmable JavaScript configuration (goja runtime) - Declarative + imperative configuration approach - Config chaining with inheritance - Tool operations (fix/lint/check) - Safe managed-config reconciliation - File patching (gitignore/dockerignore/package.json) **What the core does NOT contain:** - Concrete tool versions - Linter configurations - Opinionated defaults ### Level 2: Wrappers (npm/gem/pypi packages) Wrapper packages provide the actual tool configurations: - Full tool suite (eslint/prettier/golangci-lint/etc) - Configured defaults for all tools - VS Code recommendations - Exportable config functions - Project type detection - Migration-free updates (via patching) ### Distribution Model ``` datamitsu core (Go binary) ↓ Provides: binary mgmt, config engine, managed-config reconciliation Wrappers (language-specific packages) ↓ Provide: tool versions, configs, project templates Projects (end users) ↓ Install: npm install @company/dev-standards Run: datamitsu config reconcile && datamitsu lint ``` This architecture enables teams to: 1. **Build once, distribute everywhere** — Create your company's tool standards as a package 2. **Version independently** — Update configs without waiting for tool releases 3. **Distribute via familiar channels** — Use npm, gem, pypi, or any package manager 4. **Enforce security policies** — Mandatory hash verification for all binaries ## Who is datamitsu for? ### Primary: Config Package Creators **Who they are:** - Platform engineers at companies - Open source maintainers - DevOps teams establishing standards **What they need:** - Create company-wide tool standards - Distribute via familiar package managers - Enforce security policies (hash verification) - Version configs independently from tools **Value proposition:** "Build once, distribute everywhere. One package brings all tools and configs to every project." ### Secondary: Development Teams **Who they are:** - Teams tired of copy-paste configs - Projects with multiple contributors - Companies wanting standardization **What they need:** - One dependency = all tools configured - No manual setup per project - Docker-optimized CI/CD - Migration-free updates **Value proposition:** "Install one dependency, get everything configured. Zero manual setup in new projects." ### Tertiary: Open Source Maintainers **Who they are:** - Project template creators - Framework maintainers - Tool distribution authors **What they need:** - Distribute project templates with tools - Ensure contributors use correct versions - Provide both CLI and programmatic access **Value proposition:** "Ship your project template with tools included. Contributors get the right setup automatically." ## What makes datamitsu unique? ### 1. Mandatory Security Verification Every binary downloaded from the internet must have a SHA-256 hash specified. No exceptions. No bypassing. Hash verification happens before extraction, preventing malicious binaries and ensuring reproducibility. ### 2. Config Chaining and Inheritance Layer configurations from base → company → team → project: ```javascript // Project-specific override in datamitsu.config.ts function getConfig(prev) { return { ...prev, version: "1.0.0", apps: { ...prev.apps, // Remove a tool for this project "some-linter": undefined, }, }; } globalThis.getConfig = getConfig; globalThis.getMinVersion = () => "0.0.1"; ``` Configs receive the previous layer as input, enabling composition without duplication. ### 3. Docker CI/CD Optimization Pre-cache all tools in a Docker layer for fast, reproducible builds: ```dockerfile FROM node:20-alpine # Install datamitsu + config wrapper RUN npm install -g @company/datamitsu-config # Download ALL tools to global store RUN datamitsu init --all # Save this layer # Only changed tools re-download on updates ``` This dramatically speeds up CI builds by avoiding tool downloads on every run. ### 4. Migration-Free Updates Update your config package, optionally preview the reconciliation, then run it; your customizations survive: ```bash # Update config wrapper npm update @company/datamitsu-config # Preview without writing or fixing datamitsu config reconcile --dry-run # Reconcile files, then run fix (preserves customizations!) datamitsu config reconcile ``` The patching mechanism merges new defaults with your project-specific changes. ### 5. Multi-Runtime Support Manage tools from different ecosystems in one place: - **Binary apps** — Download native binaries with hash verification - **UV apps** — Python tools via managed UV runtime (e.g., yamllint) - **Node apps** — npm packages via managed Node.js + pnpm (e.g., eslint, prettier) - **JVM apps** — Java applications via managed JDK runtime (e.g., openapi-generator-cli) - **Go apps** — Go tools built from source via managed Go SDK (e.g., govulncheck) - **Shell apps** — Wrap arbitrary system commands All managed with the same config API, all with hash verification. Any app kind can set custom environment variables (with `${STORE}`/`${APP_DIR}` expansion) via the shared `env` field. ## Where does datamitsu fit? datamitsu is **NOT**: - A task runner (use moon/nx/turborepo for that) - A runtime manager (use mise/asdf/volta for that) - A package manager (use npm/pnpm/cargo for that) - A build system (use moon/bazel/gradle for that) datamitsu **IS**: - A **platform** for building config distributions - A **foundation** for team standards - A **delivery mechanism** for verified tools - A **configuration system** with inheritance For detailed comparisons with similar tools, see the [Comparison Guide](./reference/comparison.md). ## Use Cases ### Company-Wide Standards **Scenario:** Enterprise wants all projects to use the same linters and formatters. **With datamitsu:** ```bash # Create @company/dev-standards package once # Then in every project: npm install @company/dev-standards datamitsu config reconcile # Creates all configs automatically ``` **Result:** - One source of truth for all configs - Update package → all projects can update - Enforce via package.json dependency ### Docker-Based CI/CD **Scenario:** GitLab CI pipeline needs linting tools. **With datamitsu:** ```dockerfile # Base image - run once RUN datamitsu init --all # Layer cached with all tools # Project build - runs every time RUN datamitsu check # Only new/changed tools download ``` **Result:** - Fast CI builds (tools pre-cached in layer) - Reproducible (hash-verified binaries) - Incremental updates (only changed tools re-download) ### Open Source Project Template **Scenario:** Framework wants contributors to have consistent setup. **With datamitsu:** ```json { "dependencies": { "@framework/dev-tools": "^1.0.0" } } ``` Run `npm install && npx datamitsu config reconcile` → Everything configured automatically. **Result:** - Contributors get identical setup - No "how to configure" docs needed - Updates propagate via package version bump ## Learn More - [Architecture Deep Dive](./guides/architecture/index.md) — Understand the internal execution model, task planning, parallelization, and caching strategies - [Comparison Guide](./reference/comparison.md) — How datamitsu compares to mise, moon, and other tools - [Creating Wrappers](./contributing/creating-wrappers.md) — Build your own config distribution package - [Using Wrappers](./guides/using-wrappers.md) — Consume wrapper packages in your projects - [Core Concepts](./getting-started/core-concepts.md) — Understand how datamitsu works --- ## Brand Guidelines **Your toolchain deserves a home.** Others run tools. **datamitsu defines what those tools are.** datamitsu is the only tool that packages and distributes complete, configured toolchains. Not a task runner. Not a version manager. **Toolchain distribution as code.** We exist so you set your tools up once, and every repository inherits them. ## Brand Personality ### Voice Attributes **Confident, not arrogant** - ✅ "datamitsu is a platform for building config distributions. Think lefthook, but for your entire tooling ecosystem." - ✅ "datamitsu is for teams distributing standardized configs, not individual developers switching tool versions." - ❌ "datamitsu is the ultimate all-in-one development tool that will revolutionize your workflow." **Technical, not jargon-y** - ✅ "Every binary is verified with SHA-256 hashes before extraction to prevent malicious code." - ❌ "Enterprise-grade military-level security powered by blockchain-enabled cryptographic algorithms." **Security-focused, not paranoid** - ✅ "Hash verification ensures binaries match what the maintainer published." - ❌ "Without datamitsu, hackers will definitely compromise your entire infrastructure!" ## Writing Guidelines ### Do - **Use "Others X. datamitsu Y." framing** — "Others run tools. datamitsu defines what those tools are." - **Lead with "Different problems" / "Different layers"** — Make distinctions clear - **Use analogies from the ecosystem** — "Think lefthook, but for your entire tooling ecosystem" - **Be specific about technical details** — SHA-256, not just "secure" - **Acknowledge competitors honestly** — mise/moon solve different problems, explain how - **Write short declarative sentences** — "Not a feature. The entire point." ### Don't - **Use marketing buzzwords** — "Revolutionary," "game-changing," "paradigm shift" - **Use vague security claims** — No "military-grade" or "blockchain-enabled" - **Bash competitors** — Explain differences, never attack - **Apologize for scope** — "datamitsu is for X, not Y" (confident, not "sorry, but...") ### Headings pass the literal-translation test Translate a heading word for word into another language. If the sense survives, the heading says something. If it collapses into nonsense or into a phrase that means nothing in particular, the heading was leaning on an English idiom rather than on an idea — rewrite it. | Heading | Literally | Verdict | | ------------------------------------------------------ | ---------------------------------------------------- | ------------------------------------------------------------- | | ❌ "Make tuning worthwhile." | "Make adjustment worth the cost." | An idiom carries the whole meaning; nothing concrete survives | | ✅ "One evening of tuning. Every repository benefits." | "One evening of adjustment. Every repository gains." | Two plain facts, and the relation between them is the point | | ❌ "Upgrade deliberately." | "Upgrade with intent." | True of anything; says nothing about who decides or when | | ✅ "Upgrade on your terms." | "Upgrade when and how you decide." | Names the actor and the choice | The test is not about being translated in practice — the site is English only. It is a check that a heading carries an idea instead of a turn of phrase. ## Example Voice ✅ **Good:** "datamitsu is a platform for building config distributions. Think lefthook, but for your entire tooling ecosystem." **Why:** Specific analogy, clear boundaries, confident. ❌ **Bad:** "datamitsu is a revolutionary AI-powered cloud-native DevOps solution that will transform your development workflow." **Why:** Buzzwords, vague, overpromises. ## Language Policy **English only. No exceptions.** All documentation, code comments, commit messages, issues, and communications must be written in English. This policy ensures accessibility for the global developer community. ## Visual Identity ### Name Meaning The name "datamitsu" is built on a double meaning in Japanese: - **光 (mitsu)** — "light" → illuminating complexity, making the unclear clear - **蜜 (mitsu)** — "honey" → smooth, polished, efficient (like a beehive) The logo features a bee — the creature that produces honey through collective, structured work. ### Core Visual Metaphor: Light Breaking Through Complexity **Honey + Light + Bee = datamitsu's visual identity** - **Honey/Amber tones** — Warmth, polish, the smooth result of structured work - **Deep blue backdrop** — The complexity being illuminated - **Light rays** — Clarity cutting through the mess - **Hexagons (honeycomb)** — Structure, efficiency, bee reference ### Color System Built around the honey/light metaphor: - **Primary: Amber/honey gold (#FFA500 family)** — The core brand color. Represents light, honey, and illumination - **Secondary: Deep blue (#1E3A8A family)** — The backdrop. Complexity that light shines through - **Visual pattern:** Amber light breaking through blue complexity Not "blue for trust, gold for warmth." **Light illuminating complexity.** ### Iconography Visual elements tied to honey/light/bee: - **Honeycomb/hexagons** — Structure, efficiency, collective work (bee reference) - **Light rays/beams** — Illumination, clarity breaking through - **Layered hexagons** — Config inheritance as stacked honeycomb cells Avoid generic dev tool icons (lock, shield, package, stack). Use the metaphor. ## Competitive Positioning Language When discussing similar tools, use this framework: ### Template > [Competitor] does [their use case]. **datamitsu solves a different problem.** > > **Different problems:** > > - [Competitor]: [their use case in 5-10 words] > - datamitsu: [our use case in 5-10 words] > > **Use both:** [complementary example in one sentence] ### Example (mise) > mise manages tool versions per developer. **datamitsu solves a different problem.** > > **Different problems:** > > - mise: Per-directory runtime flexibility for individuals > - datamitsu: Team-wide toolchain standardization via packages > > **Use both:** mise manages Node version, datamitsu delivers ESLint with your company config. ### Example (moon) > moon orchestrates monorepo builds with dependency graphs and caching. **datamitsu operates at a different layer.** > > **Different layers:** > > - moon: When/how tasks run (build orchestration) > - datamitsu: What tools exist (toolchain delivery) > > **Use both:** datamitsu delivers the linters, moon runs them in optimal order. ## Documentation Style ### Code Examples - **Always test examples** — Every code snippet must work - **Use real-world scenarios** — Not "foo" and "bar" - **Include expected output** — Show what users should see ### Formatting - **Headings:** Sentence case ("How to configure tools") - **Links:** Descriptive text, not "click here" - **Admonitions:** `:::caution` for warnings, `:::danger` for destructive actions ## Core Messaging **Tagline:** "Your toolchain deserves a home." **One-line intro:** "datamitsu is a platform for building reproducible, security-first development tool distributions." ## Messaging by Audience ### For Platform Engineers "Define the toolchain once. Distribute everywhere. Not scattered across 50 repos." **Emphasize:** Toolchain distribution via npm/gem/pypi. Security policies (mandatory SHA-256). Version control as packages. ### For Development Teams "Your company's toolchain in one package. No copy-paste configs. No manual setup." **Emphasize:** Migration-free updates via patching. Override capabilities when needed. Docker-optimized CI. ### For Open Source Maintainers "Ship the template with tools inside. Not a README telling people what to install." **Emphasize:** Contributors get identical setup automatically. Version consistency enforced via package dependency. --- ## Creating Wrapper Packages This guide explains how to build wrapper packages — the second level of datamitsu's architecture — to distribute standardized tool configurations to your team, company, or the open source community. ## What are Wrapper Packages? Wrapper packages are language-specific packages (npm, gem, pypi, etc.) that bundle: - Concrete tool versions and configurations - Opinionated defaults for linters, formatters, and other tools - Managed project files (configs, ignore files, etc.) - Custom configuration logic in JavaScript/TypeScript Think of wrappers as "datamitsu config distributions" — similar to how lefthook has npm/gem/pypi wrappers around its Go core. ## Two-Level Architecture Understanding the architecture is crucial to building effective wrappers. To see how datamitsu executes tools internally, see [Architecture: Parallel Execution](../guides/architecture/execution.md). ### Level 1: The Core (datamitsu binary) The `datamitsu` binary provides platform capabilities: - Binary management with SHA-256 verification - Programmable JavaScript configuration engine (goja) - Config chaining with inheritance - Tool operations (fix/lint/check) - Safe managed-config reconciliation - File patching engine **The core does NOT provide:** - Concrete tool versions - Linter configurations - Opinionated defaults ### Level 2: Wrappers (your package) Your wrapper package provides: - Full tool suite definitions (golangci-lint, eslint, prettier, etc.) - Configured defaults for all tools - Managed config files and generation rules - Project type detection logic - Custom config functions ## Distribution Model ``` datamitsu core (Go binary) ↓ Installed globally or as dev dependency Your wrapper package (@company/datamitsu-config) ↓ Distributed via npm/gem/pypi Contains: tool versions, configs, managed config definitions End-user projects ↓ Install: npm install @company/dev-standards Config loads: datamitsu.config.ts (optional overrides) Run: datamitsu config reconcile && datamitsu lint ``` ## Creating Your First Wrapper ### Step 1: Choose a Distribution Channel Decide how you'll distribute your wrapper: - **npm** — For JavaScript/TypeScript ecosystems (recommended for web projects) - **gem** — For Ruby ecosystems - **pypi** — For Python ecosystems - **Multiple** — Publish the same config to multiple package managers Example using npm: ```bash mkdir my-datamitsu-config cd my-datamitsu-config npm init -y ``` ### Step 2: Create the Configuration File Create `config/datamitsu.config.js` (or `.ts`). Set `version` explicitly, or populate it using your own build process. Datamitsu does not prescribe how wrapper authors maintain this label. ```javascript /** * @param {config.Config} prev * @returns {config.Config} */ function getConfig(prev) { return { ...prev, version: "1.0.0", apps: { ...prev.apps, // Define your tools here "golangci-lint": { binary: { binaries: { linux: { amd64: { glibc: { url: "https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-linux-amd64.tar.gz", hash: "sha256:", contentType: "tar.gz", binaryPath: "golangci-lint-1.55.0-linux-amd64/golangci-lint", }, }, }, darwin: { amd64: { unknown: { url: "https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-darwin-amd64.tar.gz", hash: "sha256:", contentType: "tar.gz", binaryPath: "golangci-lint-1.55.0-darwin-amd64/golangci-lint", }, }, arm64: { unknown: { url: "https://github.com/golangci/golangci-lint/releases/download/v1.55.0/golangci-lint-1.55.0-darwin-arm64.tar.gz", hash: "sha256:", contentType: "tar.gz", binaryPath: "golangci-lint-1.55.0-darwin-arm64/golangci-lint", }, }, }, }, }, }, }, tools: { ...prev.tools, "golangci-lint": { name: "golangci-lint", operations: { lint: { app: "golangci-lint", args: ["run"], scope: "per-project", }, }, projectTypes: ["golang-package"], }, }, managedConfigs: { ...prev.managedConfigs, // Add managed config files ".golangci.yml": { content: () => ` linters: enable: - gofmt - govet - staticcheck `, }, }, }; } globalThis.getConfig = getConfig; globalThis.getMinVersion = () => "0.0.1"; ``` ### Step 3: Use the `--before-config` Flag The `--before-config` flag tells datamitsu to load your wrapper config before auto-discovering `datamitsu.config.js` at the git root. This enables the layering: ``` embedded default config (datamitsu core) ↓ --before-config (your wrapper) ← loaded first ↓ auto-discovered config (user's datamitsu.config.js) ← can override wrapper ↓ --config (explicit overrides) ``` ### Step 4: Create a Binary Wrapper Create `bin/datamitsu` (executable shell script): ```bash #!/bin/sh # Find the datamitsu binary DATAMITSU_BIN=$(which datamitsu) if [ -z "$DATAMITSU_BIN" ]; then echo "Error: datamitsu binary not found in PATH" exit 1 fi # Get the directory of this script SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" CONFIG_DIR="$(dirname "$SCRIPT_DIR")/config" # Execute datamitsu with our config loaded before user config exec "$DATAMITSU_BIN" --before-config "$CONFIG_DIR/datamitsu.config.js" "$@" ``` Make it executable: ```bash chmod +x bin/datamitsu ``` ### Step 5: Configure package.json ```json { "name": "@company/datamitsu-config", "version": "1.0.0", "description": "Company-wide datamitsu tool configurations", "bin": { "datamitsu": "./bin/datamitsu" }, "files": ["bin/", "config/datamitsu.config.js"], "peerDependencies": { "datamitsu": "^0.1.0" }, "keywords": ["datamitsu", "linting", "configuration", "tools"] } ``` ### Step 6: Publish Your Package ```bash # Test locally first npm link cd ../test-project npm link @company/datamitsu-config # When ready, publish npm publish ``` ## Config Chaining and Inheritance One of datamitsu's most powerful features is config chaining. Each config layer receives the previous layer as input. ### Extending a Base Config ```javascript function getConfig(prev) { return { ...prev, apps: { ...prev.apps, // Add new tools prettier: {/* ... */}, // Override existing tool "golangci-lint": { ...prev.apps["golangci-lint"], operations: { lint: { args: ["run", "--timeout=5m"], // Override args }, }, }, }, }; } globalThis.getConfig = getConfig; ``` ### Removing Tools ```javascript function getConfig(prev) { const { unwantedTool, ...remainingApps } = prev.apps; return { ...prev, apps: remainingApps, }; } globalThis.getConfig = getConfig; ``` ### Conditional Configuration Use JavaScript logic for dynamic configuration: ```javascript function getConfig(prev) { const config = { ...prev, apps: { ...prev.apps }, }; // Add tools based on environment if (process.env.CI === "true") { config.apps["some-ci-tool"] = {/* ... */}; } // Adjust settings based on OS if (process.platform === "darwin") { config.apps["golangci-lint"].operations.lint.args.push("--max-issues-per-linter=100"); } return config; } globalThis.getConfig = getConfig; ``` ## Remote Configs Wrapper packages can reference remote configuration files for additional layering: ```javascript /** * @returns {{ url: string; hash: string }[]} */ function getRemoteConfigs() { return [ { url: "https://config.company.com/datamitsu/base.ts", hash: "sha256:abc123...", // canonical SHA-256 digest (mandatory) }, ]; } globalThis.getRemoteConfigs = getRemoteConfigs; function getConfig(prev) { // prev includes the remote config merged in return { ...prev, // Your overrides here }; } globalThis.getConfig = getConfig; globalThis.getMinVersion = () => "0.0.1"; ``` Remote configs are resolved depth-first before your config is evaluated. ## Agent Prompts datamitsu publishes two Markdown guides for AI agents through `sharedStorage`. The binary that evaluates the configuration produces both, so they always describe the version that loads it. The default configuration writes neither of them anywhere: your configuration decides where each one goes. | Key | Written for | Where it belongs | | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | | `datamitsu-agent-prompt` | Agents working in a repository that **uses** a datamitsu configuration | The agent instructions your wrapper ships to its consumers | | `datamitsu-config-author-prompt` | Agents working in a repository that **writes** one: a wrapper, or a project configuration that defines its own apps, tools or configs | The authoring repository only — never shipped to its consumers | ### Shipping the Consumer Prompt Write the prompt into a project file through a managed config: ```javascript function getConfig(input) { const agentPrompt = input.sharedStorage["datamitsu-agent-prompt"]; return { ...input, managedConfigs: { ...input.managedConfigs, "AGENTS.md": { content: () => agentPrompt, scope: "git-root", }, }, }; } globalThis.getConfig = getConfig; ``` ### Extending It with Custom Instructions Create a bundle that combines the base prompt with company-specific guidance: ```javascript function getConfig(input) { const basePrompt = input.sharedStorage["datamitsu-agent-prompt"]; const customInstructions = ` ## Company-Specific Guidelines - Follow our coding standards at https://company.com/standards - Always use our custom linter configurations - Prefix commit messages with ticket numbers (e.g., "JIRA-123: Fix bug") - Use TypeScript for all new JavaScript code `; return { ...input, bundles: { ...input.bundles, "company-agents": { version: "1.0.0", files: { "AGENTS.md": basePrompt + customInstructions, }, links: { "company-agents": "AGENTS.md", }, }, }, managedConfigs: { ...input.managedConfigs, "AGENTS.md": { linkTarget: ".datamitsu/company-agents", scope: "git-root", }, }, }; } globalThis.getConfig = getConfig; ``` When datamitsu updates the prompt, `datamitsu init` rebuilds the bundle, so every project picks up the change without anyone syncing text by hand. ### Adding the Configuration-Author Guide The configuration-author guide tells an agent how to write a layer correctly for this version of datamitsu: the JavaScript runtime, mandatory hashes and lock files, the `devtools pull-*` workflow, validation rules, and a list of recent changes a configuration should review. Because `datamitsu init` refreshes it on every upgrade, an agent working on your wrapper learns about new features from the binary itself. Add it where the configuration is written. For a wrapper, that is the `datamitsu.config.*` at the wrapper repository's own git root — not the configuration the wrapper publishes, which would ship the guide to every consumer. Merge the bundle into that file's `getConfig`; the file keeps its own `getMinVersion()`, which every configuration must export: ```javascript function getConfig(input) { return { ...input, bundles: { ...input.bundles, "config-author-guide": { files: { "datamitsu-config-author.md": input.sharedStorage?.["datamitsu-config-author-prompt"] ?? "", }, links: { "ai/agents/datamitsu-config-author.md": "datamitsu-config-author.md", }, }, }, }; } globalThis.getConfig = getConfig; ``` After `datamitsu init`, point the repository's own agent instructions at it once: ```markdown Before changing the datamitsu configuration, read [.datamitsu/ai/agents/datamitsu-config-author.md](.datamitsu/ai/agents/datamitsu-config-author.md). ``` A project whose own `datamitsu.config.*` defines apps, tools or managed configs can adopt it the same way. ## Testing Your Wrapper ### Local Testing ```bash # In your wrapper directory npm link # In a test project npm link @company/datamitsu-config # Test commands datamitsu init datamitsu check ``` ### CI Testing Create a test project in your wrapper repo: ``` my-datamitsu-config/ ├── config/ │ └── datamitsu.config.js ├── bin/ │ └── datamitsu ├── test-project/ │ ├── package.json (depends on your wrapper) │ └── sample-files/ └── package.json ``` In CI: ```yaml test: script: - npm install - cd test-project - datamitsu init - datamitsu check ``` ## Versioning Strategy ### Semantic Versioning Follow semver for your wrapper: - **Major** — Breaking changes to config structure, removed tools - **Minor** — New tools, new features, non-breaking changes - **Patch** — Bug fixes, hash updates, documentation ### Example Changelog ```markdown ## 2.0.0 (Breaking) - Removed deprecated `tslint` (use `eslint` instead) - Changed `.prettierrc` format to use ES modules ## 1.5.0 - Added `hadolint` for Dockerfile linting - Added `shellcheck` for shell script linting - Updated `golangci-lint` to v1.55.0 ## 1.4.1 - Updated `eslint` hash for security patch - Fixed `prettier` args on Windows ``` ## Publishing to Multiple Package Managers You can publish the same config to npm, gem, and pypi simultaneously: ### npm (JavaScript) ```json { "name": "@company/datamitsu-config", "bin": { "datamitsu": "./bin/datamitsu" } } ``` ### gem (Ruby) ```ruby # datamitsu-config.gemspec Gem::Specification.new do |spec| spec.name = "datamitsu-config" spec.version = "1.0.0" spec.executables = ["datamitsu"] end ``` ### pypi (Python) ```python # setup.py setup( name="datamitsu-config", version="1.0.0", scripts=["bin/datamitsu"], ) ``` The config file and bin wrapper remain the same across all three. ## Real-World Example: shibanet0/datamitsu-config The author maintains `shibanet0/datamitsu-config` as a reference wrapper: - **npm package** — Distributed via npm for JavaScript projects - **Full tool suite** — golangci-lint, prettier, eslint, shellcheck, hadolint, etc. - **Project detection** — Detects Go, TypeScript, Rust, Dockerfile, etc. - **Managed configs** — Symlinks for ESLint, Prettier configs - **Remote configs** — Layers multiple config sources [View source on GitHub](https://github.com/shibanet0/datamitsu-config) ## Best Practices ### Security - **Always specify SHA-256 hashes** for all binaries (mandatory) - **Pin exact versions** — Don't use "latest" or version ranges - **Verify hashes** — Use `datamitsu devtools pull-releases --verify-extraction` during development - **Keep hashes updated** — Monitor security advisories for tool updates ### Maintainability - **Document your tools** — Explain why each tool is included - **Keep configs organized** — Separate concerns (linting, formatting, git hooks) - **Test on all platforms** — Ensure Linux, macOS, Windows support - **Provide examples** — Show users how to override your defaults - **Automate version updates** — For version update workflows, see [Maintaining Wrapper Packages](../how-to/maintain-wrapper.md) ### User Experience - **Minimize required setup** — Pre-configure as much as possible - **Support customization** — Users should be able to override any setting - **Migration guides** — Document breaking changes clearly - **Clear error messages** — Help users fix common issues ## Next Steps - Read [Using Wrappers](../guides/using-wrappers.md) to understand the user experience - See [Configuration API Reference](../reference/configuration-api.md) for complete config options - Check out [Examples](../examples/multiple-versions.md) for advanced patterns - Join discussions on [GitHub](https://github.com/datamitsu/datamitsu/discussions) Building wrapper packages is how datamitsu achieves its mission: configuration standardization across teams and projects. Your wrapper becomes the single source of truth for how your team builds software. --- ## Contributing to datamitsu Thank you for your interest in contributing to datamitsu! This project is in alpha stage and welcomes contributions from the community. :::info[Alpha Stage] datamitsu is in active development. The configuration API is not yet stabilized and may change between versions. Breaking changes are acceptable when they improve correctness, safety, or simplify architecture. ::: ## Ways to Contribute ### Code Contributions Contribute to the core datamitsu platform: - **Bug fixes** — Help identify and fix issues - **Feature implementations** — Work on planned features from GitHub issues - **Performance improvements** — Optimize binary downloads, cache handling, etc. - **Platform support** — Add support for new OS/architecture combinations **Getting started:** 1. Fork the repository on GitHub 2. Clone your fork: `git clone https://github.com/yourusername/datamitsu` 3. Create a feature branch: `git checkout -b feat/your-feature` 4. Make your changes and test them 5. Submit a pull request with a clear description ### Documentation Contributions Improve the documentation: - **Fix typos and errors** — Even small fixes help - **Add examples** — Share how you use datamitsu - **Write guides** — Help others solve common problems - **Improve clarity** — Make complex topics easier to understand All documentation lives in `website/docs/` and uses Docusaurus. See [Brand Guidelines](./brand-guidelines.md) for voice and style guidance. ### Wrapper Package Creation Build and share wrapper packages for specific ecosystems: - **Company standards** — Create internal tool configurations - **Framework integrations** — Provide ready-to-use configs for frameworks - **Language ecosystems** — Build opinionated defaults for Go, Rust, TypeScript, etc. See [Creating Wrappers](./creating-wrappers.md) for a complete guide. ### Community Support Help other users: - **Answer questions** — On GitHub Discussions or issues - **Share use cases** — Blog about how you use datamitsu - **Report bugs** — Help us identify and fix problems - **Provide feedback** — Share your experience and suggestions ## Development Setup ### Prerequisites - Go 1.21 or later - Node.js 20 or later (for website development) - pnpm (for website dependencies) ### Building from Source ```bash # Clone the repository git clone https://github.com/datamitsu/datamitsu cd datamitsu # Build the binary go build # Run tests go test ./... ``` ### Working on Documentation ```bash # Navigate to website directory cd website # Install dependencies pnpm install # Start development server pnpm start # Build for production pnpm build ``` The documentation site will be available at `http://localhost:3000`. #### Re-harvesting the embedded documentation These same pages ship inside the binary, so that `datamitsu llms` can hand an AI agent documentation that matches its exact version without network access. The snapshot lives in `internal/llmsdocs/embed/` and is committed to git, which is what keeps a plain `go build` free of any website toolchain. After changing anything under `website/docs`, regenerate it: ```bash task gen:llms-docs git add internal/llmsdocs/embed ``` That rebuilds the site, harvests the cleaned Markdown that `docusaurus-plugin-llms` emits, and rewrites the snapshot. CI re-runs the same harvest on every pull request and fails if the result differs from what you committed, so a stale snapshot cannot merge. Two rules matter when touching the snapshot: - **Never edit `internal/llmsdocs/embed/` by hand.** It is generated. The page bytes are hashed into `manifest.json`, and the tests verify that hash. - **Never reformat it.** The pages are stored exactly as the plugin emitted them; `.datamitsuignore` excludes the directory from every tool for this reason. ## Contribution Guidelines ### Code Style - **English-only** — All code, comments, and documentation must be in English - **Minimal comments** — Code should be self-documenting; add comments only when necessary - **Follow Go conventions** — Use `gofmt`, follow standard Go idioms - **Security-first** — All binaries must have SHA-256 hashes; no exceptions See CLAUDE.md for detailed code commenting guidelines. ### Documentation Style - **English-only** — No exceptions - **Clear and concise** — Avoid jargon; explain technical concepts clearly - **Use examples** — Show, don't just tell - **Maintain voice** — See [Brand Guidelines](./brand-guidelines.md) ### Commit Messages Write clear, descriptive commit messages: ``` fix: address hash verification bug in binmanager Add additional validation for empty hash strings before downloading binaries. Prevents panic when config has missing hash field. Fixes #123 ``` ### Pull Request Process 1. **Ensure tests pass** — Run `go test ./...` before submitting 2. **Update documentation** — Document new features or API changes 3. **Keep PRs focused** — One feature or fix per PR 4. **Write clear descriptions** — Explain what and why, not just how 5. **Respond to feedback** — Be open to suggestions and changes ## Documentation Requirements **All user-facing changes require documentation updates in the same PR.** This includes: - **User-facing features** → Update `website/docs/` with examples and guides - **CLI commands** → Update `website/docs/reference/cli-commands.md` - **Configuration options** → Update `website/docs/reference/configuration-api.md` - **New examples** → Add to `website/docs/examples/` - **Breaking changes** → Document migration path in docs and create blog post in `website/blog/` Documentation is not optional — it is a required deliverable for every user-facing change. ## Project Resources - **Repository:** [github.com/datamitsu/datamitsu](https://github.com/datamitsu/datamitsu) - **Issues:** [GitHub Issues](https://github.com/datamitsu/datamitsu/issues) - **Discussions:** [GitHub Discussions](https://github.com/datamitsu/datamitsu/discussions) - **Documentation:** [datamitsu.com](https://datamitsu.com) ## Code of Conduct Be respectful, constructive, and professional in all interactions. We aim to create a welcoming environment for contributors of all backgrounds and experience levels. ## Questions? If you have questions about contributing: - Open a [GitHub Discussion](https://github.com/datamitsu/datamitsu/discussions) - Check existing [GitHub Issues](https://github.com/datamitsu/datamitsu/issues) - Read the [documentation](https://datamitsu.com) We appreciate your contributions! --- ## List your configuration The [showcase](/showcase) lists configurations other people can inherit. Adding yours is one entry in [`website/src/data/showcases.json`](https://github.com/datamitsu/datamitsu/edit/main/website/src/data/showcases.json) and a pull request. ## What an entry needs ```json { "added": "2026-09-21", "author": { "github": "your-handle", "name": "Your Name" }, "consume": [{ "kind": "npm", "package": "@you/datamitsu-config" }], "description": "One sentence: what kinds of repositories this config is built for.", "id": "you-datamitsu-config", "links": { "repository": "https://github.com/you/datamitsu-config" }, "name": "@you/datamitsu-config", "tags": ["go", "typescript"] } ``` | Field | Required | Notes | | ------------- | -------- | ---------------------------------------------------------------------------- | | `id` | yes | Lowercase, unique, stable — it keys the derived data | | `name` | yes | The listing title, usually the package name | | `author` | yes | Name and GitHub handle | | `description` | yes | One sentence, up to 200 characters | | `tags` | yes | From the schema's list, so stacks do not fragment into `ts` and `typescript` | | `consume` | yes | How a reader actually uses it: `npm`, `pypi`, `gem`, `remote` or `oci` | | `links` | yes | `repository`, plus optional `site` and `inspector` | | `dataset` | no | URL of your published resolved-config dataset (see below) | | `added` | yes | The date of the pull request | Fill only what is true. Leaving a field out is always better than guessing at it. ## A `remote` entry carries a hash A reader executes what a `remote` entry points at, so its SHA-256 is mandatory and the pull request downloads the file and verifies it: ```json { "kind": "remote", "url": "https://github.com/you/datamitsu-config/releases/download/v1.2.0/datamitsu.config.js", "hash": "6fcd9a1edfaf713683380caa7fee64b9d5d40a2adec41db153ede44e230c74f7" } ``` ## Publish a dataset, and get a fingerprint The showcase does not screenshot configurations — it draws each one's composition across runtimes as a thin bar. That comes from a **dataset**: the resolved-config JSON the inspector's **Dataset** button downloads, and which you can produce in CI: ```bash datamitsu inspect --output - | grep -o '