ether-to-astro 1.1.0 → 1.3.0

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 (114) hide show
  1. package/.github/ISSUE_TEMPLATE/bug-report.yml +87 -0
  2. package/.github/ISSUE_TEMPLATE/capability-request.yml +117 -0
  3. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. package/.github/ISSUE_TEMPLATE/paper-cut.yml +59 -0
  5. package/.github/pull_request_template.md +1 -0
  6. package/AGENTS.md +32 -0
  7. package/DEVELOPER.md +78 -0
  8. package/README.md +129 -78
  9. package/SETUP.md +91 -44
  10. package/dist/astro-service/chart-output-service.d.ts +44 -0
  11. package/dist/astro-service/chart-output-service.js +110 -0
  12. package/dist/astro-service/date-input.d.ts +14 -0
  13. package/dist/astro-service/date-input.js +30 -0
  14. package/dist/astro-service/electional-service.d.ts +45 -0
  15. package/dist/astro-service/electional-service.js +305 -0
  16. package/dist/astro-service/natal-service.d.ts +41 -0
  17. package/dist/astro-service/natal-service.js +179 -0
  18. package/dist/astro-service/rising-sign-service.d.ts +37 -0
  19. package/dist/astro-service/rising-sign-service.js +137 -0
  20. package/dist/astro-service/service-types.d.ts +82 -0
  21. package/dist/astro-service/service-types.js +1 -0
  22. package/dist/astro-service/shared.d.ts +65 -0
  23. package/dist/astro-service/shared.js +98 -0
  24. package/dist/astro-service/sky-service.d.ts +48 -0
  25. package/dist/astro-service/sky-service.js +144 -0
  26. package/dist/astro-service/transit-service.d.ts +82 -0
  27. package/dist/astro-service/transit-service.js +353 -0
  28. package/dist/astro-service.d.ts +109 -48
  29. package/dist/astro-service.js +181 -457
  30. package/dist/cli.js +31 -0
  31. package/dist/entrypoint.d.ts +13 -0
  32. package/dist/entrypoint.js +78 -0
  33. package/dist/ephemeris.d.ts +15 -0
  34. package/dist/ephemeris.js +33 -0
  35. package/dist/formatter.d.ts +5 -1
  36. package/dist/formatter.js +4 -1
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.js +63 -114
  39. package/dist/loader.d.ts +1 -1
  40. package/dist/loader.js +61 -23
  41. package/dist/mcp-alias.d.ts +2 -0
  42. package/dist/mcp-alias.js +8 -0
  43. package/dist/time-utils.d.ts +8 -0
  44. package/dist/time-utils.js +16 -0
  45. package/dist/tool-registry.js +112 -6
  46. package/dist/tool-result.d.ts +8 -0
  47. package/dist/tool-result.js +39 -0
  48. package/dist/types.d.ts +79 -1
  49. package/docs/product/adrs/0001-mcp-vs-skill-boundary.md +96 -0
  50. package/docs/product/architecture-boundaries.md +231 -0
  51. package/docs/product/product-tenets.md +174 -0
  52. package/docs/releases/1.2.0-draft.md +48 -0
  53. package/docs/releases/1.3.0.md +51 -0
  54. package/docs/releases/README.md +17 -0
  55. package/package.json +9 -6
  56. package/skills/.curated/daily-brief/SKILL.md +75 -0
  57. package/skills/.curated/electional-overlay/SKILL.md +67 -0
  58. package/skills/.curated/weekly-overview/SKILL.md +73 -0
  59. package/skills/.system/write-skill/SKILL.md +90 -0
  60. package/src/astro-service/chart-output-service.ts +155 -0
  61. package/src/astro-service/date-input.ts +40 -0
  62. package/src/astro-service/electional-service.ts +395 -0
  63. package/src/astro-service/natal-service.ts +235 -0
  64. package/src/astro-service/rising-sign-service.ts +181 -0
  65. package/src/astro-service/service-types.ts +90 -0
  66. package/src/astro-service/shared.ts +128 -0
  67. package/src/astro-service/sky-service.ts +191 -0
  68. package/src/astro-service/transit-service.ts +507 -0
  69. package/src/astro-service.ts +198 -606
  70. package/src/cli.ts +84 -0
  71. package/src/entrypoint.ts +118 -0
  72. package/src/ephemeris.ts +44 -0
  73. package/src/formatter.ts +13 -1
  74. package/src/index.ts +77 -121
  75. package/src/loader.ts +69 -25
  76. package/src/mcp-alias.ts +10 -0
  77. package/src/time-utils.ts +18 -0
  78. package/src/tool-registry.ts +130 -10
  79. package/src/tool-result.ts +44 -0
  80. package/src/types.ts +91 -1
  81. package/tests/README.md +15 -0
  82. package/tests/property/electional-service.property.test.ts +67 -0
  83. package/tests/property/helpers/arbitraries.ts +126 -0
  84. package/tests/property/helpers/config.ts +52 -0
  85. package/tests/property/helpers/runtime.ts +12 -0
  86. package/tests/property/houses.property.test.ts +74 -0
  87. package/tests/property/rising-sign-service.property.test.ts +255 -0
  88. package/tests/property/service-transits.property.test.ts +154 -0
  89. package/tests/property/time-utils.property.test.ts +91 -0
  90. package/tests/property/transits.property.test.ts +113 -0
  91. package/tests/unit/astro-service/chart-output-service.test.ts +102 -0
  92. package/tests/unit/astro-service/electional-service.test.ts +182 -0
  93. package/tests/unit/astro-service/natal-service.test.ts +126 -0
  94. package/tests/unit/astro-service/rising-sign-service.test.ts +145 -0
  95. package/tests/unit/astro-service/sky-service.test.ts +130 -0
  96. package/tests/unit/astro-service/transit-service.test.ts +312 -0
  97. package/tests/unit/astro-service.test.ts +228 -127
  98. package/tests/unit/cli-commands.test.ts +13 -0
  99. package/tests/unit/entrypoint.test.ts +67 -0
  100. package/tests/unit/error-mapping.test.ts +20 -0
  101. package/tests/unit/formatter.test.ts +6 -0
  102. package/tests/unit/rising-sign-windows.test.ts +93 -0
  103. package/tests/unit/tool-registry.test.ts +125 -2
  104. package/tests/validation/README.md +14 -0
  105. package/tests/validation/adapters/internal.ts +234 -4
  106. package/tests/validation/compare/electional.ts +151 -0
  107. package/tests/validation/compare/rising-sign-windows.ts +347 -0
  108. package/tests/validation/compare/service-transits.ts +205 -0
  109. package/tests/validation/fixtures/electional/core.ts +88 -0
  110. package/tests/validation/fixtures/rising-sign-windows/core.ts +57 -0
  111. package/tests/validation/fixtures/service-transits/core.ts +89 -0
  112. package/tests/validation/utils/fixtureTypes.ts +139 -1
  113. package/tests/validation/validation.spec.ts +82 -0
  114. package/setup.sh +0 -21
