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.
- package/.github/ISSUE_TEMPLATE/bug-report.yml +87 -0
- package/.github/ISSUE_TEMPLATE/capability-request.yml +117 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/paper-cut.yml +59 -0
- package/.github/pull_request_template.md +1 -0
- package/AGENTS.md +32 -0
- package/DEVELOPER.md +78 -0
- package/README.md +129 -78
- package/SETUP.md +91 -44
- package/dist/astro-service/chart-output-service.d.ts +44 -0
- package/dist/astro-service/chart-output-service.js +110 -0
- package/dist/astro-service/date-input.d.ts +14 -0
- package/dist/astro-service/date-input.js +30 -0
- package/dist/astro-service/electional-service.d.ts +45 -0
- package/dist/astro-service/electional-service.js +305 -0
- package/dist/astro-service/natal-service.d.ts +41 -0
- package/dist/astro-service/natal-service.js +179 -0
- package/dist/astro-service/rising-sign-service.d.ts +37 -0
- package/dist/astro-service/rising-sign-service.js +137 -0
- package/dist/astro-service/service-types.d.ts +82 -0
- package/dist/astro-service/service-types.js +1 -0
- package/dist/astro-service/shared.d.ts +65 -0
- package/dist/astro-service/shared.js +98 -0
- package/dist/astro-service/sky-service.d.ts +48 -0
- package/dist/astro-service/sky-service.js +144 -0
- package/dist/astro-service/transit-service.d.ts +82 -0
- package/dist/astro-service/transit-service.js +353 -0
- package/dist/astro-service.d.ts +109 -48
- package/dist/astro-service.js +181 -457
- package/dist/cli.js +31 -0
- package/dist/entrypoint.d.ts +13 -0
- package/dist/entrypoint.js +78 -0
- package/dist/ephemeris.d.ts +15 -0
- package/dist/ephemeris.js +33 -0
- package/dist/formatter.d.ts +5 -1
- package/dist/formatter.js +4 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +63 -114
- package/dist/loader.d.ts +1 -1
- package/dist/loader.js +61 -23
- package/dist/mcp-alias.d.ts +2 -0
- package/dist/mcp-alias.js +8 -0
- package/dist/time-utils.d.ts +8 -0
- package/dist/time-utils.js +16 -0
- package/dist/tool-registry.js +112 -6
- package/dist/tool-result.d.ts +8 -0
- package/dist/tool-result.js +39 -0
- package/dist/types.d.ts +79 -1
- package/docs/product/adrs/0001-mcp-vs-skill-boundary.md +96 -0
- package/docs/product/architecture-boundaries.md +231 -0
- package/docs/product/product-tenets.md +174 -0
- package/docs/releases/1.2.0-draft.md +48 -0
- package/docs/releases/1.3.0.md +51 -0
- package/docs/releases/README.md +17 -0
- package/package.json +9 -6
- package/skills/.curated/daily-brief/SKILL.md +75 -0
- package/skills/.curated/electional-overlay/SKILL.md +67 -0
- package/skills/.curated/weekly-overview/SKILL.md +73 -0
- package/skills/.system/write-skill/SKILL.md +90 -0
- package/src/astro-service/chart-output-service.ts +155 -0
- package/src/astro-service/date-input.ts +40 -0
- package/src/astro-service/electional-service.ts +395 -0
- package/src/astro-service/natal-service.ts +235 -0
- package/src/astro-service/rising-sign-service.ts +181 -0
- package/src/astro-service/service-types.ts +90 -0
- package/src/astro-service/shared.ts +128 -0
- package/src/astro-service/sky-service.ts +191 -0
- package/src/astro-service/transit-service.ts +507 -0
- package/src/astro-service.ts +198 -606
- package/src/cli.ts +84 -0
- package/src/entrypoint.ts +118 -0
- package/src/ephemeris.ts +44 -0
- package/src/formatter.ts +13 -1
- package/src/index.ts +77 -121
- package/src/loader.ts +69 -25
- package/src/mcp-alias.ts +10 -0
- package/src/time-utils.ts +18 -0
- package/src/tool-registry.ts +130 -10
- package/src/tool-result.ts +44 -0
- package/src/types.ts +91 -1
- package/tests/README.md +15 -0
- package/tests/property/electional-service.property.test.ts +67 -0
- package/tests/property/helpers/arbitraries.ts +126 -0
- package/tests/property/helpers/config.ts +52 -0
- package/tests/property/helpers/runtime.ts +12 -0
- package/tests/property/houses.property.test.ts +74 -0
- package/tests/property/rising-sign-service.property.test.ts +255 -0
- package/tests/property/service-transits.property.test.ts +154 -0
- package/tests/property/time-utils.property.test.ts +91 -0
- package/tests/property/transits.property.test.ts +113 -0
- package/tests/unit/astro-service/chart-output-service.test.ts +102 -0
- package/tests/unit/astro-service/electional-service.test.ts +182 -0
- package/tests/unit/astro-service/natal-service.test.ts +126 -0
- package/tests/unit/astro-service/rising-sign-service.test.ts +145 -0
- package/tests/unit/astro-service/sky-service.test.ts +130 -0
- package/tests/unit/astro-service/transit-service.test.ts +312 -0
- package/tests/unit/astro-service.test.ts +228 -127
- package/tests/unit/cli-commands.test.ts +13 -0
- package/tests/unit/entrypoint.test.ts +67 -0
- package/tests/unit/error-mapping.test.ts +20 -0
- package/tests/unit/formatter.test.ts +6 -0
- package/tests/unit/rising-sign-windows.test.ts +93 -0
- package/tests/unit/tool-registry.test.ts +125 -2
- package/tests/validation/README.md +14 -0
- package/tests/validation/adapters/internal.ts +234 -4
- package/tests/validation/compare/electional.ts +151 -0
- package/tests/validation/compare/rising-sign-windows.ts +347 -0
- package/tests/validation/compare/service-transits.ts +205 -0
- package/tests/validation/fixtures/electional/core.ts +88 -0
- package/tests/validation/fixtures/rising-sign-windows/core.ts +57 -0
- package/tests/validation/fixtures/service-transits/core.ts +89 -0
- package/tests/validation/utils/fixtureTypes.ts +139 -1
- package/tests/validation/validation.spec.ts +82 -0
- 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,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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
##
|
|
173
|
+
## Runtime Surfaces
|
|
117
174
|
|
|
118
|
-
|
|
175
|
+
### MCP server (stateful per process)
|
|
119
176
|
|
|
120
|
-
|
|
177
|
+
Launch MCP mode with:
|
|
121
178
|
|
|
122
179
|
```bash
|
|
123
|
-
|
|
180
|
+
e2a --mcp --help
|
|
124
181
|
```
|
|
125
182
|
|
|
126
|
-
|
|
183
|
+
Optional deterministic startup defaults:
|
|
127
184
|
|
|
128
|
-
```
|
|
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
|
-
|
|
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:
|
|
163
|
-
`npx
|
|
164
|
-
|
|
165
|
-
|
|
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
|