diff --git a/package-lock.json b/package-lock.json index 9a9a89a5b..d893b9b29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1750,6 +1750,10 @@ } } }, + "node_modules/@gsd-build/daemon": { + "resolved": "packages/daemon", + "link": true + }, "node_modules/@gsd-build/engine-darwin-arm64": { "version": "2.10.5", "resolved": "https://registry.npmjs.org/@gsd-build/engine-darwin-arm64/-/engine-darwin-arm64-2.10.5.tgz", @@ -9149,6 +9153,24 @@ } } }, + "packages/daemon": { + "name": "@gsd-build/daemon", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "yaml": "^2.8.0" + }, + "bin": { + "gsd-daemon": "dist/cli.js" + }, + "devDependencies": { + "@types/node": "^24.12.0", + "typescript": "^5.4.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, "packages/mcp-server": { "name": "@gsd-build/mcp-server", "version": "2.52.0", diff --git a/packages/daemon/package.json b/packages/daemon/package.json new file mode 100644 index 000000000..15800d6d7 --- /dev/null +++ b/packages/daemon/package.json @@ -0,0 +1,44 @@ +{ + "name": "@gsd-build/daemon", + "version": "0.1.0", + "description": "GSD daemon — background process for project monitoring and Discord integration", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/gsd-build/gsd-2.git", + "directory": "packages/daemon" + }, + "publishConfig": { + "access": "public" + }, + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "bin": { + "gsd-daemon": "./dist/cli.js" + }, + "scripts": { + "build": "tsc", + "test": "node --test dist/daemon.test.js" + }, + "dependencies": { + "yaml": "^2.8.0" + }, + "devDependencies": { + "@types/node": "^24.12.0", + "typescript": "^5.4.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "files": [ + "dist", + "!dist/**/*.test.*" + ] +} diff --git a/packages/daemon/src/index.ts b/packages/daemon/src/index.ts new file mode 100644 index 000000000..91dd2cc2c --- /dev/null +++ b/packages/daemon/src/index.ts @@ -0,0 +1 @@ +export type { DaemonConfig, LogLevel, LogEntry } from './types.js'; diff --git a/packages/daemon/src/types.ts b/packages/daemon/src/types.ts new file mode 100644 index 000000000..c6a2d12cc --- /dev/null +++ b/packages/daemon/src/types.ts @@ -0,0 +1,34 @@ +/** + * Log severity levels, ordered from most to least verbose. + */ +export type LogLevel = 'debug' | 'info' | 'warn' | 'error'; + +/** + * A single structured log entry written as JSON-lines. + */ +export interface LogEntry { + /** ISO-8601 timestamp */ + ts: string; + level: LogLevel; + msg: string; + data?: Record; +} + +/** + * Top-level daemon configuration, loaded from YAML. + */ +export interface DaemonConfig { + discord?: { + token: string; + guild_id: string; + owner_id: string; + }; + projects: { + scan_roots: string[]; + }; + log: { + file: string; + level: LogLevel; + max_size_mb: number; + }; +} diff --git a/packages/daemon/tsconfig.json b/packages/daemon/tsconfig.json new file mode 100644 index 000000000..779b48aca --- /dev/null +++ b/packages/daemon/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2024", + "module": "Node16", + "lib": ["ES2024"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "inlineSources": true, + "inlineSourceMap": false, + "moduleResolution": "Node16", + "resolveJsonModule": true, + "allowImportingTsExtensions": false, + "types": ["node"], + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist", "**/*.d.ts", "src/**/*.d.ts"] +}