@ahmed-g-gad/apothem 0.1.1

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 (674) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +21 -0
  3. package/LICENSES/MIT.txt +18 -0
  4. package/LICENSES/PSF-2.0.txt +47 -0
  5. package/README.md +549 -0
  6. package/bin/README.md +37 -0
  7. package/bin/apothem.mjs +78 -0
  8. package/package.json +75 -0
  9. package/pyproject.toml +347 -0
  10. package/src/apothem/README.md +52 -0
  11. package/src/apothem/__init__.py +66 -0
  12. package/src/apothem/__main__.py +28 -0
  13. package/src/apothem/_vendor/.keep +0 -0
  14. package/src/apothem/_vendor/__init__.py +25 -0
  15. package/src/apothem/_vendor/attr/__init__.py +104 -0
  16. package/src/apothem/_vendor/attr/__init__.pyi +389 -0
  17. package/src/apothem/_vendor/attr/_cmp.py +160 -0
  18. package/src/apothem/_vendor/attr/_cmp.pyi +13 -0
  19. package/src/apothem/_vendor/attr/_compat.py +99 -0
  20. package/src/apothem/_vendor/attr/_config.py +31 -0
  21. package/src/apothem/_vendor/attr/_funcs.py +497 -0
  22. package/src/apothem/_vendor/attr/_make.py +3406 -0
  23. package/src/apothem/_vendor/attr/_next_gen.py +674 -0
  24. package/src/apothem/_vendor/attr/_typing_compat.pyi +15 -0
  25. package/src/apothem/_vendor/attr/_version_info.py +89 -0
  26. package/src/apothem/_vendor/attr/_version_info.pyi +9 -0
  27. package/src/apothem/_vendor/attr/converters.py +162 -0
  28. package/src/apothem/_vendor/attr/converters.pyi +19 -0
  29. package/src/apothem/_vendor/attr/exceptions.py +95 -0
  30. package/src/apothem/_vendor/attr/exceptions.pyi +17 -0
  31. package/src/apothem/_vendor/attr/filters.py +72 -0
  32. package/src/apothem/_vendor/attr/filters.pyi +6 -0
  33. package/src/apothem/_vendor/attr/py.typed +0 -0
  34. package/src/apothem/_vendor/attr/setters.py +79 -0
  35. package/src/apothem/_vendor/attr/setters.pyi +20 -0
  36. package/src/apothem/_vendor/attr/validators.py +750 -0
  37. package/src/apothem/_vendor/attr/validators.pyi +140 -0
  38. package/src/apothem/_vendor/attr.LICENSE +21 -0
  39. package/src/apothem/_vendor/attrs/__init__.py +72 -0
  40. package/src/apothem/_vendor/attrs/__init__.pyi +314 -0
  41. package/src/apothem/_vendor/attrs/converters.py +3 -0
  42. package/src/apothem/_vendor/attrs/exceptions.py +3 -0
  43. package/src/apothem/_vendor/attrs/filters.py +3 -0
  44. package/src/apothem/_vendor/attrs/py.typed +0 -0
  45. package/src/apothem/_vendor/attrs/setters.py +3 -0
  46. package/src/apothem/_vendor/attrs/validators.py +3 -0
  47. package/src/apothem/_vendor/attrs.LICENSE +21 -0
  48. package/src/apothem/_vendor/jsonschema/__init__.py +120 -0
  49. package/src/apothem/_vendor/jsonschema/__main__.py +6 -0
  50. package/src/apothem/_vendor/jsonschema/_format.py +546 -0
  51. package/src/apothem/_vendor/jsonschema/_keywords.py +449 -0
  52. package/src/apothem/_vendor/jsonschema/_legacy_keywords.py +449 -0
  53. package/src/apothem/_vendor/jsonschema/_types.py +204 -0
  54. package/src/apothem/_vendor/jsonschema/_typing.py +29 -0
  55. package/src/apothem/_vendor/jsonschema/_utils.py +355 -0
  56. package/src/apothem/_vendor/jsonschema/benchmarks/__init__.py +5 -0
  57. package/src/apothem/_vendor/jsonschema/benchmarks/const_vs_enum.py +30 -0
  58. package/src/apothem/_vendor/jsonschema/benchmarks/contains.py +28 -0
  59. package/src/apothem/_vendor/jsonschema/benchmarks/import_benchmark.py +31 -0
  60. package/src/apothem/_vendor/jsonschema/benchmarks/issue232/issue.json +2653 -0
  61. package/src/apothem/_vendor/jsonschema/benchmarks/issue232.py +25 -0
  62. package/src/apothem/_vendor/jsonschema/benchmarks/json_schema_test_suite.py +12 -0
  63. package/src/apothem/_vendor/jsonschema/benchmarks/nested_schemas.py +56 -0
  64. package/src/apothem/_vendor/jsonschema/benchmarks/subcomponents.py +42 -0
  65. package/src/apothem/_vendor/jsonschema/benchmarks/unused_registry.py +35 -0
  66. package/src/apothem/_vendor/jsonschema/benchmarks/useless_applicator_schemas.py +106 -0
  67. package/src/apothem/_vendor/jsonschema/benchmarks/useless_keywords.py +32 -0
  68. package/src/apothem/_vendor/jsonschema/benchmarks/validator_creation.py +14 -0
  69. package/src/apothem/_vendor/jsonschema/cli.py +292 -0
  70. package/src/apothem/_vendor/jsonschema/exceptions.py +490 -0
  71. package/src/apothem/_vendor/jsonschema/protocols.py +230 -0
  72. package/src/apothem/_vendor/jsonschema/validators.py +1410 -0
  73. package/src/apothem/_vendor/jsonschema.LICENSE +19 -0
  74. package/src/apothem/_vendor/jsonschema_specifications/__init__.py +12 -0
  75. package/src/apothem/_vendor/jsonschema_specifications/_core.py +38 -0
  76. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
  77. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
  78. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
  79. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
  80. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
  81. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
  82. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
  83. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
  84. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
  85. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
  86. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
  87. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
  88. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
  89. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
  90. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
  91. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
  92. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
  93. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
  94. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
  95. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
  96. package/src/apothem/_vendor/jsonschema_specifications.LICENSE +19 -0
  97. package/src/apothem/_vendor/referencing/__init__.py +7 -0
  98. package/src/apothem/_vendor/referencing/_attrs.py +31 -0
  99. package/src/apothem/_vendor/referencing/_attrs.pyi +21 -0
  100. package/src/apothem/_vendor/referencing/_core.py +739 -0
  101. package/src/apothem/_vendor/referencing/exceptions.py +165 -0
  102. package/src/apothem/_vendor/referencing/jsonschema.py +642 -0
  103. package/src/apothem/_vendor/referencing/py.typed +0 -0
  104. package/src/apothem/_vendor/referencing/retrieval.py +94 -0
  105. package/src/apothem/_vendor/referencing/typing.py +61 -0
  106. package/src/apothem/_vendor/referencing.LICENSE +19 -0
  107. package/src/apothem/_vendor/rpds/__init__.py +251 -0
  108. package/src/apothem/_vendor/typing_extensions.LICENSE +279 -0
  109. package/src/apothem/_vendor/typing_extensions.py +4317 -0
  110. package/src/apothem/_vendor/vendor.txt +22 -0
  111. package/src/apothem/_vendor/yaml/__init__.py +389 -0
  112. package/src/apothem/_vendor/yaml/composer.py +138 -0
  113. package/src/apothem/_vendor/yaml/constructor.py +748 -0
  114. package/src/apothem/_vendor/yaml/cyaml.py +100 -0
  115. package/src/apothem/_vendor/yaml/dumper.py +61 -0
  116. package/src/apothem/_vendor/yaml/emitter.py +1137 -0
  117. package/src/apothem/_vendor/yaml/error.py +74 -0
  118. package/src/apothem/_vendor/yaml/events.py +85 -0
  119. package/src/apothem/_vendor/yaml/loader.py +63 -0
  120. package/src/apothem/_vendor/yaml/nodes.py +48 -0
  121. package/src/apothem/_vendor/yaml/parser.py +588 -0
  122. package/src/apothem/_vendor/yaml/reader.py +185 -0
  123. package/src/apothem/_vendor/yaml/representer.py +388 -0
  124. package/src/apothem/_vendor/yaml/resolver.py +226 -0
  125. package/src/apothem/_vendor/yaml/scanner.py +1435 -0
  126. package/src/apothem/_vendor/yaml/serializer.py +110 -0
  127. package/src/apothem/_vendor/yaml/tokens.py +103 -0
  128. package/src/apothem/_vendor/yaml.LICENSE +20 -0
  129. package/src/apothem/agents/README.md +60 -0
  130. package/src/apothem/agents/codebase-explorer.md +91 -0
  131. package/src/apothem/agents/convention-auditor.md +93 -0
  132. package/src/apothem/agents/dependency-auditor.md +97 -0
  133. package/src/apothem/agents/fact-checker.md +84 -0
  134. package/src/apothem/agents/mcp-builder.md +86 -0
  135. package/src/apothem/agents/memory-auditor.md +93 -0
  136. package/src/apothem/agents/prompt-evaluator.md +87 -0
  137. package/src/apothem/agents/quality-gate.md +103 -0
  138. package/src/apothem/agents/refactor-surgeon.md +74 -0
  139. package/src/apothem/agents/research-scout.md +73 -0
  140. package/src/apothem/agents/security-scanner.md +83 -0
  141. package/src/apothem/agents/test-runner.md +84 -0
  142. package/src/apothem/audit/README.md +73 -0
  143. package/src/apothem/audit/_scan_lib.py +182 -0
  144. package/src/apothem/audit/analyze_graph.py +260 -0
  145. package/src/apothem/audit/build_capability_graph.py +607 -0
  146. package/src/apothem/audit/build_inventory.py +657 -0
  147. package/src/apothem/audit/build_plans_provenance.py +997 -0
  148. package/src/apothem/audit/check_links.py +389 -0
  149. package/src/apothem/audit/classify_artifacts.py +381 -0
  150. package/src/apothem/audit/deprecated-tokens.txt +10 -0
  151. package/src/apothem/audit/execute_plans_migration.py +491 -0
  152. package/src/apothem/audit/known-projects.txt +15 -0
  153. package/src/apothem/audit/render_capability_index.py +467 -0
  154. package/src/apothem/audit/render_inventory.py +405 -0
  155. package/src/apothem/audit/scan_ai_surfaces.py +1125 -0
  156. package/src/apothem/audit/scan_ai_surfaces_coarse.py +261 -0
  157. package/src/apothem/audit/scan_drift_features.py +143 -0
  158. package/src/apothem/audit/scan_frontmatter.py +293 -0
  159. package/src/apothem/audit/scan_header_coverage.py +1134 -0
  160. package/src/apothem/audit/scan_plan_leakage.py +540 -0
  161. package/src/apothem/audit/scan_plans_discipline.py +188 -0
  162. package/src/apothem/audit/scan_secrets_pii.py +245 -0
  163. package/src/apothem/audit/scan_stale_tokens.py +296 -0
  164. package/src/apothem/audit/synthesize_drift.py +205 -0
  165. package/src/apothem/benchmarks/README.md +33 -0
  166. package/src/apothem/benchmarks/__init__.py +3 -0
  167. package/src/apothem/benchmarks/bench_agents.py +63 -0
  168. package/src/apothem/benchmarks/bench_hooks.py +93 -0
  169. package/src/apothem/benchmarks/bench_install.py +58 -0
  170. package/src/apothem/benchmarks/bench_tests.py +93 -0
  171. package/src/apothem/benchmarks/bench_validate_ecosystem.py +84 -0
  172. package/src/apothem/cli/README.md +33 -0
  173. package/src/apothem/cli/__init__.py +229 -0
  174. package/src/apothem/cli/_cmd_completion.py +88 -0
  175. package/src/apothem/cli/_cmd_diff.py +181 -0
  176. package/src/apothem/cli/_cmd_doctor.py +143 -0
  177. package/src/apothem/cli/_cmd_harnesses.py +167 -0
  178. package/src/apothem/cli/_cmd_install.py +327 -0
  179. package/src/apothem/cli/_cmd_migrate_workspace.py +143 -0
  180. package/src/apothem/cli/_cmd_profile.py +341 -0
  181. package/src/apothem/cli/_cmd_status.py +180 -0
  182. package/src/apothem/cli/_cmd_uninstall.py +215 -0
  183. package/src/apothem/cli/_cmd_update.py +397 -0
  184. package/src/apothem/cli/_cmd_verify.py +194 -0
  185. package/src/apothem/cli/_common_flags.py +90 -0
  186. package/src/apothem/cli/_epilogs.py +296 -0
  187. package/src/apothem/cli/_helpers.py +857 -0
  188. package/src/apothem/cli/_json_formatter.py +21 -0
  189. package/src/apothem/cli/_materialize.py +376 -0
  190. package/src/apothem/cli/completions/apothem.bash +30 -0
  191. package/src/apothem/cli/completions/apothem.fish +19 -0
  192. package/src/apothem/cli/completions/apothem.ps1 +27 -0
  193. package/src/apothem/cli/completions/apothem.zsh +42 -0
  194. package/src/apothem/cli/reference_export.py +126 -0
  195. package/src/apothem/commands/README.md +125 -0
  196. package/src/apothem/commands/a11y-audit.md +203 -0
  197. package/src/apothem/commands/architecture-review.md +194 -0
  198. package/src/apothem/commands/audit.md +165 -0
  199. package/src/apothem/commands/code-audit.md +218 -0
  200. package/src/apothem/commands/code-review.md +193 -0
  201. package/src/apothem/commands/dependency-audit.md +209 -0
  202. package/src/apothem/commands/docs-review.md +199 -0
  203. package/src/apothem/commands/elevate.md +285 -0
  204. package/src/apothem/commands/eval.md +149 -0
  205. package/src/apothem/commands/fortress.md +172 -0
  206. package/src/apothem/commands/freshify.md +168 -0
  207. package/src/apothem/commands/github-deploy-fresh.md +178 -0
  208. package/src/apothem/commands/github-deploy-next.md +167 -0
  209. package/src/apothem/commands/perf-audit.md +198 -0
  210. package/src/apothem/commands/plan-amend.md +104 -0
  211. package/src/apothem/commands/plan-audit.md +127 -0
  212. package/src/apothem/commands/plan-design.md +257 -0
  213. package/src/apothem/commands/plan-execute.md +495 -0
  214. package/src/apothem/commands/plan-generate.md +351 -0
  215. package/src/apothem/commands/plan-review.md +555 -0
  216. package/src/apothem/commands/plan-spec.md +359 -0
  217. package/src/apothem/commands/plan-status.md +222 -0
  218. package/src/apothem/commands/plan.md +173 -0
  219. package/src/apothem/commands/projectify.md +142 -0
  220. package/src/apothem/commands/release-readiness.md +142 -0
  221. package/src/apothem/commands/research-analysis.md +241 -0
  222. package/src/apothem/commands/research-design.md +231 -0
  223. package/src/apothem/commands/research-disseminate.md +225 -0
  224. package/src/apothem/commands/research-experiment.md +232 -0
  225. package/src/apothem/commands/research-ideate.md +213 -0
  226. package/src/apothem/commands/research-paper.md +252 -0
  227. package/src/apothem/commands/research-proposal.md +220 -0
  228. package/src/apothem/commands/research-publish.md +255 -0
  229. package/src/apothem/commands/research-review.md +251 -0
  230. package/src/apothem/commands/research-sources.md +266 -0
  231. package/src/apothem/commands/research-spec.md +255 -0
  232. package/src/apothem/commands/research-synthesis.md +233 -0
  233. package/src/apothem/commands/research-theory.md +218 -0
  234. package/src/apothem/commands/research.md +181 -0
  235. package/src/apothem/commands/security-audit.md +196 -0
  236. package/src/apothem/commands/supply-chain-audit.md +192 -0
  237. package/src/apothem/commands/test-suite.md +146 -0
  238. package/src/apothem/commands/threat-model-audit.md +199 -0
  239. package/src/apothem/commands/ux-review.md +202 -0
  240. package/src/apothem/commands/workflow.md +162 -0
  241. package/src/apothem/conformity/README.md +173 -0
  242. package/src/apothem/conformity/__init__.py +1 -0
  243. package/src/apothem/conformity/_grep_base.py +93 -0
  244. package/src/apothem/conformity/agent_capability_grep.py +306 -0
  245. package/src/apothem/conformity/agents_md_coverage_grep.py +382 -0
  246. package/src/apothem/conformity/agnosticism_grep.py +311 -0
  247. package/src/apothem/conformity/always_on_budget_grep.py +318 -0
  248. package/src/apothem/conformity/bare_except_grep.py +115 -0
  249. package/src/apothem/conformity/binding_reciprocity_grep.py +151 -0
  250. package/src/apothem/conformity/brand_mark_grep.py +272 -0
  251. package/src/apothem/conformity/commented_out_code_grep.py +176 -0
  252. package/src/apothem/conformity/completion_claim_grep.py +169 -0
  253. package/src/apothem/conformity/conventional_commit_grep.py +319 -0
  254. package/src/apothem/conformity/copilot_instructions_presence_grep.py +324 -0
  255. package/src/apothem/conformity/cross_platform_matrix_grep.py +297 -0
  256. package/src/apothem/conformity/determinism_grep.py +306 -0
  257. package/src/apothem/conformity/diagram_staleness_grep.py +154 -0
  258. package/src/apothem/conformity/dynamism_grep.py +284 -0
  259. package/src/apothem/conformity/editorconfig_presence_grep.py +281 -0
  260. package/src/apothem/conformity/file_header_grep.py +502 -0
  261. package/src/apothem/conformity/freshness_token_grep.py +233 -0
  262. package/src/apothem/conformity/frontmatter_grep.py +274 -0
  263. package/src/apothem/conformity/frontmatter_value_grep.py +386 -0
  264. package/src/apothem/conformity/gate.py +1386 -0
  265. package/src/apothem/conformity/gitattributes_presence_grep.py +238 -0
  266. package/src/apothem/conformity/harden_runner_grep.py +320 -0
  267. package/src/apothem/conformity/hedging_grep.py +129 -0
  268. package/src/apothem/conformity/license_author_consistency_grep.py +204 -0
  269. package/src/apothem/conformity/link_check.py +327 -0
  270. package/src/apothem/conformity/magic_number_grep.py +182 -0
  271. package/src/apothem/conformity/multi_surface_coherence_grep.py +620 -0
  272. package/src/apothem/conformity/naming_grep.py +224 -0
  273. package/src/apothem/conformity/no_global_plans_grep.py +339 -0
  274. package/src/apothem/conformity/no_toplevel_docs_grep.py +120 -0
  275. package/src/apothem/conformity/oidc_trusted_publishing_grep.py +291 -0
  276. package/src/apothem/conformity/option_annotation_grep.py +352 -0
  277. package/src/apothem/conformity/orphan_output_grep.py +206 -0
  278. package/src/apothem/conformity/permissions_minimum_scope_grep.py +299 -0
  279. package/src/apothem/conformity/plain_language_grep.py +559 -0
  280. package/src/apothem/conformity/plan_next_step_consistency_grep.py +450 -0
  281. package/src/apothem/conformity/plan_suite_structure_grep.py +534 -0
  282. package/src/apothem/conformity/plans_discipline_language_grep.py +245 -0
  283. package/src/apothem/conformity/production_ready_pr_grep.py +200 -0
  284. package/src/apothem/conformity/recommend_next_step_grep.py +250 -0
  285. package/src/apothem/conformity/redundancy_grep.py +401 -0
  286. package/src/apothem/conformity/reference_token_grep.py +230 -0
  287. package/src/apothem/conformity/registry_capability_consistency_grep.py +368 -0
  288. package/src/apothem/conformity/secret_leak_grep.py +193 -0
  289. package/src/apothem/conformity/semver_stability_grep.py +358 -0
  290. package/src/apothem/conformity/smoke_install_grep.py +194 -0
  291. package/src/apothem/conformity/static_version_grep.py +284 -0
  292. package/src/apothem/conformity/token_efficiency_grep.py +185 -0
  293. package/src/apothem/conformity/unpinned_action_grep.py +115 -0
  294. package/src/apothem/conformity/user_confirm_grep.py +74 -0
  295. package/src/apothem/conformity/workflow_concurrency_grep.py +283 -0
  296. package/src/apothem/harnesses/README.md +63 -0
  297. package/src/apothem/harnesses/__init__.py +16 -0
  298. package/src/apothem/harnesses/_shared/README.md +36 -0
  299. package/src/apothem/harnesses/_shared/__init__.py +12 -0
  300. package/src/apothem/harnesses/_shared/install_driver.py +281 -0
  301. package/src/apothem/harnesses/_shared/install_driver_apply.py +612 -0
  302. package/src/apothem/harnesses/_shared/install_driver_backup.py +535 -0
  303. package/src/apothem/harnesses/_shared/install_driver_converters.py +310 -0
  304. package/src/apothem/harnesses/_shared/install_driver_lifecycle.py +495 -0
  305. package/src/apothem/harnesses/_shared/install_driver_materialize.py +675 -0
  306. package/src/apothem/harnesses/_shared/install_driver_merge.py +656 -0
  307. package/src/apothem/harnesses/_shared/install_driver_pathsafety.py +137 -0
  308. package/src/apothem/harnesses/_shared/install_driver_planvalidation.py +240 -0
  309. package/src/apothem/harnesses/_shared/install_driver_removal.py +366 -0
  310. package/src/apothem/harnesses/_shared/install_driver_treeops.py +248 -0
  311. package/src/apothem/harnesses/_shared/install_driver_types.py +330 -0
  312. package/src/apothem/harnesses/_shared/wrapper_factories.py +448 -0
  313. package/src/apothem/harnesses/antigravity/STANDARD-CONVENTION-PIN.md +91 -0
  314. package/src/apothem/harnesses/antigravity/__init__.py +70 -0
  315. package/src/apothem/harnesses/antigravity/capabilities.yml +40 -0
  316. package/src/apothem/harnesses/antigravity/install.py +63 -0
  317. package/src/apothem/harnesses/antigravity/templates/GEMINI.md +40 -0
  318. package/src/apothem/harnesses/antigravity/templates/plugin.json +5 -0
  319. package/src/apothem/harnesses/antigravity/uninstall.py +22 -0
  320. package/src/apothem/harnesses/antigravity/update.py +10 -0
  321. package/src/apothem/harnesses/antigravity/verify.py +11 -0
  322. package/src/apothem/harnesses/claude_code/STANDARD-CONVENTION-PIN.md +65 -0
  323. package/src/apothem/harnesses/claude_code/__init__.py +107 -0
  324. package/src/apothem/harnesses/claude_code/capabilities.yml +42 -0
  325. package/src/apothem/harnesses/claude_code/install.py +147 -0
  326. package/src/apothem/harnesses/claude_code/templates/settings.json +351 -0
  327. package/src/apothem/harnesses/claude_code/uninstall.py +23 -0
  328. package/src/apothem/harnesses/claude_code/update.py +10 -0
  329. package/src/apothem/harnesses/claude_code/verify.py +11 -0
  330. package/src/apothem/harnesses/codebuddy/STANDARD-CONVENTION-PIN.md +74 -0
  331. package/src/apothem/harnesses/codebuddy/__init__.py +49 -0
  332. package/src/apothem/harnesses/codebuddy/capabilities.yml +34 -0
  333. package/src/apothem/harnesses/codebuddy/install.py +40 -0
  334. package/src/apothem/harnesses/codebuddy/templates/apothem-rules.md +37 -0
  335. package/src/apothem/harnesses/codebuddy/uninstall.py +25 -0
  336. package/src/apothem/harnesses/codebuddy/update.py +10 -0
  337. package/src/apothem/harnesses/codebuddy/verify.py +11 -0
  338. package/src/apothem/harnesses/codex/STANDARD-CONVENTION-PIN.md +79 -0
  339. package/src/apothem/harnesses/codex/__init__.py +72 -0
  340. package/src/apothem/harnesses/codex/capabilities.yml +40 -0
  341. package/src/apothem/harnesses/codex/install.py +69 -0
  342. package/src/apothem/harnesses/codex/templates/AGENTS.md +40 -0
  343. package/src/apothem/harnesses/codex/templates/hooks.json +127 -0
  344. package/src/apothem/harnesses/codex/uninstall.py +23 -0
  345. package/src/apothem/harnesses/codex/update.py +10 -0
  346. package/src/apothem/harnesses/codex/verify.py +11 -0
  347. package/src/apothem/harnesses/cursor/STANDARD-CONVENTION-PIN.md +79 -0
  348. package/src/apothem/harnesses/cursor/__init__.py +48 -0
  349. package/src/apothem/harnesses/cursor/capabilities.yml +42 -0
  350. package/src/apothem/harnesses/cursor/install.py +38 -0
  351. package/src/apothem/harnesses/cursor/templates/apothem-rules.mdc +40 -0
  352. package/src/apothem/harnesses/cursor/uninstall.py +25 -0
  353. package/src/apothem/harnesses/cursor/update.py +10 -0
  354. package/src/apothem/harnesses/cursor/verify.py +11 -0
  355. package/src/apothem/harnesses/gemini_cli/STANDARD-CONVENTION-PIN.md +102 -0
  356. package/src/apothem/harnesses/gemini_cli/__init__.py +52 -0
  357. package/src/apothem/harnesses/gemini_cli/capabilities.yml +43 -0
  358. package/src/apothem/harnesses/gemini_cli/install.py +43 -0
  359. package/src/apothem/harnesses/gemini_cli/templates/GEMINI.md +38 -0
  360. package/src/apothem/harnesses/gemini_cli/uninstall.py +25 -0
  361. package/src/apothem/harnesses/gemini_cli/update.py +10 -0
  362. package/src/apothem/harnesses/gemini_cli/verify.py +11 -0
  363. package/src/apothem/harnesses/github_copilot/STANDARD-CONVENTION-PIN.md +84 -0
  364. package/src/apothem/harnesses/github_copilot/__init__.py +47 -0
  365. package/src/apothem/harnesses/github_copilot/capabilities.yml +42 -0
  366. package/src/apothem/harnesses/github_copilot/install.py +40 -0
  367. package/src/apothem/harnesses/github_copilot/templates/copilot-instructions.md +33 -0
  368. package/src/apothem/harnesses/github_copilot/uninstall.py +25 -0
  369. package/src/apothem/harnesses/github_copilot/update.py +10 -0
  370. package/src/apothem/harnesses/github_copilot/verify.py +11 -0
  371. package/src/apothem/harnesses/glm/STANDARD-CONVENTION-PIN.md +77 -0
  372. package/src/apothem/harnesses/glm/__init__.py +56 -0
  373. package/src/apothem/harnesses/glm/capabilities.yml +33 -0
  374. package/src/apothem/harnesses/glm/install.py +45 -0
  375. package/src/apothem/harnesses/glm/templates/glm.toml +58 -0
  376. package/src/apothem/harnesses/glm/uninstall.py +25 -0
  377. package/src/apothem/harnesses/glm/update.py +10 -0
  378. package/src/apothem/harnesses/glm/verify.py +11 -0
  379. package/src/apothem/harnesses/hermes/STANDARD-CONVENTION-PIN.md +57 -0
  380. package/src/apothem/harnesses/hermes/__init__.py +33 -0
  381. package/src/apothem/harnesses/hermes/capabilities.yml +36 -0
  382. package/src/apothem/harnesses/hermes/install.py +17 -0
  383. package/src/apothem/harnesses/hermes/materializer.py +35 -0
  384. package/src/apothem/harnesses/hermes/uninstall.py +33 -0
  385. package/src/apothem/harnesses/hermes/update.py +10 -0
  386. package/src/apothem/harnesses/hermes/verify.py +11 -0
  387. package/src/apothem/harnesses/kimi_code/STANDARD-CONVENTION-PIN.md +128 -0
  388. package/src/apothem/harnesses/kimi_code/__init__.py +59 -0
  389. package/src/apothem/harnesses/kimi_code/capabilities.yml +40 -0
  390. package/src/apothem/harnesses/kimi_code/install.py +42 -0
  391. package/src/apothem/harnesses/kimi_code/templates/AGENTS.md +43 -0
  392. package/src/apothem/harnesses/kimi_code/uninstall.py +27 -0
  393. package/src/apothem/harnesses/kimi_code/update.py +10 -0
  394. package/src/apothem/harnesses/kimi_code/verify.py +11 -0
  395. package/src/apothem/harnesses/kiro/STANDARD-CONVENTION-PIN.md +77 -0
  396. package/src/apothem/harnesses/kiro/__init__.py +49 -0
  397. package/src/apothem/harnesses/kiro/capabilities.yml +36 -0
  398. package/src/apothem/harnesses/kiro/install.py +39 -0
  399. package/src/apothem/harnesses/kiro/templates/apothem-rules.md +36 -0
  400. package/src/apothem/harnesses/kiro/uninstall.py +25 -0
  401. package/src/apothem/harnesses/kiro/update.py +10 -0
  402. package/src/apothem/harnesses/kiro/verify.py +11 -0
  403. package/src/apothem/harnesses/open_claw/STANDARD-CONVENTION-PIN.md +62 -0
  404. package/src/apothem/harnesses/open_claw/__init__.py +35 -0
  405. package/src/apothem/harnesses/open_claw/capabilities.yml +35 -0
  406. package/src/apothem/harnesses/open_claw/install.py +17 -0
  407. package/src/apothem/harnesses/open_claw/materializer.py +36 -0
  408. package/src/apothem/harnesses/open_claw/uninstall.py +32 -0
  409. package/src/apothem/harnesses/open_claw/update.py +10 -0
  410. package/src/apothem/harnesses/open_claw/verify.py +11 -0
  411. package/src/apothem/harnesses/opencode/STANDARD-CONVENTION-PIN.md +76 -0
  412. package/src/apothem/harnesses/opencode/__init__.py +35 -0
  413. package/src/apothem/harnesses/opencode/capabilities.yml +43 -0
  414. package/src/apothem/harnesses/opencode/install.py +17 -0
  415. package/src/apothem/harnesses/opencode/materializer.py +31 -0
  416. package/src/apothem/harnesses/opencode/uninstall.py +34 -0
  417. package/src/apothem/harnesses/opencode/update.py +10 -0
  418. package/src/apothem/harnesses/opencode/verify.py +11 -0
  419. package/src/apothem/harnesses/qwen_code/STANDARD-CONVENTION-PIN.md +87 -0
  420. package/src/apothem/harnesses/qwen_code/__init__.py +37 -0
  421. package/src/apothem/harnesses/qwen_code/capabilities.yml +43 -0
  422. package/src/apothem/harnesses/qwen_code/install.py +19 -0
  423. package/src/apothem/harnesses/qwen_code/materializer.py +174 -0
  424. package/src/apothem/harnesses/qwen_code/templates/QWEN.md +30 -0
  425. package/src/apothem/harnesses/qwen_code/uninstall.py +34 -0
  426. package/src/apothem/harnesses/qwen_code/update.py +10 -0
  427. package/src/apothem/harnesses/qwen_code/verify.py +11 -0
  428. package/src/apothem/harnesses/trae/STANDARD-CONVENTION-PIN.md +70 -0
  429. package/src/apothem/harnesses/trae/__init__.py +49 -0
  430. package/src/apothem/harnesses/trae/capabilities.yml +34 -0
  431. package/src/apothem/harnesses/trae/install.py +38 -0
  432. package/src/apothem/harnesses/trae/templates/apothem-rules.md +37 -0
  433. package/src/apothem/harnesses/trae/uninstall.py +25 -0
  434. package/src/apothem/harnesses/trae/update.py +10 -0
  435. package/src/apothem/harnesses/trae/verify.py +11 -0
  436. package/src/apothem/harnesses/windsurf/STANDARD-CONVENTION-PIN.md +91 -0
  437. package/src/apothem/harnesses/windsurf/__init__.py +52 -0
  438. package/src/apothem/harnesses/windsurf/capabilities.yml +40 -0
  439. package/src/apothem/harnesses/windsurf/install.py +41 -0
  440. package/src/apothem/harnesses/windsurf/templates/apothem-rules.md +37 -0
  441. package/src/apothem/harnesses/windsurf/uninstall.py +25 -0
  442. package/src/apothem/harnesses/windsurf/update.py +10 -0
  443. package/src/apothem/harnesses/windsurf/verify.py +11 -0
  444. package/src/apothem/harnesses/zed/STANDARD-CONVENTION-PIN.md +92 -0
  445. package/src/apothem/harnesses/zed/__init__.py +57 -0
  446. package/src/apothem/harnesses/zed/capabilities.yml +38 -0
  447. package/src/apothem/harnesses/zed/install.py +41 -0
  448. package/src/apothem/harnesses/zed/templates/apothem-rules.md +32 -0
  449. package/src/apothem/harnesses/zed/uninstall.py +28 -0
  450. package/src/apothem/harnesses/zed/update.py +10 -0
  451. package/src/apothem/harnesses/zed/verify.py +11 -0
  452. package/src/apothem/hooks/README.md +81 -0
  453. package/src/apothem/hooks/__init__.py +24 -0
  454. package/src/apothem/hooks/askuserquestion_validator.py +380 -0
  455. package/src/apothem/hooks/dispatch.py +296 -0
  456. package/src/apothem/hooks/emit_hook_context.py +444 -0
  457. package/src/apothem/hooks/hooks.json +318 -0
  458. package/src/apothem/hooks/lib/README.md +39 -0
  459. package/src/apothem/hooks/lib/__init__.py +18 -0
  460. package/src/apothem/hooks/lib/bootstrap.ps1 +129 -0
  461. package/src/apothem/hooks/lib/bootstrap.sh +103 -0
  462. package/src/apothem/hooks/lib/events.py +51 -0
  463. package/src/apothem/hooks/lib/find-pwsh.ps1 +78 -0
  464. package/src/apothem/hooks/lib/find-pwsh.sh +76 -0
  465. package/src/apothem/hooks/lib/find-python.ps1 +63 -0
  466. package/src/apothem/hooks/lib/find-python.sh +97 -0
  467. package/src/apothem/hooks/lib/log.py +43 -0
  468. package/src/apothem/hooks/lib/resolve_root.py +264 -0
  469. package/src/apothem/hooks/messages/postcompact.md +14 -0
  470. package/src/apothem/hooks/messages/posttooluse-proactive-compaction.md +46 -0
  471. package/src/apothem/hooks/messages/precompact.md +14 -0
  472. package/src/apothem/hooks/messages/pretooluse-askuserquestion-recommended.md +65 -0
  473. package/src/apothem/hooks/messages/pretooluse-bash-plan-guard.md +97 -0
  474. package/src/apothem/hooks/messages/pretooluse-bash.md +39 -0
  475. package/src/apothem/hooks/messages/pretooluse-conformity.md +70 -0
  476. package/src/apothem/hooks/messages/pretooluse-dependency-guard.md +21 -0
  477. package/src/apothem/hooks/messages/pretooluse-edit-header-guard.md +61 -0
  478. package/src/apothem/hooks/messages/pretooluse-edit.md +21 -0
  479. package/src/apothem/hooks/messages/pretooluse-eval-guard.md +39 -0
  480. package/src/apothem/hooks/messages/pretooluse-notebookedit.md +11 -0
  481. package/src/apothem/hooks/messages/pretooluse-write-header-guard.md +45 -0
  482. package/src/apothem/hooks/messages/pretooluse-write-plan-guard.md +72 -0
  483. package/src/apothem/hooks/messages/pretooluse-write.md +21 -0
  484. package/src/apothem/hooks/messages/sessionstart.md +15 -0
  485. package/src/apothem/hooks/messages/stop.md +27 -0
  486. package/src/apothem/hooks/proactive_compaction_tracker.py +327 -0
  487. package/src/apothem/hooks/session_start_bootstrap.py +472 -0
  488. package/src/apothem/lib/README.md +42 -0
  489. package/src/apothem/lib/__init__.py +13 -0
  490. package/src/apothem/lib/atomic_io.py +189 -0
  491. package/src/apothem/lib/auditor.py +687 -0
  492. package/src/apothem/lib/clean_slate.py +396 -0
  493. package/src/apothem/lib/contexts.py +352 -0
  494. package/src/apothem/lib/data_home.py +255 -0
  495. package/src/apothem/lib/frontmatter.py +101 -0
  496. package/src/apothem/lib/harness_materializer.py +213 -0
  497. package/src/apothem/lib/harness_protocol.py +59 -0
  498. package/src/apothem/lib/harness_registry.py +282 -0
  499. package/src/apothem/lib/harness_registry_data.py +843 -0
  500. package/src/apothem/lib/install_ledger.py +347 -0
  501. package/src/apothem/lib/learning.py +540 -0
  502. package/src/apothem/lib/memory.py +347 -0
  503. package/src/apothem/lib/parallel_sweep.py +234 -0
  504. package/src/apothem/lib/plan_tiers.py +200 -0
  505. package/src/apothem/lib/plugin_bootstrap.py +132 -0
  506. package/src/apothem/lib/plugin_tree.py +599 -0
  507. package/src/apothem/lib/profile.py +755 -0
  508. package/src/apothem/lib/profile_projection.py +198 -0
  509. package/src/apothem/lib/propagation-manifest.yaml +878 -0
  510. package/src/apothem/lib/propagation.py +220 -0
  511. package/src/apothem/lib/python_resolver.py +189 -0
  512. package/src/apothem/lib/reporter.py +62 -0
  513. package/src/apothem/lib/workspace_migration.py +323 -0
  514. package/src/apothem/output-styles/README.md +41 -0
  515. package/src/apothem/output-styles/concise-engineer.md +49 -0
  516. package/src/apothem/output-styles/default-architect.md +52 -0
  517. package/src/apothem/output-styles/default.md +113 -0
  518. package/src/apothem/output-styles/forensic-auditor.md +63 -0
  519. package/src/apothem/py.typed +0 -0
  520. package/src/apothem/rules/README.md +121 -0
  521. package/src/apothem/rules/agent-capability-discipline-matrix.md +89 -0
  522. package/src/apothem/rules/agent-capability-discipline.md +78 -0
  523. package/src/apothem/rules/agent-orchestration-patterns.md +144 -0
  524. package/src/apothem/rules/agent-orchestration.md +65 -0
  525. package/src/apothem/rules/agents-md-convention.md +86 -0
  526. package/src/apothem/rules/agile-sprints-elements.md +135 -0
  527. package/src/apothem/rules/agile-sprints.md +64 -0
  528. package/src/apothem/rules/agnostic-posture-checklist.md +47 -0
  529. package/src/apothem/rules/agnostic-posture.md +48 -0
  530. package/src/apothem/rules/authoritative-referencing-quotation.md +50 -0
  531. package/src/apothem/rules/authoritative-referencing.md +66 -0
  532. package/src/apothem/rules/authority-inquiry-categories.md +58 -0
  533. package/src/apothem/rules/authority-inquiry.md +54 -0
  534. package/src/apothem/rules/auto-memory-topic-files.md +86 -0
  535. package/src/apothem/rules/auto-memory.md +67 -0
  536. package/src/apothem/rules/bidirectional-binding.md +123 -0
  537. package/src/apothem/rules/canonical-layout-reporting-tiers.md +212 -0
  538. package/src/apothem/rules/canonical-layout.md +60 -0
  539. package/src/apothem/rules/clean-architecture-layers.md +186 -0
  540. package/src/apothem/rules/clean-room-generation-protocols.md +124 -0
  541. package/src/apothem/rules/clean-room-generation.md +59 -0
  542. package/src/apothem/rules/code-craft-conventions.md +101 -0
  543. package/src/apothem/rules/code-craft-markdown.md +138 -0
  544. package/src/apothem/rules/code-craft-python.md +154 -0
  545. package/src/apothem/rules/code-craft-shell.md +192 -0
  546. package/src/apothem/rules/cognitive-identity-techniques.md +180 -0
  547. package/src/apothem/rules/cognitive-identity.md +81 -0
  548. package/src/apothem/rules/context-management-budget.md +46 -0
  549. package/src/apothem/rules/context-management-protocol.md +161 -0
  550. package/src/apothem/rules/context-management-scratch.md +128 -0
  551. package/src/apothem/rules/context-management.md +85 -0
  552. package/src/apothem/rules/definitiveness-virtues.md +67 -0
  553. package/src/apothem/rules/definitiveness.md +58 -0
  554. package/src/apothem/rules/determinism.md +81 -0
  555. package/src/apothem/rules/disclosure-ledger-markers.md +58 -0
  556. package/src/apothem/rules/disclosure-ledger.md +52 -0
  557. package/src/apothem/rules/dynamism.md +38 -0
  558. package/src/apothem/rules/etc-extension.md +57 -0
  559. package/src/apothem/rules/expertise-posture-elements.md +68 -0
  560. package/src/apothem/rules/expertise-posture.md +54 -0
  561. package/src/apothem/rules/freshness-facade.md +64 -0
  562. package/src/apothem/rules/harness-adapter-shape-schemas.md +162 -0
  563. package/src/apothem/rules/harness-adapter-shape.md +42 -0
  564. package/src/apothem/rules/host-discovery-manifests.md +50 -0
  565. package/src/apothem/rules/host-discovery.md +56 -0
  566. package/src/apothem/rules/i18n-discipline-locale-cohorts.md +120 -0
  567. package/src/apothem/rules/i18n-discipline.md +70 -0
  568. package/src/apothem/rules/interactive-questions-canonical-shapes.md +590 -0
  569. package/src/apothem/rules/interactive-questions-detail.md +41 -0
  570. package/src/apothem/rules/interactive-questions-sweep-matchers.md +184 -0
  571. package/src/apothem/rules/interactive-questions.md +89 -0
  572. package/src/apothem/rules/large-file-generation.md +112 -0
  573. package/src/apothem/rules/large-file-reading.md +59 -0
  574. package/src/apothem/rules/living-docs.md +85 -0
  575. package/src/apothem/rules/multi-agent-workflow.md +57 -0
  576. package/src/apothem/rules/operational-mandates-expanded.md +78 -0
  577. package/src/apothem/rules/operational-mandates.md +88 -0
  578. package/src/apothem/rules/option-annotation-form.md +60 -0
  579. package/src/apothem/rules/option-annotation.md +45 -0
  580. package/src/apothem/rules/own-voice-reimplementation.md +86 -0
  581. package/src/apothem/rules/performance-discipline.md +91 -0
  582. package/src/apothem/rules/persistent-conventions-vigilance-checklist.md +54 -0
  583. package/src/apothem/rules/persistent-conventions-vigilance.md +61 -0
  584. package/src/apothem/rules/plain-language.md +56 -0
  585. package/src/apothem/rules/planning-techniques.md +130 -0
  586. package/src/apothem/rules/pre-emission-gate-bars.md +86 -0
  587. package/src/apothem/rules/pre-emission-gate.md +54 -0
  588. package/src/apothem/rules/production-ready-prs-surfaces.md +162 -0
  589. package/src/apothem/rules/production-ready-prs.md +83 -0
  590. package/src/apothem/rules/propagation.md +63 -0
  591. package/src/apothem/rules/recommend-next-step.md +106 -0
  592. package/src/apothem/rules/refactoring-discipline.md +76 -0
  593. package/src/apothem/rules/session-closure.md +44 -0
  594. package/src/apothem/rules/sota-elevation-exemplars.md +76 -0
  595. package/src/apothem/rules/sota-elevation.md +52 -0
  596. package/src/apothem/rules/source-accessibility.md +58 -0
  597. package/src/apothem/rules/surgical-manipulation.md +48 -0
  598. package/src/apothem/rules/systemic-participation-relations.md +108 -0
  599. package/src/apothem/rules/systemic-participation.md +70 -0
  600. package/src/apothem/rules/ten-dimension-check-dimensions.md +52 -0
  601. package/src/apothem/rules/ten-dimension-check.md +59 -0
  602. package/src/apothem/rules/token-budget-discipline.md +81 -0
  603. package/src/apothem/rules/token-efficiency-rewrite-protocol.md +79 -0
  604. package/src/apothem/rules/token-efficiency-rewrite.md +77 -0
  605. package/src/apothem/rules/tool-use-discipline.md +48 -0
  606. package/src/apothem/rules/visual-leverage.md +102 -0
  607. package/src/apothem/schemas/NOTICE.md +9 -0
  608. package/src/apothem/schemas/README.md +104 -0
  609. package/src/apothem/schemas/__init__.py +176 -0
  610. package/src/apothem/schemas/advisory-finding.schema.json +111 -0
  611. package/src/apothem/schemas/agent.schema.json +106 -0
  612. package/src/apothem/schemas/authorship-header.txt +1 -0
  613. package/src/apothem/schemas/cohort-manifest.yaml +248 -0
  614. package/src/apothem/schemas/cohort-metadata-vocabulary.yaml +168 -0
  615. package/src/apothem/schemas/cohort.schema.json +113 -0
  616. package/src/apothem/schemas/command.schema.json +68 -0
  617. package/src/apothem/schemas/compatibility-matrix.yaml +432 -0
  618. package/src/apothem/schemas/context-fragment.schema.json +64 -0
  619. package/src/apothem/schemas/freshness-token-denylist.txt +51 -0
  620. package/src/apothem/schemas/handoff-manifest.yaml +353 -0
  621. package/src/apothem/schemas/header-exceptions.txt +141 -0
  622. package/src/apothem/schemas/header-visibility.yaml +39 -0
  623. package/src/apothem/schemas/learning-signal.schema.json +46 -0
  624. package/src/apothem/schemas/memory-record.schema.json +61 -0
  625. package/src/apothem/schemas/output-style.schema.json +40 -0
  626. package/src/apothem/schemas/plan.schema.json +51 -0
  627. package/src/apothem/schemas/plugin.schema.json +83 -0
  628. package/src/apothem/schemas/profile.example.yaml +70 -0
  629. package/src/apothem/schemas/profile.minimal.yaml +6 -0
  630. package/src/apothem/schemas/profile.schema.json +396 -0
  631. package/src/apothem/schemas/reference-token-denylist.txt +25 -0
  632. package/src/apothem/schemas/skill.schema.json +75 -0
  633. package/src/apothem/skills/README.md +93 -0
  634. package/src/apothem/skills/dependency-upgrade/SKILL.md +105 -0
  635. package/src/apothem/skills/dev-toolkit/SKILL.md +120 -0
  636. package/src/apothem/skills/diagram-authoring/SKILL.md +113 -0
  637. package/src/apothem/skills/document-authoring/SKILL.md +118 -0
  638. package/src/apothem/skills/ecosystem-audit/SKILL.md +108 -0
  639. package/src/apothem/skills/ecosystem-audit/references/audit-fortress.md +85 -0
  640. package/src/apothem/skills/ecosystem-audit/references/procedure.md +162 -0
  641. package/src/apothem/skills/eval-harness/SKILL.md +88 -0
  642. package/src/apothem/skills/incident-runbook/SKILL.md +92 -0
  643. package/src/apothem/skills/multi-source-research/SKILL.md +90 -0
  644. package/src/apothem/skills/plan-suite/SKILL.md +118 -0
  645. package/src/apothem/skills/plan-suite/master_template.md +1324 -0
  646. package/src/apothem/skills/projectify/SKILL.md +117 -0
  647. package/src/apothem/skills/prompt-engineering/SKILL.md +122 -0
  648. package/src/apothem/skills/refactor-extract/SKILL.md +85 -0
  649. package/src/apothem/skills/research-suite/SKILL.md +170 -0
  650. package/src/apothem/skills/research-suite/references/directory-structure.md +47 -0
  651. package/src/apothem/skills/research-suite/references/lifecycle.md +67 -0
  652. package/src/apothem/skills/research-suite/references/principal-investigator-framework.md +37 -0
  653. package/src/apothem/skills/research-suite/references/rigor-mandates.md +30 -0
  654. package/src/apothem/skills/research-suite/research_template.md +476 -0
  655. package/src/apothem/skills/secret-rotation/SKILL.md +87 -0
  656. package/src/apothem/skills/source-synthesis/SKILL.md +92 -0
  657. package/src/apothem/skills/surgical-guard/SKILL.md +118 -0
  658. package/src/apothem/skills/test-authoring/SKILL.md +85 -0
  659. package/src/apothem/skills/vuln-triage/SKILL.md +91 -0
  660. package/src/apothem/skills/workflow/SKILL.md +139 -0
  661. package/src/apothem/statuslines/README.md +26 -0
  662. package/src/apothem/statuslines/__init__.py +20 -0
  663. package/src/apothem/statuslines/conformity.json +5 -0
  664. package/src/apothem/statuslines/render.py +334 -0
  665. package/src/apothem/statuslines/statusline.md +50 -0
  666. package/src/apothem/templates/README.md +43 -0
  667. package/src/apothem/templates/agents-md-template.md +80 -0
  668. package/src/apothem/templates/consideration-log.md +39 -0
  669. package/src/apothem/templates/expertise-gap-log.md +56 -0
  670. package/src/apothem/templates/master-index-template.md +93 -0
  671. package/src/apothem/templates/potency-map.md +53 -0
  672. package/src/apothem/templates/preservation-audit.md +60 -0
  673. package/src/apothem/templates/question-resolution-audit.md +52 -0
  674. package/src/apothem/templates/trace-matrix-template.md +77 -0
