ether-to-astro 1.0.2 → 1.2.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 (60) 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/.github/workflows/release.yml +2 -2
  7. package/.github/workflows/test.yml +2 -2
  8. package/AGENTS.md +46 -1
  9. package/DEVELOPER.md +78 -0
  10. package/README.md +128 -75
  11. package/SETUP.md +100 -41
  12. package/dist/astro-service.d.ts +51 -2
  13. package/dist/astro-service.js +660 -56
  14. package/dist/cli.js +31 -0
  15. package/dist/entrypoint.d.ts +13 -0
  16. package/dist/entrypoint.js +78 -0
  17. package/dist/ephemeris.d.ts +15 -0
  18. package/dist/ephemeris.js +33 -0
  19. package/dist/formatter.d.ts +5 -1
  20. package/dist/formatter.js +4 -1
  21. package/dist/index.d.ts +2 -1
  22. package/dist/index.js +63 -114
  23. package/dist/loader.d.ts +1 -1
  24. package/dist/loader.js +61 -23
  25. package/dist/mcp-alias.d.ts +2 -0
  26. package/dist/mcp-alias.js +8 -0
  27. package/dist/time-utils.d.ts +8 -0
  28. package/dist/time-utils.js +16 -0
  29. package/dist/tool-registry.js +111 -5
  30. package/dist/tool-result.d.ts +8 -0
  31. package/dist/tool-result.js +39 -0
  32. package/dist/types.d.ts +79 -1
  33. package/docs/product/adrs/0001-mcp-vs-skill-boundary.md +96 -0
  34. package/docs/product/architecture-boundaries.md +223 -0
  35. package/docs/product/product-tenets.md +174 -0
  36. package/docs/releases/1.2.0-draft.md +48 -0
  37. package/package.json +7 -7
  38. package/skills/.curated/daily-brief/SKILL.md +75 -0
  39. package/skills/.curated/electional-overlay/SKILL.md +67 -0
  40. package/skills/.curated/weekly-overview/SKILL.md +73 -0
  41. package/skills/.system/write-skill/SKILL.md +90 -0
  42. package/src/astro-service.ts +861 -60
  43. package/src/cli.ts +84 -0
  44. package/src/entrypoint.ts +118 -0
  45. package/src/ephemeris.ts +44 -0
  46. package/src/formatter.ts +13 -1
  47. package/src/index.ts +77 -121
  48. package/src/loader.ts +69 -25
  49. package/src/mcp-alias.ts +10 -0
  50. package/src/time-utils.ts +18 -0
  51. package/src/tool-registry.ts +129 -9
  52. package/src/tool-result.ts +44 -0
  53. package/src/types.ts +91 -1
  54. package/tests/unit/astro-service.test.ts +751 -5
  55. package/tests/unit/cli-commands.test.ts +13 -0
  56. package/tests/unit/entrypoint.test.ts +67 -0
  57. package/tests/unit/error-mapping.test.ts +20 -0
  58. package/tests/unit/formatter.test.ts +6 -0
  59. package/tests/unit/tool-registry.test.ts +114 -2
  60. package/setup.sh +0 -21
