mirror of
https://github.com/whekin/household-bot.git
synced 2026-03-31 08:54:04 +00:00
Codex/whe 15 bootstrap workspace (#1)
* feat(WHE-15): bootstrap bun workspace with app and package scaffolds * chore(WHE-17): switch workspace typecheck to tsgo * chore(WHE-16): configure oxlint and oxfmt no-semicolon style * chore: address CodeRabbit review feedback * chore: apply coderabbit fixes and add review script * docs: add ADR decision metadata
This commit is contained in:
9
.editorconfig
Normal file
9
.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = true
|
||||||
34
.gitignore
vendored
Normal file
34
.gitignore
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# dependencies (bun install)
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# output
|
||||||
|
out
|
||||||
|
dist
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# code coverage
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# dotenv environment variable files
|
||||||
|
.env
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
.env.local
|
||||||
|
|
||||||
|
# caches
|
||||||
|
.eslintcache
|
||||||
|
.cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# IntelliJ based IDEs
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Finder (MacOS) folder config
|
||||||
|
.DS_Store
|
||||||
8
.oxfmtrc.json
Normal file
8
.oxfmtrc.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"printWidth": 100,
|
||||||
|
"sortPackageJson": false,
|
||||||
|
"ignorePatterns": ["node_modules", "bun.lock", "apps/*/dist", "packages/*/dist"]
|
||||||
|
}
|
||||||
6
README.md
Normal file
6
README.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# kojori-tg-bot
|
||||||
|
|
||||||
|
Telegram household finance bot and mini app built with Bun workspaces.
|
||||||
|
|
||||||
|
See the [development setup runbook](docs/runbooks/dev-setup.md) for full setup,
|
||||||
|
quality-check, and local development commands.
|
||||||
12
apps/bot/package.json
Normal file
12
apps/bot/package.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "@household/bot",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "bun run src/index.ts",
|
||||||
|
"build": "bun build src/index.ts --outdir dist --target bun",
|
||||||
|
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
||||||
|
"test": "bun test --pass-with-no-tests",
|
||||||
|
"lint": "oxlint \"src\""
|
||||||
|
}
|
||||||
|
}
|
||||||
7
apps/bot/src/index.ts
Normal file
7
apps/bot/src/index.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const startupMessage = '@household/bot scaffold is ready'
|
||||||
|
|
||||||
|
if (import.meta.main) {
|
||||||
|
console.log(startupMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
export { startupMessage }
|
||||||
7
apps/bot/tsconfig.json
Normal file
7
apps/bot/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"]
|
||||||
|
}
|
||||||
25
apps/miniapp/.gitignore
vendored
Normal file
25
apps/miniapp/.gitignore
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
dist
|
||||||
|
.wrangler
|
||||||
|
.output
|
||||||
|
.vercel
|
||||||
|
.netlify
|
||||||
|
.vinxi
|
||||||
|
app.config.timestamp_*.js
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
.env
|
||||||
|
.env*.local
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
/node_modules
|
||||||
|
|
||||||
|
# IDEs and editors
|
||||||
|
/.idea
|
||||||
|
.project
|
||||||
|
.classpath
|
||||||
|
*.launch
|
||||||
|
.settings/
|
||||||
|
|
||||||
|
# System Files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
25
apps/miniapp/README.md
Normal file
25
apps/miniapp/README.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# @household/miniapp
|
||||||
|
|
||||||
|
SolidJS + Vite Telegram Mini App workspace package.
|
||||||
|
|
||||||
|
## Install dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun install
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternative package managers:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
pnpm install
|
||||||
|
yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Available scripts
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun run dev
|
||||||
|
bun run build
|
||||||
|
bun run typecheck
|
||||||
|
```
|
||||||
15
apps/miniapp/index.html
Normal file
15
apps/miniapp/index.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#000000" />
|
||||||
|
<title>Solid App</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
|
||||||
|
<script src="/src/index.tsx" type="module"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
23
apps/miniapp/package.json
Normal file
23
apps/miniapp/package.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "@household/miniapp",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
||||||
|
"test": "bun test --pass-with-no-tests",
|
||||||
|
"lint": "oxlint \"src\""
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"solid-js": "^1.9.9"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@tailwindcss/vite": "^4.1.13",
|
||||||
|
"solid-devtools": "^0.34.3",
|
||||||
|
"tailwindcss": "^4.1.13",
|
||||||
|
"typescript": "^5.9.2",
|
||||||
|
"vite": "^7.1.4",
|
||||||
|
"vite-plugin-solid": "^2.11.8"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
apps/miniapp/src/App.tsx
Normal file
10
apps/miniapp/src/App.tsx
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
function App() {
|
||||||
|
return (
|
||||||
|
<main>
|
||||||
|
<h1>Household Mini App</h1>
|
||||||
|
<p>SolidJS scaffold is ready</p>
|
||||||
|
</main>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App
|
||||||
1
apps/miniapp/src/index.css
Normal file
1
apps/miniapp/src/index.css
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@import 'tailwindcss';
|
||||||
13
apps/miniapp/src/index.tsx
Normal file
13
apps/miniapp/src/index.tsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/* @refresh reload */
|
||||||
|
import { render } from 'solid-js/web'
|
||||||
|
|
||||||
|
import './index.css'
|
||||||
|
import App from './App'
|
||||||
|
|
||||||
|
const root = document.getElementById('root')
|
||||||
|
|
||||||
|
if (!root) {
|
||||||
|
throw new Error('Root element not found')
|
||||||
|
}
|
||||||
|
|
||||||
|
render(() => <App />, root)
|
||||||
11
apps/miniapp/tsconfig.json
Normal file
11
apps/miniapp/tsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"jsxImportSource": "solid-js",
|
||||||
|
"types": ["vite/client"],
|
||||||
|
"lib": ["ESNext", "DOM", "DOM.Iterable"]
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts", "src/**/*.tsx", "vite.config.ts"]
|
||||||
|
}
|
||||||
14
apps/miniapp/vite.config.ts
Normal file
14
apps/miniapp/vite.config.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import tailwindcss from '@tailwindcss/vite'
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import solidPlugin from 'vite-plugin-solid'
|
||||||
|
import devtools from 'solid-devtools/vite'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [devtools(), solidPlugin(), tailwindcss()],
|
||||||
|
server: {
|
||||||
|
port: 3000
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
target: 'esnext'
|
||||||
|
}
|
||||||
|
})
|
||||||
484
bun.lock
Normal file
484
bun.lock
Normal file
@@ -0,0 +1,484 @@
|
|||||||
|
{
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"configVersion": 1,
|
||||||
|
"workspaces": {
|
||||||
|
"": {
|
||||||
|
"name": "kojori-tg-bot",
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/bun": "1.3.10",
|
||||||
|
"@typescript/native-preview": "7.0.0-dev.20260304.1",
|
||||||
|
"oxlint": "^1.51.0",
|
||||||
|
"typescript": "^5.9.2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"apps/bot": {
|
||||||
|
"name": "@household/bot",
|
||||||
|
},
|
||||||
|
"apps/miniapp": {
|
||||||
|
"name": "@household/miniapp",
|
||||||
|
"dependencies": {
|
||||||
|
"solid-js": "^1.9.9",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@tailwindcss/vite": "^4.1.13",
|
||||||
|
"solid-devtools": "^0.34.3",
|
||||||
|
"tailwindcss": "^4.1.13",
|
||||||
|
"typescript": "^5.9.2",
|
||||||
|
"vite": "^7.1.4",
|
||||||
|
"vite-plugin-solid": "^2.11.8",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"packages/application": {
|
||||||
|
"name": "@household/application",
|
||||||
|
},
|
||||||
|
"packages/contracts": {
|
||||||
|
"name": "@household/contracts",
|
||||||
|
},
|
||||||
|
"packages/domain": {
|
||||||
|
"name": "@household/domain",
|
||||||
|
},
|
||||||
|
"packages/observability": {
|
||||||
|
"name": "@household/observability",
|
||||||
|
},
|
||||||
|
"packages/ports": {
|
||||||
|
"name": "@household/ports",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
|
||||||
|
|
||||||
|
"@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
|
||||||
|
|
||||||
|
"@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="],
|
||||||
|
|
||||||
|
"@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
|
||||||
|
|
||||||
|
"@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="],
|
||||||
|
|
||||||
|
"@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
|
||||||
|
|
||||||
|
"@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="],
|
||||||
|
|
||||||
|
"@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="],
|
||||||
|
|
||||||
|
"@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
|
||||||
|
|
||||||
|
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
|
||||||
|
|
||||||
|
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
|
||||||
|
|
||||||
|
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
|
||||||
|
|
||||||
|
"@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="],
|
||||||
|
|
||||||
|
"@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],
|
||||||
|
|
||||||
|
"@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="],
|
||||||
|
|
||||||
|
"@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="],
|
||||||
|
|
||||||
|
"@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="],
|
||||||
|
|
||||||
|
"@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="],
|
||||||
|
|
||||||
|
"@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="],
|
||||||
|
|
||||||
|
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="],
|
||||||
|
|
||||||
|
"@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="],
|
||||||
|
|
||||||
|
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="],
|
||||||
|
|
||||||
|
"@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="],
|
||||||
|
|
||||||
|
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="],
|
||||||
|
|
||||||
|
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="],
|
||||||
|
|
||||||
|
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="],
|
||||||
|
|
||||||
|
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="],
|
||||||
|
|
||||||
|
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="],
|
||||||
|
|
||||||
|
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="],
|
||||||
|
|
||||||
|
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="],
|
||||||
|
|
||||||
|
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="],
|
||||||
|
|
||||||
|
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="],
|
||||||
|
|
||||||
|
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="],
|
||||||
|
|
||||||
|
"@household/application": ["@household/application@workspace:packages/application"],
|
||||||
|
|
||||||
|
"@household/bot": ["@household/bot@workspace:apps/bot"],
|
||||||
|
|
||||||
|
"@household/contracts": ["@household/contracts@workspace:packages/contracts"],
|
||||||
|
|
||||||
|
"@household/domain": ["@household/domain@workspace:packages/domain"],
|
||||||
|
|
||||||
|
"@household/miniapp": ["@household/miniapp@workspace:apps/miniapp"],
|
||||||
|
|
||||||
|
"@household/observability": ["@household/observability@workspace:packages/observability"],
|
||||||
|
|
||||||
|
"@household/ports": ["@household/ports@workspace:packages/ports"],
|
||||||
|
|
||||||
|
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
|
||||||
|
|
||||||
|
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
|
||||||
|
|
||||||
|
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
||||||
|
|
||||||
|
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
|
||||||
|
|
||||||
|
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
||||||
|
|
||||||
|
"@nothing-but/utils": ["@nothing-but/utils@0.17.0", "", {}, "sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.51.0", "", { "os": "android", "cpu": "arm" }, "sha512-jJYIqbx4sX+suIxWstc4P7SzhEwb4ArWA2KVrmEuu9vH2i0qM6QIHz/ehmbGE4/2fZbpuMuBzTl7UkfNoqiSgw=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.51.0", "", { "os": "android", "cpu": "arm64" }, "sha512-GtXyBCcH4ti98YdiMNCrpBNGitx87EjEWxevnyhcBK12k/Vu4EzSB45rzSC4fGFUD6sQgeaxItRCEEWeVwPafw=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.51.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-3QJbeYaMHn6Bh2XeBXuITSsbnIctyTjvHf5nRjKYrT9pPeErNIpp5VDEeAXC0CZSwSVTsc8WOSDwgrAI24JolQ=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.51.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-NzErhMaTEN1cY0E8C5APy74lw5VwsNfJfVPBMWPVQLqAbO0k4FFLjvHURvkUL+Y18Wu+8Vs1kbqPh2hjXYA4pg=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.51.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-msAIh3vPAoKoHlOE/oe6Q5C/n9umypv/k81lED82ibrJotn+3YG2Qp1kiR8o/Dg5iOEU97c6tl0utxcyFenpFw=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.51.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CqQPcvqYyMe9ZBot2stjGogEzk1z8gGAngIX7srSzrzexmXixwVxBdFZyxTVM0CjGfDeV+Ru0w25/WNjlMM2Hw=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.51.0", "", { "os": "linux", "cpu": "arm" }, "sha512-dstrlYQgZMnyOssxSbolGCge/sDbko12N/35RBNuqLpoPbft2aeBidBAb0dvQlyBd9RJ6u8D4o4Eh8Un6iTgyQ=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.51.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-QEjUpXO7d35rP1/raLGGbAsBLLGZIzV3ZbeSjqWlD3oRnxpRIZ6iL4o51XQHkconn3uKssc+1VKdtHJ81BBhDA=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.51.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-YSJua5irtG4DoMAjUapDTPhkQLHhBIY0G9JqlZS6/SZPzqDkPku/1GdWs0D6h/wyx0Iz31lNCfIaWKBQhzP0wQ=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.51.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-7L4Wj2IEUNDETKssB9IDYt16T6WlF+X2jgC/hBq3diGHda9vJLpAgb09+D3quFq7TdkFtI7hwz/jmuQmQFPc1Q=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.51.0", "", { "os": "linux", "cpu": "none" }, "sha512-cBUHqtOXy76G41lOB401qpFoKx1xq17qYkhWrLSM7eEjiHM9sOtYqpr6ZdqCnN9s6ZpzudX4EkeHOFH2E9q0vA=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.51.0", "", { "os": "linux", "cpu": "none" }, "sha512-WKbg8CysgZcHfZX0ixQFBRSBvFZUHa3SBnEjHY2FVYt2nbNJEjzTxA3ZR5wMU0NOCNKIAFUFvAh5/XJKPRJuJg=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.51.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-N1QRUvJTxqXNSu35YOufdjsAVmKVx5bkrggOWAhTWBc3J4qjcBwr1IfyLh/6YCg8sYRSR1GraldS9jUgJL/U4A=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.51.0", "", { "os": "linux", "cpu": "x64" }, "sha512-e0Mz0DizsCoqNIjeOg6OUKe8JKJWZ5zZlwsd05Bmr51Jo3AOL4UJnPvwKumr4BBtBrDZkCmOLhCvDGm95nJM2g=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.51.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wD8HGTWhYBKXvRDvoBVB1y+fEYV01samhWQSy1Zkxq2vpezvMnjaFKRuiP6tBNITLGuffbNDEXOwcAhJ3gI5Ug=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.51.0", "", { "os": "none", "cpu": "arm64" }, "sha512-5NSwQ2hDEJ0GPXqikjWtwzgAQCsS7P9aLMNenjjKa+gknN3lTCwwwERsT6lKXSirfU3jLjexA2XQvQALh5h27w=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.51.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-JEZyah1M0RHMw8d+jjSSJmSmO8sABA1J1RtrHYujGPeCkYg1NeH0TGuClpe2h5QtioRTaF57y/TZfn/2IFV6fA=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.51.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-q3cEoKH6kwjz/WRyHwSf0nlD2F5Qw536kCXvmlSu+kaShzgrA0ojmh45CA81qL+7udfCaZL2SdKCZlLiGBVFlg=="],
|
||||||
|
|
||||||
|
"@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.51.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Q14+fOGb9T28nWF/0EUsYqERiRA7cl1oy4TJrGmLaqhm+aO2cV+JttboHI3CbdeMCAyDI1+NoSlrM7Melhp/cw=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.59.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.59.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="],
|
||||||
|
|
||||||
|
"@solid-devtools/debugger": ["@solid-devtools/debugger@0.28.1", "", { "dependencies": { "@nothing-but/utils": "~0.17.0", "@solid-devtools/shared": "^0.20.0", "@solid-primitives/bounds": "^0.1.1", "@solid-primitives/event-listener": "^2.4.1", "@solid-primitives/keyboard": "^1.3.1", "@solid-primitives/rootless": "^1.5.1", "@solid-primitives/scheduled": "^1.5.1", "@solid-primitives/static-store": "^0.1.1", "@solid-primitives/utils": "^6.3.1" }, "peerDependencies": { "solid-js": "^1.9.0" } }, "sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg=="],
|
||||||
|
|
||||||
|
"@solid-devtools/shared": ["@solid-devtools/shared@0.20.0", "", { "dependencies": { "@nothing-but/utils": "~0.17.0", "@solid-primitives/event-listener": "^2.4.1", "@solid-primitives/media": "^2.3.1", "@solid-primitives/refs": "^1.1.1", "@solid-primitives/rootless": "^1.5.1", "@solid-primitives/scheduled": "^1.5.1", "@solid-primitives/static-store": "^0.1.1", "@solid-primitives/styles": "^0.1.1", "@solid-primitives/utils": "^6.3.1" }, "peerDependencies": { "solid-js": "^1.9.0" } }, "sha512-o5TACmUOQsxpzpOKCjbQqGk8wL8PMi+frXG9WNu4Lh3PQVUB6hs95Kl/S8xc++zwcMguUKZJn8h5URUiMOca6Q=="],
|
||||||
|
|
||||||
|
"@solid-primitives/bounds": ["@solid-primitives/bounds@0.1.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/resize-observer": "^2.1.5", "@solid-primitives/static-store": "^0.1.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-JFym8zijMfWp1FaAmJlH3xMfenCuhjaUsoBn3kt9FtoWwLj+yt+EGYt+p3SkOKwF7h4gaGtZ5PIdSbSNVWkRmg=="],
|
||||||
|
|
||||||
|
"@solid-primitives/event-listener": ["@solid-primitives/event-listener@2.4.5", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA=="],
|
||||||
|
|
||||||
|
"@solid-primitives/keyboard": ["@solid-primitives/keyboard@1.3.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ=="],
|
||||||
|
|
||||||
|
"@solid-primitives/media": ["@solid-primitives/media@2.3.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/static-store": "^0.1.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-LX9fB5WDaK87FMDtUB1qokBOfT2et9Uobv/zZaKLH9caFSz4+P70MBKEIBHcZQy+9MV5M2XvGYLTbLskjkzMjA=="],
|
||||||
|
|
||||||
|
"@solid-primitives/refs": ["@solid-primitives/refs@1.1.3", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-aam02fjNKpBteewF/UliPSQCVJsIIGOLEWQOh+ll6R/QePzBOOBMcC4G+5jTaO75JuUS1d/14Q1YXT3X0Ow6iA=="],
|
||||||
|
|
||||||
|
"@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/static-store": "^0.1.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw=="],
|
||||||
|
|
||||||
|
"@solid-primitives/rootless": ["@solid-primitives/rootless@1.5.3", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA=="],
|
||||||
|
|
||||||
|
"@solid-primitives/scheduled": ["@solid-primitives/scheduled@1.5.3", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-oNwLE6E6lxJAWrc8QXuwM0k2oU1BnANnkChwMw82aK1j3+mWGJkG1IFe5gCwbV+afYmjI76t9JJV3md/8tLw+g=="],
|
||||||
|
|
||||||
|
"@solid-primitives/static-store": ["@solid-primitives/static-store@0.1.3", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ=="],
|
||||||
|
|
||||||
|
"@solid-primitives/styles": ["@solid-primitives/styles@0.1.3", "", { "dependencies": { "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-7YdA21prMeCX+oOF/1RAn02+cGz/pG4dyPWtHBC2H8aZvnC7IfThBt80mP+TioejrdfE7Lc54Uh18f7Pig+gRQ=="],
|
||||||
|
|
||||||
|
"@solid-primitives/utils": ["@solid-primitives/utils@6.4.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.1", "@tailwindcss/oxide-darwin-arm64": "4.2.1", "@tailwindcss/oxide-darwin-x64": "4.2.1", "@tailwindcss/oxide-freebsd-x64": "4.2.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", "@tailwindcss/oxide-linux-x64-musl": "4.2.1", "@tailwindcss/oxide-wasm32-wasi": "4.2.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.1", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="],
|
||||||
|
|
||||||
|
"@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
|
||||||
|
|
||||||
|
"@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
|
||||||
|
|
||||||
|
"@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
|
||||||
|
|
||||||
|
"@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
|
||||||
|
|
||||||
|
"@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="],
|
||||||
|
|
||||||
|
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
|
||||||
|
|
||||||
|
"@types/node": ["@types/node@25.3.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20260304.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260304.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260304.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20260304.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260304.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20260304.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260304.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20260304.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-Xj0ZeHEy+yJ/bIg6psPwl0POvBf1j5u7IZAXsUqgvgWbMIvdM9JOGmhpifcj6j28LcXM6GTvXUoXwlatxJ73Qg=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20260304.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TnTUxYt+dShRSoeOldx7VlKoEG+bvPHnyPEBImlNc7c3WP0AHYyNHrNg6EbLbzkOorARtd06J3Vk+XYzkrRzZg=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview-darwin-x64": ["@typescript/native-preview-darwin-x64@7.0.0-dev.20260304.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1nwXX1zbyYI3sDKdaR8NsBdM7LmE0J6OzVtlWgEJ/8YR7oC2/HY6/SfShF3DHHcEOHOFxRLbkJ9zVTJJspWLCw=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview-linux-arm": ["@typescript/native-preview-linux-arm@7.0.0-dev.20260304.1", "", { "os": "linux", "cpu": "arm" }, "sha512-TXZClCJVteK2f9gcI+I7o1Sxgq3qdMtraXOP9GZF8o0sKCLdDWENN8uORfZSeQv2qOJohcKvrrEz6LLSSngvEg=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview-linux-arm64": ["@typescript/native-preview-linux-arm64@7.0.0-dev.20260304.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cw+xqroXtsk/yVTKbelcPWMd6oZdET9kNWmigyc189KWwzOu2eq2EPXPQsrhEigq8O3j0xW0z3q2oqG+smOiXg=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview-linux-x64": ["@typescript/native-preview-linux-x64@7.0.0-dev.20260304.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EXufnN4PG0HYBHYbHXQXXRXtaQKuKBT3e6nxPhKnwpBBgy2MgWDIxzroTLvI9+SllhbJQzHNZOWiB+SU+KdCNw=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview-win32-arm64": ["@typescript/native-preview-win32-arm64@7.0.0-dev.20260304.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Be9yyDDbT/PEdNlhG+NXT47fwuiIeN0+/9BkeRKkiLgzY8DqQIC9w5FRWmwAJ+9PVa2sKr5cjD1SpJDHGrPIrA=="],
|
||||||
|
|
||||||
|
"@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20260304.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lg/w+rZ9NIUoqSsk2TbtDsqyD9nW0/rhTMYd14RFP7vuNijLrTbl7GPiMhFtMxaqCSOFapwbql7/3lU4BKHB6g=="],
|
||||||
|
|
||||||
|
"babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.5", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-8TFKemVLDYezqqv4mWz+PhRrkryTzivTGu0twyLrOkVZ0P63COx2Y04eVsUjFlwSOXui1z3P3Pn209dokWnirg=="],
|
||||||
|
|
||||||
|
"babel-preset-solid": ["babel-preset-solid@1.9.10", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.3" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.10" }, "optionalPeers": ["solid-js"] }, "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ=="],
|
||||||
|
|
||||||
|
"baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="],
|
||||||
|
|
||||||
|
"browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
|
||||||
|
|
||||||
|
"bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
|
||||||
|
|
||||||
|
"caniuse-lite": ["caniuse-lite@1.0.30001776", "", {}, "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw=="],
|
||||||
|
|
||||||
|
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
|
||||||
|
|
||||||
|
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
|
||||||
|
|
||||||
|
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||||
|
|
||||||
|
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||||
|
|
||||||
|
"electron-to-chromium": ["electron-to-chromium@1.5.307", "", {}, "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg=="],
|
||||||
|
|
||||||
|
"enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="],
|
||||||
|
|
||||||
|
"entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
|
||||||
|
|
||||||
|
"esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],
|
||||||
|
|
||||||
|
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||||
|
|
||||||
|
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||||
|
|
||||||
|
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||||
|
|
||||||
|
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
|
||||||
|
|
||||||
|
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||||
|
|
||||||
|
"html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="],
|
||||||
|
|
||||||
|
"is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
|
||||||
|
|
||||||
|
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
||||||
|
|
||||||
|
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||||
|
|
||||||
|
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
|
||||||
|
|
||||||
|
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
|
||||||
|
|
||||||
|
"lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="],
|
||||||
|
|
||||||
|
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="],
|
||||||
|
|
||||||
|
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="],
|
||||||
|
|
||||||
|
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="],
|
||||||
|
|
||||||
|
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="],
|
||||||
|
|
||||||
|
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
|
||||||
|
|
||||||
|
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
||||||
|
|
||||||
|
"merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="],
|
||||||
|
|
||||||
|
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
|
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
||||||
|
|
||||||
|
"node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="],
|
||||||
|
|
||||||
|
"oxlint": ["oxlint@1.51.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.51.0", "@oxlint/binding-android-arm64": "1.51.0", "@oxlint/binding-darwin-arm64": "1.51.0", "@oxlint/binding-darwin-x64": "1.51.0", "@oxlint/binding-freebsd-x64": "1.51.0", "@oxlint/binding-linux-arm-gnueabihf": "1.51.0", "@oxlint/binding-linux-arm-musleabihf": "1.51.0", "@oxlint/binding-linux-arm64-gnu": "1.51.0", "@oxlint/binding-linux-arm64-musl": "1.51.0", "@oxlint/binding-linux-ppc64-gnu": "1.51.0", "@oxlint/binding-linux-riscv64-gnu": "1.51.0", "@oxlint/binding-linux-riscv64-musl": "1.51.0", "@oxlint/binding-linux-s390x-gnu": "1.51.0", "@oxlint/binding-linux-x64-gnu": "1.51.0", "@oxlint/binding-linux-x64-musl": "1.51.0", "@oxlint/binding-openharmony-arm64": "1.51.0", "@oxlint/binding-win32-arm64-msvc": "1.51.0", "@oxlint/binding-win32-ia32-msvc": "1.51.0", "@oxlint/binding-win32-x64-msvc": "1.51.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.15.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-g6DNPaV9/WI9MoX2XllafxQuxwY1TV++j7hP8fTJByVBuCoVtm3dy9f/2vtH/HU40JztcgWF4G7ua+gkainklQ=="],
|
||||||
|
|
||||||
|
"parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
|
||||||
|
|
||||||
|
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||||
|
|
||||||
|
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
||||||
|
|
||||||
|
"postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
|
||||||
|
|
||||||
|
"rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="],
|
||||||
|
|
||||||
|
"semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
|
||||||
|
|
||||||
|
"seroval": ["seroval@1.5.0", "", {}, "sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw=="],
|
||||||
|
|
||||||
|
"seroval-plugins": ["seroval-plugins@1.5.0", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA=="],
|
||||||
|
|
||||||
|
"solid-devtools": ["solid-devtools@0.34.5", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.6", "@solid-devtools/debugger": "^0.28.1", "@solid-devtools/shared": "^0.20.0" }, "peerDependencies": { "solid-js": "^1.9.0", "vite": "^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["vite"] }, "sha512-KNVdS9MQzzeVS++Vmg4JeU0fM6ZMuBEmkBA7SmqPS2s5UHpRjv1PNH8gShmlN9L/tki6OUAzJP3H1aKq2AcOSg=="],
|
||||||
|
|
||||||
|
"solid-js": ["solid-js@1.9.11", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q=="],
|
||||||
|
|
||||||
|
"solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="],
|
||||||
|
|
||||||
|
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||||
|
|
||||||
|
"tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="],
|
||||||
|
|
||||||
|
"tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
|
||||||
|
|
||||||
|
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
|
||||||
|
|
||||||
|
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
||||||
|
|
||||||
|
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
||||||
|
|
||||||
|
"update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
|
||||||
|
|
||||||
|
"vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="],
|
||||||
|
|
||||||
|
"vite-plugin-solid": ["vite-plugin-solid@2.11.10", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw=="],
|
||||||
|
|
||||||
|
"vitefu": ["vitefu@1.1.2", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw=="],
|
||||||
|
|
||||||
|
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
|
"babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="],
|
||||||
|
}
|
||||||
|
}
|
||||||
2
bunfig.toml
Normal file
2
bunfig.toml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[install]
|
||||||
|
exact = true
|
||||||
@@ -1,12 +1,18 @@
|
|||||||
# ADR-001: V1 Tech Stack
|
# ADR-001: V1 Tech Stack
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
Accepted
|
Accepted
|
||||||
|
|
||||||
|
Decision Date: 2026-03-05
|
||||||
|
Owners: Stanislav Kalishin
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
The project needs to be modern, modular, and scalable while still delivering v1 quickly.
|
The project needs to be modern, modular, and scalable while still delivering v1 quickly.
|
||||||
|
|
||||||
## Decision
|
## Decision
|
||||||
|
|
||||||
- Runtime/package manager/test runner: Bun
|
- Runtime/package manager/test runner: Bun
|
||||||
- Language: TypeScript (strict mode)
|
- Language: TypeScript (strict mode)
|
||||||
- Bot framework: grammY
|
- Bot framework: grammY
|
||||||
@@ -20,6 +26,7 @@ The project needs to be modern, modular, and scalable while still delivering v1
|
|||||||
- Logging/metrics baseline: Cloud Logging/Monitoring
|
- Logging/metrics baseline: Cloud Logging/Monitoring
|
||||||
|
|
||||||
## Rationale
|
## Rationale
|
||||||
|
|
||||||
- Bun provides a fast unified developer workflow.
|
- Bun provides a fast unified developer workflow.
|
||||||
- grammY is TypeScript-friendly with strong middleware patterns.
|
- grammY is TypeScript-friendly with strong middleware patterns.
|
||||||
- Supabase keeps SQL-first data modeling while reducing ops overhead.
|
- Supabase keeps SQL-first data modeling while reducing ops overhead.
|
||||||
@@ -28,15 +35,19 @@ The project needs to be modern, modular, and scalable while still delivering v1
|
|||||||
- Oxlint enables fast linting suitable for small-commit workflow.
|
- Oxlint enables fast linting suitable for small-commit workflow.
|
||||||
|
|
||||||
## Consequences
|
## Consequences
|
||||||
|
|
||||||
Positive:
|
Positive:
|
||||||
|
|
||||||
- Strong portfolio architecture with pragmatic service count.
|
- Strong portfolio architecture with pragmatic service count.
|
||||||
- Clear path to production without heavy platform ops.
|
- Clear path to production without heavy platform ops.
|
||||||
|
|
||||||
Negative:
|
Negative:
|
||||||
|
|
||||||
- Some enterprise tooling (Prometheus/Grafana/K8s) is deferred.
|
- Some enterprise tooling (Prometheus/Grafana/K8s) is deferred.
|
||||||
- Serverless constraints require disciplined idempotency and stateless design.
|
- Serverless constraints require disciplined idempotency and stateless design.
|
||||||
|
|
||||||
## Alternatives Considered
|
## Alternatives Considered
|
||||||
|
|
||||||
- Fly.io runtime: good DX, but Cloud Run better matches serverless objective.
|
- Fly.io runtime: good DX, but Cloud Run better matches serverless objective.
|
||||||
- Convex backend: strong DX, but SQL/reporting fit is weaker for financial ledger.
|
- Convex backend: strong DX, but SQL/reporting fit is weaker for financial ledger.
|
||||||
- Telegraf bot framework: mature ecosystem, but less desirable TS ergonomics.
|
- Telegraf bot framework: mature ecosystem, but less desirable TS ergonomics.
|
||||||
|
|||||||
@@ -1,13 +1,20 @@
|
|||||||
# ADR-002: Hexagonal Architecture (Ports and Adapters)
|
# ADR-002: Hexagonal Architecture (Ports and Adapters)
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
Accepted
|
Accepted
|
||||||
|
|
||||||
|
Decision Date: 2026-03-05
|
||||||
|
Owners: Stanislav Kalishin
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
The project combines domain-heavy finance logic, Telegram integration, mini-app APIs, and scheduled jobs. Without strict boundaries, framework and infrastructure concerns will leak into core logic.
|
The project combines domain-heavy finance logic, Telegram integration, mini-app APIs, and scheduled jobs. Without strict boundaries, framework and infrastructure concerns will leak into core logic.
|
||||||
|
|
||||||
## Decision
|
## Decision
|
||||||
|
|
||||||
Adopt hexagonal architecture with explicit layers:
|
Adopt hexagonal architecture with explicit layers:
|
||||||
|
|
||||||
- Domain: pure business model and invariants.
|
- Domain: pure business model and invariants.
|
||||||
- Application: use-case orchestration.
|
- Application: use-case orchestration.
|
||||||
- Ports: interfaces for repositories/services.
|
- Ports: interfaces for repositories/services.
|
||||||
@@ -15,12 +22,14 @@ Adopt hexagonal architecture with explicit layers:
|
|||||||
- Composition root: runtime wiring only.
|
- Composition root: runtime wiring only.
|
||||||
|
|
||||||
## Boundary Rules
|
## Boundary Rules
|
||||||
|
|
||||||
- Domain cannot import adapters, SDKs, HTTP, or SQL clients.
|
- Domain cannot import adapters, SDKs, HTTP, or SQL clients.
|
||||||
- Application cannot import concrete adapter implementations.
|
- Application cannot import concrete adapter implementations.
|
||||||
- Adapters can depend on SDKs and infra concerns but must implement ports.
|
- Adapters can depend on SDKs and infra concerns but must implement ports.
|
||||||
- Entry points create dependency graph and pass ports to use-cases.
|
- Entry points create dependency graph and pass ports to use-cases.
|
||||||
|
|
||||||
## Module Layout
|
## Module Layout
|
||||||
|
|
||||||
- `packages/domain`
|
- `packages/domain`
|
||||||
- `packages/application`
|
- `packages/application`
|
||||||
- `packages/ports`
|
- `packages/ports`
|
||||||
@@ -28,23 +37,30 @@ Adopt hexagonal architecture with explicit layers:
|
|||||||
- `apps/*` for composition and delivery endpoints
|
- `apps/*` for composition and delivery endpoints
|
||||||
|
|
||||||
## Rationale
|
## Rationale
|
||||||
|
|
||||||
- Keeps financial logic testable and framework-independent.
|
- Keeps financial logic testable and framework-independent.
|
||||||
- Enables incremental replacement of adapters (e.g., parser provider).
|
- Enables incremental replacement of adapters (e.g., parser provider).
|
||||||
- Supports clean growth from v1 to larger-scale architecture.
|
- Supports clean growth from v1 to larger-scale architecture.
|
||||||
|
|
||||||
## Consequences
|
## Consequences
|
||||||
|
|
||||||
Positive:
|
Positive:
|
||||||
|
|
||||||
- High maintainability and clear ownership of concerns.
|
- High maintainability and clear ownership of concerns.
|
||||||
- Better interview-readability of architecture.
|
- Easier to explain architecture decisions in interviews.
|
||||||
|
|
||||||
Negative:
|
Negative:
|
||||||
|
|
||||||
- Requires initial discipline and more explicit interfaces.
|
- Requires initial discipline and more explicit interfaces.
|
||||||
- Slight boilerplate overhead for small features.
|
- Slight boilerplate overhead for small features.
|
||||||
|
|
||||||
## Risks and Mitigations
|
## Risks and Mitigations
|
||||||
|
|
||||||
Risk:
|
Risk:
|
||||||
|
|
||||||
- Overengineering through too many tiny abstractions.
|
- Overengineering through too many tiny abstractions.
|
||||||
|
|
||||||
Mitigation:
|
Mitigation:
|
||||||
|
|
||||||
- Create ports only for external boundaries and meaningful seams.
|
- Create ports only for external boundaries and meaningful seams.
|
||||||
- Keep use-cases focused; avoid generic base classes.
|
- Keep use-cases focused; avoid generic base classes.
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
# Household Bot Roadmap
|
# Household Bot Roadmap
|
||||||
|
|
||||||
## Vision
|
## Vision
|
||||||
|
|
||||||
Build a clean, modular Telegram household finance platform with a mini app, designed for real use and portfolio-grade engineering quality.
|
Build a clean, modular Telegram household finance platform with a mini app, designed for real use and portfolio-grade engineering quality.
|
||||||
|
|
||||||
## Principles
|
## Principles
|
||||||
|
|
||||||
- Hexagonal architecture with strict ports/adapters boundaries.
|
- Hexagonal architecture with strict ports/adapters boundaries.
|
||||||
- Small, composable modules and strong type safety.
|
- Small, composable modules and strong type safety.
|
||||||
- Incremental delivery with small commits and always-green CI.
|
- Incremental delivery with small commits and always-green CI.
|
||||||
@@ -11,9 +13,11 @@ Build a clean, modular Telegram household finance platform with a mini app, desi
|
|||||||
- Pragmatic v1, explicit enterprise extensions in later phases.
|
- Pragmatic v1, explicit enterprise extensions in later phases.
|
||||||
|
|
||||||
## Phase 0 - Foundation
|
## Phase 0 - Foundation
|
||||||
|
|
||||||
Goal: establish architecture, tooling, and delivery guardrails.
|
Goal: establish architecture, tooling, and delivery guardrails.
|
||||||
|
|
||||||
Deliverables:
|
Deliverables:
|
||||||
|
|
||||||
- Bun workspace monorepo layout.
|
- Bun workspace monorepo layout.
|
||||||
- TypeScript strict base config.
|
- TypeScript strict base config.
|
||||||
- Oxlint setup and formatting conventions (no semicolons).
|
- Oxlint setup and formatting conventions (no semicolons).
|
||||||
@@ -21,27 +25,33 @@ Deliverables:
|
|||||||
- Initial ADRs and spec template.
|
- Initial ADRs and spec template.
|
||||||
|
|
||||||
Exit criteria:
|
Exit criteria:
|
||||||
|
|
||||||
- Fresh clone can run quality checks with one command.
|
- Fresh clone can run quality checks with one command.
|
||||||
- CI passes on default branch.
|
- CI passes on default branch.
|
||||||
- Architecture boundaries are documented.
|
- Architecture boundaries are documented.
|
||||||
|
|
||||||
## Phase 1 - Finance Core
|
## Phase 1 - Finance Core
|
||||||
|
|
||||||
Goal: implement deterministic domain logic for monthly settlements.
|
Goal: implement deterministic domain logic for monthly settlements.
|
||||||
|
|
||||||
Deliverables:
|
Deliverables:
|
||||||
|
|
||||||
- Domain value objects (`Money`, `BillingPeriod`, IDs).
|
- Domain value objects (`Money`, `BillingPeriod`, IDs).
|
||||||
- Settlement engine for rent + utility + purchase offsets.
|
- Settlement engine for rent + utility + purchase offsets.
|
||||||
- Default equal utility split, with optional day-based override.
|
- Default equal utility split, with optional day-based override.
|
||||||
- Domain unit tests covering edge cases.
|
- Domain unit tests covering edge cases.
|
||||||
|
|
||||||
Exit criteria:
|
Exit criteria:
|
||||||
|
|
||||||
- Settlement logic is adapter-independent.
|
- Settlement logic is adapter-independent.
|
||||||
- Domain test suite covers normal and failure paths.
|
- Domain test suite covers normal and failure paths.
|
||||||
|
|
||||||
## Phase 2 - Telegram Bot Core
|
## Phase 2 - Telegram Bot Core
|
||||||
|
|
||||||
Goal: process household activity and manage billing cycles in Telegram.
|
Goal: process household activity and manage billing cycles in Telegram.
|
||||||
|
|
||||||
Deliverables:
|
Deliverables:
|
||||||
|
|
||||||
- grammY bot webhook service.
|
- grammY bot webhook service.
|
||||||
- Topic listener for `Общие покупки`.
|
- Topic listener for `Общие покупки`.
|
||||||
- Utility and rent commands.
|
- Utility and rent commands.
|
||||||
@@ -49,60 +59,74 @@ Deliverables:
|
|||||||
- Idempotent message processing.
|
- Idempotent message processing.
|
||||||
|
|
||||||
Exit criteria:
|
Exit criteria:
|
||||||
|
|
||||||
- Purchase messages are ingested and persisted.
|
- Purchase messages are ingested and persisted.
|
||||||
- Monthly statement can be produced via command.
|
- Monthly statement can be produced via command.
|
||||||
|
|
||||||
## Phase 3 - Reminders and Scheduling
|
## Phase 3 - Reminders and Scheduling
|
||||||
|
|
||||||
Goal: automate key payment reminders.
|
Goal: automate key payment reminders.
|
||||||
|
|
||||||
Deliverables:
|
Deliverables:
|
||||||
|
|
||||||
- Cloud Scheduler jobs.
|
- Cloud Scheduler jobs.
|
||||||
- Reminder handlers for day 3/4 utilities, day 17 rent notice, day 20 due date.
|
- Reminder handlers for day 3/4 utilities, day 17 rent notice, day 20 due date.
|
||||||
- Dedicated topic posting for reminders.
|
- Dedicated topic posting for reminders.
|
||||||
|
|
||||||
Exit criteria:
|
Exit criteria:
|
||||||
|
|
||||||
- Scheduled reminders fire reliably.
|
- Scheduled reminders fire reliably.
|
||||||
- Duplicate sends are prevented.
|
- Duplicate sends are prevented.
|
||||||
|
|
||||||
## Phase 4 - Mini App V1
|
## Phase 4 - Mini App V1
|
||||||
|
|
||||||
Goal: deliver a usable household dashboard.
|
Goal: deliver a usable household dashboard.
|
||||||
|
|
||||||
Deliverables:
|
Deliverables:
|
||||||
|
|
||||||
- SolidJS mini app shell.
|
- SolidJS mini app shell.
|
||||||
- Telegram initData verification and membership gate.
|
- Telegram initData verification and membership gate.
|
||||||
- Ledger view, balances, and settlement preview.
|
- Ledger view, balances, and settlement preview.
|
||||||
- RU/EN localization.
|
- RU/EN localization.
|
||||||
|
|
||||||
Exit criteria:
|
Exit criteria:
|
||||||
|
|
||||||
- Active group members can view current month balances.
|
- Active group members can view current month balances.
|
||||||
- Financial views are consistent with bot calculations.
|
- Financial views are consistent with bot calculations.
|
||||||
|
|
||||||
## Phase 5 - Anonymous Feedback + Safety
|
## Phase 5 - Anonymous Feedback + Safety
|
||||||
|
|
||||||
Goal: support safer household communication.
|
Goal: support safer household communication.
|
||||||
|
|
||||||
Deliverables:
|
Deliverables:
|
||||||
|
|
||||||
- Anonymous DM flow to bot.
|
- Anonymous DM flow to bot.
|
||||||
- Sanitized/rephrased repost to group topic.
|
- Sanitized/rephrased repost to group topic.
|
||||||
- Rate limits and blocklist moderation.
|
- Rate limits and blocklist moderation.
|
||||||
|
|
||||||
Exit criteria:
|
Exit criteria:
|
||||||
|
|
||||||
- Sender identity is hidden from group users.
|
- Sender identity is hidden from group users.
|
||||||
- Abuse controls prevent spam and obvious misuse.
|
- Abuse controls prevent spam and obvious misuse.
|
||||||
|
|
||||||
## Phase 6 - Hardening and Portfolio Polish
|
## Phase 6 - Hardening and Portfolio Polish
|
||||||
|
|
||||||
Goal: production readiness and strong showcase quality.
|
Goal: production readiness and strong showcase quality.
|
||||||
|
|
||||||
Deliverables:
|
Deliverables:
|
||||||
|
|
||||||
- Sentry integration and structured logging.
|
- Sentry integration and structured logging.
|
||||||
- Integration and end-to-end tests.
|
- Integration and end-to-end tests.
|
||||||
- Runbooks and operational docs.
|
- Runbooks and operational docs.
|
||||||
- Architecture diagram and demo instructions.
|
- Architecture diagram and demo instructions.
|
||||||
|
|
||||||
Exit criteria:
|
Exit criteria:
|
||||||
|
|
||||||
- Incident/debug workflow is documented.
|
- Incident/debug workflow is documented.
|
||||||
- Repo can be reviewed as a coherent system design case study.
|
- Repo can be reviewed as a coherent system design case study.
|
||||||
|
|
||||||
## Deferred (Post-v1)
|
## Deferred (Post-v1)
|
||||||
|
|
||||||
- House wiki pages (Wi-Fi, rules, how-to).
|
- House wiki pages (Wi-Fi, rules, how-to).
|
||||||
- Cleaning/karma workflow.
|
- Cleaning/karma workflow.
|
||||||
- Advanced analytics and trend insights.
|
- Advanced analytics and trend insights.
|
||||||
|
|||||||
45
docs/runbooks/dev-setup.md
Normal file
45
docs/runbooks/dev-setup.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Development Setup
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Bun 1.3+
|
||||||
|
- Node.js 22+
|
||||||
|
|
||||||
|
## First-time setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workspace commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun run lint
|
||||||
|
bun run lint:fix
|
||||||
|
bun run format
|
||||||
|
bun run format:check
|
||||||
|
bun run typecheck
|
||||||
|
bun run test
|
||||||
|
bun run build
|
||||||
|
```
|
||||||
|
|
||||||
|
## App commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun run dev:bot
|
||||||
|
bun run dev:miniapp
|
||||||
|
```
|
||||||
|
|
||||||
|
## Review commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun run review:coderabbit
|
||||||
|
```
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Type checking uses `tsgo` (`@typescript/native-preview`).
|
||||||
|
- Linting uses `oxlint`.
|
||||||
|
- Formatting uses `oxfmt` with no-semicolon style.
|
||||||
|
- AI review uses CodeRabbit CLI in `--prompt-only` mode against `main`.
|
||||||
|
- `WHE-19` will add CI checks for the same root commands.
|
||||||
@@ -1,24 +1,29 @@
|
|||||||
# HOUSEBOT-001: Monorepo Bootstrap and Quality Gates
|
# HOUSEBOT-001: Monorepo Bootstrap and Quality Gates
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Initialize the repository as a Bun workspace monorepo with strict TypeScript, Oxlint, CI quality gates, and architecture-oriented package layout.
|
Initialize the repository as a Bun workspace monorepo with strict TypeScript, Oxlint, CI quality gates, and architecture-oriented package layout.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
- Establish baseline folder structure for hexagonal architecture.
|
- Establish baseline folder structure for hexagonal architecture.
|
||||||
- Add root scripts for lint, typecheck, test, and build.
|
- Add root scripts for lint, typecheck, test, and build.
|
||||||
- Enforce no-semicolon formatting style and strict linting.
|
- Enforce no-semicolon formatting style and strict linting.
|
||||||
- Ensure CI runs on every push/PR.
|
- Ensure CI runs on every push/PR.
|
||||||
|
|
||||||
## Non-goals
|
## Non-goals
|
||||||
|
|
||||||
- Implement business logic.
|
- Implement business logic.
|
||||||
- Implement Telegram handlers.
|
- Implement Telegram handlers.
|
||||||
- Create production cloud resources.
|
- Create production cloud resources.
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
- In: repo skeleton, workspace config, root tooling config, CI workflow.
|
- In: repo skeleton, workspace config, root tooling config, CI workflow.
|
||||||
- Out: feature code, database schema, external service integration.
|
- Out: feature code, database schema, external service integration.
|
||||||
|
|
||||||
## Interfaces and Contracts
|
## Interfaces and Contracts
|
||||||
|
|
||||||
- Root scripts exposed via `package.json`:
|
- Root scripts exposed via `package.json`:
|
||||||
- `lint`
|
- `lint`
|
||||||
- `typecheck`
|
- `typecheck`
|
||||||
@@ -27,6 +32,7 @@ Initialize the repository as a Bun workspace monorepo with strict TypeScript, Ox
|
|||||||
- Workspace packages must compile under shared TS config.
|
- Workspace packages must compile under shared TS config.
|
||||||
|
|
||||||
## Architecture Constraints
|
## Architecture Constraints
|
||||||
|
|
||||||
- Workspace must include:
|
- Workspace must include:
|
||||||
- `apps/bot`
|
- `apps/bot`
|
||||||
- `apps/miniapp`
|
- `apps/miniapp`
|
||||||
@@ -38,6 +44,7 @@ Initialize the repository as a Bun workspace monorepo with strict TypeScript, Ox
|
|||||||
- No cross-import from domain to adapters/apps.
|
- No cross-import from domain to adapters/apps.
|
||||||
|
|
||||||
## File Plan
|
## File Plan
|
||||||
|
|
||||||
- Root:
|
- Root:
|
||||||
- `package.json`
|
- `package.json`
|
||||||
- `bunfig.toml`
|
- `bunfig.toml`
|
||||||
@@ -53,11 +60,13 @@ Initialize the repository as a Bun workspace monorepo with strict TypeScript, Ox
|
|||||||
- `packages/*/src/index.ts`
|
- `packages/*/src/index.ts`
|
||||||
|
|
||||||
## Security and Safety
|
## Security and Safety
|
||||||
|
|
||||||
- No secrets in repo.
|
- No secrets in repo.
|
||||||
- Add `.env.example` templates only.
|
- Add `.env.example` templates only.
|
||||||
- CI must fail on type/lint/test failure.
|
- CI must fail on type/lint/test failure.
|
||||||
|
|
||||||
## Test Plan
|
## Test Plan
|
||||||
|
|
||||||
- Unit: not applicable in this ticket.
|
- Unit: not applicable in this ticket.
|
||||||
- Integration: not applicable.
|
- Integration: not applicable.
|
||||||
- Validation checks:
|
- Validation checks:
|
||||||
@@ -66,6 +75,7 @@ Initialize the repository as a Bun workspace monorepo with strict TypeScript, Ox
|
|||||||
- CI workflow executes all checks.
|
- CI workflow executes all checks.
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] Bun workspace initialized with declared workspaces.
|
- [ ] Bun workspace initialized with declared workspaces.
|
||||||
- [ ] Oxlint config present and root lint script works.
|
- [ ] Oxlint config present and root lint script works.
|
||||||
- [ ] TypeScript strict base config is shared across workspaces.
|
- [ ] TypeScript strict base config is shared across workspaces.
|
||||||
@@ -74,5 +84,6 @@ Initialize the repository as a Bun workspace monorepo with strict TypeScript, Ox
|
|||||||
- [ ] Docs updated with local bootstrap commands.
|
- [ ] Docs updated with local bootstrap commands.
|
||||||
|
|
||||||
## Rollout Plan
|
## Rollout Plan
|
||||||
|
|
||||||
- Merge to default branch.
|
- Merge to default branch.
|
||||||
- Use as mandatory baseline for all subsequent tickets.
|
- Use as mandatory baseline for all subsequent tickets.
|
||||||
|
|||||||
@@ -1,33 +1,40 @@
|
|||||||
# HOUSEBOT-002: Finance Domain Model
|
# HOUSEBOT-002: Finance Domain Model
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Define domain entities and invariants for rent, utilities, shared purchases, and monthly settlements.
|
Define domain entities and invariants for rent, utilities, shared purchases, and monthly settlements.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
- Create a deterministic model for monthly household accounting.
|
- Create a deterministic model for monthly household accounting.
|
||||||
- Encode money-safe arithmetic with integer minor units.
|
- Encode money-safe arithmetic with integer minor units.
|
||||||
- Support equal split by default with optional day-based utility override.
|
- Support equal split by default with optional day-based utility override.
|
||||||
|
|
||||||
## Non-goals
|
## Non-goals
|
||||||
|
|
||||||
- Telegram command handlers.
|
- Telegram command handlers.
|
||||||
- Mini app rendering.
|
- Mini app rendering.
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
- In: domain entities, use-case contracts, and validation rules.
|
- In: domain entities, use-case contracts, and validation rules.
|
||||||
- Out: persistence adapter implementation.
|
- Out: persistence adapter implementation.
|
||||||
|
|
||||||
## Interfaces and Contracts
|
## Interfaces and Contracts
|
||||||
|
|
||||||
- `Money` value object (`currency: GEL`, `amountMinor: bigint | number`).
|
- `Money` value object (`currency: GEL`, `amountMinor: bigint | number`).
|
||||||
- `SettlementInput` contract with members, rent, utilities, purchases, overrides.
|
- `SettlementInput` contract with members, rent, utilities, purchases, overrides.
|
||||||
- `SettlementResult` contract with per-member due and explanation lines.
|
- `SettlementResult` contract with per-member due and explanation lines.
|
||||||
|
|
||||||
## Domain Rules
|
## Domain Rules
|
||||||
|
|
||||||
- Rent is fixed per cycle and split equally among active members.
|
- Rent is fixed per cycle and split equally among active members.
|
||||||
- Utilities split equally unless per-member day override is provided.
|
- Utilities split equally unless per-member day override is provided.
|
||||||
- Shared purchases reduce payer due amount and distribute cost across members.
|
- Shared purchases reduce payer due amount and distribute cost across members.
|
||||||
- No floating-point operations.
|
- No floating-point operations.
|
||||||
|
|
||||||
## Data Model Changes
|
## Data Model Changes
|
||||||
|
|
||||||
- Define required table contracts (implemented in later DB ticket):
|
- Define required table contracts (implemented in later DB ticket):
|
||||||
- `billing_cycles`
|
- `billing_cycles`
|
||||||
- `rent_rules`
|
- `rent_rules`
|
||||||
@@ -37,20 +44,24 @@ Define domain entities and invariants for rent, utilities, shared purchases, and
|
|||||||
- `settlements`, `settlement_lines`
|
- `settlements`, `settlement_lines`
|
||||||
|
|
||||||
## Security and Privacy
|
## Security and Privacy
|
||||||
|
|
||||||
- Do not store unnecessary personal data.
|
- Do not store unnecessary personal data.
|
||||||
- Use internal IDs for members in calculations.
|
- Use internal IDs for members in calculations.
|
||||||
|
|
||||||
## Observability
|
## Observability
|
||||||
|
|
||||||
- Structured calculation logs (input hash, cycle id, result totals).
|
- Structured calculation logs (input hash, cycle id, result totals).
|
||||||
- Error event on invalid settlement state.
|
- Error event on invalid settlement state.
|
||||||
|
|
||||||
## Edge Cases and Failure Modes
|
## Edge Cases and Failure Modes
|
||||||
|
|
||||||
- Member count is zero.
|
- Member count is zero.
|
||||||
- Utility day overrides sum to zero.
|
- Utility day overrides sum to zero.
|
||||||
- Negative amounts from malformed inputs.
|
- Negative amounts from malformed inputs.
|
||||||
- Duplicate purchase entries.
|
- Duplicate purchase entries.
|
||||||
|
|
||||||
## Test Plan
|
## Test Plan
|
||||||
|
|
||||||
- Unit:
|
- Unit:
|
||||||
- money arithmetic and normalization
|
- money arithmetic and normalization
|
||||||
- equal split and day-weighted split cases
|
- equal split and day-weighted split cases
|
||||||
@@ -59,10 +70,12 @@ Define domain entities and invariants for rent, utilities, shared purchases, and
|
|||||||
- E2E: not in this ticket.
|
- E2E: not in this ticket.
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] Value objects implemented and tested.
|
- [ ] Value objects implemented and tested.
|
||||||
- [ ] Settlement input/output contracts defined.
|
- [ ] Settlement input/output contracts defined.
|
||||||
- [ ] Deterministic settlement math covered by tests.
|
- [ ] Deterministic settlement math covered by tests.
|
||||||
- [ ] Edge cases produce explicit domain errors.
|
- [ ] Edge cases produce explicit domain errors.
|
||||||
|
|
||||||
## Rollout Plan
|
## Rollout Plan
|
||||||
|
|
||||||
- Merge as dependency for settlement engine and bot handlers.
|
- Merge as dependency for settlement engine and bot handlers.
|
||||||
|
|||||||
@@ -1,22 +1,27 @@
|
|||||||
# HOUSEBOT-003: Purchase Parser (Hybrid Rules + LLM Fallback)
|
# HOUSEBOT-003: Purchase Parser (Hybrid Rules + LLM Fallback)
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Parse free-form purchase messages (primarily Russian) from the Telegram topic `Общие покупки` into structured ledger entries.
|
Parse free-form purchase messages (primarily Russian) from the Telegram topic `Общие покупки` into structured ledger entries.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
- High precision amount extraction with deterministic rules first.
|
- High precision amount extraction with deterministic rules first.
|
||||||
- Fallback to LLM for ambiguous or irregular message formats.
|
- Fallback to LLM for ambiguous or irregular message formats.
|
||||||
- Persist raw input, parsed output, and confidence score.
|
- Persist raw input, parsed output, and confidence score.
|
||||||
|
|
||||||
## Non-goals
|
## Non-goals
|
||||||
|
|
||||||
- Receipt image OCR.
|
- Receipt image OCR.
|
||||||
- Full conversational NLP.
|
- Full conversational NLP.
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
- In: parsing pipeline, confidence policy, parser contracts.
|
- In: parsing pipeline, confidence policy, parser contracts.
|
||||||
- Out: bot listener wiring (separate ticket).
|
- Out: bot listener wiring (separate ticket).
|
||||||
|
|
||||||
## Interfaces and Contracts
|
## Interfaces and Contracts
|
||||||
|
|
||||||
- `parsePurchase(input): ParsedPurchaseResult`
|
- `parsePurchase(input): ParsedPurchaseResult`
|
||||||
- `ParsedPurchaseResult`:
|
- `ParsedPurchaseResult`:
|
||||||
- `amountMinor`
|
- `amountMinor`
|
||||||
@@ -27,11 +32,13 @@ Parse free-form purchase messages (primarily Russian) from the Telegram topic `
|
|||||||
- `needsReview`
|
- `needsReview`
|
||||||
|
|
||||||
## Domain Rules
|
## Domain Rules
|
||||||
|
|
||||||
- GEL is default currency when omitted.
|
- GEL is default currency when omitted.
|
||||||
- Confidence threshold determines auto-accept vs review flag.
|
- Confidence threshold determines auto-accept vs review flag.
|
||||||
- Never mutate original message text.
|
- Never mutate original message text.
|
||||||
|
|
||||||
## Data Model Changes
|
## Data Model Changes
|
||||||
|
|
||||||
- `purchase_entries` fields:
|
- `purchase_entries` fields:
|
||||||
- `raw_text`
|
- `raw_text`
|
||||||
- `parsed_amount_minor`
|
- `parsed_amount_minor`
|
||||||
@@ -42,21 +49,25 @@ Parse free-form purchase messages (primarily Russian) from the Telegram topic `
|
|||||||
- `needs_review`
|
- `needs_review`
|
||||||
|
|
||||||
## Security and Privacy
|
## Security and Privacy
|
||||||
|
|
||||||
- Sanitize prompt inputs for LLM adapter.
|
- Sanitize prompt inputs for LLM adapter.
|
||||||
- Do not send unnecessary metadata to LLM provider.
|
- Do not send unnecessary metadata to LLM provider.
|
||||||
|
|
||||||
## Observability
|
## Observability
|
||||||
|
|
||||||
- Parser mode distribution metrics.
|
- Parser mode distribution metrics.
|
||||||
- Confidence histogram.
|
- Confidence histogram.
|
||||||
- Error log for parse failures.
|
- Error log for parse failures.
|
||||||
|
|
||||||
## Edge Cases and Failure Modes
|
## Edge Cases and Failure Modes
|
||||||
|
|
||||||
- Missing amount.
|
- Missing amount.
|
||||||
- Multiple possible amounts in one message.
|
- Multiple possible amounts in one message.
|
||||||
- Non-GEL currencies mentioned.
|
- Non-GEL currencies mentioned.
|
||||||
- Typos and slang variants.
|
- Typos and slang variants.
|
||||||
|
|
||||||
## Test Plan
|
## Test Plan
|
||||||
|
|
||||||
- Unit:
|
- Unit:
|
||||||
- regex extraction fixtures in RU/EN mixed text
|
- regex extraction fixtures in RU/EN mixed text
|
||||||
- confidence scoring behavior
|
- confidence scoring behavior
|
||||||
@@ -65,10 +76,12 @@ Parse free-form purchase messages (primarily Russian) from the Telegram topic `
|
|||||||
- E2E: consumed in bot ingestion ticket.
|
- E2E: consumed in bot ingestion ticket.
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] Rules parser handles common RU message patterns.
|
- [ ] Rules parser handles common RU message patterns.
|
||||||
- [ ] LLM fallback adapter invoked only when rules are insufficient.
|
- [ ] LLM fallback adapter invoked only when rules are insufficient.
|
||||||
- [ ] Confidence and parser mode stored in result.
|
- [ ] Confidence and parser mode stored in result.
|
||||||
- [ ] Tests include ambiguous message fixtures.
|
- [ ] Tests include ambiguous message fixtures.
|
||||||
|
|
||||||
## Rollout Plan
|
## Rollout Plan
|
||||||
|
|
||||||
- Start with conservative threshold and monitor review rate.
|
- Start with conservative threshold and monitor review rate.
|
||||||
|
|||||||
@@ -1,22 +1,27 @@
|
|||||||
# HOUSEBOT-004: Reminders and Scheduler
|
# HOUSEBOT-004: Reminders and Scheduler
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Schedule and deliver household billing reminders to dedicated Telegram topics.
|
Schedule and deliver household billing reminders to dedicated Telegram topics.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
- Automate utility and rent reminders on configured dates.
|
- Automate utility and rent reminders on configured dates.
|
||||||
- Ensure idempotent sends and reliable retries.
|
- Ensure idempotent sends and reliable retries.
|
||||||
- Keep scheduling externalized via Cloud Scheduler.
|
- Keep scheduling externalized via Cloud Scheduler.
|
||||||
|
|
||||||
## Non-goals
|
## Non-goals
|
||||||
|
|
||||||
- Dynamic natural-language reminder editing.
|
- Dynamic natural-language reminder editing.
|
||||||
- Per-user DM reminders in v1.
|
- Per-user DM reminders in v1.
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
- In: scheduler endpoints, reminder generation, send guards.
|
- In: scheduler endpoints, reminder generation, send guards.
|
||||||
- Out: full statement rendering details.
|
- Out: full statement rendering details.
|
||||||
|
|
||||||
## Interfaces and Contracts
|
## Interfaces and Contracts
|
||||||
|
|
||||||
- HTTP endpoints triggered by Cloud Scheduler:
|
- HTTP endpoints triggered by Cloud Scheduler:
|
||||||
- `/jobs/reminder/utilities`
|
- `/jobs/reminder/utilities`
|
||||||
- `/jobs/reminder/rent-warning`
|
- `/jobs/reminder/rent-warning`
|
||||||
@@ -24,12 +29,14 @@ Schedule and deliver household billing reminders to dedicated Telegram topics.
|
|||||||
- Job payload includes cycle and household references.
|
- Job payload includes cycle and household references.
|
||||||
|
|
||||||
## Domain Rules
|
## Domain Rules
|
||||||
|
|
||||||
- Utilities reminder target: day 3 or 4 (configurable).
|
- Utilities reminder target: day 3 or 4 (configurable).
|
||||||
- Rent warning target: day 17.
|
- Rent warning target: day 17.
|
||||||
- Rent due target: day 20.
|
- Rent due target: day 20.
|
||||||
- Duplicate-send guard keyed by household + cycle + reminder type.
|
- Duplicate-send guard keyed by household + cycle + reminder type.
|
||||||
|
|
||||||
## Data Model Changes
|
## Data Model Changes
|
||||||
|
|
||||||
- `reminder_dispatch_log`:
|
- `reminder_dispatch_log`:
|
||||||
- `household_id`
|
- `household_id`
|
||||||
- `billing_cycle`
|
- `billing_cycle`
|
||||||
@@ -38,20 +45,24 @@ Schedule and deliver household billing reminders to dedicated Telegram topics.
|
|||||||
- `telegram_message_id`
|
- `telegram_message_id`
|
||||||
|
|
||||||
## Security and Privacy
|
## Security and Privacy
|
||||||
|
|
||||||
- Scheduler endpoints protected by shared secret/auth header.
|
- Scheduler endpoints protected by shared secret/auth header.
|
||||||
- No sensitive data in scheduler payloads.
|
- No sensitive data in scheduler payloads.
|
||||||
|
|
||||||
## Observability
|
## Observability
|
||||||
|
|
||||||
- Job execution logs with correlation IDs.
|
- Job execution logs with correlation IDs.
|
||||||
- Success/failure counters per reminder type.
|
- Success/failure counters per reminder type.
|
||||||
- Alert on repeated send failures.
|
- Alert on repeated send failures.
|
||||||
|
|
||||||
## Edge Cases and Failure Modes
|
## Edge Cases and Failure Modes
|
||||||
|
|
||||||
- Telegram API temporary failure.
|
- Telegram API temporary failure.
|
||||||
- Scheduler retry causes duplicate call.
|
- Scheduler retry causes duplicate call.
|
||||||
- Missing household topic mapping.
|
- Missing household topic mapping.
|
||||||
|
|
||||||
## Test Plan
|
## Test Plan
|
||||||
|
|
||||||
- Unit:
|
- Unit:
|
||||||
- date and reminder eligibility logic
|
- date and reminder eligibility logic
|
||||||
- Integration:
|
- Integration:
|
||||||
@@ -60,10 +71,12 @@ Schedule and deliver household billing reminders to dedicated Telegram topics.
|
|||||||
- simulated month schedule through all reminder events
|
- simulated month schedule through all reminder events
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] Scheduler endpoints implemented and authenticated.
|
- [ ] Scheduler endpoints implemented and authenticated.
|
||||||
- [ ] Reminder sends are idempotent.
|
- [ ] Reminder sends are idempotent.
|
||||||
- [ ] Logs and counters available for each job run.
|
- [ ] Logs and counters available for each job run.
|
||||||
- [ ] Retry behavior validated.
|
- [ ] Retry behavior validated.
|
||||||
|
|
||||||
## Rollout Plan
|
## Rollout Plan
|
||||||
|
|
||||||
- Deploy with dry-run mode first, then enable live sends.
|
- Deploy with dry-run mode first, then enable live sends.
|
||||||
|
|||||||
@@ -1,32 +1,39 @@
|
|||||||
# HOUSEBOT-005: Anonymous Feedback Flow
|
# HOUSEBOT-005: Anonymous Feedback Flow
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Allow members to submit anonymous household feedback to the bot via DM, then repost sanitized messages to a configured topic.
|
Allow members to submit anonymous household feedback to the bot via DM, then repost sanitized messages to a configured topic.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
- Protect sender identity in group output.
|
- Protect sender identity in group output.
|
||||||
- Reduce conflict by neutralizing wording.
|
- Reduce conflict by neutralizing wording.
|
||||||
- Prevent abuse with rate limits and blocklist controls.
|
- Prevent abuse with rate limits and blocklist controls.
|
||||||
|
|
||||||
## Non-goals
|
## Non-goals
|
||||||
|
|
||||||
- Anonymous reactions.
|
- Anonymous reactions.
|
||||||
- Admin identity reveal path.
|
- Admin identity reveal path.
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
- In: DM intake, sanitize/rewrite, posting, moderation guardrails.
|
- In: DM intake, sanitize/rewrite, posting, moderation guardrails.
|
||||||
- Out: full moderation panel UI.
|
- Out: full moderation panel UI.
|
||||||
|
|
||||||
## Interfaces and Contracts
|
## Interfaces and Contracts
|
||||||
|
|
||||||
- Bot command in DM: `/anon <message>` (or conversational prompt flow).
|
- Bot command in DM: `/anon <message>` (or conversational prompt flow).
|
||||||
- Use-case: `PostAnonymousMessage`.
|
- Use-case: `PostAnonymousMessage`.
|
||||||
- Result includes posted message id and moderation outcome.
|
- Result includes posted message id and moderation outcome.
|
||||||
|
|
||||||
## Domain Rules
|
## Domain Rules
|
||||||
|
|
||||||
- Sender identity is never included in reposted content.
|
- Sender identity is never included in reposted content.
|
||||||
- Per-user cooldown and daily cap enforced.
|
- Per-user cooldown and daily cap enforced.
|
||||||
- Blocklisted phrases reject or request rewrite.
|
- Blocklisted phrases reject or request rewrite.
|
||||||
|
|
||||||
## Data Model Changes
|
## Data Model Changes
|
||||||
|
|
||||||
- `anonymous_messages`:
|
- `anonymous_messages`:
|
||||||
- `household_id`
|
- `household_id`
|
||||||
- `submitted_by_member_id` (internal only)
|
- `submitted_by_member_id` (internal only)
|
||||||
@@ -37,21 +44,25 @@ Allow members to submit anonymous household feedback to the bot via DM, then rep
|
|||||||
- timestamps
|
- timestamps
|
||||||
|
|
||||||
## Security and Privacy
|
## Security and Privacy
|
||||||
|
|
||||||
- Internal sender reference is never exposed via group features.
|
- Internal sender reference is never exposed via group features.
|
||||||
- PII minimization and retention policy documented.
|
- PII minimization and retention policy documented.
|
||||||
- Abuse logging without public reveal.
|
- Abuse logging without public reveal.
|
||||||
|
|
||||||
## Observability
|
## Observability
|
||||||
|
|
||||||
- Submission volume metrics.
|
- Submission volume metrics.
|
||||||
- Rejection/acceptance rate metrics.
|
- Rejection/acceptance rate metrics.
|
||||||
- Error logs for rewrite or post failures.
|
- Error logs for rewrite or post failures.
|
||||||
|
|
||||||
## Edge Cases and Failure Modes
|
## Edge Cases and Failure Modes
|
||||||
|
|
||||||
- Message too short/too long.
|
- Message too short/too long.
|
||||||
- Spam bursts.
|
- Spam bursts.
|
||||||
- Telegram post failure after rewrite.
|
- Telegram post failure after rewrite.
|
||||||
|
|
||||||
## Test Plan
|
## Test Plan
|
||||||
|
|
||||||
- Unit:
|
- Unit:
|
||||||
- moderation and cooldown policy
|
- moderation and cooldown policy
|
||||||
- anonymization invariants
|
- anonymization invariants
|
||||||
@@ -61,10 +72,12 @@ Allow members to submit anonymous household feedback to the bot via DM, then rep
|
|||||||
- anonymous submission lifecycle in test group
|
- anonymous submission lifecycle in test group
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] DM to group repost works end-to-end.
|
- [ ] DM to group repost works end-to-end.
|
||||||
- [ ] Sender is hidden in group output.
|
- [ ] Sender is hidden in group output.
|
||||||
- [ ] Rate limit and blocklist enforced.
|
- [ ] Rate limit and blocklist enforced.
|
||||||
- [ ] Sanitization pipeline tested.
|
- [ ] Sanitization pipeline tested.
|
||||||
|
|
||||||
## Rollout Plan
|
## Rollout Plan
|
||||||
|
|
||||||
- Start with strict moderation thresholds and tune based on false positives.
|
- Start with strict moderation thresholds and tune based on false positives.
|
||||||
|
|||||||
@@ -3,9 +3,11 @@
|
|||||||
Each implementation ticket should have one spec file in `docs/specs/`.
|
Each implementation ticket should have one spec file in `docs/specs/`.
|
||||||
|
|
||||||
## Naming
|
## Naming
|
||||||
|
|
||||||
Use `HOUSEBOT-<id>-<slug>.md`.
|
Use `HOUSEBOT-<id>-<slug>.md`.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
- `HOUSEBOT-001-monorepo-bootstrap.md`
|
- `HOUSEBOT-001-monorepo-bootstrap.md`
|
||||||
|
|
||||||
## Spec Template
|
## Spec Template
|
||||||
@@ -14,53 +16,67 @@ Example:
|
|||||||
# <Title>
|
# <Title>
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Short description of the feature and user value.
|
Short description of the feature and user value.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
## Non-goals
|
## Non-goals
|
||||||
|
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
- In: ...
|
- In: ...
|
||||||
- Out: ...
|
- Out: ...
|
||||||
|
|
||||||
## Interfaces and Contracts
|
## Interfaces and Contracts
|
||||||
|
|
||||||
- Commands/events/APIs involved.
|
- Commands/events/APIs involved.
|
||||||
- Input and output schemas.
|
- Input and output schemas.
|
||||||
|
|
||||||
## Domain Rules
|
## Domain Rules
|
||||||
|
|
||||||
- Business constraints and invariants.
|
- Business constraints and invariants.
|
||||||
|
|
||||||
## Data Model Changes
|
## Data Model Changes
|
||||||
|
|
||||||
- Tables, fields, indexes, migrations.
|
- Tables, fields, indexes, migrations.
|
||||||
|
|
||||||
## Security and Privacy
|
## Security and Privacy
|
||||||
|
|
||||||
- Auth, authorization, PII handling, abuse prevention.
|
- Auth, authorization, PII handling, abuse prevention.
|
||||||
|
|
||||||
## Observability
|
## Observability
|
||||||
|
|
||||||
- Required logs, metrics, traces, and alerts.
|
- Required logs, metrics, traces, and alerts.
|
||||||
|
|
||||||
## Edge Cases and Failure Modes
|
## Edge Cases and Failure Modes
|
||||||
|
|
||||||
- Invalid input
|
- Invalid input
|
||||||
- External service failures
|
- External service failures
|
||||||
- Duplicate/retry behavior
|
- Duplicate/retry behavior
|
||||||
|
|
||||||
## Test Plan
|
## Test Plan
|
||||||
|
|
||||||
- Unit:
|
- Unit:
|
||||||
- Integration:
|
- Integration:
|
||||||
- E2E:
|
- E2E:
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] ...
|
- [ ] ...
|
||||||
- [ ] ...
|
- [ ] ...
|
||||||
|
|
||||||
## Rollout Plan
|
## Rollout Plan
|
||||||
|
|
||||||
- Feature flags / staged rollout / backout plan.
|
- Feature flags / staged rollout / backout plan.
|
||||||
```
|
```
|
||||||
|
|
||||||
## Definition of Done
|
## Definition of Done
|
||||||
|
|
||||||
- Spec exists and matches implementation.
|
- Spec exists and matches implementation.
|
||||||
- Code follows architecture boundaries.
|
- Code follows architecture boundaries.
|
||||||
- Tests for new behavior are included and passing.
|
- Tests for new behavior are included and passing.
|
||||||
@@ -69,6 +85,7 @@ Short description of the feature and user value.
|
|||||||
- No TODOs without linked follow-up ticket.
|
- No TODOs without linked follow-up ticket.
|
||||||
|
|
||||||
## Boundary Rules (Hexagonal)
|
## Boundary Rules (Hexagonal)
|
||||||
|
|
||||||
- `packages/domain` must not import framework/DB/HTTP code.
|
- `packages/domain` must not import framework/DB/HTTP code.
|
||||||
- `packages/application` depends only on domain + ports/contracts.
|
- `packages/application` depends only on domain + ports/contracts.
|
||||||
- `packages/adapters-*` implement ports and may depend on external SDKs.
|
- `packages/adapters-*` implement ports and may depend on external SDKs.
|
||||||
|
|||||||
@@ -3,16 +3,21 @@
|
|||||||
## Epic: Platform Foundation
|
## Epic: Platform Foundation
|
||||||
|
|
||||||
1. HOUSEBOT-001 - Monorepo Bootstrap and Quality Gates
|
1. HOUSEBOT-001 - Monorepo Bootstrap and Quality Gates
|
||||||
|
|
||||||
- Output: Bun workspaces, strict TS, Oxlint, CI skeleton.
|
- Output: Bun workspaces, strict TS, Oxlint, CI skeleton.
|
||||||
|
|
||||||
2. HOUSEBOT-002 - Local Dev Workflow
|
2. HOUSEBOT-002 - Local Dev Workflow
|
||||||
|
|
||||||
- Output: unified dev scripts, env templates, runbook for local startup.
|
- Output: unified dev scripts, env templates, runbook for local startup.
|
||||||
|
|
||||||
3. HOUSEBOT-003 - Package Boundary Enforcement
|
3. HOUSEBOT-003 - Package Boundary Enforcement
|
||||||
|
|
||||||
- Output: import path policy and boundary lint checks.
|
- Output: import path policy and boundary lint checks.
|
||||||
|
|
||||||
4. HOUSEBOT-004 - Testing Harness Setup
|
4. HOUSEBOT-004 - Testing Harness Setup
|
||||||
|
|
||||||
- Output: test runner configuration for unit/integration/e2e layers.
|
- Output: test runner configuration for unit/integration/e2e layers.
|
||||||
|
|
||||||
5. HOUSEBOT-005 - Release/Branching Conventions
|
5. HOUSEBOT-005 - Release/Branching Conventions
|
||||||
|
|
||||||
- Output: commit conventions, PR template, branch naming guide.
|
- Output: commit conventions, PR template, branch naming guide.
|
||||||
|
|||||||
15
oxlint.json
Normal file
15
oxlint.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
||||||
|
"plugins": ["typescript", "import", "unicorn"],
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"node": true,
|
||||||
|
"es2026": true
|
||||||
|
},
|
||||||
|
"ignorePatterns": ["**/node_modules/**", "**/dist/**", "**/.git/**", "**/coverage/**", "docs/**"],
|
||||||
|
"rules": {
|
||||||
|
"no-unused-vars": "error",
|
||||||
|
"import/no-unresolved": "off",
|
||||||
|
"unicorn/prefer-node-protocol": "error"
|
||||||
|
}
|
||||||
|
}
|
||||||
27
package.json
Normal file
27
package.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "kojori-tg-bot",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"workspaces": [
|
||||||
|
"apps/*",
|
||||||
|
"packages/*"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun run --filter '*' build",
|
||||||
|
"typecheck": "bun run --filter '*' typecheck",
|
||||||
|
"test": "bun run --filter '*' test",
|
||||||
|
"lint": "oxlint .",
|
||||||
|
"lint:fix": "oxlint --fix .",
|
||||||
|
"format": "bunx oxfmt .",
|
||||||
|
"format:check": "bunx oxfmt --check .",
|
||||||
|
"review:coderabbit": "coderabbit --prompt-only --base main || ~/.local/bin/coderabbit --prompt-only --base main",
|
||||||
|
"dev:bot": "bun run --filter @household/bot dev",
|
||||||
|
"dev:miniapp": "bun run --filter @household/miniapp dev"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/bun": "1.3.10",
|
||||||
|
"@typescript/native-preview": "7.0.0-dev.20260304.1",
|
||||||
|
"oxlint": "^1.51.0",
|
||||||
|
"typescript": "^5.9.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
11
packages/application/package.json
Normal file
11
packages/application/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@household/application",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun build src/index.ts --outdir dist --target bun",
|
||||||
|
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
||||||
|
"test": "bun test --pass-with-no-tests",
|
||||||
|
"lint": "oxlint \"src\""
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/application/src/index.ts
Normal file
1
packages/application/src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const applicationReady = true
|
||||||
7
packages/application/tsconfig.json
Normal file
7
packages/application/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"]
|
||||||
|
}
|
||||||
11
packages/contracts/package.json
Normal file
11
packages/contracts/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@household/contracts",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun build src/index.ts --outdir dist --target bun",
|
||||||
|
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
||||||
|
"test": "bun test --pass-with-no-tests",
|
||||||
|
"lint": "oxlint \"src\""
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/contracts/src/index.ts
Normal file
1
packages/contracts/src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const contractsReady = true
|
||||||
7
packages/contracts/tsconfig.json
Normal file
7
packages/contracts/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"]
|
||||||
|
}
|
||||||
11
packages/domain/package.json
Normal file
11
packages/domain/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@household/domain",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun build src/index.ts --outdir dist --target bun",
|
||||||
|
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
||||||
|
"test": "bun test --pass-with-no-tests",
|
||||||
|
"lint": "oxlint \"src\""
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/domain/src/index.ts
Normal file
1
packages/domain/src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const domainReady = true
|
||||||
7
packages/domain/tsconfig.json
Normal file
7
packages/domain/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"]
|
||||||
|
}
|
||||||
11
packages/observability/package.json
Normal file
11
packages/observability/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@household/observability",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun build src/index.ts --outdir dist --target bun",
|
||||||
|
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
||||||
|
"test": "bun test --pass-with-no-tests",
|
||||||
|
"lint": "oxlint \"src\""
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/observability/src/index.ts
Normal file
1
packages/observability/src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const observabilityReady = true
|
||||||
7
packages/observability/tsconfig.json
Normal file
7
packages/observability/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"]
|
||||||
|
}
|
||||||
11
packages/ports/package.json
Normal file
11
packages/ports/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@household/ports",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun build src/index.ts --outdir dist --target bun",
|
||||||
|
"typecheck": "tsgo --project tsconfig.json --noEmit",
|
||||||
|
"test": "bun test --pass-with-no-tests",
|
||||||
|
"lint": "oxlint \"src\""
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/ports/src/index.ts
Normal file
1
packages/ports/src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const portsReady = true
|
||||||
7
packages/ports/tsconfig.json
Normal file
7
packages/ports/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"]
|
||||||
|
}
|
||||||
20
tsconfig.base.json
Normal file
20
tsconfig.base.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "Preserve",
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"lib": ["ESNext"],
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"strict": true,
|
||||||
|
"noUncheckedIndexedAccess": true,
|
||||||
|
"exactOptionalPropertyTypes": true,
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"types": ["bun"]
|
||||||
|
}
|
||||||
|
}
|
||||||
12
tsconfig.json
Normal file
12
tsconfig.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{ "path": "./apps/bot" },
|
||||||
|
{ "path": "./apps/miniapp" },
|
||||||
|
{ "path": "./packages/domain" },
|
||||||
|
{ "path": "./packages/application" },
|
||||||
|
{ "path": "./packages/ports" },
|
||||||
|
{ "path": "./packages/contracts" },
|
||||||
|
{ "path": "./packages/observability" }
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user