@@ -0,0 +1,674 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """
4
+ These are keyword-only APIs that call `attr.s` and `attr.ib` with different
5
+ default values.
6
+ """
7
+
8
+ from functools import partial
9
+
10
+ from . import setters
11
+ from ._funcs import asdict as _asdict
12
+ from ._funcs import astuple as _astuple
13
+ from ._make import (
14
+ _DEFAULT_ON_SETATTR,
15
+ NOTHING,
16
+ _frozen_setattrs,
17
+ attrib,
18
+ attrs,
19
+ )
20
+ from .exceptions import NotAnAttrsClassError, UnannotatedAttributeError
21
+
22
+
23
+ def define(
24
+ maybe_cls=None,
25
+ *,
26
+ these=None,
27
+ repr=None,
28
+ unsafe_hash=None,
29
+ hash=None,
30
+ init=None,
31
+ slots=True,
32
+ frozen=False,
33
+ weakref_slot=True,
34
+ str=False,
35
+ auto_attribs=None,
36
+ kw_only=False,
37
+ cache_hash=False,
38
+ auto_exc=True,
39
+ eq=None,
40
+ order=False,
41
+ auto_detect=True,
42
+ getstate_setstate=None,
43
+ on_setattr=None,
44
+ field_transformer=None,
45
+ match_args=True,
46
+ force_kw_only=False,
47
+ ):
48
+ r"""
49
+ A class decorator that adds :term:`dunder methods` according to
50
+ :term:`fields <field>` specified using :doc:`type annotations <types>`,
51
+ `field()` calls, or the *these* argument.
52
+
53
+ Since *attrs* patches or replaces an existing class, you cannot use
54
+ `object.__init_subclass__` with *attrs* classes, because it runs too early.
55
+ As a replacement, you can define ``__attrs_init_subclass__`` on your class.
56
+ It will be called by *attrs* classes that subclass it after they're
57
+ created. See also :ref:`init-subclass`.
58
+
59
+ Args:
60
+ slots (bool):
61
+ Create a :term:`slotted class <slotted classes>` that's more
62
+ memory-efficient. Slotted classes are generally superior to the
63
+ default dict classes, but have some gotchas you should know about,
64
+ so we encourage you to read the :term:`glossary entry <slotted
65
+ classes>`.
66
+
67
+ auto_detect (bool):
68
+ Instead of setting the *init*, *repr*, *eq*, and *hash* arguments
69
+ explicitly, assume they are set to True **unless any** of the
70
+ involved methods for one of the arguments is implemented in the
71
+ *current* class (meaning, it is *not* inherited from some base
72
+ class).
73
+
74
+ So, for example by implementing ``__eq__`` on a class yourself,
75
+ *attrs* will deduce ``eq=False`` and will create *neither*
76
+ ``__eq__`` *nor* ``__ne__`` (but Python classes come with a
77
+ sensible ``__ne__`` by default, so it *should* be enough to only
78
+ implement ``__eq__`` in most cases).
79
+
80
+ Passing :data:`True` or :data:`False` to *init*, *repr*, *eq*, or *hash*
81
+ overrides whatever *auto_detect* would determine.
82
+
83
+ auto_exc (bool):
84
+ If the class subclasses `BaseException` (which implicitly includes
85
+ any subclass of any exception), the following happens to behave
86
+ like a well-behaved Python exception class:
87
+
88
+ - the values for *eq*, *order*, and *hash* are ignored and the
89
+ instances compare and hash by the instance's ids [#]_ ,
90
+ - all attributes that are either passed into ``__init__`` or have a
91
+ default value are additionally available as a tuple in the
92
+ ``args`` attribute,
93
+ - the value of *str* is ignored leaving ``__str__`` to base
94
+ classes.
95
+
96
+ .. [#]
97
+ Note that *attrs* will *not* remove existing implementations of
98
+ ``__hash__`` or the equality methods. It just won't add own
99
+ ones.
100
+
101
+ on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]):
102
+ A callable that is run whenever the user attempts to set an
103
+ attribute (either by assignment like ``i.x = 42`` or by using
104
+ `setattr` like ``setattr(i, "x", 42)``). It receives the same
105
+ arguments as validators: the instance, the attribute that is being
106
+ modified, and the new value.
107
+
108
+ If no exception is raised, the attribute is set to the return value
109
+ of the callable.
110
+
111
+ If a list of callables is passed, they're automatically wrapped in
112
+ an `attrs.setters.pipe`.
113
+
114
+ If left None, the default behavior is to run converters and
115
+ validators whenever an attribute is set.
116
+
117
+ init (bool):
118
+ Create a ``__init__`` method that initializes the *attrs*
119
+ attributes. Leading underscores are stripped for the argument name,
120
+ unless an alias is set on the attribute.
121
+
122
+ .. seealso::
123
+ `init` shows advanced ways to customize the generated
124
+ ``__init__`` method, including executing code before and after.
125
+
126
+ repr(bool):
127
+ Create a ``__repr__`` method with a human readable representation
128
+ of *attrs* attributes.
129
+
130
+ str (bool):
131
+ Create a ``__str__`` method that is identical to ``__repr__``. This
132
+ is usually not necessary except for `Exception`\ s.
133
+
134
+ eq (bool | None):
135
+ If True or None (default), add ``__eq__`` and ``__ne__`` methods
136
+ that check two instances for equality.
137
+
138
+ .. seealso::
139
+ `comparison` describes how to customize the comparison behavior
140
+ going as far comparing NumPy arrays.
141
+
142
+ order (bool | None):
143
+ If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__``
144
+ methods that behave like *eq* above and allow instances to be
145
+ ordered.
146
+
147
+ They compare the instances as if they were tuples of their *attrs*
148
+ attributes if and only if the types of both classes are
149
+ *identical*.
150
+
151
+ If `None` mirror value of *eq*.
152
+
153
+ .. seealso:: `comparison`
154
+
155
+ unsafe_hash (bool | None):
156
+ If None (default), the ``__hash__`` method is generated according
157
+ how *eq* and *frozen* are set.
158
+
159
+ 1. If *both* are True, *attrs* will generate a ``__hash__`` for
160
+ you.
161
+ 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set
162
+ to None, marking it unhashable (which it is).
163
+ 3. If *eq* is False, ``__hash__`` will be left untouched meaning
164
+ the ``__hash__`` method of the base class will be used. If the
165
+ base class is `object`, this means it will fall back to id-based
166
+ hashing.
167
+
168
+ Although not recommended, you can decide for yourself and force
169
+ *attrs* to create one (for example, if the class is immutable even
170
+ though you didn't freeze it programmatically) by passing True or
171
+ not. Both of these cases are rather special and should be used
172
+ carefully.
173
+
174
+ .. seealso::
175
+
176
+ - Our documentation on `hashing`,
177
+ - Python's documentation on `object.__hash__`,
178
+ - and the `GitHub issue that led to the default \ behavior
179
+ <https://github.com/python-attrs/attrs/issues/136>`_ for more
180
+ details.
181
+
182
+ hash (bool | None):
183
+ Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence.
184
+
185
+ cache_hash (bool):
186
+ Ensure that the object's hash code is computed only once and stored
187
+ on the object. If this is set to True, hashing must be either
188
+ explicitly or implicitly enabled for this class. If the hash code
189
+ is cached, avoid any reassignments of fields involved in hash code
190
+ computation or mutations of the objects those fields point to after
191
+ object creation. If such changes occur, the behavior of the
192
+ object's hash code is undefined.
193
+
194
+ frozen (bool):
195
+ Make instances immutable after initialization. If someone attempts
196
+ to modify a frozen instance, `attrs.exceptions.FrozenInstanceError`
197
+ is raised.
198
+
199
+ .. note::
200
+
201
+ 1. This is achieved by installing a custom ``__setattr__``
202
+ method on your class, so you can't implement your own.
203
+
204
+ 2. True immutability is impossible in Python.
205
+
206
+ 3. This *does* have a minor a runtime performance `impact
207
+ <how-frozen>` when initializing new instances. In other
208
+ words: ``__init__`` is slightly slower with ``frozen=True``.
209
+
210
+ 4. If a class is frozen, you cannot modify ``self`` in
211
+ ``__attrs_post_init__`` or a self-written ``__init__``. You
212
+ can circumvent that limitation by using
213
+ ``object.__setattr__(self, "attribute_name", value)``.
214
+
215
+ 5. Subclasses of a frozen class are frozen too.
216
+
217
+ kw_only (bool):
218
+ Make attributes keyword-only in the generated ``__init__`` (if
219
+ *init* is False, this parameter is ignored). Attributes that
220
+ explicitly set ``kw_only=False`` are not affected; base class
221
+ attributes are also not affected.
222
+
223
+ Also see *force_kw_only*.
224
+
225
+ weakref_slot (bool):
226
+ Make instances weak-referenceable. This has no effect unless
227
+ *slots* is True.
228
+
229
+ field_transformer (~typing.Callable | None):
230
+ A function that is called with the original class object and all
231
+ fields right before *attrs* finalizes the class. You can use this,
232
+ for example, to automatically add converters or validators to
233
+ fields based on their types.
234
+
235
+ .. seealso:: `transform-fields`
236
+
237
+ match_args (bool):
238
+ If True (default), set ``__match_args__`` on the class to support
239
+ :pep:`634` (*Structural Pattern Matching*). It is a tuple of all
240
+ non-keyword-only ``__init__`` parameter names on Python 3.10 and
241
+ later. Ignored on older Python versions.
242
+
243
+ collect_by_mro (bool):
244
+ If True, *attrs* collects attributes from base classes correctly
245
+ according to the `method resolution order
246
+ <https://docs.python.org/3/howto/mro.html>`_. If False, *attrs*
247
+ will mimic the (wrong) behavior of `dataclasses` and :pep:`681`.
248
+
249
+ See also `issue #428
250
+ <https://github.com/python-attrs/attrs/issues/428>`_.
251
+
252
+ force_kw_only (bool):
253
+ A back-compat flag for restoring pre-25.4.0 behavior. If True and
254
+ ``kw_only=True``, all attributes are made keyword-only, including
255
+ base class attributes, and those set to ``kw_only=False`` at the
256
+ attribute level. Defaults to False.
257
+
258
+ See also `issue #980
259
+ <https://github.com/python-attrs/attrs/issues/980>`_.
260
+
261
+ getstate_setstate (bool | None):
262
+ .. note::
263
+
264
+ This is usually only interesting for slotted classes and you
265
+ should probably just set *auto_detect* to True.
266
+
267
+ If True, ``__getstate__`` and ``__setstate__`` are generated and
268
+ attached to the class. This is necessary for slotted classes to be
269
+ pickleable. If left None, it's True by default for slotted classes
270
+ and False for dict classes.
271
+
272
+ If *auto_detect* is True, and *getstate_setstate* is left None, and
273
+ **either** ``__getstate__`` or ``__setstate__`` is detected
274
+ directly on the class (meaning: not inherited), it is set to False
275
+ (this is usually what you want).
276
+
277
+ auto_attribs (bool | None):
278
+ If True, look at type annotations to determine which attributes to
279
+ use, like `dataclasses`. If False, it will only look for explicit
280
+ :func:`field` class attributes, like classic *attrs*.
281
+
282
+ If left None, it will guess:
283
+
284
+ 1. If any attributes are annotated and no unannotated
285
+ `attrs.field`\ s are found, it assumes *auto_attribs=True*.
286
+ 2. Otherwise it assumes *auto_attribs=False* and tries to collect
287
+ `attrs.field`\ s.
288
+
289
+ If *attrs* decides to look at type annotations, **all** fields
290
+ **must** be annotated. If *attrs* encounters a field that is set to
291
+ a :func:`field` / `attr.ib` but lacks a type annotation, an
292
+ `attrs.exceptions.UnannotatedAttributeError` is raised. Use
293
+ ``field_name: typing.Any = field(...)`` if you don't want to set a
294
+ type.
295
+
296
+ .. warning::
297
+
298
+ For features that use the attribute name to create decorators
299
+ (for example, :ref:`validators <validators>`), you still *must*
300
+ assign :func:`field` / `attr.ib` to them. Otherwise Python will
301
+ either not find the name or try to use the default value to
302
+ call, for example, ``validator`` on it.
303
+
304
+ Attributes annotated as `typing.ClassVar`, and attributes that are
305
+ neither annotated nor set to an `field()` are **ignored**.
306
+
307
+ these (dict[str, object]):
308
+ A dictionary of name to the (private) return value of `field()`
309
+ mappings. This is useful to avoid the definition of your attributes
310
+ within the class body because you can't (for example, if you want
311
+ to add ``__repr__`` methods to Django models) or don't want to.
312
+
313
+ If *these* is not `None`, *attrs* will *not* search the class body
314
+ for attributes and will *not* remove any attributes from it.
315
+
316
+ The order is deduced from the order of the attributes inside
317
+ *these*.
318
+
319
+ Arguably, this is a rather obscure feature.
320
+
321
+ .. versionadded:: 20.1.0
322
+ .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``.
323
+ .. versionadded:: 22.2.0
324
+ *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance).
325
+ .. versionchanged:: 24.1.0
326
+ Instances are not compared as tuples of attributes anymore, but using a
327
+ big ``and`` condition. This is faster and has more correct behavior for
328
+ uncomparable values like `math.nan`.
329
+ .. versionadded:: 24.1.0
330
+ If a class has an *inherited* classmethod called
331
+ ``__attrs_init_subclass__``, it is executed after the class is created.
332
+ .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*.
333
+ .. versionadded:: 24.3.0
334
+ Unless already present, a ``__replace__`` method is automatically
335
+ created for `copy.replace` (Python 3.13+ only).
336
+ .. versionchanged:: 25.4.0
337
+ *kw_only* now only applies to attributes defined in the current class,
338
+ and respects attribute-level ``kw_only=False`` settings.
339
+ .. versionadded:: 25.4.0
340
+ Added *force_kw_only* to go back to the previous *kw_only* behavior.
341
+
342
+ .. note::
343
+
344
+ The main differences to the classic `attr.s` are:
345
+
346
+ - Automatically detect whether or not *auto_attribs* should be `True`
347
+ (c.f. *auto_attribs* parameter).
348
+ - Converters and validators run when attributes are set by default --
349
+ if *frozen* is `False`.
350
+ - *slots=True*
351
+
352
+ Usually, this has only upsides and few visible effects in everyday
353
+ programming. But it *can* lead to some surprising behaviors, so
354
+ please make sure to read :term:`slotted classes`.
355
+
356
+ - *auto_exc=True*
357
+ - *auto_detect=True*
358
+ - *order=False*
359
+ - *force_kw_only=False*
360
+ - Some options that were only relevant on Python 2 or were kept around
361
+ for backwards-compatibility have been removed.
362
+
363
+ """
364
+
365
+ def do_it(cls, auto_attribs):
366
+ return attrs(
367
+ maybe_cls=cls,
368
+ these=these,
369
+ repr=repr,
370
+ hash=hash,
371
+ unsafe_hash=unsafe_hash,
372
+ init=init,
373
+ slots=slots,
374
+ frozen=frozen,
375
+ weakref_slot=weakref_slot,
376
+ str=str,
377
+ auto_attribs=auto_attribs,
378
+ kw_only=kw_only,
379
+ cache_hash=cache_hash,
380
+ auto_exc=auto_exc,
381
+ eq=eq,
382
+ order=order,
383
+ auto_detect=auto_detect,
384
+ collect_by_mro=True,
385
+ getstate_setstate=getstate_setstate,
386
+ on_setattr=on_setattr,
387
+ field_transformer=field_transformer,
388
+ match_args=match_args,
389
+ force_kw_only=force_kw_only,
390
+ )
391
+
392
+ def wrap(cls):
393
+ """
394
+ Making this a wrapper ensures this code runs during class creation.
395
+
396
+ We also ensure that frozen-ness of classes is inherited.
397
+ """
398
+ nonlocal frozen, on_setattr
399
+
400
+ had_on_setattr = on_setattr not in (None, setters.NO_OP)
401
+
402
+ # By default, mutable classes convert & validate on setattr.
403
+ if frozen is False and on_setattr is None:
404
+ on_setattr = _DEFAULT_ON_SETATTR
405
+
406
+ # However, if we subclass a frozen class, we inherit the immutability
407
+ # and disable on_setattr.
408
+ for base_cls in cls.__bases__:
409
+ if base_cls.__setattr__ is _frozen_setattrs:
410
+ if had_on_setattr:
411
+ msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)."
412
+ raise ValueError(msg)
413
+
414
+ on_setattr = setters.NO_OP
415
+ break
416
+
417
+ if auto_attribs is not None:
418
+ return do_it(cls, auto_attribs)
419
+
420
+ try:
421
+ return do_it(cls, True)
422
+ except UnannotatedAttributeError:
423
+ return do_it(cls, False)
424
+
425
+ # maybe_cls's type depends on the usage of the decorator. It's a class
426
+ # if it's used as `@attrs` but `None` if used as `@attrs()`.
427
+ if maybe_cls is None:
428
+ return wrap
429
+
430
+ return wrap(maybe_cls)
431
+
432
+
433
+ mutable = define
434
+ frozen = partial(define, frozen=True, on_setattr=None)
435
+
436
+
437
+ def field(
438
+ *,
439
+ default=NOTHING,
440
+ validator=None,
441
+ repr=True,
442
+ hash=None,
443
+ init=True,
444
+ metadata=None,
445
+ type=None,
446
+ converter=None,
447
+ factory=None,
448
+ kw_only=None,
449
+ eq=None,
450
+ order=None,
451
+ on_setattr=None,
452
+ alias=None,
453
+ ):
454
+ """
455
+ Create a new :term:`field` / :term:`attribute` on a class.
456
+
457
+ .. warning::
458
+
459
+ Does **nothing** unless the class is also decorated with
460
+ `attrs.define` (or similar)!
461
+
462
+ Args:
463
+ default:
464
+ A value that is used if an *attrs*-generated ``__init__`` is used
465
+ and no value is passed while instantiating or the attribute is
466
+ excluded using ``init=False``.
467
+
468
+ If the value is an instance of `attrs.Factory`, its callable will
469
+ be used to construct a new value (useful for mutable data types
470
+ like lists or dicts).
471
+
472
+ If a default is not set (or set manually to `attrs.NOTHING`), a
473
+ value *must* be supplied when instantiating; otherwise a
474
+ `TypeError` will be raised.
475
+
476
+ .. seealso:: `defaults`
477
+
478
+ factory (~typing.Callable):
479
+ Syntactic sugar for ``default=attr.Factory(factory)``.
480
+
481
+ validator (~typing.Callable | list[~typing.Callable]):
482
+ Callable that is called by *attrs*-generated ``__init__`` methods
483
+ after the instance has been initialized. They receive the
484
+ initialized instance, the :func:`~attrs.Attribute`, and the passed
485
+ value.
486
+
487
+ The return value is *not* inspected so the validator has to throw
488
+ an exception itself.
489
+
490
+ If a `list` is passed, its items are treated as validators and must
491
+ all pass.
492
+
493
+ Validators can be globally disabled and re-enabled using
494
+ `attrs.validators.get_disabled` / `attrs.validators.set_disabled`.
495
+
496
+ The validator can also be set using decorator notation as shown
497
+ below.
498
+
499
+ .. seealso:: :ref:`validators`
500
+
501
+ repr (bool | ~typing.Callable):
502
+ Include this attribute in the generated ``__repr__`` method. If
503
+ True, include the attribute; if False, omit it. By default, the
504
+ built-in ``repr()`` function is used. To override how the attribute
505
+ value is formatted, pass a ``callable`` that takes a single value
506
+ and returns a string. Note that the resulting string is used as-is,
507
+ which means it will be used directly *instead* of calling
508
+ ``repr()`` (the default).
509
+
510
+ eq (bool | ~typing.Callable):
511
+ If True (default), include this attribute in the generated
512
+ ``__eq__`` and ``__ne__`` methods that check two instances for
513
+ equality. To override how the attribute value is compared, pass a
514
+ callable that takes a single value and returns the value to be
515
+ compared.
516
+
517
+ .. seealso:: `comparison`
518
+
519
+ order (bool | ~typing.Callable):
520
+ If True (default), include this attributes in the generated
521
+ ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To
522
+ override how the attribute value is ordered, pass a callable that
523
+ takes a single value and returns the value to be ordered.
524
+
525
+ .. seealso:: `comparison`
526
+
527
+ hash (bool | None):
528
+ Include this attribute in the generated ``__hash__`` method. If
529
+ None (default), mirror *eq*'s value. This is the correct behavior
530
+ according the Python spec. Setting this value to anything else
531
+ than None is *discouraged*.
532
+
533
+ .. seealso:: `hashing`
534
+
535
+ init (bool):
536
+ Include this attribute in the generated ``__init__`` method.
537
+
538
+ It is possible to set this to False and set a default value. In
539
+ that case this attributed is unconditionally initialized with the
540
+ specified default value or factory.
541
+
542
+ .. seealso:: `init`
543
+
544
+ converter (typing.Callable | Converter):
545
+ A callable that is called by *attrs*-generated ``__init__`` methods
546
+ to convert attribute's value to the desired format.
547
+
548
+ If a vanilla callable is passed, it is given the passed-in value as
549
+ the only positional argument. It is possible to receive additional
550
+ arguments by wrapping the callable in a `Converter`.
551
+
552
+ Either way, the returned value will be used as the new value of the
553
+ attribute. The value is converted before being passed to the
554
+ validator, if any.
555
+
556
+ .. seealso:: :ref:`converters`
557
+
558
+ metadata (dict | None):
559
+ An arbitrary mapping, to be used by third-party code.
560
+
561
+ .. seealso:: `extending-metadata`.
562
+
563
+ type (type):
564
+ The type of the attribute. Nowadays, the preferred method to
565
+ specify the type is using a variable annotation (see :pep:`526`).
566
+ This argument is provided for backwards-compatibility and for usage
567
+ with `make_class`. Regardless of the approach used, the type will
568
+ be stored on ``Attribute.type``.
569
+
570
+ Please note that *attrs* doesn't do anything with this metadata by
571
+ itself. You can use it as part of your own code or for `static type
572
+ checking <types>`.
573
+
574
+ kw_only (bool | None):
575
+ Make this attribute keyword-only in the generated ``__init__`` (if
576
+ *init* is False, this parameter is ignored). If None (default),
577
+ mirror the setting from `attrs.define`.
578
+
579
+ on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]):
580
+ Allows to overwrite the *on_setattr* setting from `attr.s`. If left
581
+ None, the *on_setattr* value from `attr.s` is used. Set to
582
+ `attrs.setters.NO_OP` to run **no** `setattr` hooks for this
583
+ attribute -- regardless of the setting in `define()`.
584
+
585
+ alias (str | None):
586
+ Override this attribute's parameter name in the generated
587
+ ``__init__`` method. If left None, default to ``name`` stripped
588
+ of leading underscores. See `private-attributes`.
589
+
590
+ .. versionadded:: 20.1.0
591
+ .. versionchanged:: 21.1.0
592
+ *eq*, *order*, and *cmp* also accept a custom callable
593
+ .. versionadded:: 22.2.0 *alias*
594
+ .. versionadded:: 23.1.0
595
+ The *type* parameter has been re-added; mostly for `attrs.make_class`.
596
+ Please note that type checkers ignore this metadata.
597
+ .. versionchanged:: 25.4.0
598
+ *kw_only* can now be None, and its default is also changed from False to
599
+ None.
600
+
601
+ .. seealso::
602
+
603
+ `attr.ib`
604
+ """
605
+ return attrib(
606
+ default=default,
607
+ validator=validator,
608
+ repr=repr,
609
+ hash=hash,
610
+ init=init,
611
+ metadata=metadata,
612
+ type=type,
613
+ converter=converter,
614
+ factory=factory,
615
+ kw_only=kw_only,
616
+ eq=eq,
617
+ order=order,
618
+ on_setattr=on_setattr,
619
+ alias=alias,
620
+ )
621
+
622
+
623
+ def asdict(inst, *, recurse=True, filter=None, value_serializer=None):
624
+ """
625
+ Same as `attr.asdict`, except that collections types are always retained
626
+ and dict is always used as *dict_factory*.
627
+
628
+ .. versionadded:: 21.3.0
629
+ """
630
+ return _asdict(
631
+ inst=inst,
632
+ recurse=recurse,
633
+ filter=filter,
634
+ value_serializer=value_serializer,
635
+ retain_collection_types=True,
636
+ )
637
+
638
+
639
+ def astuple(inst, *, recurse=True, filter=None):
640
+ """
641
+ Same as `attr.astuple`, except that collections types are always retained
642
+ and `tuple` is always used as the *tuple_factory*.
643
+
644
+ .. versionadded:: 21.3.0
645
+ """
646
+ return _astuple(
647
+ inst=inst, recurse=recurse, filter=filter, retain_collection_types=True
648
+ )
649
+
650
+
651
+ def inspect(cls):
652
+ """
653
+ Inspect the class and return its effective build parameters.
654
+
655
+ Warning:
656
+ This feature is currently **experimental** and is not covered by our
657
+ strict backwards-compatibility guarantees.
658
+
659
+ Args:
660
+ cls: The *attrs*-decorated class to inspect.
661
+
662
+ Returns:
663
+ The effective build parameters of the class.
664
+
665
+ Raises:
666
+ NotAnAttrsClassError: If the class is not an *attrs*-decorated class.
667
+
668
+ .. versionadded:: 25.4.0
669
+ """
670
+ try:
671
+ return cls.__dict__["__attrs_props__"]
672
+ except KeyError:
673
+ msg = f"{cls!r} is not an attrs-decorated class."
674
+ raise NotAnAttrsClassError(msg) from None
@@ -0,0 +1,15 @@
1
+ from typing import Any, ClassVar, Protocol
2
+
3
+ # MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`.
4
+ MYPY = False
5
+
6
+ if MYPY:
7
+ # A protocol to be able to statically accept an attrs class.
8
+ class AttrsInstance_(Protocol):
9
+ __attrs_attrs__: ClassVar[Any]
10
+
11
+ else:
12
+ # For type checkers without plug-in support use an empty protocol that
13
+ # will (hopefully) be combined into a union.
14
+ class AttrsInstance_(Protocol):
15
+ pass