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 .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
- name: Test evidence and runner regressions
run: npm run test:unified:lib
- name: Repository root allowlist and public-content guard
run: node --test tests/toolchain/repo-root-contract.mjs tests/toolchain/public-content-contract.mjs
run: node --test tests/toolchain/repo-root-contract.mjs tests/toolchain/public-content-contract.mjs tests/toolchain/version-contract.mjs
- name: Schematic routing visual gate
run: |
npm run report:schematic -- --out test-artifacts/ci-schematic-routing
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ admin merge authority is not a non-author review approval.

## Project Overview

GraphDone is a graph-native management system that reimagines work coordination through dependencies and democratic prioritization rather than hierarchical assignments. Currently in active development (v0.3.1-alpha) with TLS/SSL production readiness.
GraphDone is a graph-native management system that reimagines work coordination through dependencies and democratic prioritization rather than hierarchical assignments. Currently in active alpha development (version: root `package.json`) with TLS/SSL production readiness.

## Core Philosophy

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
![GraphDone's living graph — priority glow, breathing nodes, energy flowing along dependencies](./docs/graphdone_ui.png)

![License](https://img.shields.io/badge/license-MIT-blue.svg)
![Version](https://img.shields.io/badge/version-0.3.1--alpha-orange.svg)
![Version](https://img.shields.io/badge/version-0.4.0--alpha-orange.svg)
![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)

> 🔒 **SECURITY NOTE**: GraphDone supports both HTTP (development) and HTTPS/TLS (production) modes. For production deployment, enable TLS encryption and use production-grade authentication. See [TLS/SSL Setup Guide](./docs/tls-ssl-setup.md) for configuration details.
Expand Down
4 changes: 2 additions & 2 deletions deployment/docker-compose.http.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ services:

graphdone-api:
container_name: graphdone-api-prod
image: gd-core-api:0.3.1-alpha
image: gd-core-api:0.4.0-alpha
build:
context: ..
dockerfile: packages/server/Dockerfile
Expand Down Expand Up @@ -79,7 +79,7 @@ services:

graphdone-web:
container_name: graphdone-web-prod
image: gd-core-web:0.3.1-alpha
image: gd-core-web:0.4.0-alpha
build:
context: ..
dockerfile: packages/web/Dockerfile
Expand Down
4 changes: 2 additions & 2 deletions deployment/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ services:

graphdone-api:
container_name: graphdone-api
image: gd-core-api:0.3.1-alpha
image: gd-core-api:0.4.0-alpha
build:
context: ..
dockerfile: packages/server/Dockerfile
Expand Down Expand Up @@ -80,7 +80,7 @@ services:

graphdone-web:
container_name: graphdone-web
image: gd-core-web:0.3.1-alpha
image: gd-core-web:0.4.0-alpha
build:
context: ..
dockerfile: packages/web/Dockerfile
Expand Down
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "graphdone",
"version": "0.3.1-alpha",
"version": "0.4.0-alpha",
"description": "Management for teams who think differently",
"private": true,
"workspaces": [
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@graphdone/core",
"version": "0.3.1-alpha",
"version": "0.4.0-alpha",
"description": "Core graph engine for GraphDone",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
2 changes: 1 addition & 1 deletion packages/mcp-server/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@graphdone/mcp-server",
"version": "0.3.1-alpha",
"version": "0.4.0-alpha",
"description": "MCP server for GraphDone graph operations",
"main": "dist/index.js",
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion packages/mcp-server/src/health-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export function startHealthServer(port = 3128) {
status: 'healthy',
timestamp: new Date().toISOString(),
server: 'graphdone-mcp',
version: '0.3.1-alpha',
version: '0.4.0-alpha',
uptime: process.uptime(),
pid: process.pid,
capabilities: [
Expand Down
2 changes: 1 addition & 1 deletion packages/mcp-server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {
const server = new Server(
{
name: 'graphdone-mcp-server',
version: '0.3.1-alpha',
version: '0.4.0-alpha',
},
{
capabilities: {
Expand Down
2 changes: 1 addition & 1 deletion packages/mcp-server/tests/health-server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ describe('MCP Health Server', () => {
expect(health).toBeDefined();
expect(health.status).toBe('healthy');
expect(health.server).toBe('graphdone-mcp');
expect(health.version).toBe('0.3.1-alpha');
expect(health.version).toBe('0.4.0-alpha');
expect(health.capabilities).toBeDefined();
expect(Array.isArray(health.capabilities)).toBe(true);
expect(health.capabilities.length).toBeGreaterThan(0);
Expand Down
2 changes: 1 addition & 1 deletion packages/mcp-server/tests/neo4j-contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ describe.skipIf(!configured)('MCP GraphService — real Neo4j contract', () => {
try {
await client.connect(transport, { timeout: 5000, maxTotalTimeout: 5000 });
pid = transport.pid;
expect(client.getServerVersion()).toEqual({ name: 'graphdone-mcp-server', version: '0.3.1-alpha' });
expect(client.getServerVersion()).toEqual({ name: 'graphdone-mcp-server', version: '0.4.0-alpha' });
expect(client.getServerCapabilities()).toEqual({ tools: {} });
const listed = await client.listTools(undefined, options);
expect(listed.tools.find(tool => tool.name === 'create_node')?.inputSchema.required).toEqual(['title', 'type']);
Expand Down
2 changes: 1 addition & 1 deletion packages/server/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@graphdone/server",
"version": "0.3.1-alpha",
"version": "0.4.0-alpha",
"description": "GraphQL API server for GraphDone",
"type": "module",
"main": "dist/index.js",
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ const PORT = Number(process.env.PORT) || 4127;
async function startServer() {
// Use the start time from ./start command if available, otherwise use current time
const startTime = process.env.GRAPHDONE_START_TIME ? parseInt(process.env.GRAPHDONE_START_TIME) : Date.now();
console.log('🚀 GraphDone Server v0.3.1-alpha starting...'); // eslint-disable-line no-console
console.log('🚀 GraphDone Server v0.4.0-alpha starting...'); // eslint-disable-line no-console
if (process.env.GRAPHDONE_START_TIME) {
console.log(`🕰️ Using ./start command timing: ${process.env.GRAPHDONE_START_TIME}`); // eslint-disable-line no-console
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ VITE_GRAPHQL_WS_URL=ws://localhost:3127/graphql

# App configuration
VITE_APP_NAME=GraphDone
VITE_APP_VERSION=0.3.1-alpha
VITE_APP_VERSION=0.4.0-alpha

# Feature flags
VITE_ENABLE_SUBSCRIPTIONS=true
Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@graphdone/web",
"version": "0.3.1-alpha",
"version": "0.4.0-alpha",
"description": "React web application for GraphDone",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/utils/version.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const APP_VERSION = '0.3.1-alpha';
export const APP_VERSION = '0.4.0-alpha';
2 changes: 1 addition & 1 deletion scripts/generate-clean-report.sh
Original file line number Diff line number Diff line change
Expand Up @@ -666,7 +666,7 @@ cat > "$HTML_REPORT" << 'HTMLEOF'
<!-- Footer -->
<div class="footer">
<p><strong>Test Report Generated:</strong> REPLACE_TIMESTAMP</p>
<p>GraphDone v0.3.1-alpha | Test Infrastructure v1.0.0</p>
<p>GraphDone | Test Infrastructure v1.0.0</p>
<p>Test Run ID: REPLACE_UUID | Git Commit: REPLACE_COMMIT</p>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion scripts/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2929,7 +2929,7 @@ install_graphdone() {
printf "\n\n"

# Fetch latest version from GitHub releases
GRAPHDONE_VERSION="v0.3.1-alpha" # Fallback version
GRAPHDONE_VERSION="v0.4.0-alpha" # Fallback version
if command -v curl >/dev/null 2>&1; then
LATEST_VERSION=$(curl -sf --max-time 3 https://api.github.com/repos/GraphDone/GraphDone-Core/releases/latest 2>/dev/null | grep -o '"tag_name": *"[^"]*"' | sed 's/"tag_name": *"\(.*\)"/\1/' 2>/dev/null)
if [ -n "$LATEST_VERSION" ]; then
Expand Down
115 changes: 58 additions & 57 deletions scripts/update-version-minimal.sh
Original file line number Diff line number Diff line change
@@ -1,62 +1,63 @@
#!/bin/bash

# Minimal version update script
# Only updates what absolutely cannot read from root package.json

set -e

NEW_VERSION="$1"

if [ -z "$NEW_VERSION" ]; then
echo "Usage: $0 <version>"
echo "Example: $0 0.3.2-alpha"
# Set the release version everywhere it is recorded.
#
# scripts/update-version-minimal.sh 0.4.0-alpha
#
# Manifests and their package-lock.json entries are edited in place (no
# re-resolution); the remaining copies (runtime-reported versions, local image
# tags, installer fallback, README badge) are listed in
# tests/toolchain/version-contract.mjs, which fails CI if any of them is missed.
set -euo pipefail

NEW_VERSION="${1:-}"
if ! [[ "$NEW_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?$ ]]; then
echo "Usage: $0 <MAJOR.MINOR.PATCH[-suffix]> e.g. $0 0.4.0-alpha" >&2
exit 1
fi

echo "Updating version to $NEW_VERSION..."

# 1. Update root package.json (THE single source of truth)
echo "✓ Updating root package.json..."
sed -i.bak "s/\"version\": \"[0-9]*\.[0-9]*\.[0-9]*-alpha\"/\"version\": \"$NEW_VERSION\"/" package.json
rm package.json.bak

# 2. Update Docker image tags (cannot read package.json at build time)
echo "✓ Updating Docker image tags..."
for compose in deployment/docker-compose*.yml; do
if [ -f "$compose" ]; then
sed -i.bak "s/gd-core-[^:]*:[0-9]*\.[0-9]*\.[0-9]*-alpha/&/g; s/:[0-9]*\.[0-9]*\.[0-9]*-alpha/:$NEW_VERSION/g" "$compose"
rm "$compose.bak"
fi
cd "$(dirname "$0")/.."

OLD_VERSION="$(node -p "require('./package.json').version")"
echo "Updating version $OLD_VERSION -> $NEW_VERSION"

# 1. Root and workspace manifests, plus their entries in package-lock.json.
# Only the version fields change: re-resolving the lockfile (npm version,
# npm install) would also rewrite unrelated dev/peer flags.
NEW_VERSION="$NEW_VERSION" node - <<'NODE'
const fs = require('fs');
const version = process.env.NEW_VERSION;
const edit = (file, change) => {
const json = JSON.parse(fs.readFileSync(file, 'utf8'));
change(json);
fs.writeFileSync(file, `${JSON.stringify(json, null, 2)}\n`);
};
const workspaces = fs.readdirSync('packages').filter(dir => fs.existsSync(`packages/${dir}/package.json`));
edit('package.json', json => { json.version = version; });
for (const dir of workspaces) edit(`packages/${dir}/package.json`, json => { json.version = version; });
edit('package-lock.json', lock => {
lock.version = version;
lock.packages[''].version = version;
for (const dir of workspaces) if (lock.packages[`packages/${dir}`]) lock.packages[`packages/${dir}`].version = version;
});
NODE

# 2. Every other recorded copy of the old version (exact-string replacement).
replace() { # file old new
OLD="$2" NEW="$3" perl -0pi -e 's/\Q$ENV{OLD}\E/$ENV{NEW}/g' "$1"
}
for file in \
packages/web/src/utils/version.ts \
packages/web/.env.example \
packages/mcp-server/src/index.ts \
packages/mcp-server/src/health-server.ts \
packages/mcp-server/tests/health-server.test.ts \
packages/mcp-server/tests/neo4j-contract.test.ts \
packages/server/src/index.ts \
scripts/install.sh \
deployment/docker-compose.yml \
deployment/docker-compose.http.yml; do
replace "$file" "$OLD_VERSION" "$NEW_VERSION"
done
replace README.md "badge/version-${OLD_VERSION//-/--}-" "badge/version-${NEW_VERSION//-/--}-"

# 3. Update web version utility
echo "✓ Updating web version utility..."
sed -i.bak "s/APP_VERSION = '[0-9]*\.[0-9]*\.[0-9]*-alpha'/APP_VERSION = '$NEW_VERSION'/g" packages/web/src/utils/version.ts
rm packages/web/src/utils/version.ts.bak

# 4. Update README badge
echo "✓ Updating README version badge..."
sed -i.bak "s/version-[0-9]*\.[0-9]*\.[0-9]*--alpha/version-${NEW_VERSION//./-}/g" README.md
rm README.md.bak

# 5. Update MCP server hardcoded versions
echo "✓ Updating MCP server versions..."
sed -i.bak "s/version: '[0-9]*\.[0-9]*\.[0-9]*-alpha'/version: '$NEW_VERSION'/g" packages/mcp-server/src/index.ts
sed -i.bak "s/version: '[0-9]*\.[0-9]*\.[0-9]*-alpha'/version: '$NEW_VERSION'/g" packages/mcp-server/src/health-server.ts
sed -i.bak "s/toBe('[0-9]*\.[0-9]*\.[0-9]*-alpha')/toBe('$NEW_VERSION')/g" packages/mcp-server/tests/health-server.test.ts
rm packages/mcp-server/src/index.ts.bak packages/mcp-server/src/health-server.ts.bak packages/mcp-server/tests/health-server.test.ts.bak


echo
echo "🎉 Version updated to $NEW_VERSION"
echo
echo "📝 What was updated:"
echo " • Root package.json (source of truth)"
echo " • Docker image tags (can't import from package.json)"
echo " • README.md version badge"
echo " • MCP server hardcoded versions"
echo " • Web version utility constant"
echo
echo "📦 Everything else imports automatically from root package.json!"
echo
echo "🚀 Next: npm install && git add . && git commit -m \"Update version to v$NEW_VERSION\""
node --test tests/toolchain/version-contract.mjs >/dev/null
echo "Version $NEW_VERSION recorded everywhere (tests/toolchain/version-contract.mjs passes)."
Loading
Loading