From d74f77fd33362c4216851439d35a1a42ca718fd9 Mon Sep 17 00:00:00 2001 From: Fusion Date: Thu, 14 May 2026 01:14:36 +0200 Subject: [PATCH] =?UTF-8?q?feat(FN-002):=20complete=20Step=201=20=E2=80=94?= =?UTF-8?q?=20Root=20Monorepo=20Tooling=20and=20Repository=20Hygiene?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 15 ++++ .fusion/config.json | 132 +++++++++++++++++++++++++++++++++++ .fusion/fusion.db | Bin 0 -> 983040 bytes .fusion/memory/2026-05-13.md | 3 + .fusion/memory/DREAMS.md | 3 + .fusion/memory/MEMORY.md | 19 +++++ .gitignore | 50 +++++++++++++ Makefile | 29 ++++++++ package.json | 20 ++++++ pnpm-workspace.yaml | 3 + 10 files changed, 274 insertions(+) create mode 100644 .editorconfig create mode 100644 .fusion/config.json create mode 100644 .fusion/fusion.db create mode 100644 .fusion/memory/2026-05-13.md create mode 100644 .fusion/memory/DREAMS.md create mode 100644 .fusion/memory/MEMORY.md create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 package.json create mode 100644 pnpm-workspace.yaml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7875149 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.py] +indent_size = 4 + +[Makefile] +indent_style = tab diff --git a/.fusion/config.json b/.fusion/config.json new file mode 100644 index 0000000..bc1393a --- /dev/null +++ b/.fusion/config.json @@ -0,0 +1,132 @@ +{ + "settings": { + "globalPause": false, + "enginePaused": false, + "maxConcurrent": 2, + "maxTriageConcurrent": 2, + "globalMaxConcurrent": 4, + "maxWorktrees": 4, + "pollIntervalMs": 15000, + "heartbeatMultiplier": 1, + "groupOverlappingFiles": true, + "overlapIgnorePaths": [], + "autoMerge": true, + "mergeStrategy": "direct", + "directMergeCommitStrategy": "auto", + "requirePrApproval": false, + "pushAfterMerge": false, + "pushRemote": "origin", + "unavailableNodePolicy": "block", + "recycleWorktrees": false, + "executorAllowSiblingBranchRename": false, + "worktreeNaming": "random", + "taskPrefix": "FN", + "includeTaskIdInCommit": true, + "commitAuthorEnabled": true, + "commitAuthorName": "Fusion", + "commitAuthorEmail": "noreply@runfusion.ai", + "modelPresets": [], + "autoSelectModelPreset": false, + "completionDocumentationMode": "off", + "defaultPresetBySize": {}, + "autoResolveConflicts": true, + "smartConflictResolution": true, + "mergerAutostashMaxAgeHours": 24, + "worktreeRebaseBeforeMerge": true, + "worktreeRebaseRemote": "", + "worktreeRebaseLocalBase": true, + "mergeConflictStrategy": "smart-prefer-main", + "mergeStrategyOverlapBehavior": "flip-to-prefer-branch", + "workflowStepTimeoutMs": 360000, + "workflowRevisionForkOnScopeMismatch": true, + "strictScopeEnforcement": false, + "buildRetryCount": 0, + "verificationFixRetries": 3, + "buildTimeoutMs": 300000, + "requirePlanApproval": false, + "agentProvisioning": {}, + "specStalenessEnabled": false, + "specStalenessMaxAgeMs": 21600000, + "taskStuckTimeoutMs": 600000, + "staleHighFanoutBlockerAgeThresholdMs": 7200000, + "aiSessionTtlMs": 604800000, + "aiSessionCleanupIntervalMs": 3600000, + "autoUnpauseEnabled": true, + "autoUnpauseBaseDelayMs": 300000, + "autoUnpauseMaxDelayMs": 3600000, + "maxStuckKills": 6, + "preserveProgressOnStuckRequeue": true, + "maxPostReviewFixes": 1, + "maxSpawnedAgentsPerParent": 5, + "maxSpawnedAgentsGlobal": 20, + "maintenanceIntervalMs": 300000, + "autoArchiveDoneTasksEnabled": true, + "autoArchiveDoneAfterMs": 172800000, + "archiveAgentLogMode": "compact", + "autoUpdatePrStatus": false, + "githubCommentOnDone": false, + "githubTrackingEnabledByDefault": false, + "githubAuthMode": "gh-cli", + "autoBackupEnabled": false, + "autoBackupSchedule": "0 2 * * *", + "autoBackupRetention": 7, + "autoBackupDir": ".fusion/backups", + "memoryBackupEnabled": false, + "memoryBackupSchedule": "0 3 * * *", + "memoryBackupRetention": 14, + "memoryBackupDir": ".fusion/backups/memory", + "memoryBackupScope": "all", + "autoSummarizeTitles": false, + "useAiMergeCommitSummary": true, + "insightExtractionEnabled": false, + "insightExtractionSchedule": "0 2 * * *", + "insightExtractionMinIntervalMs": 86400000, + "taskEvaluationEnabled": false, + "taskEvaluationSchedule": "0 5 * * *", + "taskEvaluationFollowUpPolicy": "off", + "memoryEnabled": true, + "memoryBackendType": "qmd", + "memoryAutoSummarizeEnabled": false, + "memoryAutoSummarizeThresholdChars": 50000, + "memoryAutoSummarizeSchedule": "0 3 * * *", + "memoryDreamsEnabled": false, + "memoryDreamsSchedule": "0 4 * * *", + "runStepsInNewSessions": false, + "maxParallelSteps": 2, + "missionStaleThresholdMs": 600000, + "missionMaxTaskRetries": 3, + "missionHealthCheckIntervalMs": 300000, + "reflectionEnabled": false, + "reflectionIntervalMs": 3600000, + "reflectionAfterTask": true, + "reviewHandoffPolicy": "disabled", + "showQuickChatFAB": false, + "researchSettings": { + "enabled": true, + "enabledSources": { + "webSearch": true, + "pageFetch": true, + "github": false, + "localDocs": true, + "llmSynthesis": true + }, + "limits": { + "maxConcurrentRuns": 3, + "maxSourcesPerRun": 20, + "maxDurationMs": 300000, + "requestTimeoutMs": 30000 + } + }, + "evalSettings": { + "enabled": false, + "intervalMs": 86400000, + "followUpPolicy": "suggest-only", + "retentionDays": 30 + }, + "researchEnabled": true, + "researchMaxConcurrentRuns": 3, + "researchDefaultTimeout": 300000, + "researchMaxSourcesPerRun": 20, + "researchMaxSynthesisRounds": 2 + } +} \ No newline at end of file diff --git a/.fusion/fusion.db b/.fusion/fusion.db new file mode 100644 index 0000000000000000000000000000000000000000..8f15bff3167bcc6209a295b10b76a44f85800676 GIT binary patch literal 983040 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

}2AZ>T=`1^tdUD?ND=J=uHY<-v zEjrs9p8BK=#m1#jc<$oG$MP##nP-5phSE}DEnmp279$qH9`vMs1{KJ)Su~0Jt!BczsQz&lp#>NFO8WsQpmCbOsbR=P5u=;xQEK!}a2lz!97VUk(#8f0H)&{h z+uD;PXJJFw_IJDA;eaYG25rO$y+{84|D>(X`_X;m-7nMHOi)(*ed4r!xb8D)747Yh z{{XFC^6rPXklCV*P1@ct9s8rdu(|H6*SQ-+{=I{FzxLn-lZAGtp_FMj@CWHYtD`$3Mg!0 zJkcJ|^&2(PD`FS4u5>uEf)?sn4p_hTRF_X<(K-ojel=+m(p6CRth{JGQJQ3fjo)@% zDz4@71AXhxRlV(u2QaFHHFOrmL={@h{Z~MzE49l59A?W@_=#=}^C#!5rI%yek2L@43~{_nnjx57)1lJ98N zv0QJG@8l#FEB+KCK~X!J;;4e29mcu#_Bhz5WA#Bh8?-~~s*8rq{-mXMw7T%HSTDGh z;`MH)ovc7e!Ys4)STkY0@bxPqXY?LedN7vP9M?4%^C9CPMd>Gis)b;#Hl^6$gp#FsGSJqbf{=eY7wo{xLbQ- zk%>X{0z-r|<^)bTex7g&85G5Xv1aILoNNHWI&Y%Dij^T84R)+x7hDYXAlNu=$ zsmbfxLOHf|(rUCc#l1%T>UG;ZMGVlcEq9%z7)P`i&Tiaof-H11#~3x8X5~qtI{n34 zw`y;7ZLC6EkPy+#&Mdbi<->_M&Wuu^Q-XjVNR@E1}3& zvHMG*tG8(MawZ&PBzCjL3GE{91m~85LQ5Me>6S_zOp~V&pi?=yrJRx=6;f-o%TDvM z*)@)wfIAw89fkg)mo(j{-%HK|Po*fw(k9sj2Rvny#N49j0v5-Nyj$9+)LxX!JKMXp zYKi{7B{9%hP)eI?)Bt&#{_+&61c{#rQxZ!g{P!l2Fi}jew?-hG1X`MW3)mZ^+uW$oaeYI(^c1O@ z3u=FgQq$ckJCN60MY1N-Ru=6H~v7y3i)}%X0B_t{K zm0UO4V-aa1v-!y7!0z!!E`OwbNXz47neIB}kiKkrYeCN1HgE5XJu}xyq*{=6`AD0l zS_-P5?r>s*c_ofF4V*crt*7;l(}o~J0dQOAkZe)yiec!+cz%loiUuRLR0Z!I`Q!O1@4{Xr}VTHVA`-EEGdb z>T=RaCFd6Mset7!CN6K*x+=07H*Jafu7pgol4)v398K2SRwmP%LsAr)OOGfbg~B&! z#j|S)OPnnMFX5H`X0k$i%_><1-YelZ(L5cf@m(C4y0@UK!g8UwR4k;IbFGzo4!R=e zSa4ch3a%@>BQbZq!j^;MnK3(&c5-^%v$fc@^9SLP|0JT~WalqfB8fQ+@D5m3YjTt| z)-NN%5L4L{TI0A076-=?_G&d3$b62YBgFZGo&b>HHFs|vKKGIKnFM*Y7#zbJ6m-tR zW-wZjjY1~~S-!0)!*Ed|=K!C%5NO=lDihKI4pdH()RBhsl5KC#)P zzl4nBh4yDii;O>x_y7kNtvuy|3tVF&8tJ$jZK&VVal{8$ZQ9Tb^>TDXyr4O~8) zNZ!%cf%gi>qZdQ*Uia+PuZZ(gg`nr?E`gEb>PELKhwPV=>*g(Wv1dk`aF-P%4OMF1k7x+zK*{tFW?T9nmc0Pzo(xNkI zHCkPw{8+RXXq{4P)2I9wI$x%vKa2VK%Oa+X|6V#u)C(VXP8rj2!+d6m1L65R*+Av; z6sWSav_zd69XdW(#}O$bI}lm;$<#^ft=I0T z3f0OP=9dFD3U5HLf_E(xp99bPB(&R6pjQ?j<_j1j8Ce(|+?~9l8fC?JR)K5EC`Z%> zv~bHS8dt>PofAYt)0(>$k|t#oSRSV37Fs_bYl!0Y+52~v{CFjTy?BMr)seIAo`|Lg z!+O-4W?i$d_ZJd|IzEt0(ERAjmwQ`Il>e}0QbCqhL5FWTUH<6x^z|Ey*Gr3g*C-O7 z4talQ>&Az6x5UHsQfihPT@4xo=mf&Gj-o$G=LSep-^I>Ce;7pT|CP$Nqm$y!C;{-uf;{daR%J zG5g7-q9mmx>6?2G>3jMkNs05$PRv>E_t#n(e90lXm)rG;p5Z>6c=$lqX-lOAjRh4(Ey*wy1 zhF7C$JCFX|Q0Omby|LMQ$&&%S%ZOd^er%q9Ux!x54c z8`Y5;t<>rGByT?wSZ7A;5IWykak?5rb*}T+-F=o$bf4131bbqlcL}CAt4}_;hk3{u zO3Kw_ho2TgINII2*2EDHvS1E1zH);$Yn)L1ADZmchozkIWFwWcMjN# z_7Wn*h$%0Vb_j2&a=UXPV#Az>4N-%xAr>OMu(1Vqx6#{rp{j*q#%O0aB4SL)u0Lu_ zeB}!rb7X4QqCGE?d)oS-0ijaBh$n&lU^2IRygqh5r1qs7h6p~T4QQEdTXVsQJ|i!a z2BEo7r#o*vtIIGK+N#BU<|Gx>BN5<8L#<9_AE-?VauZ$P_O_70UI1FTsdpRX(~)4; zx^&uD!~qML^D0hVC9VTn&}g5@Q3|wY+a;@taw2T3Xht1JxZ!S?1-F$+s93GAFnXI| z)IX=RRZJHg@Rq*0;2%{Ylunp*jFYy8$nGbR_9Buq9N)~_jMw7?OlOXQpefFW z79Qy+hE7h67`XI3Tgj#{lc|AXNzOSTUJPUzQ1T)tF)-Nm*%i0G^tQ{rop`rGy@eWY zXI{inh%NYjG=;plLVR|C}sr*Mlqu zp66*%n_`wSOZjZzxs$#~{_Dz_o>O=~MY*nI3UrWduv{k};Uu}fChciBck-}tPvIY3 zlU#z{Ub&mdH{qT|UPfj0fG(CeOA&)}dLZo9r+;bev-pN%V)@dip-k>MKzdZB(Scc` zzE}^04E4jV2ESp?c=)wqed(hw$<(2dNP-|%NnD?Drnw`d9h&ASBoW-?VF0;HET$f{c zC0!J}lxSQvMNY*~PSGK3kvDgZttcPiSq?6V`YJj+W-XvBS*N-&pfs;iFMF|HchqK+ zg2Je3&goD(^c!Vo(`4=sS7QY)g4ud&%}#vMSr6!v!FH_Gj~y-T3`jE3DPpT_Hp#L0 z@529|`Voo#!Jj|X1b%Qg_R9PA>Tj8kKPAmhojZ;2EqnE6-%@(=FW&m$%43g_Q|b3B z#m~`hKibm8gxw>8(&V?ls95HPSBlH70|RJ| z&)@Jo#|Gazqjz{Wcfsd{oy(MmRLAQf|AbBN|E3Spx2mj3iK!8r369grOM{N>BeqQ+&OQAe3ke6bmM zgkrXE(^Yj^XZGYxW?2;OEwQQgFFt$r^oXuf#DO*A>YNPL33l*i)$9A~g6~zQQ;xwivlpWt_B`q}cjQt|xy4|p^Mf&$XTBn-0W^IfX7>dTbVe5NR>8$(+OTv|S=YWa9^BtQ^ zVr5h;qA%POr&ioaC@ht%h7G)qxAH;dIA>jG1kyt~El;7_JrcAc>|7(F(M~s+JiHq1-=XLm zcv??hscfz7Eyax$LR$A($rMB9GDy*Nsm2^O(51T~dHlPLq-|&~E`6jLBvXb?Ah4qt zj1uzY?7QKd$6b@|aS-dwu6;8~$x`mLzC|&{p@Uk!-0!{Kv_eMF`Lq(|p9+0B-(S5& z?yFI;(cQK#_YV>0b~%u2Y2FnGGF15J!T%^(QY< za_t`OZ+8q>$FTL&yU&OzpRG-~j*FPeyBD|@ii?G8E}K5;9&zl2SnCmYy@ywQ+)x7! z-=O~m-+KH1uFLok{r^|#-#?^(|A7Aeefk%FKmY_l00ck)1V8`;KmY_l00ck)1m2wl zE?k(FzRj)r^whNU$OZo8J@3xOpw=J&0w4eaAOHd&00JNY0w4eaAOHeqBf# diff --git a/.fusion/memory/DREAMS.md b/.fusion/memory/DREAMS.md new file mode 100644 index 0000000..1e1f4f5 --- /dev/null +++ b/.fusion/memory/DREAMS.md @@ -0,0 +1,3 @@ +# Memory Dreams + + diff --git a/.fusion/memory/MEMORY.md b/.fusion/memory/MEMORY.md new file mode 100644 index 0000000..3407ce8 --- /dev/null +++ b/.fusion/memory/MEMORY.md @@ -0,0 +1,19 @@ +# Project Memory + + + +## Architecture + + + +## Conventions + + + +## Pitfalls + + + +## Context + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6aea1c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# Dependencies +node_modules/ +.pnpm-store/ + +# Build outputs +dist/ +build/ +*.tsbuildinfo + +# Environment +.env +.env.local +.env.*.local + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log +logs/ + +# Testing +coverage/ + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.venv/ +venv/ +ENV/ +env/ +.egg-info/ +dist/ + +# Docker volumes +docker-volumes/ + +# Misc +.cache/ +.temp/ +tmp/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..145d157 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +.PHONY: install lint test typecheck build dev compose-up compose-down clean + +install: + pnpm install + cd apps/api && python3 -m venv .venv && .venv/bin/pip install -e ".[dev]" + +lint: + pnpm lint + +test: + pnpm test + +typecheck: + pnpm typecheck + +build: + pnpm build + +dev: + pnpm dev + +compose-up: + docker compose up --build -d + +compose-down: + docker compose down + +clean: + rm -rf node_modules apps/web/node_modules apps/api/.venv diff --git a/package.json b/package.json new file mode 100644 index 0000000..1393fea --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "headquarter", + "version": "0.0.1", + "private": true, + "description": "Hosted workspace and tool-orchestration platform", + "scripts": { + "lint": "pnpm --filter @headquarter/web lint && pnpm --filter @headquarter/api lint", + "test": "pnpm --filter @headquarter/web test && pnpm --filter @headquarter/api test", + "typecheck": "pnpm --filter @headquarter/web typecheck && pnpm --filter @headquarter/api typecheck", + "build": "pnpm --filter @headquarter/web build && pnpm --filter @headquarter/api build", + "dev": "pnpm --parallel --filter @headquarter/web --filter @headquarter/api dev", + "compose:up": "docker compose up --build -d", + "compose:down": "docker compose down" + }, + "packageManager": "pnpm@11.1.1", + "engines": { + "node": ">=20", + "pnpm": ">=9" + } +} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..e9b0dad --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - 'apps/*' + - 'packages/*'