Skip to content

Commit c5b8f93

Browse files
committed
feat(site): publish searchable docs and product showcase
1 parent cacb519 commit c5b8f93

27 files changed

Lines changed: 770 additions & 38 deletions

‎.github/workflows/deploy-site.yml‎

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@ name: Deploy static landing page
22

33
on:
44
workflow_dispatch:
5+
push:
6+
branches: [master]
7+
paths:
8+
- 'site/**'
9+
- 'docs/**'
10+
- 'scripts/build-site.mjs'
11+
- 'deploy/compose/**'
12+
- 'package.json'
13+
- 'pnpm-lock.yaml'
14+
- '.github/workflows/deploy-site.yml'
515

616
permissions:
717
contents: read
@@ -25,11 +35,26 @@ jobs:
2535
- name: Check out source
2636
uses: actions/checkout@v7
2737

38+
- name: Set up pnpm
39+
uses: pnpm/action-setup@v4
40+
41+
- name: Set up Node.js
42+
uses: actions/setup-node@v6
43+
with:
44+
node-version: '22'
45+
cache: pnpm
46+
47+
- name: Install build dependencies
48+
run: pnpm install --frozen-lockfile --ignore-scripts --filter kintsugi
49+
50+
- name: Build landing page and documentation
51+
run: pnpm site:build
52+
2853
- name: Upload landing page
2954
uses: actions/upload-pages-artifact@v4
3055
with:
31-
path: site
56+
path: .site-dist
3257

3358
- name: Deploy to GitHub Pages
3459
id: deployment
35-
uses: actions/deploy-pages@v4
60+
uses: actions/deploy-pages@v4

‎.gitignore‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ __pycache__/
1919

2020
# CLI packages built by `pnpm release:cli`
2121
/releases/
22+
23+
# Generated public landing page and documentation
24+
/.site-dist/

