Implements Phases 1-8 of the TFTSR implementation plan. Rust backend (Tauri 2.x, src-tauri/): - Multi-provider AI: OpenAI-compatible, Anthropic, Gemini, Mistral, Ollama - PII detection engine: 11 regex patterns with overlap resolution - SQLCipher AES-256 encrypted database with 10 versioned migrations - 28 Tauri IPC commands for triage, analysis, document, and system ops - Ollama: hardware probe, model recommendations, pull/delete with events - RCA and blameless post-mortem Markdown document generators - PDF export via printpdf - Audit log: SHA-256 hash of every external data send - Integration stubs for Confluence, ServiceNow, Azure DevOps (v0.2) Frontend (React 18 + TypeScript + Vite, src/): - 9 pages: full triage workflow NewIssue→LogUpload→Triage→Resolution→RCA→Postmortem→History+Settings - 7 components: ChatWindow, TriageProgress, PiiDiffViewer, DocEditor, HardwareReport, ModelSelector, UI primitives - 3 Zustand stores: session, settings (persisted), history - Type-safe tauriCommands.ts matching Rust backend types exactly - 8 IT domain system prompts (Linux, Windows, Network, K8s, DB, Virt, HW, Obs) DevOps: - .woodpecker/test.yml: rustfmt, clippy, cargo test, tsc, vitest on every push - .woodpecker/release.yml: linux/amd64 + linux/arm64 builds, Gogs release upload Verified: - cargo check: zero errors - tsc --noEmit: zero errors - vitest run: 13/13 unit tests passing Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
145 lines
3.4 KiB
JavaScript
145 lines
3.4 KiB
JavaScript
import os from 'node:os';
|
|
import { isCI } from 'std-env';
|
|
export { mergeConfig } from 'vite';
|
|
|
|
const defaultBrowserPort = 63315;
|
|
const extraInlineDeps = [
|
|
/^(?!.*node_modules).*\.mjs$/,
|
|
/^(?!.*node_modules).*\.cjs\.js$/,
|
|
// Vite client
|
|
/vite\w*\/dist\/client\/env.mjs/
|
|
];
|
|
|
|
const isNode = typeof process < "u" && typeof process.stdout < "u" && !process.versions?.deno && !globalThis.window;
|
|
const isDeno = typeof process < "u" && typeof process.stdout < "u" && process.versions?.deno !== void 0;
|
|
(isNode || isDeno) && process.platform === "win32";
|
|
|
|
const defaultInclude = ["**/*.{test,spec}.?(c|m)[jt]s?(x)"];
|
|
const defaultExclude = [
|
|
"**/node_modules/**",
|
|
"**/dist/**",
|
|
"**/cypress/**",
|
|
"**/.{idea,git,cache,output,temp}/**",
|
|
"**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*"
|
|
];
|
|
const defaultCoverageExcludes = [
|
|
"coverage/**",
|
|
"dist/**",
|
|
"**/node_modules/**",
|
|
"**/[.]**",
|
|
"packages/*/test?(s)/**",
|
|
"**/*.d.ts",
|
|
"**/virtual:*",
|
|
"**/__x00__*",
|
|
"**/\0*",
|
|
"cypress/**",
|
|
"test?(s)/**",
|
|
"test?(-*).?(c|m)[jt]s?(x)",
|
|
"**/*{.,-}{test,spec,bench,benchmark}?(-d).?(c|m)[jt]s?(x)",
|
|
"**/__tests__/**",
|
|
"**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*",
|
|
"**/vitest.{workspace,projects}.[jt]s?(on)",
|
|
"**/.{eslint,mocha,prettier}rc.{?(c|m)js,yml}"
|
|
];
|
|
const coverageConfigDefaults = {
|
|
provider: "v8",
|
|
enabled: false,
|
|
all: true,
|
|
clean: true,
|
|
cleanOnRerun: true,
|
|
reportsDirectory: "./coverage",
|
|
exclude: defaultCoverageExcludes,
|
|
reportOnFailure: false,
|
|
reporter: [
|
|
["text", {}],
|
|
["html", {}],
|
|
["clover", {}],
|
|
["json", {}]
|
|
],
|
|
extension: [
|
|
".js",
|
|
".cjs",
|
|
".mjs",
|
|
".ts",
|
|
".mts",
|
|
".tsx",
|
|
".jsx",
|
|
".vue",
|
|
".svelte",
|
|
".marko",
|
|
".astro"
|
|
],
|
|
allowExternal: false,
|
|
excludeAfterRemap: false,
|
|
ignoreEmptyLines: true,
|
|
processingConcurrency: Math.min(
|
|
20,
|
|
os.availableParallelism?.() ?? os.cpus().length
|
|
)
|
|
};
|
|
const fakeTimersDefaults = {
|
|
loopLimit: 1e4,
|
|
shouldClearNativeTimers: true,
|
|
toFake: [
|
|
"setTimeout",
|
|
"clearTimeout",
|
|
"setInterval",
|
|
"clearInterval",
|
|
"setImmediate",
|
|
"clearImmediate",
|
|
"Date"
|
|
]
|
|
};
|
|
const config = {
|
|
allowOnly: !isCI,
|
|
isolate: true,
|
|
watch: !isCI,
|
|
globals: false,
|
|
environment: "node",
|
|
pool: "forks",
|
|
clearMocks: false,
|
|
restoreMocks: false,
|
|
mockReset: false,
|
|
unstubGlobals: false,
|
|
unstubEnvs: false,
|
|
include: defaultInclude,
|
|
exclude: defaultExclude,
|
|
teardownTimeout: 1e4,
|
|
forceRerunTriggers: ["**/package.json/**", "**/{vitest,vite}.config.*/**"],
|
|
update: false,
|
|
reporters: [],
|
|
silent: false,
|
|
hideSkippedTests: false,
|
|
api: false,
|
|
ui: false,
|
|
uiBase: "/__vitest__/",
|
|
open: !isCI,
|
|
css: {
|
|
include: []
|
|
},
|
|
coverage: coverageConfigDefaults,
|
|
fakeTimers: fakeTimersDefaults,
|
|
maxConcurrency: 5,
|
|
dangerouslyIgnoreUnhandledErrors: false,
|
|
typecheck: {
|
|
checker: "tsc",
|
|
include: ["**/*.{test,spec}-d.?(c|m)[jt]s?(x)"],
|
|
exclude: defaultExclude
|
|
},
|
|
slowTestThreshold: 300,
|
|
disableConsoleIntercept: false
|
|
};
|
|
const configDefaults = Object.freeze(config);
|
|
|
|
function defineConfig(config) {
|
|
return config;
|
|
}
|
|
function defineProject(config) {
|
|
return config;
|
|
}
|
|
function defineWorkspace(config) {
|
|
return config;
|
|
}
|
|
|
|
export { configDefaults, coverageConfigDefaults, defaultBrowserPort, defaultExclude, defaultInclude, defineConfig, defineProject, defineWorkspace, extraInlineDeps };
|