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.
- apple_a_day-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- apple_a_day-0.2.0/.github/ISSUE_TEMPLATE/new_check.md +17 -0
- apple_a_day-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +11 -0
- apple_a_day-0.2.0/.github/workflows/ci.yml +37 -0
- apple_a_day-0.2.0/.gitignore +17 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0001 - drop-click-rewrite-cli-with-argparse.md +20 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0002 - write-ansi-formatter-make-rich-optional.md +21 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0003 - add-runtime-schema-introspection-aad-schema.md +20 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0004 - write-skill-md-for-agent-discoverability.md +21 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0005 - add-fields-flag-for-context-window-discipline.md +20 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0006 - machine-parseable-errors-structured-error-json.md +22 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0007 - security-check-module.md +21 -0
- apple_a_day-0.2.0/.ike/completed/TASK-0008 - network-check-module.md +20 -0
- apple_a_day-0.2.0/.ike/documents/DOC-0001 - session-log-bootstrap-trilogy-proof-2026-03-22.md +104 -0
- apple_a_day-0.2.0/.ike/ike.json +7 -0
- apple_a_day-0.2.0/.ike/milestones/MS-0001 - v0-2-agent-native-zero-dep.md +8 -0
- apple_a_day-0.2.0/.ike/milestones/MS-0002 - v0-3-new-check-modules-pypi.md +8 -0
- apple_a_day-0.2.0/.ike/tasks/TASK-0009 - publish-to-pypi.md +16 -0
- apple_a_day-0.2.0/.ike/tasks/TASK-0010 - create-homebrew-tap.md +17 -0
- apple_a_day-0.2.0/.ike/tasks/TASK-0011 - record-demo-gif-with-asciinema.md +15 -0
- apple_a_day-0.2.0/.research/research.json +15 -0
- apple_a_day-0.2.0/.visionlog/adr/ADR-001-apple-a-day-is-agent-native-not-human-first.md +35 -0
- apple_a_day-0.2.0/.visionlog/adr/ADR-002-zero-runtime-dependencies-rich-and-click-are-optio.md +32 -0
- apple_a_day-0.2.0/.visionlog/config.yaml +3 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-001-v0-1-cli-checkup-works-end-to-end.md +11 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-002-mcp-server-claude-sessions-can-query-mac-health.md +11 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-003-auto-fix-opt-in-remediation-for-common-issues.md +11 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-004-thermal-power-monitoring-apple-silicon-.md +11 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-005-pypi-release.md +11 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-006-agent-native-affordances-schema-introspection-skil.md +16 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-007-zero-dep-rewrite-drop-click-rich-argparse-ansi.md +11 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-008-security-check-module-sip-gatekeeper-xprotect-file.md +11 -0
- apple_a_day-0.2.0/.visionlog/goals/GOAL-009-network-check-module-networkquality-wi-fi-signal-.md +11 -0
- apple_a_day-0.2.0/.visionlog/guardrails/GUARD-001-mac-only-no-cross-platform.md +18 -0
- apple_a_day-0.2.0/.visionlog/guardrails/GUARD-002-read-only-by-default.md +18 -0
- apple_a_day-0.2.0/.visionlog/guardrails/GUARD-003-plain-english-always-actionable.md +18 -0
- apple_a_day-0.2.0/.visionlog/sops/SOP-001-goal-decomposition.md +36 -0
- apple_a_day-0.2.0/.visionlog/sops/SOP-002-completion-feedback.md +32 -0
- apple_a_day-0.2.0/.visionlog/sops/SOP-003-blocked-task-escalation.md +37 -0
- apple_a_day-0.2.0/.visionlog/vision.md +58 -0
- apple_a_day-0.2.0/CHANGELOG.md +36 -0
- apple_a_day-0.2.0/CODE_OF_CONDUCT.md +41 -0
- apple_a_day-0.2.0/CONTRIBUTING.md +96 -0
- apple_a_day-0.2.0/LICENSE +21 -0
- apple_a_day-0.2.0/PKG-INFO +134 -0
- apple_a_day-0.2.0/README.md +100 -0
- apple_a_day-0.2.0/SECURITY.md +26 -0
- apple_a_day-0.2.0/SKILL.md +63 -0
- apple_a_day-0.2.0/agent-operated/.research/research.json +15 -0
- 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
- 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
- apple_a_day-0.2.0/agent-operated/findings/0003-agentic-sre-the-closed-loop-detect-diagnose-act-pattern.md +32 -0
- apple_a_day-0.2.0/agent-operated/findings/0004-the-paradigm-ai-agents-as-the-primary-software-consumer-2026-consensus.md +38 -0
- apple_a_day-0.2.0/agent-operated/findings/0005-design-implications-for-apple-a-day-as-agent-native-mac-health.md +45 -0
- apple_a_day-0.2.0/apple_a_day/__init__.py +3 -0
- apple_a_day-0.2.0/apple_a_day/checks/__init__.py +23 -0
- apple_a_day-0.2.0/apple_a_day/checks/crash_loops.py +60 -0
- apple_a_day-0.2.0/apple_a_day/checks/disk_health.py +94 -0
- apple_a_day-0.2.0/apple_a_day/checks/dylib_health.py +68 -0
- apple_a_day-0.2.0/apple_a_day/checks/homebrew.py +74 -0
- apple_a_day-0.2.0/apple_a_day/checks/kernel_panics.py +82 -0
- apple_a_day-0.2.0/apple_a_day/checks/launch_agents.py +95 -0
- apple_a_day-0.2.0/apple_a_day/checks/memory_pressure.py +72 -0
- apple_a_day-0.2.0/apple_a_day/checks/network.py +137 -0
- apple_a_day-0.2.0/apple_a_day/checks/security.py +120 -0
- apple_a_day-0.2.0/apple_a_day/cli.py +109 -0
- apple_a_day-0.2.0/apple_a_day/format_ansi.py +94 -0
- apple_a_day-0.2.0/apple_a_day/format_rich.py +65 -0
- apple_a_day-0.2.0/apple_a_day/models.py +70 -0
- apple_a_day-0.2.0/apple_a_day/runner.py +99 -0
- apple_a_day-0.2.0/apple_a_day/schema.py +48 -0
- apple_a_day-0.2.0/docs/.gitkeep +0 -0
- apple_a_day-0.2.0/findings/0001-oss-system-monitors-worth-studying.md +27 -0
- apple_a_day-0.2.0/findings/0002-native-macos-diagnostics-to-orchestrate-not-reimplement.md +26 -0
- apple_a_day-0.2.0/findings/0003-disk-storage-and-backup-tools.md +26 -0
- apple_a_day-0.2.0/findings/0004-cpu-gpu-thermal-and-power-monitoring.md +27 -0
- apple_a_day-0.2.0/findings/0005-network-and-connectivity-diagnostics.md +25 -0
- apple_a_day-0.2.0/findings/0006-security-and-integrity-checks.md +27 -0
- apple_a_day-0.2.0/findings/0007-community-recipe-collections-and-guide-patterns.md +27 -0
- apple_a_day-0.2.0/foss-launch/.research/research.json +15 -0
- apple_a_day-0.2.0/foss-launch/findings/0001-success-patterns-from-top-mac-foss-tools.md +28 -0
- apple_a_day-0.2.0/foss-launch/findings/0002-launch-and-promotion-playbook.md +43 -0
- apple_a_day-0.2.0/foss-launch/findings/0003-readme-patterns-that-convert-visitors-to-stars.md +32 -0
- apple_a_day-0.2.0/foss-launch/findings/0004-trust-signals-that-attract-contributors.md +35 -0
- apple_a_day-0.2.0/foss-launch/findings/0005-python-macos-specific-advice.md +37 -0
- apple_a_day-0.2.0/foss-launch/findings/0006-phased-launch-timeline.md +51 -0
- apple_a_day-0.2.0/foss-launch/findings/0007-dependency-minimalism-in-successful-mac-cli-tools.md +45 -0
- apple_a_day-0.2.0/foss-launch/findings/0008-mac-cli-tools-zero-dep-claim-is-partially-true.md +29 -0
- 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
- 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
- apple_a_day-0.2.0/foss-launch/findings/0011-click-has-a-track-record-of-breaking-downstream-consumers.md +29 -0
- apple_a_day-0.2.0/pyproject.toml +50 -0
- apple_a_day-0.2.0/tests/__init__.py +0 -0
- apple_a_day-0.2.0/tests/test_checks.py +26 -0
- 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,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.
|
apple_a_day-0.2.0/.ike/completed/TASK-0006 - machine-parseable-errors-structured-error-json.md
ADDED
|
@@ -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,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,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
|
apple_a_day-0.2.0/.visionlog/adr/ADR-002-zero-runtime-dependencies-rich-and-click-are-optio.md
ADDED
|
@@ -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,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.
|
apple_a_day-0.2.0/.visionlog/goals/GOAL-002-mcp-server-claude-sessions-can-query-mac-health.md
ADDED
|
@@ -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.
|
apple_a_day-0.2.0/.visionlog/goals/GOAL-006-agent-native-affordances-schema-introspection-skil.md
ADDED
|
@@ -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.
|