awkno 0.2.7__tar.gz → 0.2.8__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 (191) hide show
  1. {awkno-0.2.7 → awkno-0.2.8}/PKG-INFO +1 -1
  2. {awkno-0.2.7 → awkno-0.2.8}/awkno/__init__.py +1 -1
  3. {awkno-0.2.7 → awkno-0.2.8}/awkno/generate.py +13 -2
  4. awkno-0.2.8/awkno/pages/aitherbrowser.json +12 -0
  5. awkno-0.2.8/awkno/pages/awcap.json +16 -0
  6. awkno-0.2.8/awkno/pages/awconnect.json +12 -0
  7. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdesk.json +4 -2
  8. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdk.json +1 -1
  9. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awprism.json +1 -1
  10. awkno-0.2.8/awkno/pages/aws.json +20 -0
  11. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awstorage.json +3 -1
  12. awkno-0.2.8/awkno/pages/salescompel.json +12 -0
  13. awkno-0.2.8/awkno/pages/zeroauthy.json +12 -0
  14. {awkno-0.2.7 → awkno-0.2.8}/awkno.egg-info/PKG-INFO +1 -1
  15. {awkno-0.2.7 → awkno-0.2.8}/awkno.egg-info/SOURCES.txt +6 -0
  16. {awkno-0.2.7 → awkno-0.2.8}/pyproject.toml +1 -1
  17. {awkno-0.2.7 → awkno-0.2.8}/tests/test_awkno.py +37 -0
  18. {awkno-0.2.7 → awkno-0.2.8}/LICENSE +0 -0
  19. {awkno-0.2.7 → awkno-0.2.8}/README.md +0 -0
  20. {awkno-0.2.7 → awkno-0.2.8}/awkno/_doctor.py +0 -0
  21. {awkno-0.2.7 → awkno-0.2.8}/awkno/cli.py +0 -0
  22. {awkno-0.2.7 → awkno-0.2.8}/awkno/corpus.py +0 -0
  23. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/agent-senses.json +0 -0
  24. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/agent-vm.json +0 -0
  25. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/agentic-orchestrator.json +0 -0
  26. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/aitherconnect.json +0 -0
  27. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/aitherkvcache.json +0 -0
  28. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/aitheros.json +0 -0
  29. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/aitherzero.json +0 -0
  30. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/avatar-ensemble.json +0 -0
  31. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awask.json +0 -0
  32. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awasp.json +0 -0
  33. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awavatar.json +0 -0
  34. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awbac.json +0 -0
  35. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awbeads.json +0 -0
  36. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awbonsai.json +0 -0
  37. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awbrain.json +0 -0
  38. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awbrowse.json +0 -0
  39. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awcache.json +0 -0
  40. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awcams.json +0 -0
  41. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awclassify.json +0 -0
  42. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdaemons.json +0 -0
  43. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdata.json +0 -0
  44. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdecide.json +0 -0
  45. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdeck.json +0 -0
  46. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdelphi.json +0 -0
  47. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdiscord.json +0 -0
  48. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awdit.json +0 -0
  49. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awembed.json +0 -0
  50. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awevolve.json +0 -0
  51. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awfind.json +0 -0
  52. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awflow.json +0 -0
  53. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awfocus.json +0 -0
  54. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awforge.json +0 -0
  55. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awgit.json +0 -0
  56. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awgraph.json +0 -0
  57. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awgym.json +0 -0
  58. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awiam.json +0 -0
  59. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awiris.json +0 -0
  60. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awkit.json +0 -0
  61. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awkno.json +0 -0
  62. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awknowledge.json +0 -0
  63. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awlab.json +0 -0
  64. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awlog.json +0 -0
  65. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awm.json +0 -0
  66. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awmail.json +0 -0
  67. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awmine.json +0 -0
  68. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awmod.json +0 -0
  69. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awnboard.json +0 -0
  70. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awnest.json +0 -0
  71. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awnet.json +0 -0
  72. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awnix.json +0 -0
  73. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awnode.json +0 -0
  74. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awpack.json +0 -0
  75. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awpermit.json +0 -0
  76. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awplay.json +0 -0
  77. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awpool.json +0 -0
  78. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awpredict.json +0 -0
  79. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awprove.json +0 -0
  80. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awreason.json +0 -0
  81. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrecover.json +0 -0
  82. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrecurse.json +0 -0
  83. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrelay.json +0 -0
  84. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrena.json +0 -0
  85. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrepl.json +0 -0
  86. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awreport.json +0 -0
  87. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awresearch.json +0 -0
  88. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awresume.json +0 -0
  89. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrise.json +0 -0
  90. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrouter.json +0 -0
  91. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrtifact.json +0 -0
  92. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awrun.json +0 -0
  93. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awsaga.json +0 -0
  94. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awscope.json +0 -0
  95. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awscreen.json +0 -0
  96. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awseal.json +0 -0
  97. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awsettings.json +0 -0
  98. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awsh.json +0 -0
  99. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awshare.json +0 -0
  100. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awskills.json +0 -0
  101. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awspaces.json +0 -0
  102. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awsprite.json +0 -0
  103. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awsuite.json +0 -0
  104. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awswarm.json +0 -0
  105. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awsync.json +0 -0
  106. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awtax.json +0 -0
  107. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awtoll.json +0 -0
  108. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awtunnel.json +0 -0
  109. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awvision.json +0 -0
  110. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awvoice.json +0 -0
  111. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/awwall.json +0 -0
  112. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/bead-space.json +0 -0
  113. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/browser-companion-graduation.json +0 -0
  114. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/cited-research.json +0 -0
  115. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/creator-stack.json +0 -0
  116. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/dark-matters-living-world.json +0 -0
  117. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/dgg-research.json +0 -0
  118. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/free-cloud.json +0 -0
  119. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/gawbbonet.json +0 -0
  120. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/gobbonet.json +0 -0
  121. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-00.json +0 -0
  122. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-01.json +0 -0
  123. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-02.json +0 -0
  124. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-03.json +0 -0
  125. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-04.json +0 -0
  126. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-05.json +0 -0
  127. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-06.json +0 -0
  128. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-07.json +0 -0
  129. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-08.json +0 -0
  130. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-09.json +0 -0
  131. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-10.json +0 -0
  132. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide-11.json +0 -0
  133. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/guide.json +0 -0
  134. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/inference-commons.json +0 -0
  135. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-01.json +0 -0
  136. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-02.json +0 -0
  137. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-03.json +0 -0
  138. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-04.json +0 -0
  139. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-05.json +0 -0
  140. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-06.json +0 -0
  141. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-07.json +0 -0
  142. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-08.json +0 -0
  143. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-09.json +0 -0
  144. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-10.json +0 -0
  145. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-11.json +0 -0
  146. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-12.json +0 -0
  147. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-13.json +0 -0
  148. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-14.json +0 -0
  149. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-15.json +0 -0
  150. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-16.json +0 -0
  151. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-17.json +0 -0
  152. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-18.json +0 -0
  153. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-19.json +0 -0
  154. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-20.json +0 -0
  155. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-21.json +0 -0
  156. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-22.json +0 -0
  157. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-23.json +0 -0
  158. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-24.json +0 -0
  159. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-25.json +0 -0
  160. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-26.json +0 -0
  161. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-27.json +0 -0
  162. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-28.json +0 -0
  163. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-29.json +0 -0
  164. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/law-30.json +0 -0
  165. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/mediaforge.json +0 -0
  166. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/mine-what-you-ran.json +0 -0
  167. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/one-surface.json +0 -0
  168. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/open-scheduler.json +0 -0
  169. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/persona.json +0 -0
  170. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/personal-agent-home.json +0 -0
  171. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/personal-mesh-pool.json +0 -0
  172. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/provenance.json +0 -0
  173. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/ps5-bridge.json +0 -0
  174. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/retrieval-you-trained.json +0 -0
  175. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/set-and-forget.json +0 -0
  176. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/shared-worktree.json +0 -0
  177. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/the-aither-way-claude-code.json +0 -0
  178. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/the-daily-driver.json +0 -0
  179. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/the-front-door.json +0 -0
  180. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/the-reasoning-loop.json +0 -0
  181. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/the-studio.json +0 -0
  182. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/train-what-you-run.json +0 -0
  183. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/trust.json +0 -0
  184. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/wake-learning-loop.json +0 -0
  185. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/who-what-did.json +0 -0
  186. {awkno-0.2.7 → awkno-0.2.8}/awkno/pages/workspace-bridge.json +0 -0
  187. {awkno-0.2.7 → awkno-0.2.8}/awkno.egg-info/dependency_links.txt +0 -0
  188. {awkno-0.2.7 → awkno-0.2.8}/awkno.egg-info/entry_points.txt +0 -0
  189. {awkno-0.2.7 → awkno-0.2.8}/awkno.egg-info/requires.txt +0 -0
  190. {awkno-0.2.7 → awkno-0.2.8}/awkno.egg-info/top_level.txt +0 -0
  191. {awkno-0.2.7 → awkno-0.2.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: awkno
3
- Version: 0.2.7
3
+ Version: 0.2.8
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.7"
18
+ __version__ = "0.2.8"
19
19
 
20
20
  __all__ = [
21
21
  "AwknoRegistry",
@@ -118,11 +118,22 @@ class AwknoGenerator:
118
118
 
119
119
  # Generate a page per pack ON THE SHELF. Held packs are absent by
120
120
  # design — see _make_pack_page.
121
+ # A pack that shares an id with a registry brick or stack (awnode and awdesk
122
+ # each ship a shelf pack of the same name) must NOT overwrite that page: the
123
+ # registry owns the id, and the overwrite made EC012 report the brick as
124
+ # absent from the corpus after every regen.
125
+ registry_ids = set(pages)
121
126
  if self.shelf_dir.exists():
122
127
  for manifest in sorted(self.shelf_dir.glob("*/pack.yaml")):
123
128
  page = self._make_pack_page(manifest)
124
- if page is not None:
125
- pages[page["topic"].lower()] = page
129
+ if page is None:
130
+ continue
131
+ key = page["topic"].lower()
132
+ if key in registry_ids:
133
+ print(f"[SKIP] pack {key!r}: the id is a registry brick or "
134
+ f"stack; the registry page wins")
135
+ continue
136
+ pages[key] = page
126
137
 
127
138
  # Generate law pages
128
139
  if self.laws_dir.exists():
@@ -0,0 +1,12 @@
1
+ {
2
+ "adopt": "# Only inside a checkout of this repository, or where the addon manifest has\n# been installed to ~/.aither/components. From PyPI alone this raises\n# \"Unknown addon: aitherbrowser\".\npip install awdk\n\n# Start the browser here (port 8132) and\n# register what it finds:\nadk addon enable aitherbrowser\n\n# Confirm it is serving. The image answers TLS when configured and plain\n# HTTP on a bare node, so probe the one you actually started.\ncurl -fsS http://127.0.0.1:8132/health\n\n# Status, and the container's own log when something is wrong:\nadk addon status aitherbrowser\nadk addon logs aitherbrowser",
3
+ "category": "pack",
4
+ "description": "Kind: pack\n\nWhat it does\nRun AitherBrowser on your own machine: an untethered Chromium an agent drives with the pilot_* tools — sessions, screenshots, extraction, taught recipes and saved logins that stay on your disk and never touch anyone else's hardware.\n\nRuntime\nawdk>=3.8.0\n\nTools\n pilot_open\n pilot_navigate\n pilot_observe\n pilot_parse_ui\n pilot_look\n pilot_click\n pilot_fill\n pilot_scroll\n pilot_extract\n pilot_save_login\n pilot_done\n pilot_close",
5
+ "see_also": [
6
+ "awdk",
7
+ "awpack"
8
+ ],
9
+ "status": "preview",
10
+ "synopsis": "Run AitherBrowser on your own machine: an untethered Chromium an agent drives with the pilot_* tools — sessions, screenshots, extraction, taught recipes and saved logins that stay on your disk and never touch anyone else's hardware.",
11
+ "topic": "aitherbrowser"
12
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "adopt": "Describe one capability in one file and get the same name, arguments and JSON back from CLI, Python, MCP and relay.",
3
+ "category": "brick",
4
+ "description": "Kind: tool\n\nProblem\nA tool that ships a CLI, a Python API and an MCP server ends up with three names, three argument shapes and three result formats, and nothing tells you which of them still work.\n\nInstall\nnot yet published; builds in-tree\n\nCommands\n awcap",
5
+ "see_also": [
6
+ "awdk",
7
+ "awnode",
8
+ "awrelay",
9
+ "awm",
10
+ "awflow",
11
+ "awgit"
12
+ ],
13
+ "status": "planned",
14
+ "synopsis": "Describe a capability once; call it the same way from CLI, Python, MCP and relay.",
15
+ "topic": "awcap"
16
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "adopt": "# Chrome Web Store:\n# https://chromewebstore.google.com/detail/awconnect/peeojgjhjficedkncdejbfnacooodbak\n#\n# Source (MIT): https://github.com/Aitherium/AitherConnect\n# Load unpacked from a checkout of `awconnect/` if you want your own build.\n#\n# Start a local daemon BEFORE expecting it to pair — `awnode mcp`, or the awsh\n# harness on :8362. With no daemon listening it reports\n# \"No awdk daemon answered ...; using Cloud\"\n# and the page goes through the cloud instead of your machine. That fallback\n# is deliberate; it is also the thing to check first when it \"feels remote\".",
3
+ "category": "pack",
4
+ "description": "Kind: pack\n\nWhat it does\nAdd the awconnect browser extension: it hands an agent the page you are looking at, pairs over loopback to a local daemon, and falls back to the cloud only when no daemon answers.\n\nRuntime\nawdk>=3.8.0",
5
+ "see_also": [
6
+ "awdk",
7
+ "awpack"
8
+ ],
9
+ "status": "preview",
10
+ "synopsis": "Add the awconnect browser extension: it hands an agent the page you are looking at, pairs over loopback to a local daemon, and falls back to the cloud only when no daemon answers.",
11
+ "topic": "awconnect"
12
+ }
@@ -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 .)\n\nQuick start\n npm install\n npm run demo\n\nDocs\nhttps://aitherium.github.io/awdesk/",
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. It also replaces the Windows utilities, each synced to AitherOS Online and reachable by agents through awsh, adk and AwNode under one command id: a snipping tool (PrintScreen), clipboard sync, a screen recorder (Shift+PrintScreen), a System window for processes, ports and connections, a File Explorer (Win+E, opt-in), Search this PC (Alt+Space) and a one-click public URL for a local port.\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",
@@ -11,7 +11,9 @@
11
11
  "awavatar",
12
12
  "AitherConnect",
13
13
  "awdaemons",
14
- "awsettings"
14
+ "awsettings",
15
+ "awnode",
16
+ "awtunnel"
15
17
  ],
