awkno 0.2.0__py3-none-any.whl

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 (91) hide show
  1. awkno/__init__.py +25 -0
  2. awkno/_doctor.py +114 -0
  3. awkno/cli.py +497 -0
  4. awkno/corpus.py +216 -0
  5. awkno/generate.py +444 -0
  6. awkno/pages/agent-senses.json +13 -0
  7. awkno/pages/agent-vm.json +14 -0
  8. awkno/pages/aitherconnect.json +11 -0
  9. awkno/pages/aitherkvcache.json +11 -0
  10. awkno/pages/aitherzero.json +11 -0
  11. awkno/pages/awarena.json +14 -0
  12. awkno/pages/awask.json +15 -0
  13. awkno/pages/awbac.json +11 -0
  14. awkno/pages/awbrowse.json +13 -0
  15. awkno/pages/awdit.json +12 -0
  16. awkno/pages/awdk.json +16 -0
  17. awkno/pages/awevolve.json +15 -0
  18. awkno/pages/awfind.json +13 -0
  19. awkno/pages/awgit.json +12 -0
  20. awkno/pages/awgraph.json +12 -0
  21. awkno/pages/awiam.json +12 -0
  22. awkno/pages/awkit.json +13 -0
  23. awkno/pages/awkno.json +13 -0
  24. awkno/pages/awknowledge.json +12 -0
  25. awkno/pages/awm.json +13 -0
  26. awkno/pages/awmail.json +18 -0
  27. awkno/pages/awnboard.json +20 -0
  28. awkno/pages/awnest.json +19 -0
  29. awkno/pages/awnet.json +13 -0
  30. awkno/pages/awnix.json +20 -0
  31. awkno/pages/awnode.json +12 -0
  32. awkno/pages/awpack.json +13 -0
  33. awkno/pages/awpredict.json +11 -0
  34. awkno/pages/awprism.json +14 -0
  35. awkno/pages/awreason.json +14 -0
  36. awkno/pages/awrecover.json +13 -0
  37. awkno/pages/awrecurse.json +13 -0
  38. awkno/pages/awrelay.json +12 -0
  39. awkno/pages/awrepl.json +13 -0
  40. awkno/pages/awresearch.json +14 -0
  41. awkno/pages/awrun.json +13 -0
  42. awkno/pages/awseal.json +12 -0
  43. awkno/pages/awsh.json +13 -0
  44. awkno/pages/awshare.json +12 -0
  45. awkno/pages/awskills.json +12 -0
  46. awkno/pages/awsync.json +16 -0
  47. awkno/pages/awtunnel.json +12 -0
  48. awkno/pages/cited-research.json +14 -0
  49. awkno/pages/gobbonet-agentic.json +14 -0
  50. awkno/pages/guide-00.json +16 -0
  51. awkno/pages/guide-01.json +14 -0
  52. awkno/pages/guide-02.json +14 -0
  53. awkno/pages/guide-03.json +14 -0
  54. awkno/pages/guide-04.json +15 -0
  55. awkno/pages/guide-05.json +16 -0
  56. awkno/pages/guide-06.json +15 -0
  57. awkno/pages/guide-07.json +15 -0
  58. awkno/pages/guide-08.json +17 -0
  59. awkno/pages/guide-09.json +13 -0
  60. awkno/pages/guide.json +22 -0
  61. awkno/pages/law-01.json +11 -0
  62. awkno/pages/law-02.json +11 -0
  63. awkno/pages/law-03.json +11 -0
  64. awkno/pages/law-04.json +11 -0
  65. awkno/pages/law-05.json +11 -0
  66. awkno/pages/law-06.json +11 -0
  67. awkno/pages/law-07.json +11 -0
  68. awkno/pages/law-08.json +11 -0
  69. awkno/pages/law-09.json +11 -0
  70. awkno/pages/law-10.json +11 -0
  71. awkno/pages/law-11.json +11 -0
  72. awkno/pages/law-12.json +11 -0
  73. awkno/pages/law-13.json +11 -0
  74. awkno/pages/law-14.json +11 -0
  75. awkno/pages/law-15.json +11 -0
  76. awkno/pages/law-16.json +11 -0
  77. awkno/pages/law-17.json +11 -0
  78. awkno/pages/law-18.json +11 -0
  79. awkno/pages/law-19.json +11 -0
  80. awkno/pages/one-surface.json +15 -0
  81. awkno/pages/provenance.json +14 -0
  82. awkno/pages/shared-worktree.json +14 -0
  83. awkno/pages/the-front-door.json +15 -0
  84. awkno/pages/the-reasoning-loop.json +14 -0
  85. awkno/pages/who-what-did.json +13 -0
  86. awkno-0.2.0.dist-info/METADATA +321 -0
  87. awkno-0.2.0.dist-info/RECORD +91 -0
  88. awkno-0.2.0.dist-info/WHEEL +5 -0
  89. awkno-0.2.0.dist-info/entry_points.txt +2 -0
  90. awkno-0.2.0.dist-info/licenses/LICENSE +118 -0
  91. awkno-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "adopt": null,