@@ -0,0 +1,87 @@
1
+ name: Bug report
2
+ description: Report incorrect, misleading, lossy, or contract-drift behavior.
3
+ title: "[Bug]: "
4
+ labels:
5
+ - bug
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Use this template when the current behavior is wrong, misleading, lossy, or does not match docs.
11
+
12
+ - type: dropdown
13
+ id: surface
14
+ attributes:
15
+ label: Affected surface
16
+ options:
17
+ - MCP
18
+ - CLI
19
+ - Docs
20
+ - Charts / rendering
21
+ - Validation / tests
22
+ - Mixed / not sure
23
+ validations:
24
+ required: true
25
+
26
+ - type: textarea
27
+ id: current
28
+ attributes:
29
+ label: Current behavior
30
+ description: What happens today?
31
+ validations:
32
+ required: true
33
+
34
+ - type: textarea
35
+ id: expected
36
+ attributes:
37
+ label: Expected behavior
38
+ description: What should happen instead?
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: impact
44
+ attributes:
45
+ label: User impact
46
+ description: Why does this matter in practice?
47
+ placeholder: This causes incorrect astrology, misleading UX, or broken workflows because...
48
+ validations:
49
+ required: true
50
+
51
+ - type: textarea
52
+ id: repro
53
+ attributes:
54
+ label: Steps to reproduce
55
+ description: Include tool calls, CLI commands, or input parameters.
56
+ placeholder: |
57
+ 1. Call `...`
58
+ 2. With input `...`
59
+ 3. Observe `...`
60
+ validations:
61
+ required: true
62
+
63
+ - type: textarea
64
+ id: context
65
+ attributes:
66
+ label: Relevant chart/date/timezone context
67
+ description: Add sanitized astrology context if it matters.
68
+ placeholder: Date, timezone, house system, location, planet categories, days_ahead, etc.
69
+
70
+ - type: textarea
71
+ id: docs_drift
72
+ attributes:
73
+ label: Docs or contract drift
74
+ description: If docs/tool descriptions are involved, note the mismatch here.
75
+
76
+ - type: textarea
77
+ id: acceptance
78
+ attributes:
79
+ label: Fix acceptance criteria
80
+ description: What would make this bug fixed?
81
+ placeholder: |
82
+ - Tool docs say...
83
+ - Response no longer drops...
84
+ - Validation covers...
85
+ validations:
86
+ required: true
87
+
@@ -0,0 +1,117 @@
1
+ name: Capability request
2
+ description: Request a new feature, MCP primitive, skill, or reporting capability.
3
+ title: "[Capability]: "
4
+ labels:
5
+ - feature
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Use this template for new capabilities across MCP, CLI, skills, or docs.
11
+
12
+ Before filing, check:
13
+ - `docs/product/product-tenets.md`
14
+ - `docs/product/architecture-boundaries.md`
15
+ - whether this belongs in MCP, a skill, or docs
16
+
17
+ - type: dropdown
18
+ id: surface
19
+ attributes:
20
+ label: Recommended surface
21
+ description: Where should this capability primarily live?
22
+ options:
23
+ - MCP
24
+ - Skill
25
+ - CLI
26
+ - Docs
27
+ - Mixed / not sure
28
+ validations:
29
+ required: true
30
+
31
+ - type: dropdown
32
+ id: type
33
+ attributes:
34
+ label: Capability type
35
+ options:
36
+ - Feature
37
+ - Gap
38
+ - Skill enhancement
39
+ - Docs enhancement
40
+ - RFC / decision needed
41
+ validations:
42
+ required: true
43
+
44
+ - type: textarea
45
+ id: problem
46
+ attributes:
47
+ label: Problem statement
48
+ description: What is missing or hard today? Write this like a PM problem statement.
49
+ placeholder: The current product can do X, but it cannot do Y, which blocks Z.
50
+ validations:
51
+ required: true
52
+
53
+ - type: textarea
54
+ id: user_story
55
+ attributes:
56
+ label: User story
57
+ description: Use the format “As a..., I want..., so that...”
58
+ placeholder: As a skill author, I want...
59
+ validations:
60
+ required: true
61
+
62
+ - type: textarea
63
+ id: value
64
+ attributes:
65
+ label: Why this matters
66
+ description: What user outcome or product goal does this unlock?
67
+ placeholder: This matters because...
68
+ validations:
69
+ required: true
70
+
71
+ - type: textarea
72
+ id: determinism
73
+ attributes:
74
+ label: Determinism and boundary check
75
+ description: Explain whether the proposed output is deterministic for the same inputs, and why it belongs in MCP, a skill, or another layer.
76
+ placeholder: The output is deterministic because... It belongs in MCP/Skill because...
77
+ validations:
78
+ required: true
79
+
80
+ - type: textarea
81
+ id: proposed_scope
82
+ attributes:
83
+ label: Proposed scope
84
+ description: What should this include? Keep it concrete.
85
+ placeholder: Add a new endpoint or mode that returns...
86
+ validations:
87
+ required: true
88
+
89
+ - type: textarea
90
+ id: acceptance
91
+ attributes:
92
+ label: Acceptance criteria
93
+ description: Flat list is fine. Focus on observable outcomes.
94
+ placeholder: |
95
+ - A client can...
96
+ - The response includes...
97
+ - Docs explain...
98
+ validations:
99
+ required: true
100
+
101
+ - type: textarea
102
+ id: examples
103
+ attributes:
104
+ label: Example input/output or workflow
105
+ description: Provide a tool call, user flow, or report snippet if helpful.
106
+
107
+ - type: textarea
108
+ id: dependencies
109
+ attributes:
110
+ label: Dependencies or related issues
111
+ description: Link related issues or note prerequisite work.
112
+
113
+ - type: textarea
114
+ id: non_goals
115
+ attributes:
116
+ label: Non-goals or constraints
117
+ description: What should this issue avoid doing?
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Product triage backlog
4
+ url: https://github.com/unsalted/ether-to-astro/blob/main/docs/product/product-tenets.md
5
+ about: Start here for product boundaries and MCP-vs-skill guidance.
@@ -0,0 +1,59 @@
1
+ name: Paper-cut
2
+ description: Report small UX, API, formatting, or workflow friction that should be easy to improve.
3
+ title: "[Paper-cut]: "
4
+ labels:
5
+ - paper-cut
6
+ body:
7
+ - type: dropdown
8
+ id: surface
9
+ attributes:
10
+ label: Affected surface
11
+ options:
12
+ - MCP
13
+ - CLI
14
+ - Docs
15
+ - Skill workflow
16
+ - Mixed / not sure
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: friction
22
+ attributes:
23
+ label: Current friction
24
+ description: What is awkward or annoying today?
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: desired
30
+ attributes:
31
+ label: Desired improvement
32
+ description: What small change would make this noticeably better?
33
+ validations:
34
+ required: true
35
+
36
+ - type: textarea
37
+ id: workaround
38
+ attributes:
39
+ label: Current workaround
40
+ description: How are you working around it now?
41
+
42
+ - type: textarea
43
+ id: user_story
44
+ attributes:
45
+ label: User story
46
+ description: Optional but helpful. Use “As a..., I want..., so that...”
47
+
48
+ - type: textarea
49
+ id: acceptance
50
+ attributes:
51
+ label: Acceptance criteria
52
+ description: Keep this small and concrete.
53
+ placeholder: |
54
+ - Response includes...
55
+ - Docs show...
56
+ - A client no longer needs to...
57
+ validations:
58
+ required: true
59
+
@@ -14,3 +14,4 @@
14
14
  - [ ] Scope is focused and avoids unrelated churn
