I admit, I was frustrated (I'm just a human). After spending months figuring out low-level tooling issues and reporting them thoroughly, instead of writing my own code, I was greeted with 10-20 new issues after every update, along with a few old ones that you'd claimed were solved. Then I was told to report the new ones just as thoroughly, and that many clear regressions weren't regressions at all – even though they were. But proving that would have required spending even more days diving into your code.
And while I was doing all of this manually (with occasional help of free models), you were casually riding on top of the most cutting-edge AI available – one that could reproduce and solve all of it in hours at most, while I can't even afford it.
Of course, none of this is your fault – the fault is entirely mine. I'm just giving you my reasoning for why I had to step back and focus on my own code for a while. I've since improved my workarounds and patched the tooling locally to avoid dealing with constant bugs. I'll wait a few versions before I decide to update the pieces I'm currently using.
This report is a follow-up for: #10486
Environment
- VS Code 1.132
- Bit VS Code extension
bit.vscode-bit-1.2.30
- Bit CLI 2.0.26 (newest, bvm)
- Windows
Problem
Every time a new file is added inside a tracked component's rootDir (e.g. projects/commonlib/components/my-check-box/my-check-box-changed-event-args.ts, imported from the component's index.ts / my-check-box.tsx), the PROBLEMS tab shows a spurious Error diagnostic with code UntrackedDependencies:
{
"code": "UntrackedDependencies",
"severity": 8,
"message": "untracked file dependencies (use \"bit add <file>\" to track untracked files as components)\nindex.ts -> \u001b[33mprojects/commonlib/components/my-check-box/my-check-box-changed-event-args.ts\u001b[39m\nmy-check-box.tsx -> \u001b[33mprojects/commonlib/components/my-check-box/my-check-box-changed-event-args.ts\u001b[39m",
"source": "bit"
}
Two distinct problems are visible in that one diagnostic:
- False positive. The file is physically inside a tracked component's
rootDir, so it is part of that component (Bit tracks whole directories; there is no per-file registration step). The message is wrong, and reloading the VS Code window clears it.
- Raw ANSI escape codes (
\u001b[33m / \u001b[39m) leak into the message text.
Root Cause
False positive – stale snapshot in the bit-server
The extension does not spawn the CLI per call; it keeps a long-lived bit-server-forever process and calls POST /api/cli/mini-status with
{ showIssues: true, ignoreCircularDependencies: true } (bitClient.miniStatus / miniStatusOneComp). The server resolves every dependency file to a component via consumer.bitMap.getComponentIdByPath(path) (@teambit/legacy.bit-map), and that map is built only from the component.files snapshot present when the workspace was loaded (_populateAllPaths() creates one path -> component-id entry per tracked file). A file created afterwards is not in the snapshot:
auto-detect-deps.processOneDepFile → getComponentIdByDepFile → getComponentIdByPath returns undefined → _pushToUntrackDependenciesIssues emits UntrackedDependencies listing the new file with { existing: false }; on the next run the same file is re-found and both copies are flipped to existing: true.
- Reloading resets the server (re-scan / reconnect), the new file is back in the component's file list, and the issue disappears. A fresh CLI (
bit mini-status <comp> --show-issues) never reports it at all – verified live.
ANSI codes – chalk-colored dataAsString rendered verbatim
UntrackedDependencies.dataToString() (@teambit/component-issues) wraps every untracked path with existing: true in chalk.yellow(...), so dataAsString contains \u001b[33m...\u001b[39m. The extension builds the diagnostic as c.description + " (" + c.solution + ")\n" + c.dataAsString (statusProvider.showStatusIssues) and the tree tooltip from the same string – no ANSI stripping anywhere.
Proposed Fix
The extension should not display an UntrackedDependencies issue whose "untracked" file is physically inside a tracked component's rootDir (it is part of that component – Bit never exempts files inside a rootDir), and it must strip ANSI escape sequences from every dataAsString it renders (diagnostics and tooltips).
Ideally fix the server-side snapshot itself (rebuild the BitMap per-file index when files change while the server is running), but a robust client-side fix is:
- filter
UntrackedDependencies issues by component rootDir containment at the single miniStatusOneComp choke point (feeds both the PROBLEMS tab and the status tree), and
- run a generic ANSI-CSI cleaner over
dataAsString before rendering.
Local Fix / Workaround
A patch script (patch-bit-untracked-ansi.ps1) applies 4 byte-exact injections to the extension bundle out\extension.js (removable with -Unpatch, -DryRun previews):
- Injects module-level
bitStripAnsi(s) and bitFilterIssueList(issues, compPath).
miniStatusOneComp: issues:bitFilterIssueList(i.compWithIssues[0]?.issues||[],e).
showStatusIssues: message dataAsString wrapped in bitStripAnsi(...).
- Tree tooltip
dataAsString wrapped in bitStripAnsi(...).
bitFilterIssueList is fail-open: it only drops the whole issue when every untracked path is inside the active component's rootDir; missing/unknown data, other component ids, genuinely outside paths, or mixed cases are all kept, so real untracked dependencies are never hidden.
patch-bit-untracked-ansi.zip
Reproduction
- In a Bit workspace (versioning disabled), open any tracked component, e.g.
projects/commonlib/components/my-check-box.
- Add a new file inside that component's folder (e.g.
my-check-box-changed-event-args.ts) and import it from that component's files.
- Observed: the PROBLEMS tab immediately shows the Error above (with
\u001b[33m in the message); the path is always the new file.
- Reload the window: the diagnostic is gone and
bit status / bit mini-status show no such issue.
- Expected: no diagnostic for a file that is part of the component, and no ANSI escape sequences in any diagnostic/tooltip text.
Afterword:
If my efforts have saved you significant time and effort in resolving issues within your project, I'd kindly ask you to consider supporting future open-source work through inference donations:
- DIEM and VVV donations on Base will fund ongoing, daily inference on Venice, dedicated exclusively to addressing public issues in open-source projects.
- Donations in any other EVM-compatible currency will be converted to one-time inference credits at current API rates on PPQ or Venice, and used for the same purpose.
0x5efCEfb9Aa676E580434dEb7FB118845B233E04a
I admit, I was frustrated (I'm just a human). After spending months figuring out low-level tooling issues and reporting them thoroughly, instead of writing my own code, I was greeted with 10-20 new issues after every update, along with a few old ones that you'd claimed were solved. Then I was told to report the new ones just as thoroughly, and that many clear regressions weren't regressions at all – even though they were. But proving that would have required spending even more days diving into your code.
And while I was doing all of this manually (with occasional help of free models), you were casually riding on top of the most cutting-edge AI available – one that could reproduce and solve all of it in hours at most, while I can't even afford it.
Of course, none of this is your fault – the fault is entirely mine. I'm just giving you my reasoning for why I had to step back and focus on my own code for a while. I've since improved my workarounds and patched the tooling locally to avoid dealing with constant bugs. I'll wait a few versions before I decide to update the pieces I'm currently using.
This report is a follow-up for: #10486
Environment
bit.vscode-bit-1.2.30Problem
Every time a new file is added inside a tracked component's
rootDir(e.g.projects/commonlib/components/my-check-box/my-check-box-changed-event-args.ts, imported from the component'sindex.ts/my-check-box.tsx), the PROBLEMS tab shows a spurious Error diagnostic with codeUntrackedDependencies:{ "code": "UntrackedDependencies", "severity": 8, "message": "untracked file dependencies (use \"bit add <file>\" to track untracked files as components)\nindex.ts -> \u001b[33mprojects/commonlib/components/my-check-box/my-check-box-changed-event-args.ts\u001b[39m\nmy-check-box.tsx -> \u001b[33mprojects/commonlib/components/my-check-box/my-check-box-changed-event-args.ts\u001b[39m", "source": "bit" }Two distinct problems are visible in that one diagnostic:
rootDir, so it is part of that component (Bit tracks whole directories; there is no per-file registration step). The message is wrong, and reloading the VS Code window clears it.\u001b[33m/\u001b[39m) leak into the message text.Root Cause
False positive – stale snapshot in the bit-server
The extension does not spawn the CLI per call; it keeps a long-lived
bit-server-foreverprocess and callsPOST /api/cli/mini-statuswith{ showIssues: true, ignoreCircularDependencies: true }(bitClient.miniStatus / miniStatusOneComp). The server resolves every dependency file to a component viaconsumer.bitMap.getComponentIdByPath(path)(@teambit/legacy.bit-map), and that map is built only from thecomponent.filessnapshot present when the workspace was loaded (_populateAllPaths()creates onepath -> component-identry per tracked file). A file created afterwards is not in the snapshot:auto-detect-deps.processOneDepFile→getComponentIdByDepFile→getComponentIdByPathreturnsundefined→_pushToUntrackDependenciesIssuesemitsUntrackedDependencieslisting the new file with{ existing: false }; on the next run the same file is re-found and both copies are flipped toexisting: true.bit mini-status <comp> --show-issues) never reports it at all – verified live.ANSI codes – chalk-colored dataAsString rendered verbatim
UntrackedDependencies.dataToString()(@teambit/component-issues) wraps every untracked path withexisting: trueinchalk.yellow(...), sodataAsStringcontains\u001b[33m...\u001b[39m. The extension builds the diagnostic asc.description + " (" + c.solution + ")\n" + c.dataAsString(statusProvider.showStatusIssues) and the tree tooltip from the same string – no ANSI stripping anywhere.Proposed Fix
The extension should not display an
UntrackedDependenciesissue whose "untracked" file is physically inside a tracked component'srootDir(it is part of that component – Bit never exempts files inside a rootDir), and it must strip ANSI escape sequences from everydataAsStringit renders (diagnostics and tooltips).Ideally fix the server-side snapshot itself (rebuild the BitMap per-file index when files change while the server is running), but a robust client-side fix is:
UntrackedDependenciesissues by component rootDir containment at the singleminiStatusOneCompchoke point (feeds both the PROBLEMS tab and the status tree), anddataAsStringbefore rendering.Local Fix / Workaround
A patch script (
patch-bit-untracked-ansi.ps1) applies 4 byte-exact injections to the extension bundleout\extension.js(removable with-Unpatch,-DryRunpreviews):bitStripAnsi(s)andbitFilterIssueList(issues, compPath).miniStatusOneComp:issues:bitFilterIssueList(i.compWithIssues[0]?.issues||[],e).showStatusIssues: messagedataAsStringwrapped inbitStripAnsi(...).dataAsStringwrapped inbitStripAnsi(...).bitFilterIssueListis fail-open: it only drops the whole issue when every untracked path is inside the active component's rootDir; missing/unknown data, other component ids, genuinely outside paths, or mixed cases are all kept, so real untracked dependencies are never hidden.patch-bit-untracked-ansi.zip
Reproduction
projects/commonlib/components/my-check-box.my-check-box-changed-event-args.ts) and import it from that component's files.\u001b[33min the message); the path is always the new file.bit status/bit mini-statusshow no such issue.Afterword:
If my efforts have saved you significant time and effort in resolving issues within your project, I'd kindly ask you to consider supporting future open-source work through inference donations:
0x5efCEfb9Aa676E580434dEb7FB118845B233E04a