‎deploy/compose/README.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ The app and worker images are defined by [`Dockerfile.app`](../../Dockerfile.app
1111

1212
Runtime jobs run inside `worker`, each in its own job workspace under the data directory ([ADR-0029](../../docs/decisions/0029-job-workspaces-instead-of-os-sandboxes.md)): no Docker socket, no per-job container and no OS-level sandbox. The worker image therefore carries the standard script environment (git 2.40+, Python 3.12 and Node 22 with their standard libraries only) and runs as a non-root user. Jobs are not network-isolated: to restrict egress, attach the worker to a network that reaches only Postgres, the Git servers and the LLM providers.
1313

14-
- How to install, configure GitHub Actions and upgrade: [installation guide](../../docs/guides/installation.md)
14+
- Install using the published app and worker images: [Docker image guide](../../docs/guides/docker-images.md)
15+
- Build and deploy your own images through GitHub Actions: [installation guide](../../docs/guides/installation.md)
1516
- How it fits together: [deployment view](../../docs/architecture/07-deployment-view.md)

‎docs/README.md‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ The documentation is organized by **what the reader needs**, following [Diátaxi
1212
| [guides/](guides/) | How-to | accomplish a task: install, configure, work on a migration task |
1313
| [development/](development/) | Delivery record | review implementation status, plans, open work, and verification evidence |
1414

15-
Tutorials (learning-oriented walkthroughs) will be added once a first release exists.
15+
Start with [Your first modernization project](guides/first-project.md) for a walkthrough of the implemented development flow. Release and client-compatibility limits are stated in the linked references.
1616

1717
## Map
1818

@@ -68,6 +68,9 @@ Tutorials (learning-oriented walkthroughs) will be added once a first release ex
6868
- [Configuration](reference/configuration.md): installation environment variables
6969

7070
**Guides**
71+
- [Deploy with the published Docker images](guides/docker-images.md)
72+
- [Your first modernization project](guides/first-project.md)
73+
- [Member guideline: connect your AI client](guides/member-quickstart.md)
7174
- [Install Kintsugi](guides/installation.md)
7275
- [Build a project (register repos, write standards)](guides/build-project.md)
7376
- [Define a project's design templates](guides/define-design-templates.md)

‎docs/guides/docker-images.md‎

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# Deploy with the published Docker images
2+
3+
Run Kintsugi on your own Linux host using the same app and worker images published by this repository. You do not need to build the TypeScript workspace or configure a GitHub Actions deployment to use them.
4+
5+
## Requirements
6+
7+
- Docker Engine 24+ and Docker Compose v2.20+ on a Linux host. Start with 4 vCPU, 16 GB RAM and 100 GB disk, then size for repository storage and concurrent jobs.
8+
- Access to GHCR, your Git servers and the LLM providers you configure.
9+
- A DNS name and a TLS reverse proxy for shared access; an SSH tunnel is sufficient for a local evaluation.
10+
11+
The shipped images are `ghcr.io/evoelsewhere/kintsugi-app` and `ghcr.io/evoelsewhere/kintsugi-worker`. Both are published with `latest` and `sha-<full-commit>` tags by the [image workflow](../../.github/workflows/deploy.yml). Use the **same tag for both**. `latest` is the latest published development build, not a stable release. Pin `sha-<full-commit>` for repeatable installations and upgrades. Check the image's platform support before choosing a host.
12+
13+
## 1. Download the Compose package
14+
15+
Use the Compose bundle from the same commit as your chosen images. Replace `FULL_COMMIT_SHA` with the full commit from a successful **Build and deploy Kintsugi** run:
16+
17+
```sh
18+
mkdir -p kintsugi
19+
cd kintsugi
20+
KINTSUGI_COMMIT=FULL_COMMIT_SHA
21+
curl -fL "https://raw.githubusercontent.com/evoelsewhere/kintsugi/$KINTSUGI_COMMIT/deploy/compose/docker-compose.yml" -o docker-compose.yml
22+
curl -fL "https://raw.githubusercontent.com/evoelsewhere/kintsugi/$KINTSUGI_COMMIT/deploy/compose/.env.example" -o .env
23+
chmod 600 .env
24+
```
25+
26+
The package starts three services: the app (API and portal), the worker (runtime, orchestration and Git writes), and PostgreSQL with pgvector. PostgreSQL is the only datastore; documents stay in Git.
27+
28+
## 2. Set your installation values
29+
30+
Edit the private `.env` file:
31+
32+
```dotenv
33+
KINTSUGI_REGISTRY=ghcr.io/evoelsewhere
34+
KINTSUGI_VERSION=sha-FULL_COMMIT_SHA
35+
KINTSUGI_HTTP_BIND=127.0.0.1
36+
KINTSUGI_HTTP_PORT=8080
37+
KINTSUGI_PUBLIC_URL=http://localhost:8080
38+
KINTSUGI_DATA_DIR=/srv/kintsugi/data
39+
KINTSUGI_BOOTSTRAP_ADMIN_USER=admin
40+
```
41+
42+
Set `KINTSUGI_SECRET_KEY` to a newly generated base64 32-byte key, `POSTGRES_PASSWORD` to a random hexadecimal password, and `KINTSUGI_BOOTSTRAP_ADMIN_PASSWORD` to a unique password of at least eight characters. Generate values locally and paste them into `.env`:
43+
44+
```sh
45+
openssl rand -base64 32
46+
openssl rand -hex 32
47+
openssl rand -hex 16
48+
```
49+
50+
Keep `.env` private. Preserve the encryption key for the lifetime of the database and back it up securely; replacing it makes stored Git tokens and LLM credentials unreadable. Exact settings: [configuration reference](../reference/configuration.md).
51+
52+
Create the data directory and assign it to the non-root worker user:
53+
54+
```sh
55+
sudo mkdir -p /srv/kintsugi/data
56+
sudo chown 10001:10001 /srv/kintsugi/data
57+
```
58+
59+
If you chose a different `KINTSUGI_DATA_DIR`, use that directory in both commands.
60+
61+
## 3. Pull and start
62+
63+
If GHCR requires authentication, run `docker login ghcr.io -u YOUR_GITHUB_USERNAME` and enter a token with `read:packages` at its password prompt. Never put the token in `.env` or in shell arguments. Public packages can be pulled without signing in.
64+
65+
```sh
66+
docker compose config --quiet
67+
docker compose pull
68+
docker compose up -d --wait
69+
docker compose ps
70+
```
71+
72+
The app runs database migrations on startup. `docker compose ps` should show a healthy app and database and a running worker. Investigate startup errors with:
73+
74+
```sh
75+
docker compose logs --tail=100 app worker
76+
```
77+
78+
The default port binds only to loopback. From your computer, open a tunnel to the host:
79+
80+
```sh
81+
ssh -L 8080:127.0.0.1:8080 username@your-host
82+
```
83+
84+
Visit `http://localhost:8080`, sign in with the bootstrap account you configured, and change its password. For shared access, configure a TLS reverse proxy to `127.0.0.1:8080`, set `KINTSUGI_PUBLIC_URL` to the public HTTPS origin and recreate the containers with `docker compose up -d --wait`. Expose only the app through the proxy.
85+
86+
## 4. Configure and run your first project
87+
88+
Configure LLM providers, Git connections and permissions in the portal, then follow the [first project walkthrough](first-project.md). Provider keys and Git tokens belong in the portal, which encrypts them in PostgreSQL. Member CLI installers are served by your own installation at `/guideline`.
89+
90+
## Upgrade, backup and recovery
91+
92+
1. Back up PostgreSQL and the private `.env` before upgrading. For a small installation, create a database dump with `docker compose exec -T postgres pg_dump -U kintsugi -Fc kintsugi > kintsugi-backup.dump`. Protect the backup as sensitive data and test restoring it on a separate installation.
93+
2. Preserve the matching Compose package and image tag. Back up the Git repositories at their source; also preserve imported repositories that exist only in `KINTSUGI_DATA_DIR`.
94+
3. Download the Compose bundle at the new image commit, inspect configuration changes and set the new `KINTSUGI_VERSION` for both services.
95+
4. Run `docker compose pull`, then `docker compose up -d --wait`. Verify sign-in, repository sync and worker status in Monitoring.
96+
97+
Database migrations may prevent an image-only downgrade. Recovery can require restoring the pre-upgrade database together with its matching encryption key and images. `docker compose down` stops the stack; do not use `down -v` unless you intend to delete its database volume.
98+
99+
To build and deploy images through your own GitHub Actions workflow instead, see [installation and automated deployment](installation.md).

‎docs/guides/first-project.md‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Your first modernization project
2+
3+
This walkthrough takes an installed Kintsugi portal from an empty project to a reviewed unit. It covers the implemented assess, understand, design, member build and runtime review flow. The wider P0–P4 delivery method includes activities the team performs outside the portal; see the [delivery pipeline](../methodology/delivery-pipeline.md).
4+
5+
## 1. Prepare the installation
6+
7+
An installation administrator first [deploys the Docker images](docker-images.md), adds a [runtime LLM provider](configure-llm-providers.md), and configures Git servers and credentials in Settings → Git. Grant users the installation permissions and explicit Project Access they need. A role alone does not give a member access to every project.
8+
9+
Use a small application or a representative pilot. Have its legacy source, an empty document repository and scaffolded target repositories ready. The runtime reads source; members implement in the target repositories with their own Git credentials.
10+
11+
## 2. Register the project and its standards
12+
13+
In **Administration → Projects**, create a project, select its single document repository, add an application and link its `legacy`, optional `legacy-data`, and `target` repositories. Publish `kintsugi.yaml` with the starter structure, review the pull request and merge it. Wait for repository sync before running a stage.
14+
15+
Write target conventions, legacy-to-target mappings, review rules and design templates in `01-standards/`. Put shared architecture and components under `02-architecture/`. These are Markdown documents, reviewed in Git. Use [Build a project](build-project.md) for the exact setup and [Define design templates](define-design-templates.md) for the design contract.
16+
17+
## 3. Assess the application
18+
19+
Open **Delivery → Assessment & Catalog**, select the project and application, then start assessment. Review its runs and logs. The resulting document pull request contains the inventory, topology, catalog and rebuild assessment.
20+
21+
Check that the catalog identifies meaningful units, source references match the selected commit, and reported risks are supported by evidence. Review and merge the document pull request, then let Kintsugi sync it. The catalog is the menu for the next step; a successful job is not a human approval.
22+
23+
## 4. Understand selected units
24+
25+
Open **AS-IS Understanding → Catalog** and select a few representative items or a module. Run understanding on that selection. An optional understanding plan recommends an order based on dependencies; people choose the scope.
26+
27+
Review each unit's rules, specification, data objects, findings and traceability in the document pull request. Resolve uncertainty with the people who know the legacy behavior; do not assume an AI statement is confirmed. Merge approved results. Generated application views are rebuilt from the merged units.
28+
29+
## 5. Generate and review a design set
30+
31+
In **Unit Design**, select understood units and a design set defined by your project's templates. Confirm its prerequisites: the relevant standards, common design and any earlier design sets must be available at the chosen document revision.
32+
33+
Run the design, then inspect its proposed documents in Git. Review the handling of each business rule, interfaces, data changes, test expectations and unresolved decisions. Merge the accepted design before a member builds it. The number and names of design sets come from your project; the engine does not impose a stack.
34+
35+
## 6. Connect a member's AI client
36+
37+
Follow the [member guideline](member-quickstart.md) to install the CLI from **your installation's** `/guideline`, sign in to the project, run `kintsugi init`, and install the permitted `modernize` plugin. An administrator enables it under the project's Member plugins settings.
38+
39+
In a fresh client session opened in the target repository, use the plugin's build command with the unit path. Claude Code uses:
40+
41+
```text
42+
/modernize:build billing/invoice my-project
43+
```
44+
45+
Replace the example unit and project with the actual IDs. Codex receives the command as a skill; select the installed `modernize` build skill in its skill picker. The [client reference](../reference/member-cli.md) explains differences between clients.
46+
47+
Review the proposed implementation plan, let the member's assistant implement and test it, and inspect the canary that proves the tests can fail. The member commits the change and opens a merge request. Record its URL and full head commit through the build flow so the portal can associate it with the unit.
48+
49+
## 7. Request an independent review
50+
51+
Open **Delivery → Build** and check the recorded merge request and commit for the unit. Request a runtime review. It reads that revision against the unit's rules, merged design and project standards; it does not execute the target code or modify the merge request.
52+
53+
Review findings in the proposed `_build/review.md` document. The member fixes the code, reruns tests and records the new merge request revision before requesting another review. A person decides acceptance. Clean-build verification is a later stage; a runtime review alone does not certify that the code builds.
54+
55+
## 8. Monitor and repeat
56+
57+
- **Monitoring**: inspect stage runs, document writes, repository sync and worker health. Read errors before retrying a failed run.
58+
- **Governance → Telemetry**: inspect model calls, tokens, cache reads and cost.
59+
- **Monitoring → Members**: inspect bounded plugin activity. Raw client transcripts remain on the member's machine.
60+
- **Gates**: record the human decision against the relevant evidence; follow your project's P0–P4 process.
61+
62+
Run a small pilot first, improve standards through pull requests, then expand by wave. Keep legacy behavior, design decisions, implementation and tests traceable to their Git revisions.

‎docs/guides/installation.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Install Kintsugi
22

3+
To use the images already published by this project, start with [Deploy with the published Docker images](docker-images.md). This page covers building and deploying your own images through GitHub Actions.
4+
35
Kintsugi runs as a Docker Compose installation with one app container, one worker container, and PostgreSQL. The repository's GitHub Actions workflow builds and publishes the app and worker images to GHCR and deploys commits from `master` over SSH.
46

57
## Before you start

‎docs/guides/member-quickstart.md‎

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Member guideline: connect your AI client
2+
3+
Use Kintsugi with the AI client already on your machine. The CLI signs you in and provides a local MCP bridge for project documents and permitted plugins. It does not call a model or write to your code repository.
4+
5+
## Before you start
6+
7+
Ask your administrator for the installation's HTTPS URL, your project ID and an account with `member.read` and explicit Project Access. Install Node.js 22.19 or newer and a supported Claude Code, Codex or GitHub Copilot client. On Linux, install `libsecret-tools` and run a Secret Service provider such as GNOME Keyring or KWallet.
8+
9+
This flow is implemented in the development workspace. Check [client compatibility evidence](../reference/member-client-compatibility.md) for tested versions and remaining release gates.
10+
11+
## 1. Install from your installation
12+
13+
Open **Guideline** (`/guideline`) in your Kintsugi portal. It provides the exact commands and downloadable packages with checksums for that installation. Replace the example origin below with yours.
14+
15+
macOS / Linux:
16+
17+
```sh
18+
curl -fsSL https://kintsugi.example.internal/api/v1/releases/latest/install.sh | sh
19+
```
20+
21+
Windows PowerShell:
22+
23+
```powershell
24+
powershell -ExecutionPolicy Bypass -Command "irm https://kintsugi.example.internal/api/v1/releases/latest/install.ps1 | iex"
25+
```
26+
27+
Open a new terminal, add the installer-provided PATH entry if needed, and check:
28+
29+
```sh
30+
kintsugi --version
31+
```
32+
33+
The installer checks the package hash and remembers the installation URL. Run it again to update the CLI in place. Manual packages are available on the same Guideline page.
34+
35+
## 2. Sign in and set up clients
36+
37+
```sh
38+
kintsugi login my-project
39+
kintsugi init
40+
```
41+
42+
Replace `my-project` with your actual project ID. In the browser, review the requested project and approve access. `init` lists detected clients and asks which to configure and whether to install globally or for the current workspace. Codex and Copilot use global setup; Claude Code supports workspace setup. Restart the client afterwards.
43+
44+
Codex Desktop setup stages a personal marketplace; finish installing the connector in the app's Plugins Directory. It does not yet distribute member plugins through that staged path.
45+
46+
## 3. Install a permitted plugin
47+
48+
```sh
49+
kintsugi plugins list
50+
kintsugi install plugin modernize --all
51+
```
52+
53+
If no plugin is available, ask the project's administrator to enable it for you. Start a new client session. Claude Code exposes `/modernize:build <module>/<unit> [project]`. Codex exposes the build command as a generated skill; select it with `$` or `/skills`. Copilot exposes a plugin skill. Trust the reporting hook in Codex's `/hooks` when requested.
54+
55+
The `modernize` build flow reads the rules and merged design, proposes a plan for approval, implements and tests the unit locally, checks a canary, and records the unit's test result and merge request. See the [first project walkthrough](first-project.md) for the complete review loop.
56+
57+
## 4. Check the connection
58+
59+
```sh
60+
kintsugi auth status
61+
kintsugi project list
62+
kintsugi document tree 01-standards
63+
kintsugi doctor
64+
```
65+
66+
In the AI client, ask it to list your Kintsugi projects and read a relevant standard through the connector. Documents are read from Git at a branch or commit. A successful `doctor` check verifies the runtime, credential and API read, not full client compatibility.
67+
68+
## Maintain or disconnect
69+
70+
```sh
71+
kintsugi install fetch modernize
72+
kintsugi remove modernize --all
73+
kintsugi auth logout
74+
```
75+
76+
`auth logout` revokes the connection and removes the local credential. Access tokens stay in memory, rotating refresh credentials live in the operating system credential store, and profiles contain nonsecret configuration. Administrators can revoke connections in the portal.
77+
78+
## Troubleshooting
79+
80+
| Symptom | Next step |
81+
|---|---|
82+
| `kintsugi: command not found` | Open a new terminal and add the PATH line printed by the installer. |
83+
| No accessible project | Check the requested project ID, `member.read`, and explicit Project Access with an administrator. |
84+
| Plugin is missing | Check project plugin access, run `plugins list`, and restart the client after installation. |
85+
| Linux credential-store error | Install `libsecret-tools`, unlock the running keyring and sign in again. |
86+
| Private certificate authority | Use the CLI's `--ca-file` option; see the full reference. |
87+
| Hook is skipped in Codex | Review and trust the installed hook in `/hooks`. |
88+
89+
Exact commands, authorization, plugin safety and reporting behavior: [member CLI reference](../reference/member-cli.md).

0 commit comments

Comments
 (0)