15
15
  - [ ] Tests were added or updated when behavior changed
16
16
  - [ ] Docs were updated when workflow or interfaces changed
17
+ - [ ] This change respects the MCP vs skill boundary in `docs/product/product-tenets.md` and `docs/product/adrs/0001-mcp-vs-skill-boundary.md`
package/AGENTS.md CHANGED
@@ -98,6 +98,38 @@ Defined in `tests/validation/utils/tolerances.ts`:
98
98
  - Preferred commit types: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `build`, `ci`.
99
99
  - Keep commits scoped to one coherent change whenever possible.
100
100
 
101
+ ## Request Triage Guidance
102
+ - When responding to bug reports, feature requests, or product-boundary questions, consult these docs first:
103
+ - `docs/product/product-tenets.md`
104
+ - `docs/product/architecture-boundaries.md`
105
+ - `docs/product/adrs/0001-mcp-vs-skill-boundary.md`
106
+ - `docs/product/post-iteration-2-triage.private.md` if present locally
107
+ - Use those docs to classify the request before proposing implementation:
108
+ - `bug` for incorrect, lossy, misleading, or contract-drift behavior
109
+ - `feature` for reusable product capability
110
+ - `paper-cut` for small interface or workflow friction
111
+ - `skill` when the work is primarily synthesis, formatting, ranking, or preference-aware orchestration
112
+ - `MCP` when the work is deterministic or mostly deterministic, computational, reusable, and risky to reconstruct client-side
113
+ - Apply the determinism rule explicitly:
114
+ - deterministic and generic astro computation is a strong candidate for MCP
115
+ - deterministic but policy-heavy or personalized workflow synthesis still belongs in a skill
116
+ - If a competent LLM can solve the request in one or two calls using stable MCP primitives, prefer keeping it out of MCP unless there is strong evidence the pattern should become a reusable primitive.
117
+ - For incoming product requests, prefer extending an existing tool with flags, fields, modes, or range support before proposing a new narrowly scoped MCP tool.
118
+
119
+ ## Writing Skills
120
+ - When a request is classified as a `skill`, default the deliverable to a concrete `SKILL.md` or equivalent workflow spec, not a broad product narrative.
121
+ - Repo-owned `SKILL.md` files should follow the Agent Skills spec, including YAML frontmatter with at least `name` and `description`.
122
+ - Treat repo-owned skills as boring, compliant instruction bundles:
123
+ - clear purpose
124
+ - required inputs and assumptions
125
+ - exact MCP/tools to call
126
+ - output shape
127
+ - boundaries and non-goals
128
+ - Prefer one or two stable MCP calls plus synthesis over embedding custom astro math, hidden heuristics, or pseudo-tool contracts in the skill.
129
+ - Keep deterministic astro facts in MCP and user-specific ranking, emphasis, and interpretation in the skill.
130
+ - Do not treat every skill idea in product docs or issues as a committed repo artifact. Many skill ideas are incubation examples unless explicitly promoted.
131
+ - If authoring or revising a skill, prefer following the repo-local skill authoring guidance in `skills/.system/write-skill/SKILL.md`.
132
+
101
133
  ## Release Governance
