awkno 0.2.4__tar.gz → 0.2.5__tar.gz

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.
Files changed (166) hide show
  1. {awkno-0.2.4 → awkno-0.2.5}/PKG-INFO +1 -1
  2. {awkno-0.2.4 → awkno-0.2.5}/awkno/__init__.py +1 -1
  3. {awkno-0.2.4 → awkno-0.2.5}/awkno/generate.py +74 -1
  4. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/aitherconnect.json +1 -1
  5. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/aitherkvcache.json +1 -1
  6. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/aitheros.json +1 -1
  7. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/aitherzero.json +1 -1
  8. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awask.json +1 -1
  9. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awavatar.json +1 -1
  10. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awbac.json +1 -1
  11. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awbeads.json +1 -1
  12. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awbonsai.json +1 -1
  13. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awbrain.json +1 -1
  14. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awbrowse.json +1 -1
  15. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awclassify.json +1 -1
  16. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdaemons.json +1 -1
  17. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdecide.json +1 -1
  18. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdeck.json +1 -1
  19. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdelphi.json +1 -1
  20. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdesk.json +1 -1
  21. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdit.json +1 -1
  22. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdk.json +1 -1
  23. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awembed.json +1 -1
  24. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awevolve.json +1 -1
  25. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awfind.json +1 -1
  26. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awflow.json +1 -1
  27. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awfocus.json +1 -1
  28. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awgit.json +1 -1
  29. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awgraph.json +1 -1
  30. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awgym.json +1 -1
  31. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awiam.json +1 -1
  32. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awiris.json +1 -1
  33. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awkno.json +1 -1
  34. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awknowledge.json +1 -1
  35. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awm.json +1 -1
  36. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awmail.json +1 -1
  37. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awmine.json +1 -1
  38. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awnboard.json +1 -1
  39. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awnest.json +1 -1
  40. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awnet.json +1 -1
  41. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awnix.json +1 -1
  42. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awnode.json +1 -1
  43. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awpack.json +1 -1
  44. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awpredict.json +1 -1
  45. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awprism.json +1 -1
  46. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awprove.json +1 -1
  47. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awreason.json +1 -1
  48. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrecover.json +1 -1
  49. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrecurse.json +1 -1
  50. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrelay.json +1 -1
  51. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrena.json +1 -1
  52. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrepl.json +1 -1
  53. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awreport.json +1 -1
  54. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awresearch.json +1 -1
  55. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awresume.json +1 -1
  56. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrise.json +1 -1
  57. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrouter.json +1 -1
  58. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrtifact.json +1 -1
  59. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awrun.json +1 -1
  60. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awsaga.json +1 -1
  61. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awscreen.json +1 -1
  62. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awseal.json +1 -1
  63. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awsettings.json +1 -1
  64. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awsh.json +1 -1
  65. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awshare.json +1 -1
  66. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awskills.json +1 -1
  67. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awstorage.json +1 -1
  68. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awswarm.json +1 -1
  69. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awtax.json +1 -1
  70. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awtoll.json +1 -1
  71. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awtunnel.json +1 -1
  72. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awvision.json +1 -1
  73. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awvoice.json +1 -1
  74. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awwall.json +1 -1
  75. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/gawbbonet.json +1 -1
  76. {awkno-0.2.4 → awkno-0.2.5}/awkno.egg-info/PKG-INFO +1 -1
  77. {awkno-0.2.4 → awkno-0.2.5}/pyproject.toml +1 -1
  78. {awkno-0.2.4 → awkno-0.2.5}/tests/test_awkno.py +28 -0
  79. {awkno-0.2.4 → awkno-0.2.5}/LICENSE +0 -0
  80. {awkno-0.2.4 → awkno-0.2.5}/README.md +0 -0
  81. {awkno-0.2.4 → awkno-0.2.5}/awkno/_doctor.py +0 -0
  82. {awkno-0.2.4 → awkno-0.2.5}/awkno/cli.py +0 -0
  83. {awkno-0.2.4 → awkno-0.2.5}/awkno/corpus.py +0 -0
  84. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/agent-senses.json +0 -0
  85. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/agent-vm.json +0 -0
  86. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/agentic-orchestrator.json +0 -0
  87. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/avatar-ensemble.json +0 -0
  88. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awasp.json +0 -0
  89. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awcache.json +0 -0
  90. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awdata.json +0 -0
  91. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awforge.json +0 -0
  92. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awkit.json +0 -0
  93. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awlab.json +0 -0
  94. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awlog.json +0 -0
  95. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awmod.json +0 -0
  96. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awpool.json +0 -0
  97. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awspaces.json +0 -0
  98. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awsprite.json +0 -0
  99. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/awsync.json +0 -0
  100. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/bead-space.json +0 -0
  101. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/browser-companion-graduation.json +0 -0
  102. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/cited-research.json +0 -0
  103. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/creator-stack.json +0 -0
  104. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/dark-matters-living-world.json +0 -0
  105. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/dgg-research.json +0 -0
  106. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/gobbonet.json +0 -0
  107. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-00.json +0 -0
  108. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-01.json +0 -0
  109. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-02.json +0 -0
  110. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-03.json +0 -0
  111. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-04.json +0 -0
  112. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-05.json +0 -0
  113. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-06.json +0 -0
  114. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-07.json +0 -0
  115. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-08.json +0 -0
  116. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide-09.json +0 -0
  117. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/guide.json +0 -0
  118. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/inference-commons.json +0 -0
  119. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-01.json +0 -0
  120. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-02.json +0 -0
  121. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-03.json +0 -0
  122. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-04.json +0 -0
  123. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-05.json +0 -0
  124. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-06.json +0 -0
  125. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-07.json +0 -0
  126. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-08.json +0 -0
  127. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-09.json +0 -0
  128. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-10.json +0 -0
  129. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-11.json +0 -0
  130. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-12.json +0 -0
  131. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-13.json +0 -0
  132. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-14.json +0 -0
  133. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-15.json +0 -0
  134. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-16.json +0 -0
  135. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-17.json +0 -0
  136. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-18.json +0 -0
  137. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-19.json +0 -0
  138. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-20.json +0 -0
  139. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-21.json +0 -0
  140. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-22.json +0 -0
  141. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-23.json +0 -0
  142. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/law-24.json +0 -0
  143. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/mediaforge.json +0 -0
  144. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/mine-what-you-ran.json +0 -0
  145. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/one-surface.json +0 -0
  146. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/open-scheduler.json +0 -0
  147. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/persona.json +0 -0
  148. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/personal-agent-home.json +0 -0
  149. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/personal-mesh-pool.json +0 -0
  150. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/provenance.json +0 -0
  151. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/retrieval-you-trained.json +0 -0
  152. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/set-and-forget.json +0 -0
  153. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/shared-worktree.json +0 -0
  154. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/the-daily-driver.json +0 -0
  155. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/the-front-door.json +0 -0
  156. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/the-reasoning-loop.json +0 -0
  157. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/the-studio.json +0 -0
  158. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/train-what-you-run.json +0 -0
  159. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/wake-learning-loop.json +0 -0
  160. {awkno-0.2.4 → awkno-0.2.5}/awkno/pages/who-what-did.json +0 -0
  161. {awkno-0.2.4 → awkno-0.2.5}/awkno.egg-info/SOURCES.txt +0 -0
  162. {awkno-0.2.4 → awkno-0.2.5}/awkno.egg-info/dependency_links.txt +0 -0
  163. {awkno-0.2.4 → awkno-0.2.5}/awkno.egg-info/entry_points.txt +0 -0
  164. {awkno-0.2.4 → awkno-0.2.5}/awkno.egg-info/requires.txt +0 -0
  165. {awkno-0.2.4 → awkno-0.2.5}/awkno.egg-info/top_level.txt +0 -0
  166. {awkno-0.2.4 → awkno-0.2.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: awkno
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: The man page for the Aither World — every brick, stack and law, in your terminal, offline.
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/Aitherium/awkno
@@ -15,7 +15,7 @@ from __future__ import annotations
15
15
 
16
16
  from awkno.corpus import AwknoPage, AwknoRegistry, NotFoundError
17
17
 
18
- __version__ = "0.2.4"
18
+ __version__ = "0.2.5"
19
19
 
20
20
  __all__ = [
21
21
  "AwknoRegistry",
@@ -240,6 +240,68 @@ class AwknoGenerator:
240
240
 
241
241
  return text
242
242
 
243
+
244
+ # ------------------------------------------------------------------ usage
245
+ def _brick_source_dir(self, brick: dict) -> Path | None:
246
+ """The brick's source tree, from the registry's `source` (monorepo-relative)."""
247
+ src = brick.get("source")
248
+ if not src:
249
+ return None
250
+ d = self.repo_root.parent / src
251
+ return d if d.is_dir() else None
252
+
253
+ def _brick_commands(self, brick: dict) -> list[str]:
254
+ """Console scripts the brick installs, read from `[project.scripts]`.
255
+
256
+ Static parse on purpose: the corpus is built on a runner that has not
257
+ installed the brick, and `--help` output would make the page depend on
258
+ the machine that rendered it.
259
+ """
260
+ d = self._brick_source_dir(brick)
261
+ if d is None or not (d / "pyproject.toml").is_file():
262
+ return []
263
+ try:
264
+ import tomllib # noqa: PLC0415
265
+ except ModuleNotFoundError: # CI floor is 3.10
266
+ try:
267
+ import tomli as tomllib # type: ignore[no-redef] # noqa: PLC0415
268
+ except ModuleNotFoundError:
269
+ return []
270
+ try:
271
+ data = tomllib.loads((d / "pyproject.toml").read_text(encoding="utf-8"))
272
+ except Exception:
273
+ return []
274
+ scripts = (data.get("project") or {}).get("scripts") or {}
275
+ return sorted(k for k in scripts if not k.startswith("_"))
276
+
277
+ def _brick_quick_start(self, brick: dict) -> str:
278
+ """The first fenced shell block a stranger can type, from the brick's README.
279
+
280
+ Chosen by position, not by heading name: the family's READMEs put the
281
+ one-line install and first run in the first fenced `bash`/`sh`/`console`
282
+ block after the title. Internal refs are scrubbed like every other field.
283
+ """
284
+ import re # noqa: PLC0415
285
+ d = self._brick_source_dir(brick)
286
+ if d is None or not (d / "README.md").is_file():
287
+ return ""
288
+ text = (d / "README.md").read_text(encoding="utf-8", errors="replace")
289
+ for m in re.finditer(r"```(?:bash|sh|shell|console)?\n(.*?)```", text, re.S):
290
+ block = m.group(1).strip()
291
+ if not block or len(block) > 600:
292
+ continue
293
+ if re.search(r"\b[A-Z]:[\\/]|AitherOS/|\.PRODUCTS|\.DEPLOYMENT", block):
294
+ continue
295
+ return self._scrub_internal_refs(block)
296
+ return ""
297
+
298
+ @staticmethod
299
+ def _brick_docs_url(brick: dict) -> str:
300
+ """The brick's Pages site. Public bricks publish at aitherium.github.io/<id>/."""
301
+ if brick.get("status") != "public":
302
+ return ""
303
+ return f"https://aitherium.github.io/{brick.get('id')}/"
304
+
243
305
  def _make_brick_page(self, brick: dict) -> dict[str, Any]:
244
306
  """Create a page for a brick.
245
307
 
@@ -263,7 +325,18 @@ class AwknoGenerator:
263
325
  if problem:
264
326
  description += f"\nProblem\n{problem}\n"
265
327
  if install:
266
- description += f"\nInstall\n{install}"
328
+ description += f"\nInstall\n{install}\n"
329
+ # The part that makes a man page a man page: what to TYPE. Derived from
330
+ # the brick's own pyproject and README so it cannot drift from the code.
331
+ commands = self._brick_commands(brick)
332
+ if commands:
333
+ description += "\nCommands\n" + "\n".join(f" {c}" for c in commands) + "\n"
334
+ quick = self._brick_quick_start(brick)
335
+ if quick:
336
+ description += "\nQuick start\n" + "\n".join(f" {ln}" for ln in quick.splitlines()) + "\n"
337
+ docs = self._brick_docs_url(brick)
338
+ if docs:
339
+ description += f"\nDocs\n{docs}\n"
267
340
 
268
341
  see_also = []
269
342
  if brick.get("pairs_with"):
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Install it and ask an agent about the tab you are on.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nYour agent cannot see the page you are looking at, so you paste it in by hand.\n\nInstall\nload unpacked — see the repo",
4
+ "description": "Kind: tool\n\nProblem\nYour agent cannot see the page you are looking at, so you paste it in by hand.\n\nInstall\nload unpacked — see the repo\n\nDocs\nhttps://aitherium.github.io/AitherConnect/",
5
5
  "see_also": [
6
6
  "awdk"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Quantize the cache on one model you already serve and measure the headroom.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nKV cache, not weights, is what runs a GPU out of room during real serving, and it grows with every token of every concurrent request.\n\nInstall\npip install aither-kvcache",
4
+ "description": "Kind: tool\n\nProblem\nKV cache, not weights, is what runs a GPU out of room during real serving, and it grows with every token of every concurrent request.\n\nInstall\npip install aither-kvcache\n\nDocs\nhttps://aitherium.github.io/aitherkvcache/",
5
5
  "see_also": [
6
6
  "awnode"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Run one file on a fresh box and open the URL it prints.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nEvery part of the stack ships on its own lane -- a shell on npm, two runtimes on PyPI, a desktop app on GitHub Releases, an extension in a browser store -- so a person who wants the STACK has to find six things, install them in the right order and make them agree on ports and models. Measured 2026-09-10: every one of those lanes was live and the thing that joins them was published nowhere.\n\nInstall\nsee the repo — one binary per OS from the `aitheros-v*` release",
4
+ "description": "Kind: runtime\n\nProblem\nEvery part of the stack ships on its own lane -- a shell on npm, two runtimes on PyPI, a desktop app on GitHub Releases, an extension in a browser store -- so a person who wants the STACK has to find six things, install them in the right order and make them agree on ports and models. Measured 2026-09-10: every one of those lanes was live and the thing that joins them was published nowhere.\n\nInstall\nsee the repo — one binary per OS from the `aitheros-v*` release\n\nCommands\n aitheros\n gen\n genesis\n\nQuick start\n cd AitherOS\n \n # Create virtual environment\n python -m venv.venv\n source.venv/bin/activate # Linux/macOS\n .venv\\Scripts\\activate # Windows\n \n # Install dependencies\n pip install -e \".[dev]\"\n \n # Set testing flag (required for tests)\n export AITHER_TESTING=1",
5
5
  "see_also": [
6
6
  "awdaemons",
7
7
  "awnode",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Run one numbered script and read what it says it did.",
3
3
  "category": "brick",
4
- "description": "Kind: corpus\n\nProblem\nOps knowledge lives in people's shell history, so the same recovery gets improvised differently every time it is needed.\n\nInstall\ngit clone https://github.com/Aitherium/AitherZero",
4
+ "description": "Kind: corpus\n\nProblem\nOps knowledge lives in people's shell history, so the same recovery gets improvised differently every time it is needed.\n\nInstall\ngit clone https://github.com/Aitherium/AitherZero\n\nQuick start\n git clone https://github.com/Aitherium/AitherZero.git\n cd AitherZero\n\nDocs\nhttps://aitherium.github.io/AitherZero/",
5
5
  "see_also": [
6
6
  "awrecover"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Ask a human a question from a script, and keep working on their answer.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nA decision buried in terminal prose is a stream event — it scrolls past, and the agent either stalls waiting for someone who is not reading, or guesses and does days of the wrong work. Every agent framework can print a question; almost none can carry the ANSWER back into the run that asked it, so the human is a bottleneck exactly when they are least able to be one.\n\nInstall\npip install awask",
4
+ "description": "Kind: tool\n\nProblem\nA decision buried in terminal prose is a stream event — it scrolls past, and the agent either stalls waiting for someone who is not reading, or guesses and does days of the wrong work. Every agent framework can print a question; almost none can carry the ANSWER back into the run that asked it, so the human is a bottleneck exactly when they are least able to be one.\n\nInstall\npip install awask\n\nCommands\n awask\n\nQuick start\n pip install awask\n\nDocs\nhttps://aitherium.github.io/awask/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awrelay",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Validate one character_spec.json and one character_pack/ against their schemas and refuse the pack if any file's hash, licence or rig audit is missing.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nA generated 3D character is five artifacts from five tools (mesh, rig, clips, VRM, style renders) with no shared contract, so every host re-derives what it may load, and the bakes end up.gitignored with no canonical home -- measured 2026-09-05 on the CoC engine, where every Anny body and every clip pack is absent from disk while the code that drives them is committed.\n\nInstall\npip install git+https://github.com/Aitherium/awavatar",
4
+ "description": "Kind: tool\n\nProblem\nA generated 3D character is five artifacts from five tools (mesh, rig, clips, VRM, style renders) with no shared contract, so every host re-derives what it may load, and the bakes end up.gitignored with no canonical home -- measured 2026-09-05 on the CoC engine, where every Anny body and every clip pack is absent from disk while the code that drives them is committed.\n\nInstall\npip install git+https://github.com/Aitherium/awavatar\n\nCommands\n awavatar\n\nQuick start\n pip install awavatar\n awavatar validate-spec character_spec.json # schema_version-routed validation\n awavatar validate-pack./character_pack/ # hashes, licences, rig audit, VRM bones\n awavatar submit character_spec.json --server http://127.0.0.1:8200 # any media-forge-shaped server\n\nDocs\nhttps://aitherium.github.io/awavatar/",
5
5
  "see_also": [
6
6
  "awrtifact",
7
7
  "awdk",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Gate one endpoint and read the explanation it gives for a denial.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nMost authz answers \"no\" without saying why, so every denial becomes a debugging session — and the ones that fail OPEN never announce themselves at all.\n\nInstall\npip install awbac",
4
+ "description": "Kind: tool\n\nProblem\nMost authz answers \"no\" without saying why, so every denial becomes a debugging session — and the ones that fail OPEN never announce themselves at all.\n\nInstall\npip install awbac\n\nCommands\n awbac\n\nQuick start\n pip install awbac\n\nDocs\nhttps://aitherium.github.io/awbac/",
5
5
  "see_also": [
6
6
  "awdit"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Drop a canvas into one page, arrange two things on it, reload, and find them where you left them.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nEvery product eventually grows a screen where things are placed rather than listed — a board, a map, a graph of what connects to what. That screen is almost always re-implemented per product, and the arrangement lives in component state, so it dies on reload and cannot be exported, reviewed, or moved to another surface. Measured on this tree 2026-08-24, the same hand-vendored tarball appears in three separate product frontends because there was no registered brick to depend on.\n\nInstall\ngit clone https://github.com/Aitherium/awbeads",
4
+ "description": "Kind: tool\n\nProblem\nEvery product eventually grows a screen where things are placed rather than listed — a board, a map, a graph of what connects to what. That screen is almost always re-implemented per product, and the arrangement lives in component state, so it dies on reload and cannot be exported, reviewed, or moved to another surface. Measured on this tree 2026-08-24, the same hand-vendored tarball appears in three separate product frontends because there was no registered brick to depend on.\n\nInstall\ngit clone https://github.com/Aitherium/awbeads\n\nQuick start\n ### React",
5
5
  "see_also": [
6
6
  "awkit",
7
7
  "awsh",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Load one page and get an answer from a model that never left the tab.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nEvery in-browser LLM demo either phones home for the real answer or downloads a few hundred MB unasked. Getting BOTH right -- genuinely local inference, and a consent gate that runs BEFORE the fetch instead of after -- is the part nobody ships, so most \"runs in your browser\" claims are marketing for a server call.\n\nInstall\ngit clone https://github.com/Aitherium/awbonsai",
4
+ "description": "Kind: runtime\n\nProblem\nEvery in-browser LLM demo either phones home for the real answer or downloads a few hundred MB unasked. Getting BOTH right -- genuinely local inference, and a consent gate that runs BEFORE the fetch instead of after -- is the part nobody ships, so most \"runs in your browser\" claims are marketing for a server call.\n\nInstall\ngit clone https://github.com/Aitherium/awbonsai\n\nQuick start\n npm install @aitherium/awbonsai",
5
5
  "see_also": [
6
6
  "awkit",
7
7
  "awsprite",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Point it at a folder of notes or sessions; ask a question your context never held.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nEvery AI memory system sells you a black box: sessions vanish into a vendor cloud, and \"it remembers\" means \"the vendor's model was prompted with a blob\". Memory should be files you can read, claims you can check against the session or file that produced them, and retrieval that never dumps your whole history into a prompt.\n\nInstall\npip install awbrain",
4
+ "description": "Kind: runtime\n\nProblem\nEvery AI memory system sells you a black box: sessions vanish into a vendor cloud, and \"it remembers\" means \"the vendor's model was prompted with a blob\". Memory should be files you can read, claims you can check against the session or file that produced them, and retrieval that never dumps your whole history into a prompt.\n\nInstall\npip install awbrain\n\nCommands\n awbrain\n\nQuick start\n pip install awbrain",
5
5
  "see_also": [
6
6
  "awknowledge",
7
7
  "awm",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Drive one page and get back what is on it in a form worth reasoning about.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nHanding an agent a screenshot makes it read a picture of text; handing it raw DOM makes it read a megabyte of markup. Neither of those is the page.\n\nInstall\npip install awbrowse",
4
+ "description": "Kind: tool\n\nProblem\nHanding an agent a screenshot makes it read a picture of text; handing it raw DOM makes it read a megabyte of markup. Neither of those is the page.\n\nInstall\npip install awbrowse\n\nCommands\n awbrowse\n\nQuick start\n pip install awbrowse\n\nDocs\nhttps://aitherium.github.io/awbrowse/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awfind",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Run it on one file and read what it is, who may see it and what it is about.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nA corpus nobody has classified cannot be published safely or retrieved well: the one internal page in a public mirror is found by a stranger, and the question that needed a design note gets a changelog. Classification must be a standalone step any pipeline can call, not a judgement buried in a model prompt.\n\nInstall\npip install git+https://github.com/Aitherium/awclassify.git",
4
+ "description": "Kind: tool\n\nProblem\nA corpus nobody has classified cannot be published safely or retrieved well: the one internal page in a public mirror is found by a stranger, and the question that needed a design note gets a changelog. Classification must be a standalone step any pipeline can call, not a judgement buried in a model prompt.\n\nInstall\npip install git+https://github.com/Aitherium/awclassify.git\n\nCommands\n awclassify\n\nQuick start\n pip install awclassify\n \n awclassify classify report.md\n # doc_type report\n # visibility internal\n # audience other\n # topics -\n # engine rules classified=False\n #\n # NOT VERIFIED: rules-only classification. Pass --server for the full\n # engine. Per the fail-closed contract, do not publish on this alone.",
5
5
  "see_also": [
6
6
  "awknowledge",
7
7
  "awkno",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Run it on a box with no Python and curl its /health.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nShipping the agent loop and the shell harness means shipping a Python environment, and freezing the whole CLI to get them drags in the entire ML stack: 694 MiB and 164+ PyInstaller hooks to obtain two subcommands.\n\nInstall\nsee the repo — built by awdk/packaging/build_executable.py --narrow",
4
+ "description": "Kind: runtime\n\nProblem\nShipping the agent loop and the shell harness means shipping a Python environment, and freezing the whole CLI to get them drags in the entire ML stack: 694 MiB and 164+ PyInstaller hooks to obtain two subcommands.\n\nInstall\nsee the repo — built by awdk/packaging/build_executable.py --narrow\n\nCommands\n adk\n adk-bug\n adk-py\n adk-serve\n adk-shell\n adk-workspace\n aither-adk\n awdk\n\nQuick start\n pip install awdk\n adk quickstart # auto-detect hardware, set up inference\n adk init my-agent && cd my-agent && python agent.py",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awnode",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Ask one typed question of one state and read back a decision, a probability, and decided=False when nothing earned it.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nSoftware makes the same bounded decision millions of times and asks a text model each time, then parses prose. Hosted \"decision models\" fix the shape but send the program state off-box, emit a probability that is never resolved against what happened, and cannot say what happens next if you act on it. A decision is a function; the loop it sits in is the product.\n\nInstall\npip install awdecide",
4
+ "description": "Kind: tool\n\nProblem\nSoftware makes the same bounded decision millions of times and asks a text model each time, then parses prose. Hosted \"decision models\" fix the shape but send the program state off-box, emit a probability that is never resolved against what happened, and cannot say what happens next if you act on it. A decision is a function; the loop it sits in is the product.\n\nInstall\npip install awdecide\n\nCommands\n awdecide\n\nQuick start\n ## The loop: a decision you resolved is never paid for twice\n \n `Ladder` answers a question. `Loop` remembers how the answer turned out. Ask, act,\n resolve -- the next identical decision is answered from that evidence with no model\n call, and an answer that was resolved wrong is never given again.\n \n Add it to the agent harness you already use:",
5
5
  "see_also": [
6
6
  "awclassify",
7
7
  "awpredict",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Turn a JSON outline into a narrated MP4, and read back which voice actually spoke it.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nA rendered video looks identical whether a neural voice plane narrated it or a 2010-era desktop speech synthesiser did, so the artifact cannot be audited by looking at it. Measured 2026-09-19: one long-job transport failure was read as \"the fleet is down\", the render silently fell back to Windows SAPI, and the only thing that caught it was the owner listening to six minutes of it. Separately, the voice service accepts a `voice` parameter and serves en-GB-SoniaNeural whatever you ask for, so even the non-degraded path was not the voice chosen.\n\nInstall\nbuilds in-tree (pip install -e .); not on PyPI yet",
4
+ "description": "Kind: tool\n\nProblem\nA rendered video looks identical whether a neural voice plane narrated it or a 2010-era desktop speech synthesiser did, so the artifact cannot be audited by looking at it. Measured 2026-09-19: one long-job transport failure was read as \"the fleet is down\", the render silently fell back to Windows SAPI, and the only thing that caught it was the owner listening to six minutes of it. Separately, the voice service accepts a `voice` parameter and serves en-GB-SoniaNeural whatever you ask for, so even the non-degraded path was not the voice chosen.\n\nInstall\nbuilds in-tree (pip install -e .); not on PyPI yet\n\nCommands\n awdeck\n\nQuick start\n export AWVOICE_TTS_URL=http://127.0.0.1:8084/voice/synthesize\n awdeck doctor # is the plane reachable?\n awdeck render slides.json --out talk.mp4 --voice onyx",
5
5
  "see_also": [
6
6
  "awvoice",
7
7
  "awsh",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Run a multi-round anonymous expert panel on a question and get a converged answer with a trace.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nA single expert opinion is one opinion; a panel that reads each other's names converges on the loudest voice, not the best argument. Delphi panels need anonymous rounds, aggregate feedback, and an honest stop rule.\n\nInstall\npip install awdelphi",
4
+ "description": "Kind: tool\n\nProblem\nA single expert opinion is one opinion; a panel that reads each other's names converges on the loudest voice, not the best argument. Delphi panels need anonymous rounds, aggregate feedback, and an honest stop rule.\n\nInstall\npip install awdelphi\n\nCommands\n awdelphi\n\nQuick start\n pip install awdelphi # the CLI + engine\n pip install \"awdelphi[mcp]\" # + the MCP server for coding agents\n \n awdelphi run \"Should the fleet pin the model pool to the DGX Spark?\" \\\n --experts demiurge,athena,hydra --context \"...\" --arena\n awdelphi status <run_id>\n awdelphi show <run_id> --json\n\nDocs\nhttps://aitherium.github.io/awdelphi/",
5
5
  "see_also": [
6
6
  "awrelay",
7
7
  "awdk"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Run it, and the next decision card an agent raises pops on your desktop instead of scrolling past in a log.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nEvery surface an agent has on a laptop lives in a browser tab that can be closed, minimized or forgotten. The desk is the one that stays: an always-on presence that can interrupt you with a decision card, embody an agent as an avatar, and hold the Living Desktop over your real desktop.\n\nInstall\nsee the repo -- Electron app (npm install && npx electron .)",
4
+ "description": "Kind: runtime\n\nProblem\nEvery surface an agent has on a laptop lives in a browser tab that can be closed, minimized or forgotten. The desk is the one that stays: an always-on presence that can interrupt you with a decision card, embody an agent as an avatar, and hold the Living Desktop over your real desktop.\n\nInstall\nsee the repo -- Electron app (npm install && npx electron .)\n\nQuick start\n npm install\n npm run demo\n\nDocs\nhttps://aitherium.github.io/awdesk/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awsh",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Write one sensitive action to it and then try to remove the record.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nAn audit log you can silently delete from is decoration. Most are. The property that matters is not \"it records\" but \"a missing record is visible\".\n\nInstall\npip install awdit",
4
+ "description": "Kind: tool\n\nProblem\nAn audit log you can silently delete from is decoration. Most are. The property that matters is not \"it records\" but \"a missing record is visible\".\n\nInstall\npip install awdit\n\nCommands\n awdit\n\nQuick start\n pip install awdit\n\nDocs\nhttps://aitherium.github.io/awdit/",
5
5
  "see_also": [
6
6
  "awbac",
7
7
  "awseal"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Point it at a backend you already pay for and run one agent loop.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nRunning one agent is easy and running fifty is a different job: budgets, retries, which model, whose machine. Most frameworks make you adopt their whole world to find out.\n\nInstall\npip install awdk",
4
+ "description": "Kind: runtime\n\nProblem\nRunning one agent is easy and running fifty is a different job: budgets, retries, which model, whose machine. Most frameworks make you adopt their whole world to find out.\n\nInstall\npip install awdk\n\nCommands\n adk\n adk-bug\n adk-py\n adk-serve\n adk-shell\n adk-workspace\n aither-adk\n awdk\n\nQuick start\n pip install awdk\n adk quickstart # auto-detect hardware, set up inference\n adk init my-agent && cd my-agent && python agent.py\n\nDocs\nhttps://aitherium.github.io/awdk/",
5
5
  "see_also": [
6
6
  "aitheros",
7
7
  "awskills",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Point it at one repo and get a 0.6B embedder that ranks your directories better than the 7B one it learned from, with the eval that proves it.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nEvery agent stack searches your code with an embedding model trained on someone else's. It is right about two thirds of the time on a corpus it never saw, and nothing in the stack measures that. Distilling a small student on your own corpus -- the big model's margins plus your labels -- beats the big model, and the eval that proves it is the part people skip.\n\nInstall\npip install awembed",
4
+ "description": "Kind: tool\n\nProblem\nEvery agent stack searches your code with an embedding model trained on someone else's. It is right about two thirds of the time on a corpus it never saw, and nothing in the stack measures that. Distilling a small student on your own corpus -- the big model's margins plus your labels -- beats the big model, and the eval that proves it is the part people skip.\n\nInstall\npip install awembed\n\nCommands\n awembed\n\nQuick start\n pip install awembed # the student side: torch + transformers\n pip install \"awembed[teacher]\" # also the teacher server (fastapi, einops,...)\n\nDocs\nhttps://aitherium.github.io/awembed/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awgraph",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Point it at a file and a command that scores that file, and watch an agent improve it -- keeping every version and the score it earned.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nAutomated improvement loops fail silently and look identical while doing it. A run that explored honestly and found nothing produces the same logs, the same records and the same stop reason as a run that changed nothing at all -- there is no exception to catch and no failing request, so the loop keeps running and a human periodically concludes the search space is just hard. And the loops that DO work are usually one-shot generators: the model is asked for a candidate, handed no history, and never allowed to test its own idea before committing it.\n\nInstall\npip install awevolve",
4
+ "description": "Kind: tool\n\nProblem\nAutomated improvement loops fail silently and look identical while doing it. A run that explored honestly and found nothing produces the same logs, the same records and the same stop reason as a run that changed nothing at all -- there is no exception to catch and no failing request, so the loop keeps running and a human periodically concludes the search space is just hard. And the loops that DO work are usually one-shot generators: the model is asked for a candidate, handed no history, and never allowed to test its own idea before committing it.\n\nInstall\npip install awevolve\n\nCommands\n awevolve\n\nQuick start\n pip install awevolve",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awrun",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Ask one question and get ranked answers back instead of a page of results.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nAn agent with no search guesses from training data; an agent handed a raw web API gets ten blue links and burns its context reading them.\n\nInstall\npip install awfind",
4
+ "description": "Kind: tool\n\nProblem\nAn agent with no search guesses from training data; an agent handed a raw web API gets ten blue links and burns its context reading them.\n\nInstall\npip install awfind\n\nCommands\n awfind\n\nQuick start\n pip install awfind\n\nDocs\nhttps://aitherium.github.io/awfind/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awbrowse",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Chain parallel and sequential agent calls with deterministic ordering, a persistent journal, and hard budget enforcement. Replay from the journal at any breakpoint.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nWorkflows need deterministic orchestration with journaled execution so every call, every branch decision, and every result can be captured and replayed from any point. Agents running a workflow need to see the same progression whether they are in the middle of a live run or resuming from an earlier checkpoint.\n\nInstall\npip install aitherium-awflow",
4
+ "description": "Kind: runtime\n\nProblem\nWorkflows need deterministic orchestration with journaled execution so every call, every branch decision, and every result can be captured and replayed from any point. Agents running a workflow need to see the same progression whether they are in the middle of a live run or resuming from an earlier checkpoint.\n\nInstall\npip install aitherium-awflow\n\nCommands\n awflow\n\nQuick start\n python -m AitherOS.lib.orchestration.awflow --self-test\n\nDocs\nhttps://aitherium.github.io/awflow/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awrun",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "List your live sessions, search their transcripts, and focus or message the one you want.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nEvery session is a tab; nothing answers \"which session is doing what, where did I say X, how do I tell that session to do Y\" without hunting.\n\nInstall\npip install awfocus",
4
+ "description": "Kind: tool\n\nProblem\nEvery session is a tab; nothing answers \"which session is doing what, where did I say X, how do I tell that session to do Y\" without hunting.\n\nInstall\npip install awfocus\n\nCommands\n awfocus\n\nQuick start\n awfocus # list what is running right now\n awfocus what did we decide about the tunnel\n # search every transcript, ranked\n awfocus open 8d191d35 # open that session in a terminal tab\n awfocus ask 8d191d35 \"ship it\"\n # deliver a message into the session\n awfocus remote # sessions seen on the relay (other machines)\n awfocus --self-test # prove the contract, offline\n\nDocs\nhttps://aitherium.github.io/awfocus/",
5
5
  "see_also": [
6
6
  "awrelay",
7
7
  "awgit",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Take a lease on a file before you edit it in a shared checkout.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nSeveral agents editing one worktree silently sweep each other's work; a diff tells you WHAT changed but not who meant it or whether they were mid-edit.\n\nInstall\npip install awgit",
4
+ "description": "Kind: tool\n\nProblem\nSeveral agents editing one worktree silently sweep each other's work; a diff tells you WHAT changed but not who meant it or whether they were mid-edit.\n\nInstall\npip install awgit\n\nCommands\n awgit\n\nQuick start\n pip install awgit\n awgit init # verify the actor, install the capture hooks\n\nDocs\nhttps://aitherium.github.io/awgit/",
5
5
  "see_also": [
6
6
  "awgraph",
7
7
  "awrelay"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Index one repo and ask it who calls one function.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\n\"Who calls this?\" answered by grep is a guess. Agents burn enormous context re-reading files to rebuild a graph the parser already knows.\n\nInstall\npip install awgraph",
4
+ "description": "Kind: tool\n\nProblem\n\"Who calls this?\" answered by grep is a guess. Agents burn enormous context re-reading files to rebuild a graph the parser already knows.\n\nInstall\npip install awgraph\n\nCommands\n awgraph\n\nQuick start\n pip install awgraph\n\nDocs\nhttps://aitherium.github.io/awgraph/",
5
5
  "see_also": [
6
6
  "awm",
7
7
  "awdk",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Play one ARC game end-to-end with the world model watching every transition, then ask it to predict the next grid and watch the surprise score fall.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nA world model is only as good as the play it watches. Solver runs stream past, checkpoints get trained on whatever happened to be recorded, and nobody can answer \"did the model actually get better at predicting the next grid?\" against transitions it has never seen.\n\nInstall\npip install awgym",
4
+ "description": "Kind: runtime\n\nProblem\nA world model is only as good as the play it watches. Solver runs stream past, checkpoints get trained on whatever happened to be recorded, and nobody can answer \"did the model actually get better at predicting the next grid?\" against transitions it has never seen.\n\nInstall\npip install awgym\n\nCommands\n awgym\n\nQuick start\n awgym --help # the CLI\n awgym serve # the gym server (FastAPI)\n\nDocs\nhttps://aitherium.github.io/awgym/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awm",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Deactivate one session and watch it stop working immediately.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nDeactivation that takes effect \"eventually\" is not deactivation, and a store that cannot be read reports zero users — which every caller reads as \"nobody is authorised\" or, worse, as an empty directory to helpfully repopulate.\n\nInstall\npip install awiam",
4
+ "description": "Kind: tool\n\nProblem\nDeactivation that takes effect \"eventually\" is not deactivation, and a store that cannot be read reports zero users — which every caller reads as \"nobody is authorised\" or, worse, as an empty directory to helpfully repopulate.\n\nInstall\npip install awiam\n\nCommands\n awiam\n\nQuick start\n pip install awiam\n\nDocs\nhttps://aitherium.github.io/awiam/",
5
5
  "see_also": [
6
6
  "awbac",
7
7
  "awdit"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Hand it three reference images and get one style card back.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nCharacter-consistent generation loses the character after a few iterations when the render is locked to prompts alone. Style cards + critique let an artist pipeline run unattended and hold identity across a full production.\n\nInstall\nbuilds in-tree (AitherOS/agents/Iris) -- not on PyPI yet",
4
+ "description": "Kind: tool\n\nProblem\nCharacter-consistent generation loses the character after a few iterations when the render is locked to prompts alone. Style cards + critique let an artist pipeline run unattended and hold identity across a full production.\n\nInstall\nnot on PyPI yet (pending publish)",
5
5
  "see_also": [
6
6
  "mediaforge",
7
7
  "awdk",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Ask it what a brick does and get the answer with your network cable out.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nThe family is only useful if you can find it. Its registry lives in one yaml in one monorepo and the laws live in a public skills pack, so a stranger with a terminal and no browser can reach neither — which makes \"what exists and what should this talk to\" a question asked of a person instead of a tool.\n\nInstall\npip install awkno",
4
+ "description": "Kind: tool\n\nProblem\nThe family is only useful if you can find it. Its registry lives in one yaml in one monorepo and the laws live in a public skills pack, so a stranger with a terminal and no browser can reach neither — which makes \"what exists and what should this talk to\" a question asked of a person instead of a tool.\n\nInstall\npip install awkno\n\nCommands\n awkno\n\nQuick start\n pip install awkno\n\nDocs\nhttps://aitherium.github.io/awkno/",
5
5
  "see_also": [
6
6
  "awskills",
7
7
  "awfind",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Read one law and apply it to the next thing you ship.",
3
3
  "category": "brick",
4
- "description": "Kind: corpus\n\nProblem\nEveryone learns the same lessons about agent-written code the same expensive way, and writes none of them down where the next person looks.\n\nInstall\nread it — https://aitherium.github.io/awknowledge/",
4
+ "description": "Kind: corpus\n\nProblem\nEveryone learns the same lessons about agent-written code the same expensive way, and writes none of them down where the next person looks.\n\nInstall\nread it — https://aitherium.github.io/awknowledge/\n\nQuick start\n something breaks\n → you fix it\n → you ask: could a check have caught this?\n → if yes, THE CHECK IS THE WORK. Write it, watch it fail, wire it somewhere\n unattended. Do not write a ticket.\n\nDocs\nhttps://aitherium.github.io/awknowledge/",
5
5
  "see_also": [
6
6
  "awskills",
7
7
  "awkno",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Give one agent a memory scoped to one project and watch it stop re-asking.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nAn agent that forgets everything between sessions re-derives the same facts forever; one that remembers everything globally leaks context across projects.\n\nInstall\npip install awm",
4
+ "description": "Kind: tool\n\nProblem\nAn agent that forgets everything between sessions re-derives the same facts forever; one that remembers everything globally leaks context across projects.\n\nInstall\npip install awm\n\nCommands\n awm\n\nQuick start\n pip install awm\n \n awm remember --scope acme:alice:orchestrator --key recipe --value \"rank 16, lr 2e-5\"\n awm recall --scope acme:alice:orchestrator\n\nDocs\nhttps://aitherium.github.io/awm/",
5
5
  "see_also": [
6
6
  "awpredict",
7
7
  "awdk",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Send one email from an agent using a mailbox you already own, in about a minute.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nAn agent that cannot send email cannot finish most real errands: it drafts the invitation, the receipt, the reply, and then hands a human a block of text to paste somewhere. The usual fix is a transactional provider, which means a domain, DNS records, a paid account and a warm-up period before the first message — an afternoon of setup to send one email from a mailbox you already own. Receiving is worse: almost nothing gives an agent an inbox, so agents are write-only and cannot close a loop that a person answers by replying.\n\nInstall\npip install awmail",
4
+ "description": "Kind: tool\n\nProblem\nAn agent that cannot send email cannot finish most real errands: it drafts the invitation, the receipt, the reply, and then hands a human a block of text to paste somewhere. The usual fix is a transactional provider, which means a domain, DNS records, a paid account and a warm-up period before the first message — an afternoon of setup to send one email from a mailbox you already own. Receiving is worse: almost nothing gives an agent an inbox, so agents are write-only and cannot close a loop that a person answers by replying.\n\nInstall\npip install awmail\n\nCommands\n awmail\n\nQuick start\n pip install awmail\n\nDocs\nhttps://aitherium.github.io/awmail/",
5
5
  "see_also": [
6
6
  "awnboard",
7
7
  "awnest",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Point it at one transcript directory and read back what those sessions learned, with the line each lesson came from.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nEvery agent session leaves a transcript, and almost every transcript is thrown away. The correction a human made at turn 40, the retry that finally worked, the six-command sequence three sessions each re-derived -- all of it sits in JSONL nobody reads, while the next session starts from zero.\n\nInstall\npip install git+https://github.com/Aitherium/awmine.git",
4
+ "description": "Kind: tool\n\nProblem\nEvery agent session leaves a transcript, and almost every transcript is thrown away. The correction a human made at turn 40, the retry that finally worked, the six-command sequence three sessions each re-derived -- all of it sits in JSONL nobody reads, while the next session starts from zero.\n\nInstall\npip install git+https://github.com/Aitherium/awmine.git\n\nCommands\n awmine\n\nQuick start\n pip install awmine",
5
5
  "see_also": [
6
6
  "awtoll",
7
7
  "awm",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Put a gate in front of one URL and let exactly one person through it with a code you sent them.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nLetting one specific person reach one specific thing is still, in 2026, either a whole identity deployment or a link anyone who sees it can use. So everybody ships the link: an unguessable URL in an email, no expiry, no audience, no record of who walked through it -- and no way to take it back without breaking it for everyone.\n\nInstall\npip install awnboard",
4
+ "description": "Kind: tool\n\nProblem\nLetting one specific person reach one specific thing is still, in 2026, either a whole identity deployment or a link anyone who sees it can use. So everybody ships the link: an unguessable URL in an email, no expiry, no audience, no record of who walked through it -- and no way to take it back without breaking it for everyone.\n\nInstall\npip install awnboard\n\nCommands\n awnboard\n\nQuick start\n pip install awnboard\n\nDocs\nhttps://aitherium.github.io/awnboard/",
5
5
  "see_also": [
6
6
  "awnest",
7
7
  "awiam",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Gate one action behind a human check and watch an automated caller fail it.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nAny surface an agent can use, a bot can flood. CAPTCHA is hostile to the humans it is meant to serve and is beaten by the machines it is meant to stop, so the check has to be something other than a puzzle -- and every check that does exist fails OPEN, because \"we could not tell\" and \"it is fine\" reach the caller as the same empty value.\n\nInstall\npip install awnest",
4
+ "description": "Kind: tool\n\nProblem\nAny surface an agent can use, a bot can flood. CAPTCHA is hostile to the humans it is meant to serve and is beaten by the machines it is meant to stop, so the check has to be something other than a puzzle -- and every check that does exist fails OPEN, because \"we could not tell\" and \"it is fine\" reach the caller as the same empty value.\n\nInstall\npip install awnest\n\nCommands\n awnest\n\nQuick start\n pip install awnest\n\nDocs\nhttps://aitherium.github.io/awnest/",
5
5
  "see_also": [
6
6
  "awiam",
7
7
  "awbac",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Host a mesh on one machine and join it from another.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nAgents are islands. Every deployment reinvents how a peer is found, addressed and trusted, so two agents on two machines cost more to introduce than either cost to build — and the answers (port forwards, a VPN per pair, public IPs, a broker somebody has to run) all become permanent maintenance.\n\nInstall\npip install awnet",
4
+ "description": "Kind: runtime\n\nProblem\nAgents are islands. Every deployment reinvents how a peer is found, addressed and trusted, so two agents on two machines cost more to introduce than either cost to build — and the answers (port forwards, a VPN per pair, public IPs, a broker somebody has to run) all become permanent maintenance.\n\nInstall\npip install awnet\n\nCommands\n awnet\n\nQuick start\n pip install awnet\n\nDocs\nhttps://aitherium.github.io/awnet/",
5
5
  "see_also": [
6
6
  "awnode",
7
7
  "awdk",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Boot one throwaway box and try to make a change you cannot reproduce.",
3
3
  "category": "brick",
4
- "description": "Kind: base\n\nProblem\nAn agent with root on a mutable host eventually produces a machine nobody can reproduce.\n\nInstall\nsee the repo — image builder",
4
+ "description": "Kind: base\n\nProblem\nAn agent with root on a mutable host eventually produces a machine nobody can reproduce.\n\nInstall\npodman build -t awnix:latest -f Containerfile .\n\nQuick start\n podman build -t awnix:latest -f Containerfile.\n\nDocs\nhttps://aitherium.github.io/awnix/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awrecover",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Run it once and point one app at it instead of a vendor URL.",
3
3
  "category": "brick",
4
- "description": "Kind: runtime\n\nProblem\nEvery app hardcodes a different provider SDK, so switching backends means editing every app.\n\nInstall\npip install awnode",
4
+ "description": "Kind: runtime\n\nProblem\nEvery app hardcodes a different provider SDK, so switching backends means editing every app.\n\nInstall\npip install awnode\n\nCommands\n awnode\n awnode-mcp\n\nQuick start\n pip install awnode\n # container image:\n docker pull ghcr.io/aitherium/awnode:latest\n \n # or full stack:\n curl -fsSL https://launch.aitherium.com | bash\n\nDocs\nhttps://aitherium.github.io/awnode/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "aitherkvcache",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Install one pack and run it. Each carries its own manifest, licence and version, so taking one costs you nothing else.",
3
3
  "category": "brick",
4
- "description": "Kind: corpus\n\nProblem\nA pack bundled into the SDK inherits the SDK's licence and the SDK's release cadence. That is backwards in both directions: a proprietary pack blocks the SDK's public publish (measured — the adk sync gate aborts on exactly this and names it), and a good pack cannot ship a fix without an SDK release. Packs and the runtime that loads them are different products with different audiences.\n\nInstall\ngit clone https://github.com/Aitherium/awpack",
4
+ "description": "Kind: corpus\n\nProblem\nA pack bundled into the SDK inherits the SDK's licence and the SDK's release cadence. That is backwards in both directions: a proprietary pack blocks the SDK's public publish (measured — the adk sync gate aborts on exactly this and names it), and a good pack cannot ship a fix without an SDK release. Packs and the runtime that loads them are different products with different audiences.\n\nInstall\ngit clone https://github.com/Aitherium/awpack\n\nCommands\n awpack\n\nQuick start\n packs/<id>/\n pack.yaml # identity, version, what it needs, what it gives\n README.md # what it does, for a stranger, in one screen\n\nDocs\nhttps://aitherium.github.io/awpack/",
5
5
  "see_also": [
6
6
  "awdk",
7
7
  "awskills",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Wrap an environment you already have and ask it what happens next.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nAn agent that cannot anticipate its environment can only react. Every framework that offers this makes you adopt its whole training stack to find out whether a learned model beats the lookup table you already have.\n\nInstall\npip install git+https://github.com/Aitherium/awpredict.git",
4
+ "description": "Kind: tool\n\nProblem\nAn agent that cannot anticipate its environment can only react. Every framework that offers this makes you adopt its whole training stack to find out whether a learned model beats the lookup table you already have.\n\nInstall\npip install git+https://github.com/Aitherium/awpredict.git\n\nCommands\n awpredict\n\nQuick start\n pip install -e \".[torch]\" # torch + numpy are optional; engines degrade loudly without them\n\nDocs\nhttps://aitherium.github.io/awpredict/",
5
5
  "see_also": [
6
6
  "awm"
7
7
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Hand it a failure and get back ranked candidate causes, each with the one observation that would rule it in or out.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nDebugging with an agent collapses onto the first plausible story, because nothing forces a second. The cost is not the wrong guess, it is the hours spent proving it — measured repeatedly here, where five hypotheses were spent on a service that was genuinely correct, and where a symptom named the wrong component so consistently that \"the symptom names the INNOCENT service\" had to be written down as a standing rule.\n\nInstall\npip install awprism",
4
+ "description": "Kind: tool\n\nProblem\nDebugging with an agent collapses onto the first plausible story, because nothing forces a second. The cost is not the wrong guess, it is the hours spent proving it — measured repeatedly here, where five hypotheses were spent on a service that was genuinely correct, and where a symptom named the wrong component so consistently that \"the symptom names the INNOCENT service\" had to be written down as a standing rule.\n\nInstall\npip install awprism\n\nCommands\n awprism\n\nQuick start\n pip install awprism\n\nDocs\nhttps://aitherium.github.io/awprism/",
5
5
  "see_also": [
6
6
  "awreason",
7
7
  "awrepl",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "adopt": "Write one journey as a real user takes it, name the truths that must hold on the page, and get back a PASS/FAIL plus a gate that pins each truth.",
3
3
  "category": "brick",
4
- "description": "Kind: tool\n\nProblem\nEvery failure that enrages a user answers 200: a lock screen shown to someone already signed in, an empty knowledge base, a chat panel that says \"backend unavailable\". A route probe, a healthcheck and a test suite all pass while the product is unusable, because none of them looks at what actually rendered. And the one-off script that finally catches it is thrown away, so the same class regresses a week later with nothing watching.\n\nInstall\nbuilds in-tree -- not on PyPI yet; `pip install awprove` 404s today",
4
+ "description": "Kind: tool\n\nProblem\nEvery failure that enrages a user answers 200: a lock screen shown to someone already signed in, an empty knowledge base, a chat panel that says \"backend unavailable\". A route probe, a healthcheck and a test suite all pass while the product is unusable, because none of them looks at what actually rendered. And the one-off script that finally catches it is thrown away, so the same class regresses a week later with nothing watching.\n\nInstall\nbuilds in-tree -- not on PyPI yet; `pip install awprove` 404s today\n\nCommands\n awprove\n\nQuick start\n # offline: the proof is well-formed AND every assertion provably can fail\n awprove check proofs/example-anon.yaml\n \n # live: drive the journey and judge the render (exit 0 pass / 1 fail / 2 could-not-judge)\n awprove run proofs/example-anon.yaml --browser-url https://127.0.0.1:8132\n \n # pin it: emit a self-testing gate that fails if the truth stops being true\n awprove pin proofs/example-anon.yaml --out.\n python your_checker.py --self-test",
5
5
  "see_also": [
6
6
  "awbrowse",
7
7
  "awvision",