From 98359a5052ee476988a92d10aa6a20b5223f3393 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 06:12:52 +0000
Subject: [PATCH 1/5] Initial plan
From 94d92bb6154e0555c297a4a554c70e4fc5124ab3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 06:18:33 +0000
Subject: [PATCH 2/5] Update init command to create package.json in content
folder
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
---
README.md | 100 ++++++++++++++++-------------
examples/starter/README.md | 46 ++++++++++---
examples/starter/package.json | 6 +-
packages/cli/src/commands/init.mjs | 67 ++++++++++++++++---
test-quick.sh | 12 ++--
5 files changed, 155 insertions(+), 76 deletions(-)
diff --git a/README.md b/README.md
index 3edf5e6..2aa7aba 100644
--- a/README.md
+++ b/README.md
@@ -55,56 +55,28 @@ This architecture allows developers and technical writers to manage complex, mul
## š Quick Start
-### 1. Create a new project
+### Option 1: In Any Existing Project (Recommended)
-Initialize your documentation site structure:
+Initialize ObjectDocs in any existing GitHub project without polluting the root directory:
```bash
-mkdir my-docs
-cd my-docs
-pnpm init
-pnpm add -D @objectdocs/cli
-```
-
-### 2. Configure scripts
-
-Add the following scripts to your `package.json`:
-
-```json
-{
- "scripts": {
- "dev": "objectdocs dev",
- "build": "objectdocs build",
- "start": "objectdocs start"
- }
-}
-```
-
-### 3. Initialize ObjectDocs
-
-Run the init command to set up the site engine:
-
-```bash
-pnpm objectdocs init
+cd your-existing-project
+npx @objectdocs/cli init
```
This will:
+- Create `content/package.json` with necessary scripts
- Copy the site engine to `content/.objectdocs`
-- Install necessary dependencies
-- Automatically add `content/.objectdocs` to `.gitignore`
-- Prepare your project for development
-
-### 4. Add content
+- Install dependencies in `content/.objectdocs/node_modules`
+- Automatically add `content/.objectdocs` and `content/node_modules` to `.gitignore`
+- Keep your project root clean and unpolluted
-Create the basic directory structure:
+Then add content and start the server:
```bash
mkdir -p content/docs
-```
-
-Create `content/docs/index.mdx`:
-```mdx
+cat > content/docs/index.mdx << 'EOF'
---
title: Welcome
description: My new docs site
@@ -113,23 +85,52 @@ description: My new docs site
# Hello World
Welcome to ObjectDocs!
+EOF
+
+cat > content/docs/meta.json << 'EOF'
+{
+ "pages": ["index"]
+}
+EOF
+
+# Start the development server
+cd content && npm run dev
```
-Create `content/docs/meta.json`:
+Visit http://localhost:7777 to see your site.
+
+### Option 2: New Standalone Project
+
+For a new dedicated documentation project:
+
+```bash
+mkdir my-docs
+cd my-docs
+npm init -y
+npm install -D @objectdocs/cli
+```
+
+Add scripts to your root `package.json`:
```json
{
- "pages": ["index"]
+ "scripts": {
+ "dev": "cd content && npm run dev",
+ "build": "cd content && npm run build",
+ "start": "cd content && npm run start"
+ }
}
```
-### 5. Start the server
+Initialize ObjectDocs:
```bash
-pnpm dev
+npm run init
+# or
+npx objectdocs init
```
-Visit http://localhost:7777 to see your site.
+Then follow the same steps as Option 1 to add content.
## šļø Project Structure
@@ -137,16 +138,23 @@ ObjectDocs enforces a clear directory structure to ensure maintainability at sca
```text
.
-āāā content/ # [Data Layer] Raw Content
-ā āāā .objectdocs/ # Site engine (auto-generated by init)
+āāā content/ # [Data Layer] All documentation files
+ā āāā package.json # npm scripts (dev, build, start)
+ā āāā .objectdocs/ # Site engine (auto-generated, gitignored)
ā āāā docs.site.json # Global settings (Nav, Logo, Branding)
ā āāā docs/
ā āāā meta.json # Directory structure & sorting control
ā āāā index.mdx # Documentation content
-āāā package.json
+āāā package.json # (Optional) Root project package.json
āāā ...
```
+**Key Points:**
+- All documentation-related files are in `content/`
+- `content/.objectdocs/` is auto-generated and gitignored
+- Your project root remains clean
+- Perfect for adding docs to any existing project
+
## āļø Configuration
ObjectDocs is designed to be "Configuration as Code".
diff --git a/examples/starter/README.md b/examples/starter/README.md
index 641f45e..c4e7109 100644
--- a/examples/starter/README.md
+++ b/examples/starter/README.md
@@ -23,18 +23,25 @@ This starter template serves multiple purposes:
```
examples/starter/
āāā content/
-ā āāā .objectdocs/ # Site engine (created by init command)
-ā āāā docs.site.json # Global site configuration
+ā āāā package.json # npm scripts (auto-created by init)
+ā āāā .objectdocs/ # Site engine (created by init command, gitignored)
+ā āāā docs.site.json # Global site configuration
ā āāā docs/
-ā āāā meta.json # Sidebar navigation structure
-ā āāā index.mdx # Home page
+ā āāā meta.json # Sidebar navigation structure
+ā āāā index.mdx # Home page
ā āāā getting-started.mdx
ā āāā configuration.mdx
-āāā public/ # Static assets (logos, images)
-āāā package.json # Uses @objectdocs/cli from workspace
-āāā README.md # This file
+āāā public/ # Static assets (logos, images)
+āāā package.json # Uses @objectdocs/cli from workspace
+āāā README.md # This file
```
+**Key Points:**
+- All documentation files are in `content/`
+- `content/package.json` is auto-created by `objectdocs init`
+- `content/.objectdocs/` is gitignored and not committed
+- Root directory remains clean
+
## š Getting Started
### Prerequisites
@@ -50,7 +57,7 @@ examples/starter/
cd examples/starter
```
-2. Install dependencies:
+2. Install the CLI:
```bash
pnpm install
@@ -65,14 +72,21 @@ pnpm objectdocs init
```
This command will:
+- Create `content/package.json` with necessary scripts
- Copy the `@objectdocs/site` engine to `content/.objectdocs`
-- Install necessary dependencies
+- Install dependencies in `content/.objectdocs/node_modules`
- Prepare your project for development
### Development
Start the development server:
+```bash
+cd content && npm run dev
+```
+
+Or if you have a root-level script configured:
+
```bash
pnpm dev
```
@@ -83,16 +97,28 @@ The site will be available at [http://localhost:7777](http://localhost:7777).
Build the project for production:
+```bash
+cd content && npm run build
+```
+
+Or with root-level script:
+
```bash
pnpm build
```
-This will generate the production build in the `.next` directory.
+This will generate the production build in the `content/.objectdocs/.next` directory.
### Production Server
Start the production server:
+```bash
+cd content && npm run start
+```
+
+Or with root-level script:
+
```bash
pnpm start
```
diff --git a/examples/starter/package.json b/examples/starter/package.json
index 9374bd5..fa01338 100644
--- a/examples/starter/package.json
+++ b/examples/starter/package.json
@@ -4,9 +4,9 @@
"private": true,
"description": "Starter template for creating documentation sites with ObjectDocs",
"scripts": {
- "dev": "objectdocs dev",
- "build": "objectdocs build",
- "start": "objectdocs start"
+ "dev": "cd content && npm run dev",
+ "build": "cd content && npm run build",
+ "start": "cd content && npm run start"
},
"devDependencies": {
"@objectdocs/cli": "workspace:*"
diff --git a/packages/cli/src/commands/init.mjs b/packages/cli/src/commands/init.mjs
index 75e97a3..fa77409 100644
--- a/packages/cli/src/commands/init.mjs
+++ b/packages/cli/src/commands/init.mjs
@@ -22,7 +22,9 @@ export function registerInitCommand(cli) {
.action(async (options) => {
console.log('Initializing ObjectDocs...\n');
- const targetDir = path.resolve(process.cwd(), 'content/.objectdocs');
+ const contentDir = path.resolve(process.cwd(), 'content');
+ const targetDir = path.resolve(contentDir, '.objectdocs');
+ const contentPackageJsonPath = path.resolve(contentDir, 'package.json');
// Check if already initialized
if (fs.existsSync(targetDir)) {
@@ -31,6 +33,12 @@ export function registerInitCommand(cli) {
return;
}
+ // Create content directory if it doesn't exist
+ if (!fs.existsSync(contentDir)) {
+ fs.mkdirSync(contentDir, { recursive: true });
+ console.log(`š Created content directory\n`);
+ }
+
// Resolve the site package directory
let siteDir;
try {
@@ -65,9 +73,45 @@ export function registerInitCommand(cli) {
console.log('ā
ObjectDocs site copied successfully!\n');
+ // Initialize or update content/package.json
+ let packageJson = {};
+ if (fs.existsSync(contentPackageJsonPath)) {
+ console.log('š Updating existing content/package.json\n');
+ packageJson = JSON.parse(fs.readFileSync(contentPackageJsonPath, 'utf-8'));
+ } else {
+ console.log('š Creating content/package.json\n');
+ packageJson = {
+ name: 'objectdocs-content',
+ version: '0.1.0',
+ private: true,
+ description: 'ObjectDocs documentation content'
+ };
+ }
+
+ // Ensure scripts section exists
+ if (!packageJson.scripts) {
+ packageJson.scripts = {};
+ }
+
+ // Add/update ObjectDocs scripts
+ packageJson.scripts = {
+ ...packageJson.scripts,
+ dev: 'cd .objectdocs && npm run dev',
+ build: 'cd .objectdocs && npm run build',
+ start: 'cd .objectdocs && npm run start'
+ };
+
+ // Write package.json
+ fs.writeFileSync(
+ contentPackageJsonPath,
+ JSON.stringify(packageJson, null, 2) + '\n'
+ );
+
+ console.log('ā
content/package.json configured\n');
+
// Add to .gitignore
const gitignorePath = path.resolve(process.cwd(), '.gitignore');
- const gitignoreEntry = 'content/.objectdocs';
+ const gitignoreEntries = ['content/.objectdocs', 'content/node_modules'];
try {
let gitignoreContent = '';
@@ -75,21 +119,21 @@ export function registerInitCommand(cli) {
gitignoreContent = fs.readFileSync(gitignorePath, 'utf-8');
}
- // Check if the entry already exists (as a complete line)
const lines = gitignoreContent.split('\n').map(line => line.trim());
- if (!lines.includes(gitignoreEntry)) {
- // Add the entry with a comment
+ const entriesToAdd = gitignoreEntries.filter(entry => !lines.includes(entry));
+
+ if (entriesToAdd.length > 0) {
const separator = gitignoreContent.trim() ? '\n\n' : '';
- const newContent = `${gitignoreContent.trim()}${separator}# ObjectDocs\n${gitignoreEntry}\n`;
+ const newContent = `${gitignoreContent.trim()}${separator}# ObjectDocs\n${entriesToAdd.join('\n')}\n`;
fs.writeFileSync(gitignorePath, newContent);
- console.log('š Added content/.objectdocs to .gitignore\n');
+ console.log(`š Added ${entriesToAdd.join(', ')} to .gitignore\n`);
}
} catch (e) {
console.warn('ā ļø Could not update .gitignore:', e.message);
}
// Install dependencies in the target directory
- console.log('š¦ Installing dependencies...\n');
+ console.log('š¦ Installing dependencies in content/.objectdocs...\n');
const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
const installProcess = spawn(npmCmd, ['install', '--legacy-peer-deps'], {
@@ -101,8 +145,11 @@ export function registerInitCommand(cli) {
if (code === 0) {
console.log('\nā
Dependencies installed successfully!');
console.log('\nš ObjectDocs initialized! You can now run:');
- console.log(' pnpm dev - Start development server');
- console.log(' pnpm build - Build for production\n');
+ console.log(' cd content && npm run dev - Start development server');
+ console.log(' cd content && npm run build - Build for production\n');
+ console.log('Or if you have npm scripts in your root package.json:');
+ console.log(' npm run dev - Start development server');
+ console.log(' npm run build - Build for production\n');
} else {
console.error('\nā Failed to install dependencies');
process.exit(code);
diff --git a/test-quick.sh b/test-quick.sh
index b6830f6..f53b503 100755
--- a/test-quick.sh
+++ b/test-quick.sh
@@ -58,10 +58,7 @@ main() {
print_success "Installed @objectdocs/cli from npm"
fi
- # Configure scripts
- pnpm pkg set scripts.build="objectdocs build"
-
- # Initialize ObjectDocs
+ # Initialize ObjectDocs (this will create content/package.json)
pnpm objectdocs init
print_success "Initialized ObjectDocs"
@@ -92,9 +89,10 @@ EOF
print_success "Created content"
- # Run build
+ # Run build from content directory
print_section "Running Build"
- if pnpm build; then
+ cd content
+ if npm run build; then
print_success "Build completed successfully"
else
print_error "Build failed"
@@ -102,7 +100,7 @@ EOF
fi
# Check build output
- if [ -d "content/.objectdocs/.next" ] || [ -d ".next" ]; then
+ if [ -d ".objectdocs/.next" ]; then
print_success "Build output exists"
else
print_error "Build output not found"
From 6b7adabb15548b009ac29502c510ec8b8ce75cc5 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 06:38:37 +0000
Subject: [PATCH 3/5] Changes before error encountered
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
---
content/docs/index.mdx | 59 ++----------------------------
content/docs/meta.json | 8 +---
packages/cli/src/commands/init.mjs | 35 +++++++++++-------
pnpm-lock.yaml | 2 +-
4 files changed, 27 insertions(+), 77 deletions(-)
diff --git a/content/docs/index.mdx b/content/docs/index.mdx
index c54f103..1d9300e 100644
--- a/content/docs/index.mdx
+++ b/content/docs/index.mdx
@@ -1,58 +1,5 @@
---
-title: Introduction
-description: The Metadata-Driven Documentation Engine for the Low-Code Era.
+title: Test
+description: Test page
---
-
-import { FileJson, Layers, Cpu, Zap } from 'lucide-react';
-
-# What is ObjectDocs?
-
-**ObjectDocs** is a modern, opinionated documentation site generator built on top of **Next.js 14** and **Fumadocs**.
-
-It was created to solve a specific problem in the **ObjectStack** ecosystem: *How do we document complex, multi-product low-code platforms without drowning in frontend maintenance?*
-
-Unlike general-purpose static site generators (SSGs), ObjectDocs treats documentation structure as **data**, not code.
-
-## Core Philosophy
-
-
- }
- title="Metadata-Driven"
- href="/docs/getting-started/configuration"
- >
- Control sidebars, navigation, and page ordering entirely through local `meta.json` files. No React knowledge required for content updates.
-
- }
- title="Low-Code Native"
- href="/docs/components"
- >
- Directly embed JSON schemas in Markdown. Render live, interactive components powered by ObjectQL definitions.
-
-
-
-## Why ObjectDocs?
-
-### 1. Separation of Concerns
-In traditional documentation sites, adding a new section often requires editing a global `sidebar.js` config or touching React components. In ObjectDocs, we strictly separate roles:
-
-* **Technical Writers**: Write `.mdx` content and manage local `meta.json` for sorting.
-* **Platform Architects**: Configure global `content/docs.site.json` (branding, nav links).
-* **Frontend Developers**: Maintain the base UI logic only when strictly necessary.
-
-### 2. Interactive Components
-Static text is not enough to showcase the capabilities of a low-code platform. ObjectDocs allows you to mount live component demos directly in your docs.
-
-## Next Steps
-
-Ready to build your documentation?
-
-
-}>
-Install ObjectDocs and create your first page in under 5 minutes.
-
-}>
-Deep dive into the directory structure and data flow.
-
-
+# Test Page
diff --git a/content/docs/meta.json b/content/docs/meta.json
index fb26779..d20d140 100644
--- a/content/docs/meta.json
+++ b/content/docs/meta.json
@@ -1,9 +1,3 @@
{
- "title": "Documentation",
- "pages": [
- "index",
- "getting-started",
- "components",
- "development-plan"
- ]
+ "pages": ["index"]
}
diff --git a/packages/cli/src/commands/init.mjs b/packages/cli/src/commands/init.mjs
index fa77409..0d7ab82 100644
--- a/packages/cli/src/commands/init.mjs
+++ b/packages/cli/src/commands/init.mjs
@@ -141,19 +141,28 @@ export function registerInitCommand(cli) {
stdio: 'inherit'
});
- installProcess.on('close', (code) => {
- if (code === 0) {
- console.log('\nā
Dependencies installed successfully!');
- console.log('\nš ObjectDocs initialized! You can now run:');
- console.log(' cd content && npm run dev - Start development server');
- console.log(' cd content && npm run build - Build for production\n');
- console.log('Or if you have npm scripts in your root package.json:');
- console.log(' npm run dev - Start development server');
- console.log(' npm run build - Build for production\n');
- } else {
- console.error('\nā Failed to install dependencies');
- process.exit(code);
- }
+ // Wait for the install process to complete
+ await new Promise((resolve, reject) => {
+ installProcess.on('close', (code) => {
+ if (code === 0) {
+ console.log('\nā
Dependencies installed successfully!');
+ console.log('\nš ObjectDocs initialized! You can now run:');
+ console.log(' cd content && npm run dev - Start development server');
+ console.log(' cd content && npm run build - Build for production\n');
+ console.log('Or if you have npm scripts in your root package.json:');
+ console.log(' npm run dev - Start development server');
+ console.log(' npm run build - Build for production\n');
+ resolve();
+ } else {
+ console.error('\nā Failed to install dependencies');
+ reject(new Error(`Install failed with code ${code}`));
+ }
+ });
+
+ installProcess.on('error', (err) => {
+ console.error('\nā Failed to start install process:', err.message);
+ reject(err);
+ });
});
});
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4ab03ca..22d9a2f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,7 +1,7 @@
lockfileVersion: '9.0'
settings:
- autoInstallPeers: false
+ autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
From 2be2a4ec97ead3dc96b05c6e911046babfc11e3e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 09:09:42 +0000
Subject: [PATCH 4/5] Fix test script to use local CLI and make init await
properly
Co-authored-by: xuyushun441-sys <255036401+xuyushun441-sys@users.noreply.github.com>
---
test-quick.sh | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/test-quick.sh b/test-quick.sh
index f53b503..5d236da 100755
--- a/test-quick.sh
+++ b/test-quick.sh
@@ -38,6 +38,10 @@ trap cleanup EXIT
main() {
print_section "ObjectDocs Quick Build Test"
+ # Detect monorepo root BEFORE changing directories
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+ MONOREPO_ROOT="${SCRIPT_DIR}"
+
# Create test project
mkdir -p "$TEST_DIR"
cd "$TEST_DIR"
@@ -46,9 +50,6 @@ main() {
print_success "Initialized project"
# Install CLI from workspace (detect monorepo root)
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
- MONOREPO_ROOT="${SCRIPT_DIR}"
-
if [ -d "$MONOREPO_ROOT/packages/cli" ]; then
pnpm add -D "$MONOREPO_ROOT/packages/cli"
print_success "Installed @objectdocs/cli from local workspace"
From 2219503fdd5dc0897f526e07a76ddd1becb15b48 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 10:34:07 +0000
Subject: [PATCH 5/5] Restore original ObjectDocs project documentation content
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
---
content/docs/index.mdx | 59 +++++++++++++++++++++++++++++++++++++++---
content/docs/meta.json | 8 +++++-
2 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/content/docs/index.mdx b/content/docs/index.mdx
index 1d9300e..c54f103 100644
--- a/content/docs/index.mdx
+++ b/content/docs/index.mdx
@@ -1,5 +1,58 @@
---
-title: Test
-description: Test page
+title: Introduction
+description: The Metadata-Driven Documentation Engine for the Low-Code Era.
---
-# Test Page
+
+import { FileJson, Layers, Cpu, Zap } from 'lucide-react';
+
+# What is ObjectDocs?
+
+**ObjectDocs** is a modern, opinionated documentation site generator built on top of **Next.js 14** and **Fumadocs**.
+
+It was created to solve a specific problem in the **ObjectStack** ecosystem: *How do we document complex, multi-product low-code platforms without drowning in frontend maintenance?*
+
+Unlike general-purpose static site generators (SSGs), ObjectDocs treats documentation structure as **data**, not code.
+
+## Core Philosophy
+
+
+ }
+ title="Metadata-Driven"
+ href="/docs/getting-started/configuration"
+ >
+ Control sidebars, navigation, and page ordering entirely through local `meta.json` files. No React knowledge required for content updates.
+
+ }
+ title="Low-Code Native"
+ href="/docs/components"
+ >
+ Directly embed JSON schemas in Markdown. Render live, interactive components powered by ObjectQL definitions.
+
+
+
+## Why ObjectDocs?
+
+### 1. Separation of Concerns
+In traditional documentation sites, adding a new section often requires editing a global `sidebar.js` config or touching React components. In ObjectDocs, we strictly separate roles:
+
+* **Technical Writers**: Write `.mdx` content and manage local `meta.json` for sorting.
+* **Platform Architects**: Configure global `content/docs.site.json` (branding, nav links).
+* **Frontend Developers**: Maintain the base UI logic only when strictly necessary.
+
+### 2. Interactive Components
+Static text is not enough to showcase the capabilities of a low-code platform. ObjectDocs allows you to mount live component demos directly in your docs.
+
+## Next Steps
+
+Ready to build your documentation?
+
+
+}>
+Install ObjectDocs and create your first page in under 5 minutes.
+
+}>
+Deep dive into the directory structure and data flow.
+
+
diff --git a/content/docs/meta.json b/content/docs/meta.json
index d20d140..fb26779 100644
--- a/content/docs/meta.json
+++ b/content/docs/meta.json
@@ -1,3 +1,9 @@
{
- "pages": ["index"]
+ "title": "Documentation",
+ "pages": [
+ "index",
+ "getting-started",
+ "components",
+ "development-plan"
+ ]
}