build: Set up the monorepo workspace. Ensure the root README describes a pro...
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
This commit is contained in:
parent
64b4207150
commit
6d1992bd6c
@ -1,25 +1,39 @@
|
|||||||
# foundary-1770670477
|
# Foundary
|
||||||
|
|
||||||
Project deployed to gbgf39u8.threesix.ai via threesix.ai platform.
|
A product studio for conversational product development. Deployed to gbgf39u8.threesix.ai via threesix.ai platform.
|
||||||
|
|
||||||
|
## Monorepo layout
|
||||||
|
|
||||||
|
This is a **pnpm workspace monorepo**. Key locations:
|
||||||
|
|
||||||
|
- `apps/web/` — Frontend web application (`@foundary/web`)
|
||||||
|
- `apps/api/` — Backend API server (`@foundary/api`)
|
||||||
|
- `packages/shared/` — Shared types, utilities, constants (`@foundary/shared`)
|
||||||
|
- `packages/config/` — Shared tsconfig and lint config (`@foundary/config`)
|
||||||
|
|
||||||
|
Internal dependencies use `workspace:*` protocol.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clone
|
# Install
|
||||||
git clone https://git.threesix.ai/jordan/foundary-1770670477.git
|
pnpm install
|
||||||
cd foundary-1770670477
|
|
||||||
|
|
||||||
# Build
|
# Dev
|
||||||
docker build -t foundary-1770670477 .
|
pnpm dev
|
||||||
|
|
||||||
# Run
|
# Build all
|
||||||
docker run -p 8080:8080 foundary-1770670477
|
pnpm build
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
docker build -t foundary .
|
||||||
|
docker run -p 8080:80 foundary
|
||||||
```
|
```
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
Pushes to `main` trigger automatic deployment via Woodpecker CI:
|
Pushes to `main` trigger automatic deployment via Woodpecker CI:
|
||||||
1. Build Docker image
|
1. Build Docker image (multi-stage)
|
||||||
2. Push to registry (registry.threesix.ai)
|
2. Push to registry (registry.threesix.ai)
|
||||||
3. Update Kubernetes deployment
|
3. Update Kubernetes deployment
|
||||||
|
|
||||||
@ -30,3 +44,4 @@ Live at: https://gbgf39u8.threesix.ai
|
|||||||
- Keep the Dockerfile optimized for build time
|
- Keep the Dockerfile optimized for build time
|
||||||
- Use multi-stage builds when possible
|
- Use multi-stage builds when possible
|
||||||
- All config via environment variables
|
- All config via environment variables
|
||||||
|
- Use pnpm for package management — no npm or yarn
|
||||||
|
|||||||
24
Dockerfile
24
Dockerfile
@ -1,9 +1,21 @@
|
|||||||
# Default Dockerfile - replace with your application
|
# Stage 1 — Install dependencies
|
||||||
|
FROM node:20-alpine AS deps
|
||||||
|
RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml* .npmrc ./
|
||||||
|
COPY apps/web/package.json ./apps/web/
|
||||||
|
COPY apps/api/package.json ./apps/api/
|
||||||
|
COPY packages/shared/package.json ./packages/shared/
|
||||||
|
COPY packages/config/package.json ./packages/config/
|
||||||
|
RUN pnpm install --frozen-lockfile || pnpm install
|
||||||
|
|
||||||
|
# Stage 2 — Build
|
||||||
|
FROM deps AS build
|
||||||
|
COPY . .
|
||||||
|
RUN pnpm build
|
||||||
|
|
||||||
|
# Stage 3 — Production image
|
||||||
FROM nginx:alpine
|
FROM nginx:alpine
|
||||||
|
COPY --from=build /app/apps/web/dist /usr/share/nginx/html/
|
||||||
# Copy static files or your app
|
|
||||||
COPY . /usr/share/nginx/html/
|
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
|
|||||||
66
README.md
66
README.md
@ -1,21 +1,59 @@
|
|||||||
# foundary-1770670477
|
# Foundary
|
||||||
|
|
||||||
Deployed at: https://gbgf39u8.threesix.ai
|
**A product studio for conversational product development.**
|
||||||
|
|
||||||
## Getting Started
|
Foundary lets teams shape, build, and ship products through structured conversations. Instead of disconnected specs, tickets, and hand-offs, Foundary keeps the entire product development lifecycle inside a single conversational thread — from initial idea through launched product.
|
||||||
|
|
||||||
1. Clone the repository
|
## How it works
|
||||||
2. Build with Docker: `docker build -t foundary-1770670477 .`
|
|
||||||
3. Run locally: `docker run -p 8080:8080 foundary-1770670477`
|
|
||||||
|
|
||||||
## CI/CD
|
1. **Converse** — Describe what you want to build in plain language. Foundary captures intent, constraints, and decisions as structured product artifacts.
|
||||||
|
2. **Refine** — Iterate on scope, priorities, and design through ongoing dialogue. Every conversation turn updates the living product definition.
|
||||||
|
3. **Ship** — Foundary translates the conversation into deployable outputs and tracks progress against the goals you defined together.
|
||||||
|
|
||||||
This project uses Woodpecker CI for continuous deployment. Pushing to `main` will:
|
## Monorepo structure
|
||||||
- Build a Docker image
|
|
||||||
- Push to the container registry
|
|
||||||
- Deploy to Kubernetes
|
|
||||||
|
|
||||||
## Resources
|
```
|
||||||
|
foundary/
|
||||||
|
├── apps/
|
||||||
|
│ ├── web/ # Web application (frontend)
|
||||||
|
│ └── api/ # API server (backend)
|
||||||
|
├── packages/
|
||||||
|
│ ├── shared/ # Shared types, utilities, and constants
|
||||||
|
│ └── config/ # Shared configuration (TypeScript, ESLint)
|
||||||
|
├── package.json # Workspace root
|
||||||
|
├── pnpm-workspace.yaml
|
||||||
|
└── Dockerfile
|
||||||
|
```
|
||||||
|
|
||||||
- Live site: https://gbgf39u8.threesix.ai
|
## Getting started
|
||||||
- Git repository: https://git.threesix.ai/jordan/foundary-1770670477.git
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
# Run the web app in development
|
||||||
|
pnpm dev
|
||||||
|
|
||||||
|
# Build all packages and apps
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# Run tests across the monorepo
|
||||||
|
pnpm test
|
||||||
|
|
||||||
|
# Type-check everything
|
||||||
|
pnpm typecheck
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
Pushes to `main` trigger automatic deployment via Woodpecker CI:
|
||||||
|
|
||||||
|
1. Build Docker image (multi-stage, optimized for cache)
|
||||||
|
2. Push to container registry (`registry.threesix.ai`)
|
||||||
|
3. Update Kubernetes deployment
|
||||||
|
|
||||||
|
Live at: https://gbgf39u8.threesix.ai
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
This is a pnpm workspace monorepo. All packages use `workspace:*` protocol for internal dependencies. Run commands from the root — pnpm will route them to the correct workspace packages.
|
||||||
|
|||||||
16
apps/api/package.json
Normal file
16
apps/api/package.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "@foundary/api",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"description": "Foundary API server",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "echo 'api dev server not configured yet'",
|
||||||
|
"build": "echo 'api build not configured yet'",
|
||||||
|
"typecheck": "tsc --noEmit",
|
||||||
|
"lint": "echo 'no linter configured yet'",
|
||||||
|
"test": "echo 'no tests configured yet'"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@foundary/shared": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
apps/api/src/index.ts
Normal file
2
apps/api/src/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export { };
|
||||||
|
console.log("@foundary/api");
|
||||||
8
apps/api/tsconfig.json
Normal file
8
apps/api/tsconfig.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../packages/config/tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src"
|
||||||
|
},
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
||||||
16
apps/web/package.json
Normal file
16
apps/web/package.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "@foundary/web",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"description": "Foundary web application",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "echo 'web dev server not configured yet'",
|
||||||
|
"build": "echo 'web build not configured yet'",
|
||||||
|
"typecheck": "tsc --noEmit",
|
||||||
|
"lint": "echo 'no linter configured yet'",
|
||||||
|
"test": "echo 'no tests configured yet'"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@foundary/shared": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
apps/web/src/index.ts
Normal file
2
apps/web/src/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export { };
|
||||||
|
console.log("@foundary/web");
|
||||||
9
apps/web/tsconfig.json
Normal file
9
apps/web/tsconfig.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../packages/config/tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"jsx": "react-jsx"
|
||||||
|
},
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
||||||
18
package.json
Normal file
18
package.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "foundary",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "Foundary — a product studio for conversational product development",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "pnpm --filter @foundary/web dev",
|
||||||
|
"build": "pnpm -r build",
|
||||||
|
"lint": "pnpm -r lint",
|
||||||
|
"test": "pnpm -r test",
|
||||||
|
"typecheck": "pnpm -r typecheck"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20",
|
||||||
|
"pnpm": ">=9"
|
||||||
|
},
|
||||||
|
"packageManager": "pnpm@9.15.4"
|
||||||
|
}
|
||||||
11
packages/config/package.json
Normal file
11
packages/config/package.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@foundary/config",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"description": "Shared configuration (TypeScript, ESLint, etc.)",
|
||||||
|
"main": "./tsconfig.base.json",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "echo 'no linter configured yet'",
|
||||||
|
"test": "echo 'no tests configured yet'"
|
||||||
|
}
|
||||||
|
}
|
||||||
14
packages/config/tsconfig.base.json
Normal file
14
packages/config/tsconfig.base.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"declaration": true,
|
||||||
|
"strict": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true
|
||||||
|
}
|
||||||
|
}
|
||||||
14
packages/shared/package.json
Normal file
14
packages/shared/package.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "@foundary/shared",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"description": "Shared types, utilities, and constants",
|
||||||
|
"main": "./src/index.ts",
|
||||||
|
"types": "./src/index.ts",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc --build",
|
||||||
|
"typecheck": "tsc --noEmit",
|
||||||
|
"lint": "echo 'no linter configured yet'",
|
||||||
|
"test": "echo 'no tests configured yet'"
|
||||||
|
}
|
||||||
|
}
|
||||||
15
packages/shared/src/index.ts
Normal file
15
packages/shared/src/index.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
export type ConversationMessage = {
|
||||||
|
id: string;
|
||||||
|
role: "user" | "assistant" | "system";
|
||||||
|
content: string;
|
||||||
|
timestamp: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Product = {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
status: "draft" | "in-progress" | "launched";
|
||||||
|
createdAt: number;
|
||||||
|
updatedAt: number;
|
||||||
|
};
|
||||||
16
packages/shared/tsconfig.json
Normal file
16
packages/shared/tsconfig.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"strict": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"skipLibCheck": true
|
||||||
|
},
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
||||||
3
pnpm-workspace.yaml
Normal file
3
pnpm-workspace.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
packages:
|
||||||
|
- "apps/*"
|
||||||
|
- "packages/*"
|
||||||
Loading…
Reference in New Issue
Block a user