poltergeist.config.jsonβ’8.64 kB
{
"version": "1.0",
"projectType": "mixed",
"targets": [
{
"name": "Peekaboo",
"type": "executable",
"enabled": true,
"buildCommand": "./scripts/build-swift-debug.sh",
"outputPath": "./peekaboo",
"settlingDelay": 1000,
"debounceInterval": 5000,
"icon": "./assets/icon_512x512@2x.png",
"watchPaths": [
"Core/PeekabooCore/**/*.swift",
"AXorcist/**/*.swift",
"Commander/**/*.swift",
"Tachikoma/**/*.swift",
"TauTUI/**/*.swift",
"Apps/CLI/**/*.swift"
],
"postBuild": [
{
"name": "Swift tests",
"command": "./scripts/status-swifttests.sh",
"runOn": "success",
"timeoutSeconds": 1800,
"maxLines": 5
}
]
},
{
"name": "Commander",
"type": "test",
"enabled": true,
"testCommand": "swift test --package-path Commander",
"watchPaths": [
"Commander/**/*.swift",
"Commander/Package.swift"
],
"settlingDelay": 1000,
"debounceInterval": 5000
},
{
"name": "AXorcist",
"type": "test",
"enabled": true,
"testCommand": "swift test --package-path AXorcist",
"watchPaths": [
"AXorcist/**/*.swift",
"AXorcist/Package.swift"
],
"settlingDelay": 1000,
"debounceInterval": 5000
},
{
"name": "Tachikoma",
"type": "test",
"enabled": true,
"testCommand": "swift test --package-path Tachikoma",
"watchPaths": [
"Tachikoma/**/*.swift",
"Tachikoma/Package.swift"
],
"settlingDelay": 1000,
"debounceInterval": 5000
},
{
"name": "TauTUI",
"type": "test",
"enabled": true,
"testCommand": "swift test --package-path TauTUI",
"watchPaths": [
"TauTUI/**/*.swift",
"TauTUI/Package.swift"
],
"settlingDelay": 1000,
"debounceInterval": 5000
},
{
"name": "Peekaboo.app",
"type": "app-bundle",
"platform": "macos",
"enabled": true,
"buildCommand": "./scripts/build-mac-debug.sh",
"bundleId": "boo.peekaboo.mac.debug",
"autoRelaunch": true,
"settlingDelay": 4000,
"debounceInterval": 5000,
"icon": "./assets/icon_512x512@2x.png",
"watchPaths": [
"Apps/Mac/Peekaboo/**/*.swift",
"Apps/Mac/Peekaboo/**/*.storyboard",
"Apps/Mac/Peekaboo/**/*.xib",
"Core/PeekabooCore/**/*.swift",
"AXorcist/**/*.swift",
"Commander/**/*.swift",
"Tachikoma/**/*.swift",
"TauTUI/**/*.swift"
]
},
{
"name": "Playground.app",
"type": "app-bundle",
"platform": "macos",
"enabled": true,
"buildCommand": "SCHEME=Playground APP_NAME=Playground ./scripts/build-mac-debug.sh",
"bundleId": "boo.peekaboo.playground.debug",
"autoRelaunch": true,
"settlingDelay": 4000,
"debounceInterval": 5000,
"icon": "./assets/icon_512x512@2x.png",
"watchPaths": [
"Apps/Playground/**/*.swift",
"Apps/Playground/**/*.storyboard",
"Apps/Playground/**/*.xib",
"Apps/Playground/**/*.xcassets",
"Apps/Playground/**/*.entitlements",
"Apps/Playground/**/*.plist",
"Apps/Playground/Playground.xcodeproj/project.pbxproj",
"Apps/Playground/Package.swift",
"Core/PeekabooCore/**/*.swift",
"AXorcist/**/*.swift",
"Commander/**/*.swift",
"Tachikoma/**/*.swift",
"TauTUI/**/*.swift"
]
},
{
"name": "Inspector.app",
"type": "executable",
"enabled": true,
"buildCommand": "cd Apps/PeekabooInspector && swift build",
"autoRelaunch": false,
"settlingDelay": 4000,
"debounceInterval": 5000,
"icon": "./assets/icon_512x512@2x.png",
"watchPaths": [
"Apps/PeekabooInspector/**/*.swift",
"Apps/PeekabooInspector/**/*.storyboard",
"Apps/PeekabooInspector/**/*.xib",
"Apps/PeekabooInspector/**/*.xcassets",
"Apps/PeekabooInspector/**/*.entitlements",
"Apps/PeekabooInspector/**/*.plist",
"Apps/PeekabooInspector/Inspector.xcodeproj/project.pbxproj",
"Apps/PeekabooInspector/Package.swift",
"Core/PeekabooCore/**/*.swift",
"AXorcist/**/*.swift",
"Commander/**/*.swift",
"Tachikoma/**/*.swift",
"TauTUI/**/*.swift"
],
"outputPath": "Apps/PeekabooInspector/.build/debug/PeekabooInspector"
}
],
"watchman": {
"useDefaultExclusions": true,
"excludeDirs": [
"coverage",
"*.log",
"tmp_screenshots",
"test_output",
"Server/dist",
"Server/node_modules"
],
"projectType": "mixed",
"maxFileEvents": 15000,
"recrawlThreshold": 3,
"settlingDelay": 1000,
"rules": [
{
"pattern": "**/test_results/**",
"action": "ignore",
"reason": "Test output directory",
"enabled": true
},
{
"pattern": "**/*.xcuserstate",
"action": "ignore",
"reason": "Xcode user state files",
"enabled": true
},
{
"pattern": "**/Version.swift",
"action": "ignore",
"reason": "Auto-generated version file that changes on every build",
"enabled": true
}
]
},
"performance": {
"profile": "balanced",
"autoOptimize": true,
"metrics": {
"enabled": true,
"reportInterval": 300
}
},
"buildScheduling": {
"parallelization": 1,
"prioritization": {
"enabled": true,
"focusDetectionWindow": 300000,
"priorityDecayTime": 1800000,
"buildTimeoutMultiplier": 2
}
},
"notifications": {
"enabled": true
},
"logging": {
"file": ".poltergeist.log",
"level": "debug"
},
"statusScripts": [
{
"label": "SwiftLint",
"command": "./scripts/status-swiftlint.sh",
"cooldownSeconds": 60,
"timeoutSeconds": 300,
"maxLines": 5,
"formatter": "auto",
"targets": [
"Peekaboo"
]
},
{
"label": "Tests (Commander)",
"command": "swift test --package-path Commander",
"targets": [
"Commander"
],
"cooldownSeconds": 600,
"timeoutSeconds": 900,
"maxLines": 6,
"formatter": "auto"
},
{
"label": "Tests (AXorcist)",
"command": "swift test --package-path AXorcist",
"targets": [
"AXorcist"
],
"cooldownSeconds": 600,
"timeoutSeconds": 900,
"maxLines": 6,
"formatter": "auto"
},
{
"label": "Tests (Tachikoma)",
"command": "swift test --package-path Tachikoma",
"targets": [
"Tachikoma"
],
"cooldownSeconds": 900,
"timeoutSeconds": 1200,
"maxLines": 6,
"formatter": "auto"
},
{
"label": "Tests (TauTUI)",
"command": "swift test --package-path TauTUI",
"targets": [
"TauTUI"
],
"cooldownSeconds": 900,
"timeoutSeconds": 1200,
"maxLines": 6,
"formatter": "auto"
}
],
"summaryScripts": [
{
"label": "Changelog",
"placement": "summary",
"command": "node -e \"const fs=require('fs');const md=fs.readFileSync('CHANGELOG.md','utf8').split(/\\\\r?\\\\n/);const start=md.findIndex((l)=>l.startsWith('## '));const end=md.findIndex((l,i)=>i>start&&l.startsWith('## '));const chunk=md.slice(start,end>0?end:md.length);const out=chunk.map((l)=>{if(/^#+\\\\s*/.test(l))return l.replace(/^#+\\\\s*/,'').toUpperCase();if(/^\\\\s*-\\\\s+/.test(l))return 'β’ '+l.replace(/^\\\\s*-\\\\s+/,'');return l.trim();}).filter(Boolean);console.log(out.slice(0,50).join('\\\\n'));\"",
"refreshSeconds": 600,
"timeoutSeconds": 5,
"maxLines": 50,
"formatter": "none"
},
{
"label": "Dependencies",
"placement": "summary",
"command": "node -e \"const {execSync}=require('node:child_process');function emit(data){if(!Array.isArray(data)||data.length===0){process.exit(0);}for(const row of data){console.log(row.name + '@' + row.path + ' ' + row.current + ' -> ' + row.latest);}process.exit(1);}try{const out=execSync('pnpm outdated --recursive --long --format=json',{encoding:'utf8'}).trim();if(!out){process.exit(0);}emit(JSON.parse(out));}catch(err){const out=err.stdout?.toString().trim();if(!out){console.error(err.message||String(err));process.exit(1);}emit(JSON.parse(out));}\"",
"refreshSeconds": 1800,
"timeoutSeconds": 120,
"maxLines": 10
}
]
}