@@ -0,0 +1,174 @@
1
+ # Product Tenets
2
+
3
+ This document defines what `ether-to-astro` is, what it is not, and how we avoid turning the MCP surface into a muddy bundle of personalized workflow logic.
4
+
5
+ ## Mission
6
+
7
+ Build a trustworthy astrology computation layer for AI-native workflows.
8
+
9
+ ## North-Star
10
+
11
+ `ether-to-astro` should provide reliable astrological facts and structured primitives that agents can use to build high-quality experiences without reimplementing astro math client-side.
12
+
13
+ ## Primary Jobs To Be Done
14
+
15
+ - Compute natal, transit, mundane, and electional astrology data accurately.
16
+ - Expose that data through stable MCP and CLI primitives.
17
+ - Make those primitives composable for skills, prompts, and downstream agent workflows.
18
+ - Preserve clear boundaries between computation, interpretation, and personalization.
19
+
20
+ ## What We Build
21
+
22
+ - Astrology computation and normalization
23
+ - Reusable primitives for transit and chart workflows
24
+ - Structured outputs that reduce fragile client-side reconstruction
25
+ - Docs and examples that help agents compose the system correctly
26
+
27
+ ## What We Do Not Build
28
+
29
+ - A monolithic “do everything” astrology assistant inside MCP
30
+ - User-specific advice engines hardcoded into the core surface
31
+ - Prompt-shaped tools that mostly duplicate what a competent LLM can do from stable primitives
32
+ - Endless one-off reporting endpoints for every downstream workflow
33
+
34
+ ## Boundary Rules
35
+
36
+ ### MCP Owns
37
+
38
+ Put a capability in MCP if it is:
39
+
40
+ - deterministic or mostly deterministic,
41
+ - computational rather than interpretive,
42
+ - reusable across clients or skills,
43
+ - grounded in astro math, house logic, timezone logic, or ephemeris logic,
44
+ - and difficult or risky to reconstruct client-side.
45
+
46
+ Examples:
47
+
48
+ - transit calculation
49
+ - range-aware forecast data
50
+ - mundane aspects
51
+ - house activation metadata
52
+ - electional primitives
53
+ - local rising-sign windows
54
+
55
+ ### Skills Own
56
+
57
+ Put a capability in a skill if it is:
58
+
59
+ - mostly synthesis, ranking, or formatting,
60
+ - non-deterministic or heavily dependent on judgment,
61
+ - user-specific or preference-heavy,
62
+ - likely to evolve quickly,
63
+ - and doable by a competent LLM in one or two calls to stable MCP primitives.
64
+
65
+ Examples:
66
+
67
+ - daily brief generation
68
+ - weekly overview synthesis
69
+ - opportunity/risk framing
70
+ - “best use today” language
71
+ - electional scoring using a specific user’s preferences
72
+ - preference-aware section ordering and tone
73
+
74
+ Skill ideas are the default incubation layer for new workflow concepts.
75
+
76
+ That does not make every skill example in this repo a committed product roadmap item.
77
+
78
+ Treat skill-layer examples and issue ideas as candidate workflows unless they are explicitly promoted into committed work.
79
+
80
+ ### MCP Prompts Own
81
+
82
+ Use MCP prompts as thin, discoverable entry points into common workflows.
83
+
84
+ Prompts may:
85
+
86
+ - guide clients toward the right tools,
87
+ - provide a reusable public starting point,
88
+ - and expose common report workflows for non-local clients.
89
+
90
+ Prompts should not:
91
+
92
+ - become the primary place where product logic lives,
93
+ - duplicate full skill logic,
94
+ - or hardcode personalized heuristics that belong in a skill or profile.
95
+
96
+ ### Profiles Or Preferences Own
97
+
98
+ Put durable personalization in a profile or preference layer, not in generic MCP tools.
99
+
100
+ Examples:
101
+
102
+ - Whole Sign-first reporting
103
+ - timezone defaults
104
+ - preferred electional filters
105
+ - section preferences
106
+ - naming and tagging preferences
107
+
108
+ ## Feature Creep Guardrails
109
+
110
+ - MCP is for astrological facts, not personalized advice.
111
+ - Deterministic and generic astro computation is a strong candidate for MCP.
112
+ - Determinism alone is not enough; deterministic but opinionated workflow synthesis still belongs in a skill.
113
+ - A new MCP feature must justify why it cannot be cleanly handled by a skill in two calls.
114
+ - Prefer extending an existing tool over adding a new narrowly scoped tool.
115
+ - Do not add user-specific heuristics to MCP.
116
+ - Do not add report-generation tools to MCP unless the output is generic, stable, and broadly reusable.
117
+ - If a feature mixes computation and interpretation, split it.
118
+ Computation belongs in MCP. Interpretation belongs in a skill.
119
+
120
+ ## Promotion Rule
121
+
122
+ New workflow ideas should start life as skills or prompts.
123
+
124
+ That is an incubation step, not an automatic commitment to ship a repo-owned skill or workflow.
125
+
126
+ They should graduate into MCP only when:
127
+
128
+ - the computational pattern is stable,
129
+ - multiple workflows need the same primitive,
130
+ - and the client-side implementation would otherwise duplicate fragile astro logic.
131
+
132
+ ## Decision Test
133
+
134
+ Before adding new MCP surface area, answer these questions:
135
+
136
+ 1. Is this astrological computation or interpretation?
137
+ 2. Is the output deterministic or mostly deterministic for the same inputs?
138
+ 3. Would two different skills or clients need the same structured output?
139
+ 4. Would keeping this outside MCP force astro logic duplication?
140
+ 5. Can a competent LLM do this in two calls from existing primitives?
141
+ 6. Are we adding a generic primitive, or hardcoding one user’s workflow?
142
+
143
+ If the output is deterministic, generic, and reusable, prefer MCP.
144
+
145
+ If a competent LLM can already do it in two calls and the remaining value is mostly synthesis or policy, it probably does not belong in MCP.
146
+
147
+ ## Examples
148
+
149
+ ### Belongs In MCP
150
+
151
+ - “Return a 7-day forecast grouped by day.”
152
+ - “Return mundane aspects between transiting planets.”
153
+ - “Return which natal and transiting houses are activated.”
154
+ - “Return Moon condition and rising-sign windows for a date and location.”
155
+ - “Add an `include_houses` or `include_mundane_aspects` flag to an existing tool.”
156
+
157
+ ### Belongs In A Skill
158
+
159
+ - “Write a daily brief with top 3 influences.”
160
+ - “Rank today as clean, mixed, or caution.”
161
+ - “Suggest best uses for work, family, health, and spiritual practice.”
162
+ - “Score electional windows according to one user’s preferred rulers and Mars/Saturn cautions.”
163
+
164
+ ### Does Not Belong
165
+
166
+ - “Best time for my Google QBR” as a first-class MCP tool
167
+ - one-user reporting tags embedded into tool contracts
168
+ - generic tools whose only job is to produce prose a skill could generate from structured data
169
+ - deterministic but policy-heavy labels like “clean”, “mixed”, or “caution” baked into core tools
170
+
171
+ ## Related Docs
172
+
173
+ - [Architecture Boundaries](/Users/salted/Code/astro-mcp/docs/product/architecture-boundaries.md)
174
+ - [ADR 0001: MCP Vs Skill Boundary](/Users/salted/Code/astro-mcp/docs/product/adrs/0001-mcp-vs-skill-boundary.md)
@@ -0,0 +1,48 @@
1
+ # ether-to-astro v1.2.0
2
+
3
+ Suggested release type: `minor`
4
+
5
+ This release improves transit forecasting, adds new electional and rising-sign primitives, and tightens a few important MCP and timezone edge cases. 🎉
6
+
7
+ ## 1.2.0 (2026-03-29)
8
+
9
+ ### New feature
10
+
11
+ - add explicit `snapshot`, `best_hit`, and `forecast` transit modes with day-grouped forecast output
12
+ - add sign, degree, and house metadata directly to transit responses for both transit and natal sides
13
+ - add mundane transit-to-transit aspects and supportive/challenging weather output for date and date-range queries
14
+ - add standalone `get_electional_context` for deterministic electional snapshots without requiring a loaded natal chart 🌙
15
+ - add rising-sign window helpers for date and location queries, with approximate and exact modes ⬆️
16
+ - add deterministic MCP startup defaults for reporting and make `e2a --mcp` the canonical MCP entrypoint
17
+
18
+ ### Bug fix
19
+
20
+ - keep forecast labels and exact-time rendering aligned with the reporting timezone
21
+ - preserve `e2a-mcp` compatibility behavior when launched through bin shims and wrapper paths
22
+ - reject DST-ambiguous or nonexistent local electional times instead of silently normalizing them
23
+ - fix applying-aspect edge cases in electional context, especially for faster-moving bodies
24
+
25
+ ### Documentation Changes
26
+
27
+ - update docs and setup guidance around the unified `e2a` CLI and MCP entrypoint
28
+ - add repo-owned workflow skills and skill authoring guidance
29
+ - clarify MCP vs skill product boundaries in repo docs
30
+
31
+ ### ⚙️ Chore
32
+
33
+ - refresh product governance and contributor guidance for issue triage and release workflow
34
+
35
+ ## Upgrade notes
36
+
37
+ - prefer `e2a --mcp` for MCP launches
38
+ - `e2a-mcp` remains available as a compatibility alias
39
+ - if you consume transit output programmatically, prefer explicit `mode` values over relying on legacy `days_ahead` behavior
40
+
41
+ ## Included PRs
42
+
43
+ - #32 add rising-sign window helper
44
+ - #34 add mundane transit-to-transit aspects and weather output
45
+ - #38 unify `e2a` entrypoint for CLI and MCP
46
+ - #40 clarify transit mode contract
47
+ - #41 preserve alias mode and reporting timezone consistency
48
+ - #43 fix electional DST and applying-aspect edge cases
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "ether-to-astro",
3
- "version": "1.0.2",
4
- "description": "Local-first astrology toolkit with a CLI (e2a) and MCP server (e2a-mcp) for charts, transits, rendering, and agent workflows.",
3
+ "version": "1.2.0",
4
+ "description": "Local-first astrology toolkit with a unified e2a binary for CLI and MCP workflows, plus an e2a-mcp compatibility alias.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "engines": {
8
8
  "node": ">=22"
