Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"type": "module",
"scripts": {
"dev": "vocs dev",
"lint": "tsc --noEmit",
"lint": "tsc --noEmit && node scripts/check-status-badges.mjs",
"build": "vocs build && node scripts/copy-markdown-routes.mjs",
"preview": "vocs preview"
},
Expand Down
70 changes: 70 additions & 0 deletions scripts/check-status-badges.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { readdir, readFile } from 'node:fs/promises'
import { join, relative } from 'node:path'
import { fileURLToPath } from 'node:url'

const pagesRoot = fileURLToPath(new URL('../src/pages/', import.meta.url))
const expectedStyle = {
Shipped: 'success',
Partial: 'warning',
Planned: undefined,
}

async function collectMdxFiles(directory) {
const entries = await readdir(directory, { withFileTypes: true })
const nested = await Promise.all(
entries.map((entry) => {
const path = join(directory, entry.name)
if (entry.isDirectory()) return collectMdxFiles(path)
return entry.isFile() && entry.name.endsWith('.mdx') ? [path] : []
}),
)
return nested.flat()
}

const files = await collectMdxFiles(pagesRoot)
const errors = []
let badgedPageCount = 0
let unbadgedPageCount = 0

for (const file of files) {
const source = await readFile(file, 'utf8')
const matches = [
...source.matchAll(/:badge\[(Shipped|Partial|Planned)\](?:\{([^}]+)\})?/g),
]
const page = relative(pagesRoot, file).replaceAll('\\', '/')
const expectsBadge = page !== 'index.mdx' && !page.startsWith('use-bloom/')

if (!expectsBadge) {
unbadgedPageCount += 1
if (matches.length !== 0) {
errors.push(`${page}: homepage and Use Bloom pages must not have status badges`)
}
continue
}

badgedPageCount += 1
if (matches.length !== 1) {
errors.push(`${page}: expected exactly one status badge, found ${matches.length}`)
continue
}

const [, status, style] = matches[0]
if (style !== expectedStyle[status]) {
const expected = expectedStyle[status] ?? 'no style'
errors.push(`${page}: ${status} must use ${expected}`)
}

const firstLines = source.split('\n').slice(0, 15).join('\n')
if (!firstLines.includes(matches[0][0])) {
errors.push(`${page}: status badge must appear near the top of the page`)
}
}

if (errors.length > 0) {
console.error(errors.join('\n'))
process.exitCode = 1
} else {
console.log(
`Verified ${badgedPageCount} badged pages and ${unbadgedPageCount} intentionally unbadged pages.`,
)
}
13 changes: 13 additions & 0 deletions src/pages/_root.css
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,19 @@
}
}

/* Keep implementation status at the far edge of the page-title box. */
[data-v-content] > h1:has(> [data-v-badge]) {
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 0.75rem;
}

[data-v-content] > h1 > [data-v-badge] {
flex: 0 0 auto;
margin-inline-start: auto;
}

.bloom-expected-output {
display: inline-flex;
align-items: center;
Expand Down
2 changes: 1 addition & 1 deletion src/pages/integrators/agent-setup.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Agent setup
# Agent setup :badge[Shipped]{success}

The preferred user prompt is:

Expand Down
2 changes: 1 addition & 1 deletion src/pages/integrators/integrating.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Integrating Bloom
# Integrating Bloom :badge[Planned]

Bloom and walletFS can help you achieve your agentic use cases safely and quickly.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/integrators/quickstart.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Quickstart
# Quickstart :badge[Shipped]{success}

This walkthrough uses the mounted `/bloom` filesystem. Bloom’s command-specific fallbacks exist for constrained environments, but normal shell tools against the mount are the default interface.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/introduction/benefits.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Benefits
# Benefits :badge[Partial]{warning}

Bloom is designed around the operating model agents already understand: files. Our initial hypothesis is confirmed from early testing (not public yet): a filesystem based approach to agentic tool use spends less tokens while achieving higher tool call reliability. We plan to publish our findings soon. Other benefits include:

Expand Down
2 changes: 1 addition & 1 deletion src/pages/introduction/core-concepts.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Core concepts
# Core concepts :badge[Shipped]{success}

## Virtual filesystem

Expand Down
2 changes: 1 addition & 1 deletion src/pages/introduction/demos.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Demos
# Demos :badge[Shipped]{success}

## x402 Paid HTTP Request

Expand Down
2 changes: 1 addition & 1 deletion src/pages/introduction/what-is-bloom.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# What is Bloom?
# What is Bloom? :badge[Partial]{warning}

Bloom is a framework for creating agent-safe software components. The first application of Bloom is an agentic Ethereum wallet. We call this walletFS.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/petals/authoring.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Authoring Petals
# Authoring Petals :badge[Partial]{warning}

The petal authoring surface is a small Rust framework.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/petals/model.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Petal Model
# Petal Model :badge[Partial]{warning}

Bloom-native petals are deterministic wasm modules called by the chain executor.
They are not ordinary off-chain plugins and they do not have ambient access to
Expand Down
2 changes: 1 addition & 1 deletion src/pages/petals/overview.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Petals
# Petals :badge[Partial]{warning}

## ⚠️ WARNING - EARLY / UNFINISHED

Expand Down
2 changes: 1 addition & 1 deletion src/pages/petals/ptbs-and-pipes.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# PTBs And Pipes
# PTBs And Pipes :badge[Partial]{warning}

Petals are called through programmable transaction blocks. A PTB is an ordered
list of commands plus signer, gas, and expiry metadata.
Expand Down
2 changes: 1 addition & 1 deletion src/pages/petals/quickstart.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Quickstart
# Quickstart :badge[Partial]{warning}

This guide shows the shape of a minimal Bloom-native petal, then a slightly more
involved object petal. The examples are intentionally small; the standard
Expand Down
2 changes: 1 addition & 1 deletion src/pages/petals/testing.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Testing Petals
# Testing Petals :badge[Partial]{warning}

Petal testing usually happens at three levels.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/reference/development.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Development
# Development :badge[Shipped]{success}

## Build

Expand Down
2 changes: 1 addition & 1 deletion src/pages/reference/limitations.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Limitations
# Limitations :badge[Partial]{warning}

Bloom is useful today, but several boundaries are explicit.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/reference/project-map.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Project map
# Project map :badge[Partial]{warning}

This map connects public docs concepts to the Bloom source files that currently implement them.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/reference/supported-chains.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Supported chains
# Supported chains :badge[Shipped]{success}

`bloom init` ships read-ready defaults for:

Expand Down
2 changes: 1 addition & 1 deletion src/pages/reference/technical-architecture.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Technical architecture
# Technical architecture :badge[Partial]{warning}

Bloom is a Rust workspace split into focused crates around a daemon, virtual filesystem, wallet transaction engine, and chain integrations.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/wallet/defi-intents.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# DeFi intents
# DeFi intents :badge[Partial]{warning}

Bloom exposes DeFi routing under `/bloom/defi/intents/<wallet>/`. The current implementation uses Enso Shortcuts.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/wallet/filesystem-guide.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Filesystem guide
# Filesystem guide :badge[Partial]{warning}

Bloom’s VFS is normally mounted at `/bloom`. Use standard shell tools against that mount: reads are `cat`/`ls`, writes are file writes.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/wallet/security-model.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Security model
# Security model :badge[Shipped]{success}

Bloom is built around explicit control points between an agent and user funds.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/wallet/use-cases.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ExpectedOutput } from '../../components/ExpectedOutput'

# Use cases
# Use cases :badge[Shipped]{success}

Bloom’s filesystem model lets Ethereum power users compose chain reads, wallet state, encoding helpers, and transaction staging with ordinary shell tooling. The examples below assume Bloom is mounted at `/bloom` and that you review every generated plan before signing.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/wallet/wallets-and-transactions.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Wallets and transactions
# Wallets and transactions :badge[Shipped]{success}

Bloom wallets are local encrypted keys or watch-only addresses exposed through the filesystem.

Expand Down
2 changes: 1 addition & 1 deletion src/pages/wallet/watches-and-simulation.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Watches and simulation
# Watches and simulation :badge[Shipped]{success}

## Watches

Expand Down
Loading