3
+ "body": "*Part V · Trust*\n\n**Fires when:** any code decides *who* someone is, or *what* they may reach.\n\n## The law\n\nDerive identity and scope from the **authenticated** caller — the verified token,\nthe session, the middleware-established context. Then check the request's claimed\ntarget against that.\n\nNever from the request body. Never from a metadata field. Never from a `source=`\nstring, a header the client can set, or an id extracted from the messages.\n\n```python\n# wrong - the caller chose this value\ntenant = payload[\"metadata\"][\"tenant_id\"]\n\n# right - the caller proved this value\ncaller = get_current_caller()\nif payload[\"tenant_id\"] != caller.tenant_id and not caller.is_admin:\n raise Forbidden\n```\n\n## The variant nobody expects: the fabricated caller\n\nMany frameworks synthesise a default context when none is set — a \"system\" or\n\"platform\" caller — so internal code can run without a session. If any gate then\nreads:\n\n```python\nif caller.type == \"platform\":\n return True\n```\n\n…every unauthenticated request that reaches that code **without passing through\nauth middleware** is trusted. The absence of a caller has been converted into\nmaximum privilege.\n\nExempt only *genuine* privilege — a real admin role on a real verified identity.\nAn absent or anonymous caller must deny.\n\n## Content-addressed keys are an authorization decision too\n\nA cache key, a content hash or a derived id **is** a scope decision:\n\n- Key tenant-first — `(tenant, workspace, hash)` — so an identical hash in two\n tenants can never collide into a shared read. Prove it with a live cross-tenant\n lookup that returns nothing.\n- A hash computed from untrusted input can be *forged*. Gate the **use** of the\n key on authenticated ownership, not on possession of the key.\n\n## Where the boundary really is\n\nTwo related mistakes worth naming, because both look like tidying up:\n\n**\"It's an internal call, so it's fine.\"** A route reached by an in-process call\nbypasses its own dependency-injected auth. Three \"obvious\" fixes to undefined\nnames in one audit pointed at real handlers whose authentication would have been\nskipped that way — the mechanical fix would have opened a hole that a crash was\naccidentally closing.\n\n**\"The app already checked.\"** Application permission and platform identity are\ntwo different questions. A user can hold a perfectly valid platform session and\nbe a viewer in the app, or vice versa. Do not let one answer the other.\n\n## The check\n\nStatic rules catch some of it:\n\n```\n an authz decision keyed on a payload-supplied tenant/user/workspace id\n a fabricated/absent caller treated as privileged\n```\n\nThe rest is a review question. On any diff touching auth, tenancy, entitlements,\ncapability tokens or a cross-tenant boundary, state which of these you checked:\n\n1. does every error path deny? ([LAW 17](17-fail-closed-then-prove-the-happy-path.md))\n2. is any decision keyed on caller-supplied input?\n3. is an absent caller treated as privileged?\n4. does every internal call carry an identity, over TLS you actually verify?\n5. is there a positive, live assertion that the happy path returns data?\n6. are cache and content keys scoped tenant-first?\n\nA change that trips any of these is not done.",
4
+ "category": "law",
5
+ "description": "Law #18",
6
+ "see_also": null,
7
+ "slug": "never-trust-the-caller",
8
+ "status": "published",
9
+ "synopsis": "Never trust the caller for an authorization decision — the payload is not evidence",
10
+ "topic": "law-18"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "adopt": null,
3
+ "body": "*Part V · Trust*\n\n**Fires when:** you are deciding whether a file can be lifted out of a codebase\nand shipped on its own — extracting a library, splitting a package, publishing\nan internal tool, or estimating how much work a decoupling is.\n\n## The law\n\nThe number of import lines in a file measures how many edges you can see from\nwhere you are standing. It does not measure what the file needs in order to run\nsomewhere else, and it is wrong in **both** directions:\n\n- **It under-counts reach.** One import of a local module can drag in that\n module's whole subtree. The count says one; the work is the transitive\n closure.\n- **It over-counts cohesion.** Imports between files that travel *together*\n cost nothing on extraction — they become relative imports inside the package\n you are creating. The count says coupled; they are the thing itself.\n\nSo the useful question is never \"how many imports does this file have\". It is\n**\"what does this file need that a stranger's machine will not have?\"** Count\nthat, and count it transitively, with internal edges excluded.\n\n## The measurement that produced this\n\nFive candidates were measured for extraction with a one-line command — imports\nmatching the monorepo's top-level packages, per file. The plan was built on the\nresult. Both of the two most confident readings were wrong, on the same run,\nin opposite directions:\n\n| candidate | lines | one-hop count | what was actually true |\n|---|---|---|---|\n| a client module | 1,020 | **3** | one of the three pulled a 653-line base class that itself pulled the HTTP client, the degradation registry, the port resolver, the TLS config and the request signer |\n| a subpackage | 636 | **14** | **9 of the 14 were internal** — the subpackage importing itself. Real external coupling: 2 |\n| a product engine | 3,867 | **1** | genuinely standalone, and the largest of the five was the easiest to ship |\n\nThe first row is the expensive one. \"Three imports\" was read as \"an afternoon\",\nand the work it described was not decoupling at all: the correct move was to\n**write a new thin client against the wire protocol** and treat the original as\na specification. Those are different tasks with different costs and different\noutputs, and the metric chose the wrong one while looking precise.\n\nThe third row kills the intuition that size predicts portability. The biggest\ncandidate was the most portable. Lines and coupling are independent axes, and\nonly one of them decides whether the thing installs on someone else's laptop.\n\n## The trap in the fix\n\nThe obvious repair is to compute the transitive closure and use that number\ninstead. Do that — but do not let it become the new oracle, because the closure\nhas the same shape of blind spot one level out:\n\n**An import is not the only thing a file needs.** A module with zero internal\nimports still fails on a stranger's machine if it reads a config file that is\nnot in the wheel, resolves a hostname only your network answers, expects an\nenvironment variable your deploy sets, or imports a third-party package you\nhappen to have installed. None of those is an import edge, and none of them\nappears in any count.\n\nWhich is why the number is a filter and never a verdict. The verdict comes from\n**building the artifact and running it somewhere that has nothing** — a clean\ncontainer, a fresh virtualenv, a machine that has never seen your repository. A\npackage is not portable because you counted its imports. It is portable when it\nimported successfully on a machine that could not possibly have helped it.\n\nThe counting is still worth doing. It is cheap, it ranks the work, and it tells\nyou which candidate to start with. It just never gets to be the last word,\nbecause every failure mode it cannot see fails in the same place: on the\nstranger's machine, days after you shipped, where you are not watching.",
4
+ "category": "law",
5
+ "description": "Law #19",
6
+ "see_also": null,
7
+ "slug": "count-the-closure-not-the-edge",
8
+ "status": "published",
9
+ "synopsis": "Count the closure, not the edge — an import count is not a portability measurement",
10
+ "topic": "law-19"
11
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "adopt": null,
3
+ "category": "stack",
4
+ "description": "OWNER DECISION 2026-08-19, recorded because it was made in a transcript and would otherwise be re-litigated: stop hand-maintaining a web UI per app. The Living Desktop is the shell; an \"app\" is a dynamic agent panel rendered from a tool result (awkit), scoped by the identity plane, driven by intent rather than clicking. veil/portal keep serving pages and APIs where genuinely needed -- the UI, widgets and apps are what collapses, not the hosting. WHY, measured that day on ONE tenant: 18 apps listed and 0 deployed; AitherOne showing \"Service Unavailable\" while healthy, because all 11 of its GET routes require a body and answer 422 to every caller alive; 189 catalogue routes against 105 registered panels; and 2 of 6 declared panels were ids with NO component -- rendering nothing, with no error, no boundary and no log line. Every one of those is the same shape: declared in one place, not real in another, and nothing comparing the two. THE TRAP THIS MUST NOT INHERIT, stated here so the stack is judged on it: collapsing six surfaces into one does not fix that shape, it reduces how many places it can happen. A panel spec a renderer cannot honour is a stale component one layer up. The parity gate (-'s shape: producer ids == renderer ids, asserted by something that fails) comes FIRST, or this becomes the seventh island. DONE means: one previously-broken app rebuilt as an agent panel end to end with real scope and real data; the entitlement plane answering once instead of a catalogue and a backend disagreeing; and surfaces retired by the ratchet, one at a time, each with its consumers moved in the same commit -- never by decree.\n\nIncludes: awkit, awdk, awnode, awiam, awbac",
5
+ "see_also": [
6
+ "awkit",
7
+ "awdk",
8
+ "awnode",
9
+ "awiam",
10
+ "awbac"
11
+ ],
12
+ "status": "planned",
13
+ "synopsis": "One surface — agent panels, not hand-built UIs",
14
+ "topic": "one-surface"
15
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "adopt": null,
3
+ "category": "stack",
4
+ "description": "Prove what an artifact is, who acted on it, and that nothing was quietly removed from the record.\n\nIncludes: awseal, awshare, awdit, awbac",
5
+ "see_also": [
6
+ "awseal",
7
+ "awshare",
8
+ "awdit",
9
+ "awbac"
10
+ ],
11
+ "status": "partial",
12
+ "synopsis": "Provenance",
13
+ "topic": "provenance"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "adopt": null,
3
+ "category": "stack",
4
+ "description": "Several agents editing one codebase without sweeping each other's work or re-deriving what the last one already learned.\n\nIncludes: awgit, awgraph, awrelay, awm",
5
+ "see_also": [
6
+ "awgit",
7
+ "awgraph",
8
+ "awrelay",
9
+ "awm"
10
+ ],
11
+ "status": "ready",
12
+ "synopsis": "Many agents, one repo",
13
+ "topic": "shared-worktree"
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "adopt": null,
3
+ "category": "stack",
4
+ "description": "Who may come in at all, before anything asks who they are: a human check whose verdict is bound to one door and one use, the identity it names, the authority it feeds, and a record of every refusal. Named because the four already existed as four separate answers to one question a stranger asks first.\n\nIncludes: awnboard, awnest, awiam, awbac, awdit",
5
+ "see_also": [
6
+ "awnboard",
7
+ "awnest",
8
+ "awiam",
9
+ "awbac",
10
+ "awdit"
11
+ ],
12
+ "status": "partial",
13
+ "synopsis": "The front door",
14
+ "topic": "the-front-door"
15
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "adopt": null,
3
+ "category": "stack",
4
+ "description": "The thinking core, kept apart from the senses and the hands on purpose. A hard question becomes a session with phases you can inspect (awreason); a failure inside it becomes ranked hypotheses with a falsifying check for each (awprism); and the check is actually RUN against live state rather than recalled (awrepl). Those three are the loop. It composes with `agent-senses` for what is outside the process and with `shared-worktree` for what is in the codebase — which is why neither set is repeated here.\n\nIncludes: awreason, awprism, awrepl, awrecurse",
5
+ "see_also": [
6
+ "awreason",
7
+ "awprism",
8
+ "awrepl",
9
+ "awrecurse"
10
+ ],
11
+ "status": "planned",
12
+ "synopsis": "The reasoning loop",
13
+ "topic": "the-reasoning-loop"
14
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "adopt": null,
3
+ "category": "stack",
4
+ "description": "The three questions every access decision needs answered separately: who is this caller, what may they do, and what did they actually do. Kept apart on purpose -- one component that answers all three is one component that can quietly answer all three wrongly.\n\nIncludes: awiam, awbac, awdit",
5
+ "see_also": [
6
+ "awiam",
7
+ "awbac",
8
+ "awdit"
9
+ ],
10
+ "status": "partial",
11
+ "synopsis": "Identity, authority, and the record",
12
+ "topic": "who-what-did"
13
+ }
@@ -0,0 +1,321 @@
1
+ Metadata-Version: 2.4
2
+ Name: awkno
3
+ Version: 0.2.0
4
+ Summary: The man page for the Aither World — every brick, stack and law, in your terminal, offline.
5
+ License: Apache-2.0
6
+ Project-URL: Homepage, https://github.com/Aitherium/awkno
7
+ Project-URL: Documentation, https://github.com/Aitherium/awkno#readme
8
+ Project-URL: Repository, https://github.com/Aitherium/awkno.git
9
+ Project-URL: Issues, https://github.com/Aitherium/awkno/issues
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: PyYAML>=6.0
14
+ Provides-Extra: dev
15
+ Requires-Dist: pytest>=7.0; extra == "dev"
16
+ Dynamic: license-file
17
+
18
+ # awkno — The man page for the Aither World
19
+
20
+ **Every brick, stack, and law in your terminal, offline.**
21
+
22
+ awkno is a standalone reference for the Aither World ecosystem — the set of portable, composable tools and principles that make agent automation reproducible and auditable. No browser, no internet connection, no external dependencies needed.
23
+
24
+ ## Why
25
+
26
+ Agent systems need documented principles. The Aither World is built on 18 laws derived from real failures on production systems — lessons about gates, silence, atomicity, and delivery that apply to every agent work you build.
27
+
28
+ The ecosystem itself is ~36 portable tools (bricks) organized into thematic stacks. awkno brings them all into your terminal: any brick's purpose and adoption path, any law's principle and reasoning, any stack's composition and status — all offline, all fast, queryable by keyword, and open to reading and redistribution.
29
+
30
+ ## Quick Start
31
+
32
+ ### Install
33
+
34
+ ```bash
35
+ pip install awkno
36
+ ```
37
+
38
+ ### Use
39
+
40
+ ```bash
41
+ # Show a brick
42
+ awkno awdk
43
+ awkno awsh
44
+
45
+ # Show a law
46
+ awkno law 5
47
+
48
+ # List everything
49
+ awkno list
50
+
51
+ # Search for a term
52
+ awkno search agent
53
+ awkno -k silence
54
+
55
+ # Raw output for piping
56
+ awkno awdk --plain
57
+ awkno --json awdk
58
+ ```
59
+
60
+ ### No Arguments
61
+
62
+ ```bash
63
+ awkno
64
+ ```
65
+
66
+ Shows the overview: command summary, quick start examples, and how to explore further.
67
+
68
+ ## What's Inside
69
+
70
+ ### Bricks (36 tools)
71
+
72
+ Portable, single-purpose tools that do one job well and compose with others:
73
+
74
+ - **awdk** — Build AI agent fleets (3 lines, any backend)
75
+ - **awskills** — Portable agent skills (self-contained procedures)
76
+ - **awm** — Scoped agent memory (tenant:user:project boundaries)
77
+ - **awgit** — Semantic version control (edit-ops, leases)
78
+ - **awgraph** — Code graph for agents (AST, call graphs)
79
+ - **awrelay** — Agent messaging (findings, alerts, coordination)
80
+ - **awmail** — Email for agents (send and receive)
81
+ - **And 29 more...**
82
+
83
+ Each has an "adopt" sentence: the smallest useful thing you can do with it alone, without adopting anything else.
84
+
85
+ ### Stacks (9 collections)
86
+
87
+ Curated sets of bricks that work together:
88
+
89
+ - **agent-vm** — The bare agent VM
90
+ - **agent-senses** — Perception (search, pages)
91
+ - **shared-worktree** — Many agents, one repo
92
+ - **the-front-door** — Identity, authority, record
93
+ - **And 5 more...**
94
+
95
+ ### Laws (18 principles)
96
+
97
+ Lessons learned in production, written down so they don't have to be re-derived:
98
+
99
+ 1. A rule nothing asserts is a suggestion
100
+ 2. Make it a check, not a ticket
101
+ 3. Watch your gate fail
102
+ 4. Mutate the test, not just the code
103
+ 5. Design for the silence
104
+ 6. A check that cannot run must not pass
105
+ 7. The symptom names the innocent
106
+ 8. A checker in the wrong place found nothing
107
+ 9. Detection without delivery is not detection
108
+ 10. A gate that floods gets switched off
109
+ 11. Open green; ratchet down
110
+ 12. Measure it again
111
+ 13. Written is not deployed
112
+ 14. You wrote it; that does not mean it ships
113
+ 15. Generate, never copy
114
+ 16. The defect lives in the union
115
+ 17. Fail closed, then prove the happy path
116
+ 18. Never trust the caller
117
+
118
+ ## Architecture
119
+
120
+ ### Offline-First Design
121
+
122
+ The corpus is **generated once** from `ecosystem.yaml` and `awknowledge/laws/`, then **committed as JSON data files** under `awkno/pages/`. After install, the package needs no external files or network.
123
+
124
+ This means:
125
+ - No runtime generation (fast startup)
126
+ - No external dependencies beyond stdlib
127
+ - Reproducible across machines and time
128
+ - Auditable: every page is in the repo
129
+
130
+ ### CLI Features
131
+
132
+ - **Pager support**: Automatic pagination on TTY (via `$PAGER` or system default)
133
+ - **TTY-aware formatting**: ANSI bold headers only when connected to a terminal
134
+ - **Multiple output modes**:
135
+ - `--plain` — No ANSI codes (safe for piping to other tools)
136
+ - `--json` — Structured output for scripting
137
+ - Default — Man-page-style formatted text
138
+ - **Fuzzy search**: Type something close, get ranked results
139
+ - **Command shortcuts**:
140
+ - `awkno list` — Show all topics grouped by category
141
+ - `awkno law N` — Show law by number
142
+ - `awkno -k TERM` / `awkno --apropos TERM` — Search (like `man -k`)
143
+
144
+ ### No Internal Leakage
145
+
146
+ This package is built for public distribution, and the corpus is GENERATED from
147
+ an internal registry -- so the generator strips, and the build then re-checks,
148
+ every category of internal detail: infrastructure hostnames, absolute paths from
149
+ the build machine, issue-tracker and quality-gate identifiers, and imports that
150
+ only resolve inside a private monorepo.
151
+
152
+ The point of scanning the *generated* corpus rather than the generator is that a
153
+ sanitiser is only as good as its last pattern. A page that slips through reads as
154
+ ordinary prose, so nothing downstream would ever notice.
155
+
156
+ ## Development
157
+
158
+ ### Regenerate the Corpus
159
+
160
+ ```bash
161
+ python awkno/generate.py
162
+ ```
163
+
164
+ The generator reads:
165
+ - `ecosystem.yaml` — The brick and stack registry
166
+ - `awknowledge/laws/*.md` — The 18 laws
167
+
168
+ And writes JSON to `awkno/pages/`.
169
+
170
+ ### Test Locally
171
+
172
+ ```bash
173
+ pip install -e .
174
+ pytest
175
+
176
+ # Or run the CLI directly
177
+ python -m awkno.cli awdk
178
+ ```
179
+
180
+ ### Build and Publish
181
+
182
+ ```bash
183
+ pip install build
184
+ python -m build
185
+
186
+ # Publish to PyPI
187
+ twine upload dist/*
188
+ ```
189
+
190
+ ## Integration
191
+
192
+ ### In Your Own Code
193
+
194
+ ```python
195
+ from awkno import AwknoRegistry
196
+
197
+ registry = AwknoRegistry()
198
+ page = registry.get("awdk")
199
+ print(page.render())
200
+
201
+ # Search
202
+ results = registry.search("agent memory")
203
+ for page, score in results[:5]:
204
+ print(f"{page.topic}: {page.synopsis}")
205
+
206
+ # List by category
207
+ bricks = registry.list_by_category("brick")
208
+ laws = registry.list_by_category("law")
209
+ ```
210
+
211
+ ### As a Dependency
212
+
213
+ awkno has zero runtime dependencies (PyYAML is dev-only, for corpus generation).
214
+
215
+ ```toml
216
+ [project]
217
+ dependencies = [
218
+ "awkno",
219
+ ]
220
+ ```
221
+
222
+ ## Contributing
223
+
224
+ Read a law, apply it, send a pull request. The package itself is small and well-documented.
225
+
226
+ Pages are generated from `ecosystem.yaml` and law files — edits to those files flow into awkno on the next generation.
227
+
228
+ ## License
229
+
230
+ Apache 2.0. See [LICENSE](LICENSE).
231
+
232
+ ## Further Reading
233
+
234
+ - Ecosystem registry: https://github.com/Aitherium/ecosystem
235
+ - Laws and codex: https://github.com/Aitherium/awskills
236
+ - AitherWorld reference: https://aitherium.com
237
+
238
+ ---
239
+
240
+ **awkno** — read the principles once, apply them everywhere.
241
+
242
+ <!-- aither-ecosystem:start GENERATED from the ecosystem registry. Edits here are overwritten; change the registry instead. -->
243
+
244
+ ## The aw family
245
+
246
+ Standalone tools that share one idea: **replace something you would otherwise have to _trust_ with something you can _check_.**
247
+
248
+ Each installs on its own, works offline, and needs no account.
249
+
250
+ | | instead of trusting | you check |
251
+ |---|---|---|
252
+ | [awdk](https://github.com/Aitherium/awdk) | a framework's idea of how your agents should run | one loop you can read, pointed at a backend you already pay for |
253
+ | [awskills](https://github.com/Aitherium/awskills) | that an agent knows your procedure | the procedure written down, versioned, and loadable by any agent |
254
+ | [awm](https://github.com/Aitherium/awm) | that memory stayed in its lane | tenant:user:project scopes, so a write cannot cross a boundary |
255
+ | [awnode](https://github.com/Aitherium/awnode) | a vendor's cloud with every prompt | a local gateway routing to backends you chose |
256
+ | [awgraph](https://github.com/Aitherium/awgraph) | that grep found everything | an AST + tree-sitter call graph an agent can traverse |
257
+ | [awgit](https://github.com/Aitherium/awgit) | that no one else is editing this file | a lease, refused at commit time if you do not hold it |
258
+ | [awseal](https://github.com/Aitherium/awseal) | that the artifact came from who you think | an Ed25519 seal — the key that verifies is not the key that forges |
259
+ | [awshare](https://github.com/Aitherium/awshare) | that the download is intact | content-addressed bundles, verified on fetch |
260
+ | [awnest](https://github.com/Aitherium/awnest) | that there is a person on the other end | a verdict with evidence, where "we could not tell" is not "yes" |
261
+ | [awnboard](https://github.com/Aitherium/awnboard) | a share link anyone who sees it can use | an invitation addressed to one person, for one gate, revocable |
262
+ | [awnix](https://github.com/Aitherium/awnix) | that the box is what you left it as | an immutable image you built, with atomic rollback |
263
+ | [awrecover](https://github.com/Aitherium/awrecover) | that the restore worked | a restore that fully lands or does not land at all |
264
+ | [awrelay](https://github.com/Aitherium/awrelay) | a SaaS in the middle of your agents | findings, alerts and coordination over your own transport |
265
+ | [awmail](https://github.com/Aitherium/awmail) | a mailbox somebody else can read | mail your agents send and receive over your own server |
266
+ | [awfind](https://github.com/Aitherium/awfind) | one vendor's idea of the web | results from whichever providers you configured |
267
+ | [awbrowse](https://github.com/Aitherium/awbrowse) | that the page said what you were told | the render, the DOM and the requests it made |
268
+ | [aitherkvcache](https://github.com/Aitherium/aitherkvcache) | a vendor's quantisation defaults | sub-byte KV cache kernels you can benchmark yourself |
269
+ | [AitherZero](https://github.com/Aitherium/AitherZero) | a pile of scripts nobody has numbered | numbered, discoverable automation with declarative playbooks |
270
+ | [AitherConnect](https://github.com/Aitherium/AitherConnect) | what a page tells your browser to do | a federated search and desktop bridge you host |
271
+ | [awreason](https://github.com/Aitherium/awreason) | a confident paragraph | the phases it went through, and every tool call it made to get there |
272
+ | [awrecurse](https://github.com/Aitherium/awrecurse) | that everything you pasted in was actually read | which slices it opened, and what it concluded from each |
273
+ | [awprism](https://github.com/Aitherium/awprism) | the first explanation that fits | the ranked alternatives, and the observation that separates them |
274
+ | [awrepl](https://github.com/Aitherium/awrepl) | what the agent believes the value is | the value, printed from the live session |
275
+ | [awresearch](https://github.com/Aitherium/awresearch) | a summary of pages nobody opened | every claim against the source it came from |
276
+ | [awpredict](https://github.com/Aitherium/awpredict) | a model because it trained without erroring | its prediction against a self-updating lookup, on the rows that are actually novel |
277
+ | **awkno** _(you are here)_ | that the docs site is up, or that you remember the family | the whole ecosystem in your terminal, with no network at all |
278
+
279
+ [**awnix**](https://github.com/Aitherium/awnix) is the ground floor — A Linux you can hand to an agent — immutable base, capabilities included.
280
+
281
+ ## The Aitherium ecosystem
282
+
283
+ Every repository here is public. Each publishes an `aither-manifest.json` beside its page, so any surface can read every sibling's — the network is browsable from any node in it.
284
+
285
+ | repo | what it is | pages |
286
+ |---|---|---|
287
+ | [awdk](https://github.com/Aitherium/awdk) | Build AI agent fleets — 3 lines, any backend, local or cloud | [docs](https://aitherium.github.io/awdk/) |
288
+ | [awskills](https://github.com/Aitherium/awskills) | Portable agent skills — self-contained procedures an agent loads on demand | [docs](https://aitherium.github.io/awskills/) |
289
+ | [awm](https://github.com/Aitherium/awm) | A portable, scoped agent memory | [docs](https://aitherium.github.io/awm/) |
290
+ | [awnode](https://github.com/Aitherium/awnode) | A lightweight local gateway — bridges your apps to the AI backends you chose | [docs](https://aitherium.github.io/awnode/) |
291
+ | [awrun](https://github.com/Aitherium/awrun) | A priority-aware queue and dispatcher for agentic runs and ad-hoc CI builds | [docs](https://aitherium.github.io/awrun/) |
292
+ | [awgraph](https://github.com/Aitherium/awgraph) | A semantic code graph for agents — AST + tree-sitter, call graphs | [docs](https://aitherium.github.io/awgraph/) |
293
+ | [awgit](https://github.com/Aitherium/awgit) | Semantic version control on top of git — edit-ops and leases | [docs](https://aitherium.github.io/awgit/) |
294
+ | [awseal](https://github.com/Aitherium/awseal) | Sign an artifact so a stranger can verify it | [docs](https://aitherium.github.io/awseal/) |
295
+ | [awshare](https://github.com/Aitherium/awshare) | Publish an artifact and fetch it back verified | [docs](https://aitherium.github.io/awshare/) |
296
+ | [awdit](https://github.com/Aitherium/awdit) | An append-only audit trail whose gaps are DETECTABLE | [docs](https://aitherium.github.io/awdit/) |
297
+ | [awbac](https://github.com/Aitherium/awbac) | Role-based access control that fails closed and explains itself | [docs](https://aitherium.github.io/awbac/) |
298
+ | [awiam](https://github.com/Aitherium/awiam) | Who is this caller? A directory and session store that fails honestly | [docs](https://aitherium.github.io/awiam/) |
299
+ | [awtunnel](https://github.com/Aitherium/awtunnel) | Reach a service that has no public address | [docs](https://aitherium.github.io/awtunnel/) |
300
+ | [awnest](https://github.com/Aitherium/awnest) | Prove there is a human before you let them into the nest | [docs](https://aitherium.github.io/awnest/) |
301
+ | [awnboard](https://github.com/Aitherium/awnboard) | A front gate you can put in front of anything, and hand someone the key to | [docs](https://aitherium.github.io/awnboard/) |
302
+ | [awnix](https://github.com/Aitherium/awnix) | A Linux you can hand to an agent — immutable base, capabilities included | [docs](https://aitherium.github.io/awnix/) |
303
+ | [awrecover](https://github.com/Aitherium/awrecover) | Labelled snapshots with an all-or-nothing restore | [docs](https://aitherium.github.io/awrecover/) |
304
+ | [awrelay](https://github.com/Aitherium/awrelay) | Portable agent messaging — findings, alerts, coordination | [docs](https://aitherium.github.io/awrelay/) |
305
+ | [awmail](https://github.com/Aitherium/awmail) | Give an agent an email address — send, and actually receive | [docs](https://aitherium.github.io/awmail/) |
306
+ | [awnet](https://github.com/Aitherium/awnet) | The agentic web — agents host a mesh, and agents join one | [docs](https://aitherium.github.io/awnet/) |
307
+ | [awfind](https://github.com/Aitherium/awfind) | A portable search client — query, results, ranking | [docs](https://aitherium.github.io/awfind/) |
308
+ | [awbrowse](https://github.com/Aitherium/awbrowse) | A portable browser client — navigate, console, network, DOM, screenshot | [docs](https://aitherium.github.io/awbrowse/) |
309
+ | [awknowledge](https://github.com/Aitherium/awknowledge) | How to run a coding agent so the result survives — the laws, with evidence | [docs](https://aitherium.github.io/awknowledge/) |
310
+ | [aitherkvcache](https://github.com/Aitherium/aitherkvcache) | Near-optimal KV cache quantization for LLM inference — sub-byte compression | [docs](https://aitherium.github.io/aitherkvcache/) |
311
+ | [AitherZero](https://github.com/Aitherium/AitherZero) | PowerShell 7+ automation framework — numbered, self-describing scripts | [docs](https://aitherium.github.io/AitherZero/) |
312
+ | [AitherConnect](https://github.com/Aitherium/AitherConnect) | Browser extension — federated AI search, page context, and the Living OS overlay | [docs](https://aitherium.github.io/AitherConnect/) |
313
+ | [awreason](https://github.com/Aitherium/awreason) | A portable reasoning client — sessions, phases, thoughts, and the chain that produced the answer | [docs](https://aitherium.github.io/awreason/) |
314
+ | [awrecurse](https://github.com/Aitherium/awrecurse) | Answer a question over a context far larger than the window — recursively, with the trace kept | [docs](https://aitherium.github.io/awrecurse/) |
315
+ | [awprism](https://github.com/Aitherium/awprism) | Turn a failure into ranked hypotheses — and say what would confirm each one | [docs](https://aitherium.github.io/awprism/) |
316
+ | [awrepl](https://github.com/Aitherium/awrepl) | A REPL an agent can actually use — state that survives between turns | [docs](https://aitherium.github.io/awrepl/) |
317
+ | [awresearch](https://github.com/Aitherium/awresearch) | Ask a research question, get a cited report you can check | [docs](https://aitherium.github.io/awresearch/) |
318
+ | [awpredict](https://github.com/Aitherium/awpredict) | Predict what your environment does next, and how surprised you were | [docs](https://aitherium.github.io/awpredict/) |
319
+ | **awkno** _(you are here)_ | The man page for the Aither World — every brick, stack and law, offline | [docs](https://aitherium.github.io/awkno/) |
320
+
321
+ <!-- aither-ecosystem:end -->
@@ -0,0 +1,91 @@
1
+ awkno/__init__.py,sha256=WQ9FhfAyYBUFxGvZ5MVBlyYP9s6owCbxcVBNIQoOTTI,584
2
+ awkno/_doctor.py,sha256=Iw1M2fs57W9LF1BjgKsC0wu0bTG5EcBcrRN1cLTdbLU,4256
3
+ awkno/cli.py,sha256=gpoSfOWgC5pUEK8nxPJTXpgt1QAuDTeHqWYkv7P-4E8,18249
4
+ awkno/corpus.py,sha256=7hGIRsttruTCl7ZYNxky8mlzz_199ioK_lKz74uzlVw,6415
5
+ awkno/generate.py,sha256=_84SiSjkERZ5GIM9Zjm7StpPVHt-QUXm7jyGsAJnkm8,18805
6
+ awkno/pages/agent-senses.json,sha256=Vk-0BSgrUfOItqXFxV0GL_CAKctLPWYuK77SEw0Av7M,331
7
+ awkno/pages/agent-vm.json,sha256=Je4OOQ-jTro3DdS98XJp3zHAagr9BCateDBU34xoV1U,512
8
+ awkno/pages/aitherconnect.json,sha256=cj8wzW1sz9-3pRhLZj1a-rnmroxD2UOwQZFMJLPoonQ,385
9
+ awkno/pages/aitherkvcache.json,sha256=mh7vvepk7IY-eAUHBBHvD-TN4JJlBsK0EsST6pv4-sA,495
10
+ awkno/pages/aitherzero.json,sha256=k8gkuNOw3vnSSIMwNPk2grwBlKAkG0YBp2MX63K9ugk,467
11
+ awkno/pages/awarena.json,sha256=RP_mJZos-g2_gmxJYqpOCzOlswZCKFOJ6fZmwj1A2CU,903
12
+ awkno/pages/awask.json,sha256=n63cVxDVLv1UkfRBEjdZFOCk35qF7CDh5ltalmqQ_G0,750
13
+ awkno/pages/awbac.json,sha256=GSC18jjlE-t0Fo4CqWvuXbGt7V9d0P5tTvniWlnlv7c,501
14
+ awkno/pages/awbrowse.json,sha256=yb9CZCBKqSlRWkWsnFyxsQEvEFt29TSK-uadGSOb6ls,496
15
+ awkno/pages/awdit.json,sha256=65h_cjESxB9AgeESGUP_5v--WZXwNV0vyR4nBMCL_v8,503
16
+ awkno/pages/awdk.json,sha256=qAvjGss549MaeDTcTAoi19K5X1cUsh52I_B3RQrb5pA,555
17
+ awkno/pages/awevolve.json,sha256=xwobhrd4l4iZT9XRiBx7e5sTKdwFrvAsNiNwvIsKT4Y,1046
18
+ awkno/pages/awfind.json,sha256=ygHdON-C3GGEcQlcegJS2S8gT4USrhzqk7kdLxXOKHo,483
19
+ awkno/pages/awgit.json,sha256=RqWPnZso7rK8sxN4ZrQ2w0sYoLZHY6pFk1bNvF7Vpc0,487
20
+ awkno/pages/awgraph.json,sha256=O6-JqrauelcCfddPLkrG6pqv4Q1Wj3diQJpsqOtkVjU,452
21
+ awkno/pages/awiam.json,sha256=62k9jMecHJzyi41G1ezrVsYfY4tlNHmuX4oeoxHcbuE,594
22
+ awkno/pages/awkit.json,sha256=9zURcrbW0MjirtPHt7mCOP0JzhZMpEKAV9onYxcvdnQ,837
23
+ awkno/pages/awkno.json,sha256=7HoDI-4MGESO8FSPSrAhB-jcO3Gx3-hWS67LGymzRMw,659
24
+ awkno/pages/awknowledge.json,sha256=XqZPCnK565hSrB9BsApbyxIlnJdREMIKSDE4FAQ8rqE,517
25
+ awkno/pages/awm.json,sha256=u3BaswAqDX0HsuPRQJQAOofYKbtxfMtdhrhxsL_Vvnc,506
26
+ awkno/pages/awmail.json,sha256=ERBslbDtIvlUvEbeBK9WTHEaJcHATAcr4-c1g-2UI7k,967
27
+ awkno/pages/awnboard.json,sha256=xUaKaogWO-LaFD3mTqIBoTE-7iQvOhBx9sqwC9FjFPE,854
28
+ awkno/pages/awnest.json,sha256=n6hj74FcPhTmJMCE5l6rSUld3DASPsF4TRzDWelJwZ8,810
29
+ awkno/pages/awnet.json,sha256=uBZSk4O6dJrsUEk5qZbBa6lchRzKS8PgWLm4hSVVJ2E,614
30
+ awkno/pages/awnix.json,sha256=YUXzaElCzXdHcpFbtvOgQHt5-eDuqxzdAyxYmu4dEys,558
31
+ awkno/pages/awnode.json,sha256=Eda6VjVZXFlVh-JZxzXn4EY8mcwzNGR_zMgWPdFZYM8,422
32
+ awkno/pages/awpack.json,sha256=1_jdbhfTrHhbx7h0W7V7vz2Tvss7qJ1fgiDewbHQbNc,808
33
+ awkno/pages/awpredict.json,sha256=OJJLF70JPhZs4D2DBYrhL-gfPixgZoy5p6ut2XIwvsk,571
34
+ awkno/pages/awprism.json,sha256=HeRGIH7VKoIZ2Ry8ujp2sfXC9sSq6Qj1-c8FnES4k9M,842
35
+ awkno/pages/awreason.json,sha256=BIYs78uYw_oJjzURQks0GmvIAgIgvFxg9ByCUaAuqFg,818
36
+ awkno/pages/awrecover.json,sha256=HltixRd6xaBHJu6OZ-bElEl9hS7nP1qtjlWniGBgtqQ,471
37
+ awkno/pages/awrecurse.json,sha256=TLEGHbXj-2kjy6EVcI-8YQRQIqXUyzEB4108IRh_9Mk,785
38
+ awkno/pages/awrelay.json,sha256=Wva8E-Qyc_xPV1NvBpCBQomMEXrTIuj6JSgtg_8b2JI,473
39
+ awkno/pages/awrepl.json,sha256=QNQnG5NIIR6Q6gcvlt4dG0WFrXBwqTxDhfbPi8gyJTI,707
40
+ awkno/pages/awresearch.json,sha256=nGpGjg9gfh-BotDjELkz7M-Abe4COlZOi5TEWzULNng,693
41
+ awkno/pages/awrun.json,sha256=fY-J1PQjDrMz8PRX6aEyGqNWi5W1EitiZLwG2KZT148,584
42
+ awkno/pages/awseal.json,sha256=kjD0FsMdXQHF8D1ZgeVmwMO2bs6NfM11r2U3A080W-0,413
43
+ awkno/pages/awsh.json,sha256=lU5hWGaiuB0paoxO7hYjQqQRoIregKCjml63CF8uGv4,714
44
+ awkno/pages/awshare.json,sha256=S8nY0uoeAhI14-uS0LwzsV72-C1-XzkG9Hkh9ChY6f0,458
45
+ awkno/pages/awskills.json,sha256=gQtkVa-DgkS98jCe3TSfSaVe1C9apbDktq8UiUsukzo,506
46
+ awkno/pages/awsync.json,sha256=WB4I_JImrlhypsdzngJrjzZEZKAR6en_4pbdKJ_9sbo,685
47
+ awkno/pages/awtunnel.json,sha256=hkM01T0sIKJpLKlrr5CydkEWatIk4zpV-GQ9x_mID-0,506
48
+ awkno/pages/cited-research.json,sha256=9uA1nY0JrmnNR2j_ixIweSYIBiRI005S3HECJKV5Fps,643
49
+ awkno/pages/gobbonet-agentic.json,sha256=gyh4bt1lDQgI2lGgNMcptdEAklcgx8aIzirZ50iv-r8,613
50
+ awkno/pages/guide-00.json,sha256=qrsj_bWmKWJguFGZfkJkDHD9JxVUtNS_KU0mqneA_jo,3249
51
+ awkno/pages/guide-01.json,sha256=L_FN22OqjDONuoKVV8ir0KdU-klnPAZoIlaT0Cv-iSY,3597
52
+ awkno/pages/guide-02.json,sha256=EG2jjJJoutk5PJR-HWkWhONU4_FZeeR7BNYi7QPBgbw,4326
53
+ awkno/pages/guide-03.json,sha256=iqAoCFKknb_jIlUQoWyGmo9SWpyabPNqE4AD7PCmiuY,3898
54
+ awkno/pages/guide-04.json,sha256=ccmNSbyjklvfKSXkDT2gUsEsouNfczkWC_mFhojKeiw,3994
55
+ awkno/pages/guide-05.json,sha256=41-q9zrdKsRrkuTuAvYJ6wR_FCo-BKQSOLWtfZA4jlE,3402
56
+ awkno/pages/guide-06.json,sha256=OM8nUtrC9K5UAiyjSLGIcddNeHHY5JoLWSI5JA34kJE,3279
57
+ awkno/pages/guide-07.json,sha256=Hm7bt31Q5ezRbi3xjnmnbM_u9yltBjnHETYMM0ppJxo,4866
58
+ awkno/pages/guide-08.json,sha256=LX4njtT8Y13PazipicB-wwMYjDq1Oz2w4wqimUprFdI,3697
59
+ awkno/pages/guide-09.json,sha256=Rle6oVGlZda7ccteLbYn0umlE11QvpqAeNsJcKQfljo,2964
60
+ awkno/pages/guide.json,sha256=zv85uqmc5F6i4G-R9S1yQxOWJa_xXIM7kWzvVBh4mRg,988
61
+ awkno/pages/law-01.json,sha256=QtzPnpqGOIbgtQFKxkZMuCQ_gZVpGmCmtyGDPnRmAkE,3258
62
+ awkno/pages/law-02.json,sha256=n3AvLpAcrAA293Fc8MhbyJrlFyGs5aL4b6j0zrTjUgA,3020
63
+ awkno/pages/law-03.json,sha256=AA7o-7BvG-pbdg2fmWKkUj5UHIUWpHctFC2st97oWFo,3029
64
+ awkno/pages/law-04.json,sha256=QHkHnPgLIfn1PoMtVEpzYP4GwYDz09fJjBisBfCWf4s,3226
65
+ awkno/pages/law-05.json,sha256=tp8aT73vMsh4GkCKMHwbQV72efaVByZlxBftVsWmL6g,3785
66
+ awkno/pages/law-06.json,sha256=P5ydXg-YgwlmWG8IxZ0dsA6D-wOl1HCYfVELDrkKOSA,3152
67
+ awkno/pages/law-07.json,sha256=bOaJzoD-zUWOUF4IkzvgCNIUEURQrNGQFSt1lC2NZ5o,3513
68
+ awkno/pages/law-08.json,sha256=8-SN3U1LF8yPyS-P_1AaFcnolsnp7SJEBB3UypH7uXk,3180
69
+ awkno/pages/law-09.json,sha256=PeGJ2n830BZOF-OTCujqEKH6O-9Ry-KgT08OMbgWtz4,3429
70
+ awkno/pages/law-10.json,sha256=RrTzB8LyKVxTijTEDXw2jodpKKnX4OeOu13cb0lopoU,3505
71
+ awkno/pages/law-11.json,sha256=i6-9gK6Us42HeHRZhn_PWECmlewLvZ1Tzh9H-3Lk_Io,3362
72
+ awkno/pages/law-12.json,sha256=JqgU61brQh78Q8rLOUcs3N4aBUauckrnYrZ5W_aUMDs,3427
73
+ awkno/pages/law-13.json,sha256=tBKEVmdnn6KQSCnkBGO149rhoAVT05enlTkETN67Wc0,3756
74
+ awkno/pages/law-14.json,sha256=sRj-7B6YbG_TCxMcDWHUAUmHz6hU7F60wy3YAc6IMiI,3795
75
+ awkno/pages/law-15.json,sha256=e-8bpbL7XekySlotiSrSgu9EjM_2PpFFIjgsbUEO3Jc,3733
76
+ awkno/pages/law-16.json,sha256=FXdRsz6E3CALxvaSg5o0kkx_GWilH1y7X0Y04gRvySs,3913
77
+ awkno/pages/law-17.json,sha256=WIRFlyMOtJlbbcpa9-a-yHMTGEiuZ8QMxU37UAg_q5A,3941
78
+ awkno/pages/law-18.json,sha256=Ghf_nBIMRokvyCY8RQxF14ffGJjIS4et8jJn_PZXf5M,3612
79
+ awkno/pages/law-19.json,sha256=8KWBw6pdFXirZ58smVnB1Wsl_nG5ZKddFzJPqZAjjBo,4233
80
+ awkno/pages/one-surface.json,sha256=OOsb8qUOBxCxESR7WuNMnfc1UzSZF_YoCS9qRv8S-kI,1974
81
+ awkno/pages/provenance.json,sha256=wB1i73zMcjNGpiuESgVSrKlxnyJYv0_WxJFA8wPlE9c,367
82
+ awkno/pages/shared-worktree.json,sha256=zDTNaHpF5Zp1PixmiEYRP5R3VnW_M1AggXzuM2UMMr4,402
83
+ awkno/pages/the-front-door.json,sha256=rpkaVw4_zfRUbJkNFnd06uZcq4_SnP_hBPrtV2xV2KA,602
84
+ awkno/pages/the-reasoning-loop.json,sha256=t_qMYF7DvnkifaZlROis4Qo93KalEdSyoaHmClC3rdM,807
85
+ awkno/pages/who-what-did.json,sha256=j9P0h-t6KKy2G7Q5-Ld0YyVxjOGJTJoDE7ibxENd6YE,529
86
+ awkno-0.2.0.dist-info/licenses/LICENSE,sha256=vUDTWBRP7Wp9y6uUHHO3Pq8TmODgUQ8AKfobbOKGDN0,5613
87
+ awkno-0.2.0.dist-info/METADATA,sha256=6ezAVV3LLxeZKHM9U6LXcOsxy-l_ES7gE14rdABd5Gk,17405
88
+ awkno-0.2.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
89
+ awkno-0.2.0.dist-info/entry_points.txt,sha256=7u8Q6vsNuP_R3owgns6RH5RwJKPG7MIN2uz-acloDFU,41
90
+ awkno-0.2.0.dist-info/top_level.txt,sha256=2VYMJUddiRkYYoNsdeMlX8gc_f0xRXWF6eihBgmQ-n8,6
91
+ awkno-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ awkno = awkno.cli:main