102
134
  - `main` is PR-only and branch-protected; do not push directly.
103
135
  - Use Conventional Commits / commitizen-style messages for all commits.
package/DEVELOPER.md ADDED
@@ -0,0 +1,78 @@
1
+ # Developer Guide
2
+
3
+ This guide is for contributors working in the repository.
4
+
5
+ For product setup and end-user usage, see [SETUP.md](/Users/salted/Code/astro-mcp/SETUP.md).
6
+
7
+ ## Local Repo Setup
8
+
9
+ Requirements:
10
+
11
+ - Node.js 22+
12
+
13
+ Install dependencies:
14
+
15
+ ```bash
16
+ npm install
17
+ ```
18
+
19
+ Build the local checkout:
20
+
21
+ ```bash
22
+ npm run build
23
+ ```
24
+
25
+ Use the local CLI after building:
26
+
27
+ ```bash
28
+ npm run start:cli -- --help
29
+ ```
30
+
31
+ ## Quality Gates
32
+
33
+ Routine merge gate:
34
+
35
+ ```bash
36
+ npm run quality:gate
37
+ ```
38
+
39
+ This runs:
40
+
41
+ - `npm run build`
42
+ - `npm run lint`
43
+ - `npm test -- --run`
44
+
45
+ Targeted validation for high-risk astrology engine changes:
46
+
47
+ ```bash
48
+ npm run validate:astro
49
+ ```
50
+
51
+ ## Contributor Contract
52
+
53
+ - Keep changes focused and avoid unrelated churn in the same diff.
54
+ - Treat Biome as the source of truth for formatting, import order, and linting.
55
+ - Use conventional commit messages: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `build`, `ci`.
56
+ - Keep PR descriptions short and explicit about what changed and how it was verified.
57
+ - Respect the MCP-vs-skill boundary documented in:
58
+ - [docs/product/product-tenets.md](/Users/salted/Code/astro-mcp/docs/product/product-tenets.md)
59
+ - [docs/product/architecture-boundaries.md](/Users/salted/Code/astro-mcp/docs/product/architecture-boundaries.md)
60
+ - [docs/product/adrs/0001-mcp-vs-skill-boundary.md](/Users/salted/Code/astro-mcp/docs/product/adrs/0001-mcp-vs-skill-boundary.md)
61
+
62
+ ## Technical Notes
63
+
64
+ - Engine: native Swiss Ephemeris via Node `sweph` bindings
65
+ - `sweph` is pinned to an exact version to keep validation fixtures and numerical baselines stable
66
+ - Primary accuracy mode uses Swiss Ephemeris data files
67
+ - `EPHEMERIS_VERSION=moshier` is supported as a lower-precision fallback
68
+ - Chart rendering uses `@astrodraw/astrochart` with JSDOM
69
+
70
+ ## Common Commands
71
+
72
+ ```bash
73
+ npm run build
74
+ npm run lint
75
+ npm test -- --run
76
+ npm run validate:astro
77
+ npm run start:cli -- --help
78
+ ```
package/README.md CHANGED
@@ -12,26 +12,98 @@
12
12
 
13
13
  Astrology tooling for agent workflows.
14
14
 
15
- `ether-to-astro` is a local-first astrology toolkit with two surfaces: `e2a`, a CLI, and `e2a-mcp`, an MCP server.
15
+ `ether-to-astro` is a local-first astrology toolkit with a unified `e2a` binary for CLI and MCP usage, plus an `e2a-mcp` compatibility alias for existing MCP setups.
16
16
 
17
17
  This started as a side project because my wife is the real user, and I wasn’t impressed with the tooling around her astrology fascination. I’ve worked on plenty of AI tools and have a pretty high bar for them. Most of what I found in this space felt flimsy, closed-off, or not designed for serious agent workflows.
18
18
 
19
19
  So I built the version I wanted to exist: local-first, scriptable, tested, and structured to work well both from the command line and through MCP. I built it, she uses it daily, and that feedback loop has made the product better.
20
20
 
21
+ ## Quick Start
22
+
23
+ ### MCP
24
+
25
+ Add this to your MCP client config:
26
+
27
+ ```json
28
+ {
29
+ "mcpServers": {
30
+ "astro": {
31
+ "command": "npx",
32
+ "args": ["--yes", "--package=ether-to-astro", "e2a", "--mcp"]
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ Then restart your MCP client and call `set_natal_chart`.
39
+
40
+ ### CLI
41
+
42
+ Run the CLI directly with `npx`:
43
+
44
+ ```bash
45
+ npx --yes ether-to-astro --help
46
+ ```
47
+
48
+ Or:
49
+
50
+ ```bash
51
+ npx --yes --package=ether-to-astro e2a --help
52
+ ```
53
+
54
+ Or install globally:
55
+
56
+ ```bash
57
+ npm install -g ether-to-astro
58
+ e2a --help
59
+ e2a --mcp --help
60
+ ```
61
+
62
+ ### Product Setup
63
+
64
+ - End-user setup and examples: [SETUP.md](/Users/salted/Code/astro-mcp/SETUP.md)
65
+ - Local repo setup and contributor workflow: [DEVELOPER.md](/Users/salted/Code/astro-mcp/DEVELOPER.md)
66
+
67
+ ### Agent Skills
68
+
69
+ This repo also includes repo-owned agent skills in a standard `skills/` layout.
70
+
71
+ If you use the [Vercel `skills` CLI](https://github.com/vercel-labs/skills), you can inspect or install them from a local checkout:
72
+
73
+ ```bash
74
+ # List skills available in this repo
75
+ npx skills add . --list
76
+
77
+ # Install the repo's skills to Codex for this project
78
+ npx skills add . --agent codex --skill daily-brief --skill weekly-overview --skill electional-overlay
79
+
80
+ # Install the repo's write-skill helper to Codex for this project
81
+ npx skills add . --agent codex --skill write-skill
82
+ ```
83
+
84
+ You can also install from GitHub instead of a local checkout:
85
+
86
+ ```bash
87
+ npx skills add unsalted/ether-to-astro --agent codex --skill write-skill
88
+ ```
89
+
21
90
  ## Features
22
91
 
23
92
  You can ask your AI agent about:
24
93
 
25
94
  ### Transits
26
- - **Daily mundane transits** - Current planetary positions
95
+ - **Daily mundane positions** - Current planetary positions
96
+ - **Mundane transit-to-transit aspects** - Deterministic aspect signals between transiting bodies
97
+ - **Mundane weather metadata** - Deterministic supportive/challenging grouping references (non-narrative)
27
98
  - **Moon transits** - Fast-moving Moon aspects to natal planets
28
99
  - **Personal planet transits** - Sun, Mercury, Venus, Mars aspects to natal chart
29
100
  - **Outer planet transits** - Jupiter, Saturn, Uranus, Neptune, Pluto aspects
30
101
  - **Exact transit times** - Precise timing when transits become exact (0° orb)
31
- - **Upcoming transits** - Multi-day forecast for transits approaching within
102
+ - **Upcoming transit preview** - Best upcoming hits across a requested date range
32
103
 
33
104
  ### Advanced Features
34
105
  - **House cusps** - Ascendant, Midheaven, and all 12 houses (multiple systems)
106
+ - **Electional context** - Stateless ascendant, sect, Moon phase, and applying-aspect context for a specific date, time, and location
35
107
  - **Retrograde status** - Which planets are currently retrograde
36
108
  - **Rise/Set times** - Sunrise, sunset, moonrise, moonset
37
109
  - **Asteroids & Nodes** - Chiron, Ceres, Pallas, Juno, Vesta, North Node
@@ -40,8 +112,29 @@ You can ask your AI agent about:
40
112
 
41
113
  ## Installation
42
114
 
115
+ ### From npm
116
+
117
+ For normal product usage, install from npm or use `npx`.
118
+
119
+ ```bash
120
+ npx --yes --package=ether-to-astro e2a --help
121
+ ```
122
+
123
+ Or:
124
+
43
125
  ```bash
