apple-a-day 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. apple_a_day-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
  2. apple_a_day-0.2.0/.github/ISSUE_TEMPLATE/new_check.md +17 -0
  3. apple_a_day-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +11 -0
  4. apple_a_day-0.2.0/.github/workflows/ci.yml +37 -0
  5. apple_a_day-0.2.0/.gitignore +17 -0
  6. apple_a_day-0.2.0/.ike/completed/TASK-0001 - drop-click-rewrite-cli-with-argparse.md +20 -0
  7. apple_a_day-0.2.0/.ike/completed/TASK-0002 - write-ansi-formatter-make-rich-optional.md +21 -0
  8. apple_a_day-0.2.0/.ike/completed/TASK-0003 - add-runtime-schema-introspection-aad-schema.md +20 -0
  9. apple_a_day-0.2.0/.ike/completed/TASK-0004 - write-skill-md-for-agent-discoverability.md +21 -0
  10. apple_a_day-0.2.0/.ike/completed/TASK-0005 - add-fields-flag-for-context-window-discipline.md +20 -0
  11. apple_a_day-0.2.0/.ike/completed/TASK-0006 - machine-parseable-errors-structured-error-json.md +22 -0
  12. apple_a_day-0.2.0/.ike/completed/TASK-0007 - security-check-module.md +21 -0
  13. apple_a_day-0.2.0/.ike/completed/TASK-0008 - network-check-module.md +20 -0
  14. apple_a_day-0.2.0/.ike/documents/DOC-0001 - session-log-bootstrap-trilogy-proof-2026-03-22.md +104 -0
  15. apple_a_day-0.2.0/.ike/ike.json +7 -0
  16. apple_a_day-0.2.0/.ike/milestones/MS-0001 - v0-2-agent-native-zero-dep.md +8 -0
  17. apple_a_day-0.2.0/.ike/milestones/MS-0002 - v0-3-new-check-modules-pypi.md +8 -0
  18. apple_a_day-0.2.0/.ike/tasks/TASK-0009 - publish-to-pypi.md +16 -0
  19. apple_a_day-0.2.0/.ike/tasks/TASK-0010 - create-homebrew-tap.md +17 -0
  20. apple_a_day-0.2.0/.ike/tasks/TASK-0011 - record-demo-gif-with-asciinema.md +15 -0
  21. apple_a_day-0.2.0/.research/research.json +15 -0
  22. apple_a_day-0.2.0/.visionlog/adr/ADR-001-apple-a-day-is-agent-native-not-human-first.md +35 -0
  23. apple_a_day-0.2.0/.visionlog/adr/ADR-002-zero-runtime-dependencies-rich-and-click-are-optio.md +32 -0
  24. apple_a_day-0.2.0/.visionlog/config.yaml +3 -0
  25. apple_a_day-0.2.0/.visionlog/goals/GOAL-001-v0-1-cli-checkup-works-end-to-end.md +11 -0
  26. apple_a_day-0.2.0/.visionlog/goals/GOAL-002-mcp-server-claude-sessions-can-query-mac-health.md +11 -0
  27. apple_a_day-0.2.0/.visionlog/goals/GOAL-003-auto-fix-opt-in-remediation-for-common-issues.md +11 -0
  28. apple_a_day-0.2.0/.visionlog/goals/GOAL-004-thermal-power-monitoring-apple-silicon-.md +11 -0
  29. apple_a_day-0.2.0/.visionlog/goals/GOAL-005-pypi-release.md +11 -0
  30. apple_a_day-0.2.0/.visionlog/goals/GOAL-006-agent-native-affordances-schema-introspection-skil.md +16 -0
  31. apple_a_day-0.2.0/.visionlog/goals/GOAL-007-zero-dep-rewrite-drop-click-rich-argparse-ansi.md +11 -0
  32. apple_a_day-0.2.0/.visionlog/goals/GOAL-008-security-check-module-sip-gatekeeper-xprotect-file.md +11 -0
  33. apple_a_day-0.2.0/.visionlog/goals/GOAL-009-network-check-module-networkquality-wi-fi-signal-.md +11 -0
  34. apple_a_day-0.2.0/.visionlog/guardrails/GUARD-001-mac-only-no-cross-platform.md +18 -0
  35. apple_a_day-0.2.0/.visionlog/guardrails/GUARD-002-read-only-by-default.md +18 -0
  36. apple_a_day-0.2.0/.visionlog/guardrails/GUARD-003-plain-english-always-actionable.md +18 -0
  37. apple_a_day-0.2.0/.visionlog/sops/SOP-001-goal-decomposition.md +36 -0
  38. apple_a_day-0.2.0/.visionlog/sops/SOP-002-completion-feedback.md +32 -0
  39. apple_a_day-0.2.0/.visionlog/sops/SOP-003-blocked-task-escalation.md +37 -0
  40. apple_a_day-0.2.0/.visionlog/vision.md +58 -0
  41. apple_a_day-0.2.0/CHANGELOG.md +36 -0
  42. apple_a_day-0.2.0/CODE_OF_CONDUCT.md +41 -0
  43. apple_a_day-0.2.0/CONTRIBUTING.md +96 -0
  44. apple_a_day-0.2.0/LICENSE +21 -0
  45. apple_a_day-0.2.0/PKG-INFO +134 -0
  46. apple_a_day-0.2.0/README.md +100 -0
  47. apple_a_day-0.2.0/SECURITY.md +26 -0
  48. apple_a_day-0.2.0/SKILL.md +63 -0
  49. apple_a_day-0.2.0/agent-operated/.research/research.json +15 -0
  50. apple_a_day-0.2.0/agent-operated/findings/0001-agent-native-is-an-established-term-cli-anything-hku-defines-the-pattern.md +36 -0
  51. apple_a_day-0.2.0/agent-operated/findings/0002-cli-design-for-agents-7-principles-from-rewrite-your-cli-for-ai-agents.md +32 -0
  52. apple_a_day-0.2.0/agent-operated/findings/0003-agentic-sre-the-closed-loop-detect-diagnose-act-pattern.md +32 -0
  53. apple_a_day-0.2.0/agent-operated/findings/0004-the-paradigm-ai-agents-as-the-primary-software-consumer-2026-consensus.md +38 -0
  54. apple_a_day-0.2.0/agent-operated/findings/0005-design-implications-for-apple-a-day-as-agent-native-mac-health.md +45 -0
  55. apple_a_day-0.2.0/apple_a_day/__init__.py +3 -0
  56. apple_a_day-0.2.0/apple_a_day/checks/__init__.py +23 -0
  57. apple_a_day-0.2.0/apple_a_day/checks/crash_loops.py +60 -0
  58. apple_a_day-0.2.0/apple_a_day/checks/disk_health.py +94 -0
  59. apple_a_day-0.2.0/apple_a_day/checks/dylib_health.py +68 -0
  60. apple_a_day-0.2.0/apple_a_day/checks/homebrew.py +74 -0
  61. apple_a_day-0.2.0/apple_a_day/checks/kernel_panics.py +82 -0
  62. apple_a_day-0.2.0/apple_a_day/checks/launch_agents.py +95 -0
  63. apple_a_day-0.2.0/apple_a_day/checks/memory_pressure.py +72 -0
  64. apple_a_day-0.2.0/apple_a_day/checks/network.py +137 -0
  65. apple_a_day-0.2.0/apple_a_day/checks/security.py +120 -0
  66. apple_a_day-0.2.0/apple_a_day/cli.py +109 -0
  67. apple_a_day-0.2.0/apple_a_day/format_ansi.py +94 -0
  68. apple_a_day-0.2.0/apple_a_day/format_rich.py +65 -0
  69. apple_a_day-0.2.0/apple_a_day/models.py +70 -0
  70. apple_a_day-0.2.0/apple_a_day/runner.py +99 -0
  71. apple_a_day-0.2.0/apple_a_day/schema.py +48 -0
  72. apple_a_day-0.2.0/docs/.gitkeep +0 -0
  73. apple_a_day-0.2.0/findings/0001-oss-system-monitors-worth-studying.md +27 -0
  74. apple_a_day-0.2.0/findings/0002-native-macos-diagnostics-to-orchestrate-not-reimplement.md +26 -0
  75. apple_a_day-0.2.0/findings/0003-disk-storage-and-backup-tools.md +26 -0
  76. apple_a_day-0.2.0/findings/0004-cpu-gpu-thermal-and-power-monitoring.md +27 -0
  77. apple_a_day-0.2.0/findings/0005-network-and-connectivity-diagnostics.md +25 -0
  78. apple_a_day-0.2.0/findings/0006-security-and-integrity-checks.md +27 -0
  79. apple_a_day-0.2.0/findings/0007-community-recipe-collections-and-guide-patterns.md +27 -0
  80. apple_a_day-0.2.0/foss-launch/.research/research.json +15 -0
  81. apple_a_day-0.2.0/foss-launch/findings/0001-success-patterns-from-top-mac-foss-tools.md +28 -0
  82. apple_a_day-0.2.0/foss-launch/findings/0002-launch-and-promotion-playbook.md +43 -0
  83. apple_a_day-0.2.0/foss-launch/findings/0003-readme-patterns-that-convert-visitors-to-stars.md +32 -0
  84. apple_a_day-0.2.0/foss-launch/findings/0004-trust-signals-that-attract-contributors.md +35 -0
  85. apple_a_day-0.2.0/foss-launch/findings/0005-python-macos-specific-advice.md +37 -0
  86. apple_a_day-0.2.0/foss-launch/findings/0006-phased-launch-timeline.md +51 -0
  87. apple_a_day-0.2.0/foss-launch/findings/0007-dependency-minimalism-in-successful-mac-cli-tools.md +45 -0
  88. apple_a_day-0.2.0/foss-launch/findings/0008-mac-cli-tools-zero-dep-claim-is-partially-true.md +29 -0
  89. apple_a_day-0.2.0/foss-launch/findings/0009-top-python-clis-are-zero-dep-yt-dlp-152k-youtube-dl-140k-tqdm-31k.md +31 -0
  90. apple_a_day-0.2.0/foss-launch/findings/0010-pip-vendored-rich-rather-than-depending-on-it-the-gold-standard-compromise.md +33 -0
  91. apple_a_day-0.2.0/foss-launch/findings/0011-click-has-a-track-record-of-breaking-downstream-consumers.md +29 -0
  92. apple_a_day-0.2.0/pyproject.toml +50 -0
  93. apple_a_day-0.2.0/tests/__init__.py +0 -0
  94. apple_a_day-0.2.0/tests/test_checks.py +26 -0
  95. apple_a_day-0.2.0/tests/test_models.py +21 -0
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something apple-a-day got wrong or missed
4
+ labels: bug
5
+ ---
6
+
7
+ **What happened**
8
+ A clear description of the bug.
9
+
10
+ **Expected behavior**
11
+ What should have happened instead.
12
+
13
+ **Mac details**
14
+ - macOS version: (e.g., 15.3.1)
15
+ - Chip: (e.g., M4 Pro)
16
+ - apple-a-day version: (`aad --version`)
17
+ - Python version: (`python3 --version`)
18
+
19
+ **Output**
20
+ Paste the relevant `aad checkup` output or error.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: New check request
3
+ about: Suggest a health check apple-a-day should perform
4
+ labels: enhancement
5
+ ---
6
+
7
+ **What happened on your Mac**
8
+ Describe the issue you encountered.
9
+
10
+ **How you diagnosed it manually**
11
+ What commands did you run? What did you find?
12
+
13
+ **What apple-a-day should have told you**
14
+ What finding summary, severity, and fix would have saved you time?
15
+
16
+ **Native macOS tools involved**
17
+ List any macOS commands or tools relevant to this check.
@@ -0,0 +1,11 @@
1
+ ## What does this PR do?
2
+
3
+ <!-- Brief description -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] Tested on my Mac (`aad checkup` runs without errors)
8
+ - [ ] New check follows the pattern in CONTRIBUTING.md
9
+ - [ ] Every finding has a plain-english `summary` and a `fix`
10
+ - [ ] No system state is modified (read-only checks only)
11
+ - [ ] macOS-native tools only (no cross-platform abstractions)
@@ -0,0 +1,37 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: actions/setup-python@v5
15
+ with:
16
+ python-version: "3.12"
17
+ - run: pip install ruff
18
+ - run: ruff check .
19
+ - run: ruff format --check .
20
+
21
+ test:
22
+ strategy:
23
+ matrix:
24
+ os: [macos-13, macos-14, macos-15]
25
+ python-version: ["3.11", "3.12", "3.13"]
26
+ runs-on: ${{ matrix.os }}
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+ - uses: actions/setup-python@v5
30
+ with:
31
+ python-version: ${{ matrix.python-version }}
32
+ - run: pip install -e ".[dev]"
33
+ - run: pytest -v
34
+ - name: Smoke test
35
+ run: |
36
+ aad --version
37
+ aad checkup --json | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'{len(d[\"findings\"])} findings')"
@@ -0,0 +1,17 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ *.egg
8
+ .eggs/
9
+ *.so
10
+ .venv/
11
+ venv/
12
+ env/
13
+ .env
14
+ .pytest_cache/
15
+ .ruff_cache/
16
+ .mypy_cache/
17
+ *.DS_Store
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: TASK-0001
3
+ title: 'Drop click, rewrite CLI with argparse'
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: high
7
+ milestone: MS-0001
8
+ tags:
9
+ - zero-dep
10
+ - adr-002
11
+ definition-of-done:
12
+ - aad checkup works with all existing flags
13
+ - click removed from pyproject.toml dependencies
14
+ - all 17 tests pass
15
+ visionlog_goal_id: GOAL-007
16
+ updated: '2026-03-22'
17
+ ---
18
+ Replace click with stdlib argparse. Same flags: --json, --min-severity, --check, --no-parallel, --version. ADR-002 mandate.
19
+
20
+ **Completion notes:** Replaced click with stdlib argparse. All flags preserved: --json, --min-severity, --check/-c, --no-parallel, --version. Added --fields. 17 tests pass.
@@ -0,0 +1,21 @@
1
+ ---
2
+ id: TASK-0002
3
+ title: 'Write ANSI formatter, make rich optional'
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: high
7
+ milestone: MS-0001
8
+ tags:
9
+ - zero-dep
10
+ - adr-002
11
+ definition-of-done:
12
+ - aad checkup renders colored output without rich installed
13
+ - 'pip install apple-a-day[rich] enables rich tables'
14
+ - rich removed from core dependencies
15
+ - zero entries in dependencies list
16
+ visionlog_goal_id: GOAL-007
17
+ updated: '2026-03-22'
18
+ ---
19
+ Write a thin ANSI escape code + Unicode box-drawing formatter as default renderer. Move rich to optional extra: pip install apple-a-day[rich]. Auto-detect: if rich is importable, use it; otherwise ANSI.
20
+
21
+ **Completion notes:** format_ansi.py as default, format_rich.py auto-detected. pyproject.toml: dependencies = [], rich is optional [rich] extra. ANSI output verified independently.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: TASK-0003
3
+ title: 'Add runtime schema introspection: aad schema'
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: high
7
+ milestone: MS-0001
8
+ tags:
9
+ - agent-native
10
+ - adr-001
11
+ definition-of-done:
12
+ - aad schema outputs valid JSON describing all 7 checks
13
+ - each check lists its possible finding fields
14
+ - agents can discover capabilities without reading README
15
+ visionlog_goal_id: GOAL-006
16
+ updated: '2026-03-22'
17
+ ---
18
+ Add `aad schema` command that outputs JSON schema of all checks: name, description, output fields, severity levels. Agents use this to understand what apple-a-day can do at runtime without consuming docs tokens.
19
+
20
+ **Completion notes:** schema.py with get_schema(). Exposed via `aad schema`. Returns checks, output schema, usage examples, invariants.
@@ -0,0 +1,21 @@
1
+ ---
2
+ id: TASK-0004
3
+ title: Write SKILL.md for agent discoverability
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: medium
7
+ milestone: MS-0001
8
+ tags:
9
+ - agent-native
10
+ - adr-001
11
+ definition-of-done:
12
+ - SKILL.md exists at package root
13
+ - describes all commands and their flags
14
+ - lists operational invariants agents should know
15
+ - follows CLI-Anything/Poehnelt patterns from research
16
+ visionlog_goal_id: GOAL-006
17
+ updated: '2026-03-22'
18
+ ---
19
+ Create SKILL.md following CLI-Anything pattern. Structured markdown that agents read to discover: what apple-a-day does, available commands, output format, invariants (read-only, never requires sudo for basic checks, always returns JSON with --json).
20
+
21
+ **Completion notes:** SKILL.md at package root. Commands, checks, output format, invariants. Agent-discoverable.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: TASK-0005
3
+ title: Add --fields flag for context window discipline
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: medium
7
+ milestone: MS-0001
8
+ tags:
9
+ - agent-native
10
+ - adr-001
11
+ definition-of-done:
12
+ - '--fields severity,summary returns only those fields in JSON'
13
+ - works with --json flag
14
+ - invalid field names return a clear error
15
+ visionlog_goal_id: GOAL-006
16
+ updated: '2026-03-22'
17
+ ---
18
+ Add --fields flag to limit which fields are returned in JSON output (e.g. --fields severity,summary,fix). Agents use this to keep responses small and protect their context window.
19
+
20
+ **Completion notes:** --fields flag filters JSON output fields. Tested: --fields severity,summary,fix correctly strips check and details.
@@ -0,0 +1,22 @@
1
+ ---
2
+ id: TASK-0006
3
+ title: Machine-parseable errors (structured error JSON)
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: medium
7
+ milestone: MS-0001
8
+ tags:
9
+ - agent-native
10
+ - adr-001
11
+ definition-of-done:
12
+ - 'errors return JSON with error_code, message, suggestion fields'
13
+ - no Python tracebacks in --json mode
14
+ - >-
15
+ agents can distinguish between 'check found problems' and 'check itself
16
+ failed'
17
+ visionlog_goal_id: GOAL-006
18
+ updated: '2026-03-22'
19
+ ---
20
+ When a check fails to run (permission denied, tool not found, timeout), return structured JSON error with error_code, message, and suggestion — not a Python traceback or prose string. Agents need to parse errors programmatically.
21
+
22
+ **Completion notes:** CheckError model with error_code, message, suggestion. Error codes: TIMEOUT, PERMISSION_DENIED, TOOL_NOT_FOUND, PARSE_ERROR, UNKNOWN_ERROR. Runner produces structured errors instead of silent swallows. JSON output includes "errors" array only when errors exist. No tracebacks in --json mode.
@@ -0,0 +1,21 @@
1
+ ---
2
+ id: TASK-0007
3
+ title: Security check module
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: high
7
+ milestone: MS-0002
8
+ tags:
9
+ - new-check
10
+ - research-0006
11
+ definition-of-done:
12
+ - 'check_security() returns findings for SIP, Gatekeeper, XProtect, FileVault'
13
+ - SIP disabled = CRITICAL finding
14
+ - FileVault off = WARNING finding
15
+ - registered in ALL_CHECKS
16
+ visionlog_goal_id: GOAL-008
17
+ updated: '2026-03-22'
18
+ ---
19
+ New check module: csrutil (SIP status), spctl (Gatekeeper), XProtect definition freshness, FileVault encryption status. From landscape research finding 0006.
20
+
21
+ **Completion notes:** Security module: SIP (csrutil), Gatekeeper (spctl), FileVault (fdesetup), XProtect freshness (system_profiler install history). All four green on test Mac.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: TASK-0008
3
+ title: Network check module
4
+ status: Done
5
+ created: '2026-03-22'
6
+ priority: high
7
+ milestone: MS-0002
8
+ tags:
9
+ - new-check
10
+ - research-0005
11
+ definition-of-done:
12
+ - 'check_network() returns findings for throughput, latency, Wi-Fi signal'
13
+ - 'poor signal = WARNING, very poor = CRITICAL'
14
+ - registered in ALL_CHECKS
15
+ visionlog_goal_id: GOAL-009
16
+ updated: '2026-03-22'
17
+ ---
18
+ New check module: networkQuality (throughput/latency), airport command (Wi-Fi signal/noise/channel). From landscape research finding 0005.
19
+
20
+ **Completion notes:** Network module: Wi-Fi signal via system_profiler SPAirPortDataType (replaced deprecated airport command). SSID, RSSI, noise, SNR, channel, PHY mode. Speed test via networkQuality -s -c (JSON output). Throughput + responsiveness with Apple's RPM scale. 21 tests pass.
@@ -0,0 +1,104 @@
1
+ ---
2
+ id: DOC-0001
3
+ title: 'Session Log: Bootstrap + Trilogy Proof — 2026-03-22'
4
+ created: '2026-03-22'
5
+ tags:
6
+ - devlog
7
+ - session
8
+ - trilogy
9
+ ---
10
+ # Session Log: apple-a-day Bootstrap + Trilogy Proof
11
+
12
+ **Date:** 2026-03-22
13
+ **Pilot:** Daniel + Claude Opus 4.6
14
+
15
+ ## Origin
16
+
17
+ Daniel's Mac was crashing. Investigation revealed:
18
+ - Facebook's `watchman` crash-looping 611 times/day (broken `libboost_system.dylib` after brew upgrade)
19
+ - `KeepAlive` launchd plist respawning it endlessly
20
+ - 9 kernel panics in 7 days (watchdog timeouts)
21
+ - 15.6 GB swap, 3 crash-looping services total
22
+
23
+ 20 minutes of manual forensics to diagnose. apple-a-day was born to make that take seconds.
24
+
25
+ ## What Was Built
26
+
27
+ **v0.1 CLI** — 7 check modules, all working:
28
+ - Crash loops, kernel panics, dylib health, memory pressure, disk health, launch agents, homebrew
29
+ - Parallel execution via ThreadPoolExecutor
30
+ - Rich terminal output + JSON mode
31
+ - Severity filtering, selective checks, Mac info header, timing
32
+
33
+ **FOSS scaffolding:**
34
+ - MIT license, CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md
35
+ - GitHub issue templates (bug report, new check request), PR template
36
+ - CHANGELOG.md, GitHub Actions CI (macOS 13/14/15 × Python 3.11-3.13)
37
+ - 17 tests passing
38
+
39
+ ## The Trilogy in Action
40
+
41
+ ### research.md → earned the decisions
42
+
43
+ Three research subprojects, 22 findings total:
44
+
45
+ 1. **landscape** (7 findings) — 25 existing tools cataloged. Identified smartctl, networkQuality, csrutil as key gaps. Determined which tools to wrap vs reimplement.
46
+
47
+ 2. **foss-launch** (11 findings) — Verified top Python CLIs are zero-dep (yt-dlp 152k stars, youtube-dl 140k). Discovered pip vendored rich rather than depending on it. Found Click has a track record of breaking downstream. Mapped launch channels (HN, Reddit, awesome-lists) with specific tactics.
48
+
49
+ 3. **agent-operated** (5 findings) — Discovered "agent-native" is an established term (CLI-Anything/HKU). Found Poehnelt's 7 principles for agent CLIs. Mapped Agentic SRE detect→diagnose→act pattern. Confirmed 2026 industry consensus: agents are becoming the primary software consumer.
50
+
51
+ ### visionlog → recorded the contracts
52
+
53
+ - **Vision** reframed: "Your Mac's immune system, operated by your AI agent."
54
+ - **ADR-001:** apple-a-day is agent-native, not human-first (backed by agent-operated research)
55
+ - **ADR-002:** Zero runtime dependencies (backed by foss-launch research)
56
+ - **9 goals** (GOAL-001 complete, GOAL-006/007 available, rest locked)
57
+ - **3 guardrails:** Mac-only, read-only by default, plain english always actionable
58
+
59
+ ### ike.md → executes within those contracts
60
+
61
+ 11 tasks across 2 milestones:
62
+
63
+ **MS-0001 v0.2 Agent-Native + Zero-Dep (due 2026-04-05):**
64
+ - TASK-0001: Drop click → argparse (GOAL-007, ADR-002)
65
+ - TASK-0002: ANSI formatter, rich optional (GOAL-007, ADR-002)
66
+ - TASK-0003: aad schema introspection (GOAL-006, ADR-001)
67
+ - TASK-0004: SKILL.md (GOAL-006, ADR-001)
68
+ - TASK-0005: --fields flag (GOAL-006, ADR-001)
69
+ - TASK-0006: Structured errors (GOAL-006, ADR-001)
70
+
71
+ **MS-0002 v0.3 New Checks + PyPI (due 2026-04-19):**
72
+ - TASK-0007: Security module (GOAL-008)
73
+ - TASK-0008: Network module (GOAL-009)
74
+ - TASK-0009: PyPI release (GOAL-005)
75
+ - TASK-0010: Homebrew tap (GOAL-005)
76
+ - TASK-0011: Demo GIF
77
+
78
+ ## The Traceability Chain
79
+
80
+ ```
81
+ research.md finding → visionlog ADR → visionlog GOAL → ike.md TASK
82
+ ```
83
+
84
+ Every task traces to a goal. Every goal traces to a decision. Every decision traces to evidence. Nothing was done on vibes.
85
+
86
+ ## Key Insight
87
+
88
+ The trilogy's value is not bureaucracy — it's **preventing drift**. In a single session the project went from "CLI for humans" to "agent-native library" based on the founder's clarification. Without the trilogy:
89
+ - The research would be lost in chat history
90
+ - The architectural pivot would be an undocumented gut call
91
+ - Future agents/pilots would rebuild from scratch
92
+
93
+ With the trilogy, any agent can cold-start on apple-a-day, read visionlog, and know exactly what was decided, why, and what to do next.
94
+
95
+ ## Stats
96
+
97
+ - Repo: https://github.com/eidos-agi/apple-a-day
98
+ - Commits: 5
99
+ - Files: ~50
100
+ - Lines of code: ~1200
101
+ - Research findings: 22
102
+ - Visionlog items: 2 ADRs, 9 goals, 3 guardrails
103
+ - ike tasks: 11 across 2 milestones
104
+ - Time: 1 session
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "91197e57-081c-473f-ad83-8835f6ce7b57",
3
+ "version": "0.1.0",
4
+ "project": "apple-a-day",
5
+ "created": "2026-03-22",
6
+ "ike_path": ".ike"
7
+ }
@@ -0,0 +1,8 @@
1
+ ---
2
+ id: MS-0001
3
+ title: 'v0.2: Agent-Native + Zero-Dep'
4
+ status: closed
5
+ created: '2026-03-22'
6
+ due: '2026-04-05'
7
+ ---
8
+ Rewrite core to zero dependencies, add agent-native affordances. This is the milestone that transforms apple-a-day from a CLI demo into an agent-native library.
@@ -0,0 +1,8 @@
1
+ ---
2
+ id: MS-0002
3
+ title: 'v0.3: New Check Modules + PyPI'
4
+ status: open
5
+ created: '2026-03-22'
6
+ due: '2026-04-19'
7
+ ---
8
+ Add security and network check modules, publish to PyPI, create Homebrew tap.
@@ -0,0 +1,16 @@
1
+ ---
2
+ id: TASK-0009
3
+ title: Publish to PyPI
4
+ status: To Do
5
+ created: '2026-03-22'
6
+ priority: high
7
+ milestone: MS-0002
8
+ tags:
9
+ - release
10
+ definition-of-done:
11
+ - pip install apple-a-day installs from PyPI
12
+ - aad --version shows correct version
13
+ - PyPI page has description and metadata
14
+ visionlog_goal_id: GOAL-005
15
+ ---
16
+ Publish apple-a-day to PyPI. pip install apple-a-day works. Claim the package name.
@@ -0,0 +1,17 @@
1
+ ---
2
+ id: TASK-0010
3
+ title: Create Homebrew tap
4
+ status: To Do
5
+ created: '2026-03-22'
6
+ priority: medium
7
+ milestone: MS-0002
8
+ tags:
9
+ - release
10
+ - distribution
11
+ definition-of-done:
12
+ - eidos-agi/homebrew-tap repo exists
13
+ - brew install eidos-agi/tap/apple-a-day works
14
+ - formula bundles Python deps in virtualenv
15
+ visionlog_goal_id: GOAL-005
16
+ ---
17
+ Create eidos-agi/homebrew-tap repo with formula for apple-a-day. brew tap eidos-agi/tap && brew install apple-a-day works.
@@ -0,0 +1,15 @@
1
+ ---
2
+ id: TASK-0011
3
+ title: Record demo GIF with asciinema
4
+ status: To Do
5
+ created: '2026-03-22'
6
+ priority: medium
7
+ milestone: MS-0002
8
+ tags:
9
+ - foss-launch
10
+ definition-of-done:
11
+ - docs/screenshot.png or docs/demo.gif exists
12
+ - embedded in README.md
13
+ - shows real output with real findings
14
+ ---
15
+ Record aad checkup running with colorful output. Convert to animated SVG or GIF for README. Research finding: repos with demo GIFs get ~42% more stars.
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "c07b9113-7534-4c76-b7f0-3fe646a26257",
3
+ "version": "0.1.0",
4
+ "projectName": "apple-a-day-landscape",
5
+ "created": "2026-03-22",
6
+ "phase": "research",
7
+ "transitions": [
8
+ {
9
+ "phase": "research",
10
+ "date": "2026-03-22"
11
+ }
12
+ ],
13
+ "question": "What existing open-source tools, native macOS utilities, and community patterns should apple-a-day integrate, wrap, or learn from to build the most comprehensive Mac health toolkit?",
14
+ "context": "apple-a-day is a new Mac-native health toolkit in the eidos-agi ecosystem (repo: eidos-agi/apple-a-day). It already has a working v0.1 CLI (`aad checkup`) with 7 check modules: crash loops, kernel panics, dylib health, memory pressure, disk health, launch agents, and homebrew.\n\nThe motivation came from a real incident: a broken Homebrew dependency (missing libboost_system.dylib) caused Facebook's watchman to crash-loop 611 times in a day via a KeepAlive launchd plist, likely triggering kernel panics (9 in 7 days) via watchdog timeouts. The user spent 20 minutes manually diagnosing what the tool should have caught automatically.\n\nThe project has 3 guardrails: Mac-only (no cross-platform), read-only by default (fixes require opt-in), and plain-english always-actionable output.\n\nThis research catalogs 25 open-source tools and native macOS utilities across 7 categories (system monitoring, native diagnostics, disk/storage, CPU/GPU/thermal, network, launchd/crash, security) to determine what apple-a-day should wrap, invoke, mine for patterns, or reimplement. The goal is to avoid reinventing wheels while building a unified interface.\n\nKey decision: should v1 prioritize crash/panic/launchd issues (the acute pain that triggered the project) or general \"is my Mac slow/overheating/out of disk\" complaints? Or both?\n\nTarget users: Eidos AGI developers first, Mac power users and sysadmins second, general Mac users third."
15
+ }
@@ -0,0 +1,35 @@
1
+ ---
2
+ id: "ADR-001"
3
+ type: "decision"
4
+ title: "apple-a-day is agent-native, not human-first"
5
+ status: "accepted"
6
+ date: "2026-03-22"
7
+ relates_to: ["GOAL-002", "GOAL-003", "GUARD-002"]
8
+ source_research_id: "117c7991-5983-4dee-bc64-ba50f3021e11"
9
+ ---
10
+
11
+ ## Context
12
+
13
+ apple-a-day was initially designed as a CLI tool for humans (`aad checkup` with Rich tables). During the first session, the founder clarified that Eidos AGI builds software that AIs run, not humans. Research into agent-native software design (CLI-Anything/HKU, Poehnelt's agent CLI manifesto, Agentic SRE patterns) confirmed this is an established and growing paradigm.
14
+
15
+ ## Decision
16
+
17
+ apple-a-day is a **diagnostic library first**, with the AI agent as its primary consumer. Architecture is library → CLI → MCP, not CLI with MCP bolted on.
18
+
19
+ Key implications:
20
+ - Structured JSON output is the contract, rich tables are opt-in
21
+ - Zero runtime dependencies (agents run in lean environments)
22
+ - SKILL.md for agent discoverability
23
+ - Runtime schema introspection (`aad schema`)
24
+ - No interactive input — everything via flags/args
25
+ - Checks are autonomous, fixes are policy-gated
26
+ - The agent is not a trusted operator
27
+
28
+ ## Consequences
29
+
30
+ - GOAL-002 (MCP server) becomes a thin wrapper, not a separate product
31
+ - CLI output priorities shift: JSON first, tables second
32
+ - Need to add: `--fields`, `aad schema`, SKILL.md, machine-parseable errors
33
+ - Future `aad fix` must implement Agentic SRE trust model (least-privilege, audit trail, human approval by default)
34
+ - Python is the right language — agents import it or shell out
35
+ - Rich becomes optional dependency, not core
@@ -0,0 +1,32 @@
1
+ ---
2
+ id: "ADR-002"
3
+ type: "decision"
4
+ title: "Zero runtime dependencies — rich and click are optional"
5
+ status: "accepted"
6
+ date: "2026-03-22"
7
+ source_research_id: "bad85d8e-be67-4e9e-bb3a-c25eb71bd311"
8
+ ---
9
+
10
+ ## Context
11
+
12
+ Research (foss-launch findings 0007-0011) showed:
13
+ - Top Python CLIs are zero-dep: yt-dlp (152k stars), youtube-dl (140k), tqdm (31k)
14
+ - pip vendored rich rather than depending on it
15
+ - Click has a track record of breaking downstream consumers (spaCy, miiocli, others)
16
+ - A Mac health tool that diagnoses broken dependencies should not itself have dependency problems
17
+
18
+ ## Decision
19
+
20
+ Zero runtime dependencies. `dependencies = []` in pyproject.toml.
21
+ - Drop click → use argparse (stdlib)
22
+ - Move rich to optional: `pip install apple-a-day[rich]`
23
+ - Default output uses ANSI escape codes + Unicode box-drawing
24
+ - Follow the yt-dlp pattern: core works with nothing but stdlib Python
25
+
26
+ ## Consequences
27
+
28
+ - Need to rewrite CLI from click to argparse (~30 lines)
29
+ - Need to write a thin ANSI formatter as default renderer
30
+ - Rich tables available via `apple-a-day[rich]` for humans who want them
31
+ - Install is instant, no transitive deps, no supply chain risk
32
+ - Marketing angle: "zero-dependency Mac health tool that diagnoses dependency problems"
@@ -0,0 +1,3 @@
1
+ id: "1b107e77-416b-4f01-b615-c9ce19cf784d"
2
+ project: "apple-a-day"
3
+ created: "2026-03-22"
@@ -0,0 +1,11 @@
1
+ ---
2
+ id: "GOAL-001"
3
+ type: "goal"
4
+ title: "v0.1: CLI checkup works end-to-end"
5
+ status: "complete"
6
+ date: "2026-03-22"
7
+ depends_on: []
8
+ unlocks: []
9
+ ---
10
+
11
+ All 7 check modules run, produce findings, and render in the terminal via `aad checkup`. JSON output works. Installable via pip.
@@ -0,0 +1,11 @@
1
+ ---
2
+ id: "GOAL-002"
3
+ type: "goal"
4
+ title: "MCP server: Claude sessions can query Mac health"
5
+ status: "locked"
6
+ date: "2026-03-22"
7
+ depends_on: []
8
+ unlocks: []
9
+ ---
10
+
11
+ Thin MCP wrapper over the diagnostic library (per ADR-001). Expose each check as an MCP tool: `mac_checkup`, `mac_crash_loops`, `mac_kernel_panics`, etc. Returns structured Finding objects. This is one of three surfaces (import, CLI, MCP), not the primary interface.
@@ -0,0 +1,11 @@
1
+ ---
2
+ id: "GOAL-003"
3
+ type: "goal"
4
+ title: "Auto-fix: opt-in remediation for common issues"
5
+ status: "locked"
6
+ date: "2026-03-22"
7
+ depends_on: []
8
+ unlocks: []
9
+ ---
10
+
11
+ Per ADR-001 and Agentic SRE research: implement the "act" phase of detect→diagnose→act. Fixes are policy-gated: human approval by default, agent can request override. Every fix logged with before/after state for audit. `--dry-run` required on all mutations. The agent is not a trusted operator.
@@ -0,0 +1,11 @@
1
+ ---
2
+ id: "GOAL-004"
3
+ type: "goal"
4
+ title: "Thermal & power monitoring (Apple Silicon)"
5
+ status: "locked"
6
+ date: "2026-03-22"
7
+ depends_on: []
8
+ unlocks: []
9
+ ---
10
+
11
+ Leverage `powermetrics`, IOKit, and SMC to surface CPU/GPU temperature, throttling state, fan speed, and power draw. Apple Silicon specific.
@@ -0,0 +1,11 @@
1
+ ---
2
+ id: "GOAL-005"
3
+ type: "goal"
4
+ title: "PyPI release"
5
+ status: "locked"
6
+ date: "2026-03-22"
7
+ depends_on: []
8
+ unlocks: []
9
+ ---
10
+
11
+ Publish to PyPI as `apple-a-day` so anyone can `pip install apple-a-day` and run `aad`.
@@ -0,0 +1,16 @@
1
+ ---
2
+ id: "GOAL-006"
3
+ type: "goal"
4
+ title: "Agent-native affordances: schema introspection, SKILL.md, --fields"
5
+ status: "available"
6
+ date: "2026-03-22"
7
+ depends_on: []
8
+ unlocks: []
9
+ ---
10
+
11
+ Add the agent-native features identified in research:
12
+ - `aad schema` — runtime introspection of all checks and their output schemas
13
+ - SKILL.md — co-located agent-discoverable capability definition
14
+ - `--fields` flag — limit response fields to protect agent context window
15
+ - Machine-parseable errors (error codes + structured JSON, not prose)
16
+ - No interactive input anywhere
@@ -0,0 +1,11 @@
1
+ ---
2
+ id: "GOAL-007"
3
+ type: "goal"
4
+ title: "Zero-dep rewrite: drop click/rich, argparse + ANSI"
5
+ status: "available"
6
+ date: "2026-03-22"
7
+ depends_on: []
8
+ unlocks: []
9
+ ---
10
+
11
+ Per ADR-002: replace click with argparse, replace rich with ANSI escape codes + Unicode box-drawing. Move rich to optional dependency under `[rich]` extra. Core runs on stdlib Python only.