16
18
  "status": "public",
17
19
  "synopsis": "Aither World Desk -- the desktop body of AitherOS Online: tray, avatars, decision cards, the Living Desktop as an overlay.",
@@ -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\n\nCommands\n adk\n adk-awdelegate\n adk-bug\n adk-py\n adk-serve\n adk-shell\n adk-workspace\n aither-adk\n aither-hearth\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\nIn Claude Code\n plugin awsh@awsh\n command adk claude setup\n command adk claude doctor\n skill /awdk\n\nDocs\nhttps://aitherium.github.io/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-awdelegate\n adk-bug\n adk-py\n adk-serve\n adk-shell\n adk-workspace\n aither-adk\n aither-hearth\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\nIn Claude Code\n plugin awsh@awsh\n command adk claude setup\n command adk claude doctor\n mcp python -m adk.harnesses.mcp_stdio\n skill /awdk\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": "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\n\nCommands\n awprism\n\nQuick start\n pip install awprism\n\nIn Claude Code\n mcp awprism mcp [planned]\n\nDocs\nhttps://aitherium.github.io/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\nIn Claude Code\n mcp awprism mcp\n\nDocs\nhttps://aitherium.github.io/awprism/",
5
5
  "see_also": [
6
6
  "awreason",
7
7
  "awrepl",
@@ -0,0 +1,20 @@
1
+ {
2
+ "adopt": null,
3
+ "category": "stack",
4
+ "description": "An open-source private cloud you run yourself: identity, directory, RBAC, secrets, certificates, object storage, events, metrics, audit, messaging, jobs and tunnels, on an immutable awnix base on hardware you own. The parts a stranger can adopt alone are these bricks. The control plane behind them (Identity, Directory, Secrets, Strata, Flux, Pulse, Watch, Chronicle, Nexus, Relay) is a set of platform services that the sovereign-replica layer set stands up, not bricks. Solutions (CRM, mail, web hosting, MDM, the OccupySaaS packs) ship as optional packs on top and are never baked in. Design and the AWS service map: `.AITHEROS/43-AITHER-WORLD-SERVICES.md`.\n\nIncludes: awnix, awdaemons, awrun, awiam, awbac, awdit, awseal, awrelay, awtunnel, awpack",
5
+ "see_also": [
6
+ "awnix",
7
+ "awdaemons",
8
+ "awrun",
9
+ "awiam",
10
+ "awbac",
11
+ "awdit",
12
+ "awseal",
13
+ "awrelay",
14
+ "awtunnel",
15
+ "awpack"
16
+ ],
17
+ "status": "partial",
18
+ "synopsis": "Aither World Services",
19
+ "topic": "aws"
20
+ }
@@ -12,7 +12,9 @@
12
12
  "awseal",
13
13
  "awshare",
14
14
  "awm",
15
- "awrise"
15
+ "awrise",
16
+ "awrtifact",
17
+ "awrelay"
16
18
  ],