44
- ./setup.sh
126
+ npm install -g ether-to-astro
127
+ ```
128
+
129
+ You do not need to run `npm run build` when installing from npm.
130
+
131
+ ### From a local repo checkout
132
+
133
+ If you cloned this repository and want to run the local source checkout:
134
+
135
+ ```bash
136
+ npm install
137
+ npm run build
45
138
  ```
46
139
 
47
140
  ### Ephemeris Data Configuration
@@ -68,82 +161,32 @@ EPHEMERIS_VERSION=moshier npm install
68
161
  Or manually:
69
162
  ```bash
70
163
  npm install
71
- npm run build
72
164
  ```
73
165
 
74
- ## Contributing Contract
75
-
76
- This repo uses a lightweight, agent-friendly operating contract:
77
-
78
- - Keep changes focused and avoid unrelated churn in the same diff.
79
- - Treat Biome as the source of truth for formatting, import order, and linting.
80
- - Use conventional commit messages: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `build`, `ci`.
81
- - Keep PR descriptions short and explicit about what changed and how it was verified.
166
+ ## Package Names
82
167
 
83
- Required routine quality gate:
84
-
85
- ```bash
86
- npm run quality:gate
87
- ```
88
-
89
- This runs:
90
-
91
- - `npm run build`
92
- - `npm run lint`
93
- - `npm test -- --run`
94
-
95
- Use `npm run validate:astro` for high-risk astrology engine work such as ephemeris/root-solver/transit-timing changes. It is intentionally not part of the default routine gate.
96
-
97
- Commit examples:
98
-
99
- ```text
100
- fix(cli): resolve injected cwd for relative profile paths
101
- test(profiles): cover default profile precedence
102
- refactor(transits): simplify exact-time formatting
103
- docs(readme): document remote-ready repo contract
104
- ```
105
-
106
- Pull request checklist:
107
-
108
- - Scope is focused and coherent.
109
- - `npm run quality:gate` passed locally.
110
- - Tests were added or updated when behavior changed.
111
- - Docs were updated when workflow or interfaces changed.
112
- - PR description includes:
113
- - What changed
114
- - How it was verified
168
+ - Package: `ether-to-astro`
169
+ - CLI command aliases: `ether-to-astro`, `e2a`
170
+ - Canonical MCP command: `e2a --mcp`
171
+ - Compatibility MCP alias: `e2a-mcp`
115
172
 
116
- ## Setup
173
+ ## Runtime Surfaces
117
174
 
118
- 1. Run setup script or install manually (see above)
175
+ ### MCP server (stateful per process)
119
176
 
120
- 2. Build:
177
+ Launch MCP mode with:
121
178
 
122
179
  ```bash
123
- npm run build
180
+ e2a --mcp --help
124
181
  ```
125
182
 
126
- 3. Add MCP to your MCP settings (e.g., Claude Desktop config):
183
+ Optional deterministic startup defaults:
127
184
 
128
- ```json
129
- {
130
- "mcpServers": {
131
- "astro": {
132
- "command": "npx",
133
- "args": ["--yes", "--package=ether-to-astro", "e2a-mcp"]
134
- }
135
- }
136
- }
185
+ ```bash
186
+ e2a --mcp --preferred-tz America/Los_Angeles --preferred-house-style W --weekday-labels
137
187
  ```
138
188
 
139
- Package/binary names:
140
- - Package: `ether-to-astro`
141
- - CLI command: `e2a`
142
- - MCP command: `e2a-mcp`
143
-
144
- ## Runtime Surfaces
145
-
146
- ### MCP server (stateful per process)
189
+ The `e2a-mcp` binary remains available as a compatibility alias and starts MCP mode automatically.
147
190
 
148
191
  ### In-Memory Storage
149
192
  The MCP server uses **in-memory storage** for natal chart data:
@@ -159,16 +202,10 @@ This design is **MCP-compliant** for stdio transport and ensures complete isolat
159
202
 
160
203
  `e2a` is JSON-first for agent usage and supports `--pretty` for human-readable output.
