@rubytech/create-maxy-lite 0.1.4 → 0.1.6
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/index.mjs +43 -22
- package/lib/healthcheck.mjs +60 -19
- package/lib/orchestrate.mjs +32 -11
- package/lib/paths.mjs +73 -0
- package/package.json +1 -1
- package/payload/package.json +2 -1
- package/payload/skills/README.md +26 -0
- package/payload/skills/admin/datetime/SKILL.md +147 -0
- package/payload/skills/admin/session-management/SKILL.md +39 -0
- package/payload/skills/admin/upgrade/SKILL.md +32 -0
- package/payload/skills/browser/SKILL.md +60 -0
- package/payload/skills/browser/scripts/cdp.mjs +134 -0
- package/payload/skills/browser/scripts/pdf.mjs +38 -0
- package/payload/skills/browser/scripts/render.mjs +43 -0
- package/payload/skills/browser/scripts/screenshot.mjs +52 -0
- package/payload/skills/business-assistant/SKILL.md +110 -0
- package/payload/skills/calendar-site/SKILL.md +71 -0
- package/payload/skills/calendar-site/template/availability.json +14 -0
- package/payload/skills/calendar-site/template/functions/api/book.ts +112 -0
- package/payload/skills/calendar-site/template/public/booking.css +100 -0
- package/payload/skills/calendar-site/template/public/booking.js +202 -0
- package/payload/skills/calendar-site/template/public/index.html +44 -0
- package/payload/skills/calendar-site/template/schema.sql +19 -0
- package/payload/skills/calendar-site/template/wrangler.toml +14 -0
- package/payload/skills/contacts/SKILL.md +57 -0
- package/payload/skills/deep-research/SKILL.md +70 -0
- package/payload/skills/deep-research/references/citation-styles.md +52 -0
- package/payload/skills/deep-research/references/research-modes.md +22 -0
- package/payload/skills/deep-research/references/search-strategy.md +24 -0
- package/payload/skills/docs/SKILL.md +23 -0
- package/payload/skills/docs/references/capability-map.md +25 -0
- package/payload/skills/docs/references/getting-started.md +29 -0
- package/payload/skills/docs/references/vault-model.md +40 -0
- package/payload/skills/email-composition/SKILL.md +107 -0
- package/payload/skills/memory/SKILL.md +48 -0
- package/payload/skills/projects/SKILL.md +47 -0
- package/payload/skills/publish-site/SKILL.md +21 -0
- package/payload/skills/replicate/SKILL.md +63 -0
- package/payload/skills/replicate/scripts/replicate-image.mjs +131 -0
- package/payload/skills/scheduling/SKILL.md +74 -0
- package/payload/skills/site-deploy/SKILL.md +52 -0
- package/payload/skills/slides/SKILL.md +45 -0
- package/payload/skills/slides/deck.html +1359 -0
- package/payload/skills/url-get/SKILL.md +48 -0
- package/payload/skills/url-get/scripts/url-get.mjs +93 -0
- package/payload/skills/work/SKILL.md +49 -0
- package/payload/webchat/inject-line.mjs +11 -0
- package/payload/webchat/package.json +2 -1
- package/payload/webchat/request-handler.mjs +62 -0
- package/payload/webchat/server.mjs +31 -31
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scheduling
|
|
3
|
+
description: Create, update, and cancel calendar events as vault files, and sync them to Google Calendar. This is the skill behind "put a meeting on my calendar", "schedule a call", "move that appointment", "cancel the meeting", and "add this to Google Calendar". The vault Event file is the source of truth; the Google Calendar connector is pushed to after the file is written and validated. A push that fails leaves a correct local Event, never lost.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Schedule, update, and cancel events
|
|
7
|
+
|
|
8
|
+
An event in the vault is one file under `calendar/`, shaped by the Event entity in the SCHEMA (`schema/SCHEMA.md`). This skill writes that file, validates it, then pushes the change to Google Calendar. The order is fixed and it matters: the vault is authoritative, so the file is written and proven conformant before anything leaves the device.
|
|
9
|
+
|
|
10
|
+
## The Event file
|
|
11
|
+
|
|
12
|
+
Write `calendar/<summary>.md`. The frontmatter carries the typed fields; the markdown body holds the meeting notes, agenda, or call notes (free prose, never in frontmatter).
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
---
|
|
16
|
+
type: event
|
|
17
|
+
summary: Intro call with Acme
|
|
18
|
+
start: 2026-07-01T15:00:00
|
|
19
|
+
end: 2026-07-01T15:30:00
|
|
20
|
+
location: Google Meet
|
|
21
|
+
attendees:
|
|
22
|
+
- "[[Jane Doe]]"
|
|
23
|
+
organizer: "[[John Smith]]"
|
|
24
|
+
project: "[[Acme Onboarding]]"
|
|
25
|
+
recurrence: FREQ=WEEKLY;BYDAY=TU
|
|
26
|
+
status: CONFIRMED
|
|
27
|
+
area: work
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
Agenda and notes live here.
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Field rules, taken straight from the SCHEMA so a write never drifts:
|
|
34
|
+
|
|
35
|
+
- `type` is always `event` and `summary` and `start` are required. Everything else is optional.
|
|
36
|
+
- `start` and `end` are an ISO date (`2026-07-01`) or date-time (`2026-07-01T15:00:00`).
|
|
37
|
+
- `attendees` is a list of `[[Person]]` links and `organizer` is a single `[[Person]]` link. Each link resolves by basename to a file in `people/`; create the Person first if it does not exist, so the link is not dangling.
|
|
38
|
+
- `project` is a single `[[Project]]` link resolving into `projects/`.
|
|
39
|
+
- `recurrence` is a raw iCalendar `RRULE` string (for example `FREQ=WEEKLY;BYDAY=TU`). It is stored only. This skill does not expand recurrences or fire anything on a schedule.
|
|
40
|
+
- `status` mirrors iCalendar: `CONFIRMED`, `TENTATIVE`, or `CANCELLED`.
|
|
41
|
+
- `area` is one of the SCHEMA Areas, when the event belongs to one.
|
|
42
|
+
|
|
43
|
+
## The fixed order: write, validate, then push
|
|
44
|
+
|
|
45
|
+
Every create, update, and cancel follows the same three steps in this order.
|
|
46
|
+
|
|
47
|
+
1. Write the Event file to `calendar/`.
|
|
48
|
+
2. Run the validator over the vault and read its exit code:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
maxy-lite-validate <vault>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Exit 0 means every file conforms. A non-zero exit with `ok=false` on the Event you just wrote means the file drifted from the SCHEMA (a missing required field, a bad area, a dangling `[[Person]]` link). Fix the file and re-run until it exits 0. Never leave a non-conformant Event.
|
|
55
|
+
|
|
56
|
+
3. Only after the validator exits 0, push the event to the Google Calendar connector: create the calendar event for a new file, update it for an edited file, cancel it for a cancellation. Use whatever the Google Calendar connector exposes for that action; do not hardcode a tool name.
|
|
57
|
+
|
|
58
|
+
This order is what "vault-authoritative" means here. The local file is correct and proven before the network is touched.
|
|
59
|
+
|
|
60
|
+
## When the push fails
|
|
61
|
+
|
|
62
|
+
A Google Calendar push can fail while the local Event is perfectly valid. That is a sync problem, not data loss. Keep the local file exactly as written, report that the calendar push did not land and why, and offer to retry the push. Do not roll back, do not delete the Event, and do not treat it as a schema problem. The two failure modes are distinct:
|
|
63
|
+
|
|
64
|
+
- Validator non-zero on the Event: schema drift. Fix the file.
|
|
65
|
+
- Validator 0 but the push returned an error: sync issue. The file is correct; retry the push.
|
|
66
|
+
|
|
67
|
+
## Update and cancel
|
|
68
|
+
|
|
69
|
+
- Update: edit the Event file in place, run the validator to 0, then push the update to Google Calendar.
|
|
70
|
+
- Cancel: set `status: CANCELLED` in the frontmatter, run the validator to 0, then push the cancellation to Google Calendar. Keep the file. A cancelled event is a retained record with a cancelled status, not a deleted file.
|
|
71
|
+
|
|
72
|
+
## Conflicts
|
|
73
|
+
|
|
74
|
+
The vault wins. If the same event differs between the vault and Google Calendar, the vault file is correct and the connector is brought into line with it on the next push. Richer two-way merge is out of scope for this skill.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: site-deploy
|
|
3
|
+
description: Deploy a folder of static HTML and assets to Cloudflare Pages and return a live URL that stays up with the phone offline. Use when a site or page is built and ready to go live, or when a live site is stale and needs redeploying. Runs `wrangler pages deploy` over Bash; the page is edge-hosted, not served from the device. This is the implementer behind `publish-site`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Deploy a site to Cloudflare Pages
|
|
7
|
+
|
|
8
|
+
You take one folder of static files (an [`slides`](../slides/SKILL.md) deck, a landing page, any HTML tree) and put it live on Cloudflare's edge. Cloudflare hosts the build, so the page stays reachable when the phone is off. The live URL is the deliverable.
|
|
9
|
+
|
|
10
|
+
The mechanism is the `wrangler` CLI, run over Bash. It is already available through Node; invoke it with `npx wrangler` if it is not on the path. Nothing here uses an MCP connector: the Cloudflare connector cannot deploy Pages, and its login is not reachable from the shell.
|
|
11
|
+
|
|
12
|
+
## Auth, once
|
|
13
|
+
|
|
14
|
+
`wrangler` needs to be signed in to the Cloudflare account. Two ways, in order of preference:
|
|
15
|
+
|
|
16
|
+
- `npx wrangler login` opens the Cloudflare OAuth page in the browser and persists the session. Do this once; later deploys reuse it. This is the on-device default.
|
|
17
|
+
- Or set `CLOUDFLARE_API_TOKEN` (a token with **Account · Cloudflare Pages · Edit**) and `CLOUDFLARE_ACCOUNT_ID` in the environment. Never write the token into the project folder, never commit it, never print it.
|
|
18
|
+
|
|
19
|
+
If neither is present, `wrangler` reports it is not authenticated. Stop and tell the user to run `wrangler login`; do not guess a token.
|
|
20
|
+
|
|
21
|
+
## Deploy
|
|
22
|
+
|
|
23
|
+
Pick a project slug (lowercase, hyphenated, derived from the site's name). The first deploy of a new slug creates the project.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx wrangler pages deploy <output-dir> --project-name <slug> --branch=main
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`--branch=main` deploys to the production alias `https://<slug>.pages.dev`; any other branch name produces a preview URL instead. `wrangler` prints the deployment URL. Surface the operation as verb plus target ("deploying Pages project `<slug>`"); the token value never appears in chat or stdout.
|
|
30
|
+
|
|
31
|
+
## Custom domain (optional)
|
|
32
|
+
|
|
33
|
+
By default the site answers on `<slug>.pages.dev`, which is enough for most uses. To serve it on the user's own domain, attach the domain to the Pages project in the Cloudflare dashboard (**Workers & Pages → the project → Custom domains → Set up a domain**). When the zone is on the same Cloudflare account, Cloudflare provisions the certificate and the DNS record itself. A custom domain is optional polish; do not block the deploy on it.
|
|
34
|
+
|
|
35
|
+
## Done is a live 200, not a clean exit
|
|
36
|
+
|
|
37
|
+
A successful `wrangler` run is not the finish line. The finish line is the live URL serving the new content. Check it, cache-busted, and read the first line:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
curl -s "https://<slug>.pages.dev/?cb=$(date +%s)" -D - -o /tmp/site.html | head -1
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Done holds only when all are true:
|
|
44
|
+
|
|
45
|
+
- the status line is `HTTP/2 200` (or `HTTP/1.1 200 OK`); a `522` is the certificate window on a fresh custom domain, so wait and re-curl rather than calling it done,
|
|
46
|
+
- the body carries a content marker you can name in advance (a headline or title from this site), not a leftover from whatever the folder was copied from.
|
|
47
|
+
|
|
48
|
+
Any other status, or a missing or stale marker, blocks done and is reported with the exact failing URL. Record the live URL and this check in the result so it can be re-run later to confirm the site is still up without reading the source.
|
|
49
|
+
|
|
50
|
+
## Out of scope
|
|
51
|
+
|
|
52
|
+
Building the HTML (that is [`slides`](../slides/SKILL.md) or whatever produced the folder), form-to-database capture, and serving from the device over a tunnel. The lite default is Pages, which survives the phone going offline; device-origin hosting is not part of lite.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slides
|
|
3
|
+
description: Build a slide deck or a single web page as one self-contained HTML file from vault content. Use when the user asks for a deck, slides, a presentation, a pitch, a talk, a one-pager, or a landing page, or wants to turn notes, a project, or a meeting into something they can present or publish. Produces one HTML file with inline CSS and JS, no build step. Pair with `publish-site` / `site-deploy` to put it online.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Slides and pages
|
|
7
|
+
|
|
8
|
+
You produce **one self-contained HTML file**: inline CSS and JS, no build step, no dependencies beyond the Inter web font. It opens straight in a browser, navigates with arrow keys, space, or swipe, and exports to PDF with `P`. To put it online, hand the file to [`publish-site`](../publish-site/SKILL.md).
|
|
9
|
+
|
|
10
|
+
The starting point is [`deck.html`](deck.html) in this folder. Copy it, then change only the content. It carries the design tokens, the component library (21 components, indexed in a comment at the top of the file), the headline pattern, and the keyboard/swipe/PDF behaviour. Stay on its tokens; do not invent a new colour scheme or font.
|
|
11
|
+
|
|
12
|
+
## Use what the user gave you
|
|
13
|
+
|
|
14
|
+
The user's message and the vault are the brief. Pull the content from where it already lives: a Project file and its linked Tasks, a set of Notes, a meeting, a person or organization. Read those files, do not re-ask for what the vault already holds. Only ask once, in one short question, if you genuinely have no idea what the deck is about.
|
|
15
|
+
|
|
16
|
+
## Pick the shape, then outline
|
|
17
|
+
|
|
18
|
+
Most decks fit the six-beat story arc. Choose the timing to the format; the proportions hold.
|
|
19
|
+
|
|
20
|
+
| Beat | ~Share | Purpose |
|
|
21
|
+
|------|--------|---------|
|
|
22
|
+
| Open | 10% | Hook the room with a confession, a contradiction, or a surprising fact |
|
|
23
|
+
| The world before | 15% | The status quo the audience already lives in, to build recognition |
|
|
24
|
+
| The turn | 15% | Name the one thing that changed, cleanly |
|
|
25
|
+
| The evidence | 40% | Three to five concrete proof points: pain → action → result |
|
|
26
|
+
| The honest part | 15% | The caveat, the cost, the open question; this earns trust |
|
|
27
|
+
| Close | 5% | Land one line |
|
|
28
|
+
|
|
29
|
+
For a pitch lean into problem → market → product → traction → ask; for a one-pager or landing page drop the navigation idea and write a single long scrolling section. The arc is a default, not a cage.
|
|
30
|
+
|
|
31
|
+
Write the slide-by-slide outline first (number, component, headline, which beat) and show it to the user before you write HTML. Get a nod, then build.
|
|
32
|
+
|
|
33
|
+
## Write the HTML
|
|
34
|
+
|
|
35
|
+
Copy the matching component from `deck.html` and swap the text. The headline pattern is the visual identity: a bold anchor phrase plus a dim extension that fades.
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<h1>Anchor. <span class="dim">Extension that fades.</span></h1>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
One dark slide per deck at most; it loses its weight if every slide is dark. Keep claims true to the vault; do not invent numbers to fill a stat grid. Drop images into a `media/` folder beside the HTML and reference them with relative paths.
|
|
42
|
+
|
|
43
|
+
## When the user wants it online
|
|
44
|
+
|
|
45
|
+
A deck or page is a static HTML file, so it deploys to Cloudflare Pages like any site. When the user asks to publish, host, or share a live link, hand the file (and its `media/` folder, if any) to [`publish-site`](../publish-site/SKILL.md), which routes to [`site-deploy`](../site-deploy/SKILL.md). The result is an edge-hosted URL that stays live with the phone offline.
|