17
19
  "status": "public",
18
20
  "synopsis": "Every drive on every node, indexed, classified and diffed -- so you can see what you own before you delete it.",
@@ -0,0 +1,12 @@
1
+ {
2
+ "adopt": "# Source (Apache-2.0): https://github.com/occupysaas/salescompel\ngit clone https://github.com/occupysaas/salescompel\ncd salescompel\n\n# It needs PostgreSQL, and NOTHING UPSTREAM CREATES THE LOGINS OR THE GRANTS —\n# the role names below are examples you choose, not names the project defines.\n# The one rule the program enforces: migrations run as an OPERATOR principal\n# and serve runs as a RUNTIME principal that does not own the database\n# (serve refuses owner privileges). Grant the runtime logins what the schema\n# needs; the repository's docs are the authority on which privileges.\ncreatedb salescompel\npsql -d salescompel -c \"CREATE ROLE salescompel_op LOGIN PASSWORD 'change-me';\"\npsql -d salescompel -c \"CREATE ROLE salescompel_app LOGIN PASSWORD 'change-me';\"\npsql -d salescompel -c \"CREATE ROLE salescompel_id LOGIN PASSWORD 'change-me';\"\n\nexport MIGRATION_DATABASE_URL='postgres://salescompel_op@127.0.0.1:5432/salescompel?sslmode=disable'\nexport DATABASE_URL='postgres://salescompel_app@127.0.0.1:5432/salescompel?sslmode=disable'\nexport AUTH_DATABASE_URL='postgres://salescompel_id@127.0.0.1:5432/salescompel?sslmode=disable'\n\n# Build, migrate, create the first user, then serve.\ngo build -o salescompel ./cmd/salescompel\n./salescompel migrate status # forward-only migrations; never run at startup\n./salescompel migrate up\nSALESCOMPEL_TENANT=acme SALESCOMPEL_USERNAME=admin@example.com \\\n SALESCOMPEL_PASSWORD='<choose-one>' SALESCOMPEL_ROLE=owner \\\n ./salescompel user create # reads the four env vars above\n./salescompel serve -addr 127.0.0.1:8080\n\n# The UI is BUILT assets, not source: -assets defaults to web/dist. Build them\n# once with Node 22.12 or newer, or pass -assets \"\" to serve the API alone.\n# (cd web && npm ci && npm run build)\n#\n# A non-loopback listener is REFUSED without TLS. That is deliberate:\n# ./salescompel serve -addr 0.0.0.0:8443 -tls-cert cert.pem -tls-key key.pem",
3
+ "category": "pack",
4
+ "description": "Kind: pack\n\nWhat it does\nRun SalesCompel — the Apache-2.0, work-in-progress Salesforce replacement from the OccupySaaS community — from source: a Go/PostgreSQL candidate with a Vue record workflow, OAuth with PKCE, and a compatibility laboratory. This pack records how to build and serve it; it never vendors or hosts it.\n\nRuntime\nawdk>=3.8.0",
5
+ "see_also": [
6
+ "awdk",
7
+ "awpack"
8
+ ],
9
+ "status": "preview",
10
+ "synopsis": "Run SalesCompel — the Apache-2.0, work-in-progress Salesforce replacement from the OccupySaaS community — from source: a Go/PostgreSQL candidate with a Vue record workflow, OAuth with PKCE, and a compatibility laboratory",
11
+ "topic": "salescompel"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "adopt": "# Source, docs and the compatibility matrix (Apache-2.0):\n# https://github.com/occupysaas/zeroauthy\ngit clone https://github.com/occupysaas/zeroauthy\ncd zeroauthy\n\n# Their quickstart (docs/quickstart.md) covers the TLS certificate pair and\n# master.key that the server requires before it will start.\n# Put cert.pem, key.pem and master.key where the run command below expects.\n\n# Run the published image. Tag 1.0.0-rc.1 is the current public release.\ndocker run -d --name zeroauthy -p 8443:8443 -v zeroauthy-data:/data \\\n -v \"$PWD/certs:/certs:ro\" \\\n -e ZEROAUTHY_SERVER__LISTEN=:8443 \\\n -e ZEROAUTHY_SERVER__SYSTEM_HOST=system.localhost:8443 \\\n -e ZEROAUTHY_SERVER__TLS_CERT_FILE=/certs/cert.pem \\\n -e ZEROAUTHY_SERVER__TLS_KEY_FILE=/certs/key.pem \\\n -e ZEROAUTHY_SECURITY__MASTER_KEY=\"$(cat master.key)\" \\\n ghcr.io/occupysaas/zeroauthy:1.0.0-rc.1\n\n# First admin, then sign in at https://system.localhost:8443/\ndocker exec zeroauthy zeroauthy admin create --email you@example.com\n\n# No Docker? Release binaries for linux/amd64, linux/arm64 and darwin/arm64\n# are on their releases page, with a SHA256SUMS file.",
3
+ "category": "pack",
4
+ "description": "Kind: pack\n\nWhat it does\nStand up zeroauthy — the Apache-2.0 Go identity provider from the OccupySaaS community — from its published container image or its release binaries. This pack installs and documents it; it never vendors or hosts it.\n\nRuntime\nawdk>=3.8.0",
5
+ "see_also": [
6
+ "awdk",
7
+ "awpack"
8
+ ],
9
+ "status": "preview",
10
+ "synopsis": "Stand up zeroauthy — the Apache-2.0 Go identity provider from the OccupySaaS community — from its published container image or its release binaries",
11
+ "topic": "zeroauthy"
12
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: awkno
3
- Version: 0.2.7
3
+ Version: 0.2.8
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,6 +15,7 @@ awkno.egg-info/top_level.txt
15
15
  awkno/pages/agent-senses.json
16
16
  awkno/pages/agent-vm.json
17
17
  awkno/pages/agentic-orchestrator.json
18
+ awkno/pages/aitherbrowser.json
18
19
  awkno/pages/aitherconnect.json
19
20
  awkno/pages/aitherkvcache.json
20
21
  awkno/pages/aitheros.json
@@ -30,7 +31,9 @@ awkno/pages/awbrain.json
30
31
  awkno/pages/awbrowse.json
31
32
  awkno/pages/awcache.json
32
33
  awkno/pages/awcams.json
34
+ awkno/pages/awcap.json
33
35
  awkno/pages/awclassify.json
36
+ awkno/pages/awconnect.json
34
37
  awkno/pages/awdaemons.json
35
38
  awkno/pages/awdata.json
36
39
  awkno/pages/awdecide.json
@@ -85,6 +88,7 @@ awkno/pages/awrise.json
85
88
  awkno/pages/awrouter.json
86
89
  awkno/pages/awrtifact.json
87
90
  awkno/pages/awrun.json
91
+ awkno/pages/aws.json
88
92
  awkno/pages/awsaga.json
89
93
  awkno/pages/awscope.json
90
94
  awkno/pages/awscreen.json
@@ -168,6 +172,7 @@ awkno/pages/personal-mesh-pool.json
168
172
  awkno/pages/provenance.json
169
173
  awkno/pages/ps5-bridge.json
170
174
  awkno/pages/retrieval-you-trained.json
175
+ awkno/pages/salescompel.json
171
176
  awkno/pages/set-and-forget.json
172
177
  awkno/pages/shared-worktree.json
173
178
  awkno/pages/the-aither-way-claude-code.json
@@ -180,4 +185,5 @@ awkno/pages/trust.json
180
185
  awkno/pages/wake-learning-loop.json
181
186
  awkno/pages/who-what-did.json
182
187
  awkno/pages/workspace-bridge.json
188
+ awkno/pages/zeroauthy.json
183
189
  tests/test_awkno.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "awkno"
7
- version = "0.2.7"
7
+ version = "0.2.8"
8
8
  description = "The man page for the Aither World — every brick, stack and law, in your terminal, offline."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -247,6 +247,43 @@ class TestAwknoRegistry:
247
247
  data2_str = json.dumps(pages2[key], sort_keys=True)
248
248
  assert data1_str == data2_str, f"Page {key} differs between runs"
249
249
 
250
+ def test_shelf_pack_never_overwrites_a_registry_brick(self, tmp_path):
251
+ """A pack named like a brick (awnode, awdesk) must not replace the brick page.
252
+
253
+ It did: packs were written after bricks into the same dict key, so every
254
+ regen turned the `awnode` brick page into a pack page and EC012 then
255
+ reported the brick as absent from the offline corpus.
256
+ """
257
+ from awkno.generate import AwknoGenerator
258
+
259
+ root = tmp_path / "AitherOS"
260
+ (root / "config").mkdir(parents=True)
261
+ (root / "config" / "ecosystem.yaml").write_text(
262
+ "bricks:\n"
263
+ " - id: awzed\n name: awzed\n kind: runtime\n status: public\n"
264
+ " problem: p\n adopt: a\n",
265
+ encoding="utf-8")
266
+ shelf = tmp_path / "awpack" / "packs"
267
+ shelf.mkdir(parents=True)
268
+ real = Path(__file__).resolve()
269
+ while real != real.parent and not (real / "awpack" / "packs" / "awnode").is_dir():
270
+ real = real.parent
271
+ src = real / "awpack" / "packs" / "awnode" / "pack.yaml"
272
+ if not src.is_file():
273
+ pytest.skip("standalone awkno checkout: no shelf pack to copy")
274
+ (shelf / "awzed").mkdir()
275
+ text = src.read_text(encoding="utf-8").replace("awnode", "awzed")
276
+ (shelf / "awzed" / "pack.yaml").write_text(text, encoding="utf-8")
277
+ out = tmp_path / "pages"
278
+ out.mkdir()
279
+
280
+ gen = AwknoGenerator(str(root), output_dir=str(out))
281
+ assert gen._make_pack_page(shelf / "awzed" / "pack.yaml") is not None, \
282
+ "fixture pack must be a real shelf page or the test proves nothing"
283
+ pages = gen.generate()
284
+
285
+ assert pages["awzed"]["category"] == "brick", pages["awzed"]
286
+
250
287
  def test_scrub_removes_empty_span_and_keeps_code_fences(self):
251
288
  """The empty-span safety net must not eat two-thirds of a ``` fence.
252
289
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes