@aistastudio/myc 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -22
- package/bin/myc.js +2 -2
- package/bin/preflight.js +20 -12
- package/dist/myc.js +1002 -318
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,12 @@ machines through plain git.
|
|
|
11
11
|
Design docs live in `docs/design/` (start with `00-brief.md`); the measurements
|
|
12
12
|
quoted below are reproducible from `bench/` and `scripts/`.
|
|
13
13
|
|
|
14
|
+
**Site: <https://aistastudio.github.io/myc/>** — the same measurements as charts,
|
|
15
|
+
in English and Russian, with the command that reproduces each number printed
|
|
16
|
+
next to it. Source in `site/`; `bun run site/build.ts` re-checks every figure
|
|
17
|
+
against the measurement artefacts in this repository and refuses to build on a
|
|
18
|
+
mismatch.
|
|
19
|
+
|
|
14
20
|
## Requires Bun — this is not fine print
|
|
15
21
|
|
|
16
22
|
The runtime is bound to `bun:sqlite` (SQLite and `sqlite-vec` ship inside Bun,
|
|
@@ -25,7 +31,7 @@ Once published, installation is one command — the package is built and verifie
|
|
|
25
31
|
from a tarball today, but nothing has been pushed to the registry yet:
|
|
26
32
|
|
|
27
33
|
```bash
|
|
28
|
-
bun
|
|
34
|
+
bun install -g @aistastudio/myc # 3.17 MB, 10 files, no models pulled at install
|
|
29
35
|
bunx myc --version
|
|
30
36
|
```
|
|
31
37
|
|
|
@@ -63,15 +69,15 @@ Full command list: `./dist/myc --help`.
|
|
|
63
69
|
|
|
64
70
|
**Speed is a constraint, not an optimisation.** Every hot path has a budget
|
|
65
71
|
enforced in CI; a p95 regression over 15% fails the build. Measured on 100 000
|
|
66
|
-
nodes (`bun run scripts/bench-latency.ts`):
|
|
72
|
+
nodes, 2026-09-07, darwin-arm64-14 (`bun run scripts/bench-latency.ts`):
|
|
67
73
|
|
|
68
74
|
| operation | p99 | budget |
|
|
69
75
|
|---|---|---|
|
|
70
|
-
| `prime` (session context) | 0.
|
|
71
|
-
| read | 0.
|
|
72
|
-
| search |
|
|
73
|
-
| write | 0.
|
|
74
|
-
| cold start |
|
|
76
|
+
| `prime` (session context) | 0.755 ms | 30 ms |
|
|
77
|
+
| read | 0.012 ms | 3 ms |
|
|
78
|
+
| search | 10.354 ms | 25 ms |
|
|
79
|
+
| write | 0.460 ms | 5 ms |
|
|
80
|
+
| cold start | 23.820 ms | 60 ms |
|
|
75
81
|
|
|
76
82
|
**Ranking is measured, not asserted.** Two labelled corpora with graded
|
|
77
83
|
relevance, each containing a *control group that gets worse* when the feature
|
|
@@ -83,9 +89,10 @@ works — so a gain cannot be manufactured by shaping the corpus:
|
|
|
83
89
|
|
|
84
90
|
**Caching that cannot go stale silently.** Result, embedding and hydration
|
|
85
91
|
caches are invalidated by `MAX(oplog.seq)` read *from the database*, so a write
|
|
86
|
-
by another process invalidates them too. A cache hit is
|
|
87
|
-
miss
|
|
88
|
-
|
|
92
|
+
by another process invalidates them too. A cache hit is two orders of magnitude
|
|
93
|
+
cheaper than a miss — 252× in the run of 2026-09-07, ≈27 000× for embeddings;
|
|
94
|
+
the ratio is wall-clock and moves with the machine. The ranking does not: same
|
|
95
|
+
MRR to three decimals, zero rank differences.
|
|
89
96
|
|
|
90
97
|
**Memory has three independent axes**, and the surface says what it hid:
|
|
91
98
|
tier (project vs personal), session reach, repository reach. `prime` prints
|
|
@@ -103,9 +110,12 @@ the first machine's priority and the second's tags. Nothing is lost to
|
|
|
103
110
|
last-writer-wins over whole records.
|
|
104
111
|
|
|
105
112
|
**Migration from beads is real, not a demo.** A working project imported in
|
|
106
|
-
|
|
113
|
+
889 ms: 796 tasks, 972 dependencies, 265 notes, 41 memories — with unknown
|
|
107
114
|
issue types carried over verbatim and named, and out-of-range priorities
|
|
108
|
-
clamped and named, instead of one odd row aborting the import.
|
|
115
|
+
clamped and named, instead of one odd row aborting the import. On that same
|
|
116
|
+
graph `myc ready` offers 195 tasks and `bd ready` offers 144: beads inherits
|
|
117
|
+
blockers down the parent chain and myc does not yet, so beads is right about
|
|
118
|
+
those 51 (open bug `memory-atcm254ry6c7`).
|
|
109
119
|
|
|
110
120
|
**Guards are proved by mutation.** Every refusal and every invariant is
|
|
111
121
|
accompanied by a mutation that removes it; a guard whose removal breaks no test
|
|
@@ -114,24 +124,32 @@ is treated as absent.
|
|
|
114
124
|
## Roadmap
|
|
115
125
|
|
|
116
126
|
Numbers are closed/total subtasks per milestone (`myc show <epic-id>`), as of
|
|
117
|
-
2026-09-
|
|
127
|
+
2026-09-08. Done and not-done are shown the same way on purpose. Totals grow
|
|
128
|
+
when work uncovers work: M0 went 33 → 39 because measuring it found four real
|
|
129
|
+
defects, not because the plan changed.
|
|
118
130
|
|
|
119
131
|
| milestone | status |
|
|
120
132
|
|---|---|
|
|
121
|
-
| **M0** core and tasks |
|
|
133
|
+
| **M0** core and tasks | 35 / 39 |
|
|
122
134
|
| **M0.5** self-hosting (myc developed through myc) | **4 / 4 — closed** |
|
|
123
|
-
| **M1** memory |
|
|
124
|
-
| **M2** semantics |
|
|
125
|
-
| **M7** human interface (board, cards, threads, routing panel) |
|
|
126
|
-
| **M3** code intelligence |
|
|
127
|
-
| **M4** team: `myc serve`, ACL, network sync, Postgres, containers |
|
|
135
|
+
| **M1** memory | 21 / 23 |
|
|
136
|
+
| **M2** semantics | 17 / 20 |
|
|
137
|
+
| **M7** human interface (board, cards, threads, routing panel) | 13 / 14 |
|
|
138
|
+
| **M3** code intelligence | 5 / 9 |
|
|
139
|
+
| **M4** team: `myc serve`, ACL, network sync, Postgres, containers | 3 / 14 |
|
|
128
140
|
| **M5** swarm self-learning: routing by cost and outcome | 0 / 12 |
|
|
129
141
|
| **M6** distillation | 0 / 7 |
|
|
130
142
|
|
|
131
143
|
What that means in practice: **today myc is a single-user local tool over files
|
|
132
|
-
in git.** There is no server, no ACL
|
|
133
|
-
|
|
134
|
-
|
|
144
|
+
in git.** There is no server, no ACL and no team mode. Those are designed
|
|
145
|
+
(`docs/design/03…`, `04…`, `05…`) and tracked, not implemented.
|
|
146
|
+
|
|
147
|
+
Code↔knowledge anchors now work: `myc task "…" --anchor src/file.ts:10-20`
|
|
148
|
+
binds a task to a span, and the anchor follows the code as it moves. The
|
|
149
|
+
binding is language-agnostic — it was verified on Python as well as
|
|
150
|
+
TypeScript. What is *not* there yet is symbol-level understanding: parsing
|
|
151
|
+
functions and classes covers `ts/tsx/js/jsx` only, and the symbol index is
|
|
152
|
+
built but not yet wired to any command (tracked, not hidden).
|
|
135
153
|
|
|
136
154
|
## Syncing between machines
|
|
137
155
|
|
|
@@ -154,3 +172,4 @@ sqlite-vec) is permissive too.
|
|
|
154
172
|
---
|
|
155
173
|
|
|
156
174
|
Russian version of this document: [`docs/README.ru.md`](docs/README.ru.md).
|
|
175
|
+
Both languages, with charts: <https://aistastudio.github.io/myc/>.
|
package/bin/myc.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
/**
|
|
3
|
-
* Точка входа npm-пакета @myc
|
|
3
|
+
* Точка входа npm-пакета @aistastudio/myc.
|
|
4
4
|
*
|
|
5
5
|
* Файл СОЗНАТЕЛЬНО написан на голом JS без единого `bun:`-импорта и без TS:
|
|
6
6
|
* его обязан уметь разобрать и выполнить Node. Иначе отказ выглядел бы как
|
|
@@ -76,7 +76,7 @@ function refusal() {
|
|
|
76
76
|
" Bun у вас установлен — запускайте через него:",
|
|
77
77
|
" bun x myc <команда>",
|
|
78
78
|
" либо переустановите пакет средствами bun:",
|
|
79
|
-
" bun add -g @myc
|
|
79
|
+
" bun add -g @aistastudio/myc",
|
|
80
80
|
"",
|
|
81
81
|
);
|
|
82
82
|
} else {
|
package/bin/preflight.js
CHANGED
|
@@ -17,18 +17,26 @@ import { spawnSync } from "node:child_process";
|
|
|
17
17
|
|
|
18
18
|
if (typeof process.versions.bun !== "string" && !bunOnPath()) {
|
|
19
19
|
process.stderr.write(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
// Рамка собирается по ширине самой длинной строки, а не подгоняется
|
|
21
|
+
// руками: после переименования пакета `@myc/cli` -> `@aistastudio/myc`
|
|
22
|
+
// верхняя граница разъехалась, и это первое, что видит человек без Bun.
|
|
23
|
+
(() => {
|
|
24
|
+
const title = "@aistastudio/myc установлен, но запускаться пока не будет";
|
|
25
|
+
const body = [
|
|
26
|
+
"myc работает только на Bun (хранилище на bun:sqlite).",
|
|
27
|
+
"Bun в системе не найден.",
|
|
28
|
+
"",
|
|
29
|
+
" curl -fsSL https://bun.sh/install | bash",
|
|
30
|
+
"",
|
|
31
|
+
"После этого: myc --version",
|
|
32
|
+
];
|
|
33
|
+
const w = Math.max(title.length + 3, ...body.map((l) => l.length)) + 1;
|
|
34
|
+
const top = ` ┌─ ${title} ${"─".repeat(Math.max(0, w - title.length - 2))}┐`;
|
|
35
|
+
const mid = body.map((l) => ` │ ${l.padEnd(w)}│`);
|
|
36
|
+
const bot = ` └${"─".repeat(w + 1)}┘`;
|
|
37
|
+
return ["", top, ...mid, bot, ""].join("\n");
|
|
38
|
+
})(),
|
|
39
|
+
|
|
32
40
|
);
|
|
33
41
|
}
|
|
34
42
|
|