161
204
 
162
- `npx` usage note: this package is named `ether-to-astro`, so invoke bins with `--package`.
163
- `npx e2a` will not work by itself because npm resolves package names first.
164
-
165
- Install globally if you want direct commands without `--package`:
166
-
167
- ```bash
168
- npm install -g ether-to-astro
169
- e2a --help
170
- e2a-mcp --help
171
- ```
205
+ `npx` usage note:
206
+ - `npx ether-to-astro ...` works directly (package-name bin alias).
207
+ - `npx e2a ...` does **not** work by itself because npm resolves package names first.
208
+ - `npx --package=ether-to-astro e2a ...` remains supported.
172
209
 
173
210
  Examples:
174
211
 
@@ -261,7 +298,17 @@ Ask your AI agent:
261
298
  - `set_natal_chart` - Store birth chart data
262
299
 
263
300
  ### Transits
264
- - `get_transits` - Category-filtered transits with optional exact-time data
301
+ - `get_transits` - Category-filtered transits with optional exact-time data and explicit mode semantics:
302
+ - `snapshot`: single-day view for the selected date
303
+ - `best_hit`: compressed multi-day preview across the selected date window
304
+ - `forecast`: day-grouped transit output across the selected date window
305
+ - if `mode` is omitted, legacy behavior is preserved: `days_ahead=0` resolves to `snapshot`, and `days_ahead>0` resolves to `best_hit`
306
+ - each transit now includes additive placement metadata for both sides: sign, degree, and house
307
+ - with `include_mundane=true`, output includes deterministic mundane positions plus `mundane.aspects` and non-narrative `mundane.weather` grouping metadata
308
+ - when `include_mundane=true` and `mode=forecast`, output includes `mundane.days[]` with per-day grouped mundane aspects/weather
309
+
310
+ ### Electional
311
+ - `get_electional_context` - Stateless electional context for a local date, time, and location. Returns deterministic ascendant, sect/day-night classification, Moon phase, applying aspects, and optional ASC-ruler basics without requiring a natal chart.
265
312
 
266
313
  ### Advanced Tools
267
314
  - `get_houses` - House cusps, Ascendant, Midheaven (Placidus, Koch, Whole Sign, Equal)
@@ -304,6 +351,10 @@ Ask your AI agent:
304
351
  - **Exact time calculation**: Uses binary search interpolation for precision
305
352
  - **Advance warnings**: Shows transits within 2° orb
306
353
 
354
+ ## Development
355
+
356
+ Contributor workflow, local repo setup, quality gates, and release-oriented notes live in [DEVELOPER.md](/Users/salted/Code/astro-mcp/DEVELOPER.md).
357
+
307
358
  ## License
308
359
 
309
360
  AGPL-3.0-or-later