9
9
  },
10
10
  "bin": {
11
- "e2a-mcp": "dist/loader.js",
12
- "e2a": "dist/cli.js"
11
+ "e2a": "dist/loader.js",
12
+ "e2a-mcp": "dist/mcp-alias.js"
13
13
  },
14
14
  "scripts": {
15
15
  "build": "tsc",
16
16
  "dev": "tsc --watch",
17
17
  "dev:watch": "tsx watch src/loader.ts",
18
- "start": "node dist/loader.js",
19
- "start:cli": "node dist/cli.js",
18
+ "start": "node dist/loader.js --mcp",
19
+ "start:cli": "node dist/loader.js",
20
20
  "postinstall": "node scripts/download-ephemeris.js",
21
21
  "test": "vitest tests/unit",
22
22
  "validate:astro": "vitest run tests/validation",
@@ -58,7 +58,7 @@
58
58
  "@vitest/ui": "^4.1.2",
59
59
  "happy-dom": "^20.8.9",
60
60
  "tsx": "^4.21.0",
61
- "typescript": "^5.0.0",
61
+ "typescript": "^6.0.2",
62
62
  "vitest": "^4.1.2"
63
63
  }
64
64
  }
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: daily-brief
3
+ description: Produce a concise daily astrology brief from ether-to-astro MCP primitives. Use when a user wants today's personal transits and collective weather summarized without turning interpretation into MCP logic.
4
+ metadata:
5
+ repo: ether-to-astro
6
+ ---
7
+
8
+ # Daily Brief
9
+
10
+ ## Purpose
11
+ Use this skill when a user wants a same-day astrology brief grounded in `ether-to-astro` MCP data.
12
+
13
+ This skill owns synthesis, ordering, and narrative framing. It does not invent astro facts or encode its own computational logic.
14
+
15
+ ## Inputs
16
+ - A loaded natal chart on the MCP side, or enough birth data to load one first.
17
+ - Date to analyze. Default to today in the reporting timezone if the user does not specify a date.
18
+ - Optional deterministic defaults:
19
+ - preferred reporting timezone
20
+ - preferred house style for interpretation
21
+ - weekday labels on or off
22
+
23
+ ## Required MCP Calls
24
+ 1. Call `get_server_status`.
25
+ 2. If no natal chart is loaded, either:
26
+ - call `set_natal_chart` when the user has supplied birth data, or
27
+ - stop and ask for natal-chart setup.
28
+ 3. Call `get_transits` for the target date.
29
+ Recommended arguments:
30
+ - `date`
31
+ - `include_mundane: true`
32
+ - `categories: ["all"]`
33
+ 4. Use additional MCP primitives only when they already exist and materially improve the brief:
34
+ - house-aware transit metadata
35
+ - electional context
36
+ - rising-sign windows
37
+
38
+ ## Workflow
39
+ 1. Resolve the target date and reporting timezone.
40
+ 2. Retrieve same-day transit data.
41
+ 3. Separate the output into:
42
+ - mundane baseline
43
+ - personal transit modifiers
44
+ 4. Rank or group the results for readability, but keep all rankings clearly skill-side.
45
+ 5. Produce a concise brief with explicit references back to the underlying astro facts.
46
+
47
+ ## Output Contract
48
+ - Keep the brief short and practical.
49
+ - Default section order:
50
+ 1. `Overview`
51
+ 2. `Mundane Baseline`
52
+ 3. `Personal Modifiers`
53
+ 4. `Optional Timing Notes`
54
+ - Reference actual astro facts directly:
55
+ - planets
56
+ - aspects
57
+ - sign or house context when available
58
+ - exact timing only when the MCP result provides it
59
+ - Use weekday labels only when enabled by config or clearly requested by the user.
60
+ - If the available MCP data is incomplete, say so plainly instead of implying precision that is not present.
61
+
62
+ ## Boundaries
63
+ - Do not turn the brief into a new MCP contract.
64
+ - Do not describe ranking labels such as `clean`, `mixed`, or `caution` as deterministic truth.
65
+ - Do not invent house activations, electional windows, or mundane-aspect data when the MCP response does not provide them.
66
+ - Do not use multi-day `get_transits` output as if it were a true day-by-day forecast unless the explicit forecast contract exists.
67
+
68
+ ## Good Patterns
69
+ - Summarize mundane weather first, then describe how natal transits personalize it.
70
+ - Use exact-time notes only when the tool returned them.
71
+ - Prefer a compact brief over exhaustive prose.
72
+
73
+ ## Failure Handling
74
+ - If no natal chart is available, stop and request natal-chart setup.
75
+ - If the MCP surface lacks a needed primitive, explain the missing capability and continue with the best truthful same-day brief possible.
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: electional-overlay
3
+ description: Add a secondary electional timing overlay to an existing daily or weekly astrology workflow. Use when the user wants timing refinement after the main overview has already been established.
4
+ metadata:
5
+ repo: ether-to-astro
6
+ ---
7
+
8
+ # Electional Overlay
9
+
10
+ ## Purpose
11
+ Use this skill to add timing refinement after a daily brief or weekly overview already exists.
12
+
13
+ This skill is not the primary report. It is a secondary overlay that narrows candidate windows using electional primitives.
14
+
15
+ ## Inputs
16
+ - An existing daily brief or weekly overview context.
17
+ - Date, time, or narrowed candidate window to evaluate.
18
+ - Location and timezone for electional checks.
19
+ - Optional deterministic defaults:
20
+ - preferred reporting timezone
21
+ - weekday labels on or off
22
+
23
+ ## Required MCP Calls
24
+ Use the smallest useful set of electional primitives available. Preferred surfaces include:
25
+ - a standalone electional-context tool for date/time/location
26
+ - rising-sign windows
27
+ - Moon condition or applying-aspect primitives
28
+
29
+ If the needed primitives are not available, stop and explain the limitation instead of inventing electional logic.
30
+
31
+ ## Workflow
32
+ 1. Start from an already-established overview or brief.
33
+ 2. Narrow the timing question to a date or candidate window.
34
+ 3. Call electional primitives for that narrowed scope.
35
+ 4. Summarize the resulting timing implications as secondary notes.
36
+
37
+ ## Elicitation
38
+ - Ask for missing information only when it materially changes the result.
39
+ - Prefer targeted clarifications over open-ended questions:
40
+ - date or candidate window
41
+ - location or timezone
42
+ - action type, if the user wants timing for a specific kind of action
43
+ - If the user asks for a general timing overlay without enough specificity, ask for the narrowest missing detail needed to make the overlay meaningful.
44
+
45
+ ## Output Contract
46
+ - Keep this as an add-on section, not a full replacement report.
47
+ - Default section order:
48
+ 1. `Timing Window`
49
+ 2. `Electional Signals`
50
+ 3. `Why It Stands Out`
51
+ - Reference the underlying deterministic facts directly.
52
+ - Make confidence and limitations clear when the primitive set is incomplete.
53
+
54
+ ## Boundaries
55
+ - Do not invent electional scoring formulas inside the skill.
56
+ - Do not represent subjective ranking as MCP truth.
57
+ - Do not let asteroids or niche filters dominate unless the user explicitly asks for them.
58
+ - Do not replace the main weekly/daily overview with timing-only analysis.
59
+
60
+ ## Good Patterns
61
+ - Treat electional guidance as optional and secondary.
62
+ - Use explicit time windows when the MCP primitive provides them.
63
+ - Explain why a window is notable using raw signals, not just verdict labels.
64
+
65
+ ## Failure Handling
66
+ - If electional primitives are unavailable, say that timing refinement is limited by the current MCP surface.
67
+ - If the user has not narrowed the timing question enough, ask for the date, window, or location needed for a meaningful overlay.
@@ -0,0 +1,73 @@
1
+ ---
2
+ name: weekly-overview
3
+ description: Produce a weekly astrology overview from ether-to-astro MCP primitives. Use when a user wants an overview-first planning read that can optionally include secondary electional notes.
4
+ metadata:
5
+ repo: ether-to-astro
6
+ ---
7
+
8
+ # Weekly Overview
9
+
10
+ ## Purpose
11
+ Use this skill when a user wants a seven-day overview, not just a same-day brief.
12
+
13
+ This skill is only as strong as the underlying forecast primitives. It must not fake a day-by-day weekly report from lossy MCP data.
14
+
15
+ ## Inputs
16
+ - A loaded natal chart on the MCP side, or enough birth data to load one first.
17
+ - Start date for the weekly window. Default to today in the reporting timezone if unspecified.
18
+ - Optional deterministic defaults:
19
+ - preferred reporting timezone
20
+ - preferred house style for interpretation
21
+ - weekday labels on or off
22
+
23
+ ## Required MCP Calls
24
+ 1. Call `get_server_status`.
25
+ 2. Ensure a natal chart is loaded before continuing.
26
+ 3. Prefer a true range-aware transit forecast primitive when available.
27
+ Examples:
28
+ - explicit `forecast` mode on `get_transits`
29
+ - date-grouped transit forecast output
30
+ - per-day mundane aspect data
31
+ 4. Only use electional primitives as a second pass after the weekly overview exists.
32
+
33
+ ## Workflow
34
+ 1. Resolve the weekly window and reporting timezone.
35
+ 2. Retrieve week-level transit data using a forecast-capable MCP surface.
36
+ 3. Build the overview in this order:
37
+ - collective weather across the week
38
+ - notable personal modifiers by day or cluster
39
+ - optional secondary timing suggestions
40
+ 4. Keep recommendations clearly secondary to the overview.
41
+
42
+ ## Elicitation
43
+ - If the user does not provide a start date, default to today in the reporting timezone.
44
+ - If the user appears to mean a calendar week rather than the next seven days, ask for the intended start date or state the assumption clearly.
45
+ - Do not ask extra questions if the overview can proceed truthfully with the default seven-day window.
46
+
47
+ ## Output Contract
48
+ - Default section order:
49
+ 1. `Week Overview`
50
+ 2. `Daily Highlights`
51
+ 3. `Interpretive Lens`
52
+ 4. `Optional Timing Suggestions`
53
+ - `Week Overview` should summarize the overall weather first.
54
+ - `Daily Highlights` should preserve actual day boundaries when the MCP data supports them.
55
+ - `Interpretive Lens` should explain why certain days stand out using referenced astro facts.
56
+ - `Optional Timing Suggestions` should remain clearly secondary and should only appear when supported by MCP primitives.
57
+
58
+ ## Boundaries
59
+ - Do not use current lossy multi-day `get_transits` behavior as if it were a true weekly forecast.
60
+ - If the forecast-capable MCP primitive is missing, say so explicitly and do one of the following:
61
+ - provide a limited best-hit preview, clearly labeled as such, or
62
+ - stop and explain that a true weekly overview is not yet supported by the current MCP surface.
63
+ - Do not hardcode personal scoring policy into the contract.
64
+ - Do not move prose generation into MCP.
65
+
66
+ ## Good Patterns
67
+ - Overview first, suggestions second.
68
+ - Mundane baseline first, natal modifiers second.
69
+ - Keep optional electional guidance visibly separate from the main weekly read.
70
+
71
+ ## Failure Handling
72
+ - If no natal chart is loaded, stop and request natal-chart setup.
73
+ - If the forecast primitive is missing, do not synthesize a false weekly report.
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: write-skill
3
+ description: Write or revise repo-owned SKILL.md files for ether-to-astro. Use when a workflow should become a concrete, compliant skill artifact rather than a broad product narrative.
4
+ metadata:
5
+ repo: ether-to-astro
6
+ ---
7
+
8
+ # Write Skills For `ether-to-astro`
9
+
10
+ ## Purpose
11
+ Use this skill when creating or revising repo-owned skills or workflow specs for `ether-to-astro`.
12
+
13
+ The goal is not to write aspirational product prose. The goal is to produce a boring, compliant `SKILL.md` that another agent can execute consistently.
14
+
15
+ ## Core Rules
16
+ - Skills own synthesis, ranking, formatting, and user/workflow-specific judgment.
17
+ - MCP owns deterministic astro computation and reusable structured facts.
18
+ - If a skill starts inventing astro math, transit logic, house logic, or electional primitives, stop and move that requirement back into MCP or a product issue.
19
+ - Prefer a one-call or two-call workflow over a large prompt blob.
20
+ - Keep the skill reusable. Do not hardcode one transient conversation unless the request is explicitly private/user-local.
21
+
22
+ ## Default Shape
23
+ Write skills using this structure unless there is a strong reason to simplify:
24
+
25
+ ```md
26
+ ---
27
+ name: your-skill-name
28
+ description: What this skill does and when to use it.
29
+ ---
30
+
31
+ # <Skill Name>
32
+
33
+ ## Purpose
34
+ One short paragraph on what this skill does and when to use it.
35
+
36
+ ## Inputs
37
+ - Required context or assumptions
38
+ - Required MCP/tool outputs
39
+ - Optional config/defaults
40
+
41
+ ## Workflow
42
+ 1. Call the relevant MCP/tool surface(s).
43
+ 2. Transform or rank the results.
44
+ 3. Produce the final output in the required shape.
45
+
46
+ ## Output Contract
47
+ - Required sections
48
+ - Ordering rules
49
+ - Required references to underlying astro facts
50
+ - Things that must stay optional
51
+
52
+ ## Boundaries
53
+ - What this skill must not do
54
+ - What stays in MCP
55
+ - What stays user-specific
56
+ ```
57
+
58
+ ## Repo-Specific Expectations
59
+ - Prefer concrete nouns over product slogans.
60
+ - Name the actual MCP tools the skill should call.
61
+ - If there is a stable two-call model, spell it out explicitly.
62
+ - If defaults matter, distinguish:
63
+ - deterministic startup/config defaults
64
+ - skill-side interpretation preferences
65
+ - Keep output contracts minimal. Define only the sections and fields needed for consistency.
66
+ - Do not turn issue language into fake canonical schema unless the repo has explicitly committed to one.
67
+
68
+ ## Good Patterns
69
+ - “Call `get_transits` with forecast mode, then optionally call `get_electional_context` for narrowed windows.”
70
+ - “Summarize mundane baseline first, natal modifiers second.”
71
+ - “Keep tags and rankings in the skill, not in MCP payloads.”
72
+
73
+ ## Bad Patterns
74
+ - Defining new astro facts inside the skill.
75
+ - Requiring hidden state not available from the documented workflow.
76
+ - Writing a manifesto instead of an execution spec.
77
+ - Hardcoding one user’s private heuristics into a repo-owned shared skill.
78
+
79
+ ## Validation
80
+ - Follow the Agent Skills spec at https://agentskills.io/specification.
81
+ - Validate frontmatter and naming with the reference tooling when available, for example:
82
+ - `skills-ref validate ./skills/your-skill-name`
83
+ - or the equivalent validator flow provided by your skills toolchain
84
+
85
+ ## Definition Of Done
86
+ A good repo-owned `SKILL.md` should let a zero-context agent answer:
87
+ - when should I use this skill?
88
+ - which tools do I call, and in what order?
89
+ - what output shape do I produce?
90
+ - what must I avoid putting into MCP?