Skip to content

Commit 9c22160

Browse files
authored
Merge branch 'main' into dependabot/npm_and_yarn/wrangler-4.125.0
2 parents 28d735b + 8f0b4a4 commit 9c22160

48 files changed

Lines changed: 2093 additions & 253 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release.yml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,19 @@ jobs:
2121
cache: npm
2222
- run: npm ci
2323
- run: npm run check
24-
- name: Create GitHub release
24+
- name: Create or verify GitHub release
2525
env:
2626
GH_TOKEN: ${{ github.token }}
27-
run: gh release create "$GITHUB_REF_NAME" --verify-tag --generate-notes --title "$GITHUB_REF_NAME"
27+
run: |
28+
release_state=$(gh release view "$GITHUB_REF_NAME" --json isDraft --jq '.isDraft' 2>/dev/null || echo missing)
29+
case "$release_state" in
30+
true)
31+
gh release edit "$GITHUB_REF_NAME" --draft=false
32+
;;
33+
false)
34+
echo "Release $GITHUB_REF_NAME already exists; validation completed successfully."
35+
;;
36+
missing)
37+
gh release create "$GITHUB_REF_NAME" --verify-tag --generate-notes --title "$GITHUB_REF_NAME"
38+
;;
39+
esac

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
All notable changes follow [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and semantic versioning.
44

5-
## [0.1.1] - Unreleased
5+
## [Unreleased]
6+
7+
## [0.1.1] - 2026-08-25
68

79
### Added
810

@@ -30,3 +32,6 @@ All notable changes follow [Keep a Changelog](https://keepachangelog.com/en/1.1.
3032
- Dynamic freshness, real provenance disclosure, evidence references, and bounded snapshot history navigation.
3133
- Plain-language Prompt Studio starters with a separate human-readable permission receipt.
3234
- SHA-pinned GitHub Actions, a public synthetic Pages demo, fork-sync, lifecycle, compatibility, support, and release guidance.
35+
36+
[Unreleased]: https://github.com/mohsinht/zaati-os/compare/v0.1.1...HEAD
37+
[0.1.1]: https://github.com/mohsinht/zaati-os/releases/tag/v0.1.1

README.md

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ You choose the LLM. You own the data. You control the deployment. Zaati OS has n
3636
## What makes it different
3737

3838
- **Any LLM workflow:** ChatGPT, Claude, Gemini, a local model, n8n, cron, or custom code can publish the same contract.
39-
- **LLM-directed presentation:** A safe UI contract lets the producer request metrics, lists, timelines, calendars, line or bar charts, progress views, notices, text, and tables. The renderer only permits audited components, never arbitrary HTML or code.
39+
- **LLM-directed presentation:** A safe UI contract lets the producer request metrics, lists, timelines, calendars, line, bar, or allocation charts, progress views, notices, text, and tables. The renderer only permits audited components, never arbitrary HTML or code.
4040
- **Private by architecture:** Real snapshots are ignored in the public code repository. The recommended public-fork setup keeps data in a separate private repository and protects the deployment with Cloudflare Access.
4141
- **Files before databases:** JSON is portable, diffable, inspectable, and easy for AI tools to create.
4242
- **Useful failure states:** Freshness, provenance, confidence, missing sources, and warnings remain visible.
@@ -50,11 +50,17 @@ Requires Node.js 22 or newer.
5050
git clone https://github.com/YOUR_GITHUB_USERNAME/zaati-os.git
5151
cd zaati-os
5252
npm install
53+
npm run dev
54+
```
55+
56+
The first demo visit opens an optional guided tour of sources, safe components, scheduled-task prompts, and the private setup path. Everything shown is public synthetic data. When you are ready to create your workspace:
57+
58+
```bash
5359
npm run setup
5460
npm run tutorial
5561
```
5662

57-
The setup assistant creates ignored local preferences. The tutorial runs a credential-free mock LLM that deliberately fails its first contract attempt, retries safely, creates six synthetic snapshots in one transaction, and opens the dashboard.
63+
The setup assistant creates ignored local preferences and switches the local app to private mode. Synthetic example pages, Component Lab, copy-prompt guides, and the automatic demo tour are no longer included. The tutorial can still test ingestion with credential-free synthetic snapshots, clearly labeled as test data inside the private shell.
5864

5965
![Animated terminal showing Zaati OS setup and the synthetic tutorial](docs/assets/onboarding/setup.gif)
6066

@@ -69,12 +75,15 @@ make tutorial
6975

7076
## Make it yours
7177

72-
1. Fork the code repository and run `npm run setup`.
73-
2. Test the entire ingestion loop with `npm run tutorial`.
74-
3. Run `npm run prompt:create`, then paste the generated task prompt into the LLM you already use.
78+
1. Explore the synthetic demo and guided tour with `npm run dev`.
79+
2. Run `npm run setup` to create an ignored private workspace and remove demo-only UI.
80+
3. Test the entire ingestion loop with `npm run tutorial`.
81+
4. Run `npm run prompt:create`, then paste the generated task prompt into the LLM you already use.
7582

7683
Everything else, including custom sources, encrypted storage, full theme tokens, and automatic deployment, is optional and documented separately.
7784

85+
Synthetic demo mode includes a **Component lab** with the JSON contract beside each rendered block. Every demo source also includes a **Recreate this page** drawer containing one standalone scheduled-task prompt. It includes the resolved worker and source, permission boundary, and current executable schemas; the user only replaces the code repository, private data repository, and timezone placeholders before review and use.
86+
7887
The canonical daily bundle contains agenda, inbox attention, work focus, money, news, and the dependency-backed daily overview. Prompt Studio can also create smaller independent bundles, and now generates the matching private-repository setup command.
7988

8089
## Create a scheduled task prompt
@@ -155,7 +164,7 @@ See [LLM contract](docs/llm-contract.md) and [`schemas/`](schemas/) for the exec
155164
| `daily-overview.md` | Combine registered source snapshots | Adaptive dashboard |
156165
| `weekly-review.md` | Find patterns and produce an evidence-based review | Progress, timeline, decisions |
157166

158-
These are provider-neutral templates, not connectors. ChatGPT scheduled tasks are the target first real path, but the release evidence is not complete yet. Other providers are contract-compatible and are not claimed as end-to-end certified until their documented release gate passes.
167+
These are provider-neutral templates, not connectors. The local mock tutorial and command adapter are maintained in v0.1.1. ChatGPT scheduled tasks are the target first hosted path, but no hosted provider is claimed as end-to-end certified until its documented provider gate passes.
159168

160169
## Repository map
161170

@@ -236,7 +245,9 @@ Zaati OS charges no platform fee and can be deployed using free or already-owned
236245

237246
Code version: **v0.1.1**
238247

239-
No immutable GitHub Release is published yet. Until the recorded provider and hosted-demo release gates pass, pin private validators to a reviewed full commit SHA. This code version establishes the portable data contract, atomic bundle ingestion, adaptive renderer, guided onboarding, provider-neutral prompts, optional encrypted storage, theme studio, privacy boundaries, Cloudflare recipe, and CI quality gates. See [CHANGELOG.md](CHANGELOG.md).
248+
Latest GitHub release: **[v0.1.1](https://github.com/mohsinht/zaati-os/releases/tag/v0.1.1)**, published August 25, 2026.
249+
250+
This foundation release establishes the portable data contract, atomic bundle ingestion, adaptive renderer, guided onboarding, provider-neutral prompts, optional encrypted storage, theme studio, privacy boundaries, Cloudflare recipe, and CI quality gates. Hosted LLM workflows remain contract-compatible rather than provider-certified until their recorded end-to-end gates pass. Private validators should pin the reviewed v0.1.1 release commit `0ef31dc8e973e5f1f557b1df9c7f79a012dd7d2a`; future signed, protected, and immutable releases may be used as stable references. See [CHANGELOG.md](CHANGELOG.md).
240251

241252
Before storing real data, read [Data lifecycle and key recovery](docs/data-lifecycle.md). Fork maintainers can follow [Upgrade and fork sync](docs/upgrading.md).
242253

config/instance.example.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
"currency": "USD",
99
"week_starts_on": "monday",
1010
"enabled_sources": ["overview:daily", "agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing", "review:weekly"],
11+
"experience": {
12+
"mode": "demo",
13+
"show_tour": true
14+
},
1115
"theme": {
1216
"preset": "sage",
1317
"default_mode": "system",

config/sources.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"cadence": "daily",
1515
"freshness_sla_hours": 30,
1616
"dashboard_role": "primary",
17-
"presentation": { "preferred_blocks": ["calendar", "list", "notice"] },
17+
"presentation": { "preferred_blocks": ["metric-group", "calendar", "list", "timeline", "notice"] },
1818
"depends_on": [],
1919
"target_path": "data/snapshots/agenda/primary/{YYYY}/{MM}/{YYYY-MM-DD}.json",
2020
"privacy": {
@@ -36,7 +36,7 @@
3636
"cadence": "daily",
3737
"freshness_sla_hours": 30,
3838
"dashboard_role": "primary",
39-
"presentation": { "preferred_blocks": ["metric-group", "list", "notice"] },
39+
"presentation": { "preferred_blocks": ["metric-group", "list", "timeline", "table", "notice"] },
4040
"depends_on": [],
4141
"target_path": "data/snapshots/inbox/attention/{YYYY}/{MM}/{YYYY-MM-DD}.json",
4242
"privacy": {
@@ -58,7 +58,7 @@
5858
"cadence": "weekdays",
5959
"freshness_sla_hours": 36,
6060
"dashboard_role": "primary",
61-
"presentation": { "preferred_blocks": ["metric-group", "table", "list", "progress", "notice"] },
61+
"presentation": { "preferred_blocks": ["metric-group", "table", "list", "progress", "timeline", "notice"] },
6262
"depends_on": [],
6363
"target_path": "data/snapshots/work/focus/{YYYY}/{MM}/{YYYY-MM-DD}.json",
6464
"privacy": {
@@ -80,7 +80,7 @@
8080
"cadence": "daily",
8181
"freshness_sla_hours": 36,
8282
"dashboard_role": "primary",
83-
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "bar-chart", "table", "progress", "notice"] },
83+
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "bar-chart", "donut-chart", "table", "progress", "notice"] },
8484
"depends_on": [],
8585
"target_path": "data/snapshots/money/pulse/{YYYY}/{MM}/{YYYY-MM-DD}.json",
8686
"privacy": {
@@ -102,7 +102,7 @@
102102
"cadence": "daily",
103103
"freshness_sla_hours": 24,
104104
"dashboard_role": "primary",
105-
"presentation": { "preferred_blocks": ["list", "timeline", "text", "notice"] },
105+
"presentation": { "preferred_blocks": ["list", "timeline", "bar-chart", "table", "text", "notice"] },
106106
"depends_on": [],
107107
"target_path": "data/snapshots/news/briefing/{YYYY}/{MM}/{YYYY-MM-DD}.json",
108108
"privacy": {
@@ -124,7 +124,7 @@
124124
"cadence": "daily",
125125
"freshness_sla_hours": 30,
126126
"dashboard_role": "primary",
127-
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "calendar", "list", "progress", "notice"] },
127+
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "calendar", "list", "progress", "timeline", "table", "notice"] },
128128
"depends_on": ["agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing"],
129129
"target_path": "data/snapshots/overview/daily/{YYYY}/{MM}/{YYYY-MM-DD}.json",
130130
"privacy": {
@@ -146,7 +146,7 @@
146146
"cadence": "weekly",
147147
"freshness_sla_hours": 192,
148148
"dashboard_role": "primary",
149-
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "list", "progress", "timeline", "notice"] },
149+
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "list", "progress", "timeline", "table", "notice"] },
150150
"depends_on": ["overview:daily", "agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing"],
151151
"target_path": "data/snapshots/review/weekly/{YYYY}/{MM}/{YYYY-MM-DD}.json",
152152
"privacy": {

data/examples/agenda/primary/2026-08-24.json

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,19 @@
3939
"start": "2026-08-24T13:00:00Z",
4040
"end": "2026-08-24T14:30:00Z",
4141
"status": "scheduled"
42+
},
43+
{
44+
"id": "a4",
45+
"title": "Walk and reset",
46+
"start": "2026-08-24T15:00:00Z",
47+
"end": "2026-08-24T15:30:00Z",
48+
"status": "scheduled"
4249
}
4350
],
4451
"actions": [
4552
{ "id": "p1", "title": "Open the acceptance criteria", "due_at": "2026-08-24T08:30:00Z", "status": "open" },
46-
{ "id": "p2", "title": "Write the sync decision", "due_at": "2026-08-24T11:00:00Z", "status": "open" }
53+
{ "id": "p2", "title": "Write the sync decision", "due_at": "2026-08-24T11:00:00Z", "status": "open" },
54+
{ "id": "p3", "title": "Prepare the release note", "due_at": "2026-08-24T13:00:00Z", "status": "open" }
4755
]
4856
},
4957
"presentation": {
@@ -64,7 +72,8 @@
6472
"tone": "positive"
6573
},
6674
{ "id": "a2", "title": "Project sync", "start": "2026-08-24T11:00:00Z", "end": "2026-08-24T11:30:00Z", "tone": "info" },
67-
{ "id": "a3", "title": "Review and ship", "start": "2026-08-24T13:00:00Z", "end": "2026-08-24T14:30:00Z", "tone": "positive" }
75+
{ "id": "a3", "title": "Review and ship", "start": "2026-08-24T13:00:00Z", "end": "2026-08-24T14:30:00Z", "tone": "positive" },
76+
{ "id": "a4", "title": "Walk and reset", "start": "2026-08-24T15:00:00Z", "end": "2026-08-24T15:30:00Z", "tone": "neutral" }
6877
]
6978
},
7079
{
@@ -74,8 +83,55 @@
7483
"span": "one",
7584
"items": [
7685
{ "id": "p1", "title": "Open the acceptance criteria", "meta": "Before 08:30", "tone": "neutral" },
77-
{ "id": "p2", "title": "Write the sync decision in one sentence", "meta": "Before 11:00", "tone": "info" }
86+
{ "id": "p2", "title": "Write the sync decision in one sentence", "meta": "Before 11:00", "tone": "info" },
87+
{ "id": "p3", "title": "Prepare the release note", "meta": "Before 13:00", "tone": "neutral" }
88+
]
89+
},
90+
{
91+
"id": "day-capacity",
92+
"kind": "metric-group",
93+
"title": "Day capacity",
94+
"span": "full",
95+
"metrics": [
96+
{ "label": "Protected focus", "value": 3.5, "unit": "hours", "tone": "positive" },
97+
{ "label": "Meetings", "value": 0.5, "unit": "hours", "tone": "neutral" },
98+
{ "label": "Open buffer", "value": 2, "unit": "hours", "tone": "info" },
99+
{ "label": "Prep actions", "value": 3, "tone": "warning" }
78100
]
101+
},
102+
{
103+
"id": "day-sequence",
104+
"kind": "timeline",
105+
"title": "Energy-aware sequence",
106+
"span": "one",
107+
"items": [
108+
{
109+
"label": "08:30",
110+
"title": "Build before coordinating",
111+
"description": "Use the highest-energy window for the complete slice.",
112+
"tone": "positive"
113+
},
114+
{
115+
"label": "11:00",
116+
"title": "Make one decision visible",
117+
"description": "End the sync with an owner and next checkpoint.",
118+
"tone": "info"
119+
},
120+
{
121+
"label": "15:00",
122+
"title": "Stop before the final push",
123+
"description": "The reset protects the remaining buffer.",
124+
"tone": "neutral"
125+
}
126+
]
127+
},
128+
{
129+
"id": "buffer",
130+
"kind": "notice",
131+
"title": "Keep 15:30 onward unclaimed",
132+
"body": "That window absorbs a late review, travel, or an unfinished release note without displacing recovery time.",
133+
"tone": "info",
134+
"span": "one"
79135
}
80136
]
81137
}

data/examples/inbox/attention/2026-08-24.json

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"quality": { "confidence": "high", "warnings": [] },
1515
"privacy": { "classification": "public", "contains_personal_data": false, "synthetic": true },
1616
"data": {
17-
"title": "Two messages deserve attention",
18-
"summary": "One scheduling decision and one document review need a response. Everything else can wait.",
17+
"title": "Four messages fit into two reply windows",
18+
"summary": "One deadline and one scheduling decision come first. A review and follow-up can share the afternoon window; 18 low-value messages remain excluded.",
1919
"attention": "medium",
2020
"facts": {
2121
"items": [
@@ -33,6 +33,21 @@
3333
"subject_summary": "Approve the revised outline",
3434
"reason": "reply",
3535
"status": "open"
36+
},
37+
{
38+
"id": "m3",
39+
"sender_label": "Operations contact",
40+
"subject_summary": "Confirm the renewal choice",
41+
"reason": "deadline",
42+
"deadline": "2026-08-24T15:00:00Z",
43+
"status": "open"
44+
},
45+
{
46+
"id": "m4",
47+
"sender_label": "Research collaborator",
48+
"subject_summary": "Close the open question",
49+
"reason": "follow-up",
50+
"status": "waiting"
3651
}
3752
]
3853
},
@@ -45,7 +60,8 @@
4560
"title": "Attention filter",
4661
"span": "full",
4762
"metrics": [
48-
{ "label": "Needs reply", "value": 2, "tone": "warning" },
63+
{ "label": "Needs reply", "value": 4, "tone": "warning" },
64+
{ "label": "Due today", "value": 2, "tone": "danger" },
4965
{ "label": "Waiting on others", "value": 1, "tone": "neutral" },
5066
{ "label": "Ignored noise", "value": 18, "tone": "positive" }
5167
]
@@ -71,6 +87,22 @@
7187
"meta": "15 minutes",
7288
"status": "Review",
7389
"tone": "info"
90+
},
91+
{
92+
"id": "m3",
93+
"title": "Confirm the renewal choice",
94+
"description": "A yes-or-no choice is due before the afternoon processing window.",
95+
"meta": "Due 15:00",
96+
"status": "Deadline",
97+
"tone": "danger"
98+
},
99+
{
100+
"id": "m4",
101+
"title": "Close the open research question",
102+
"description": "Send the missing constraint; no full thread review is required.",
103+
"meta": "No explicit deadline",
104+
"status": "Follow-up",
105+
"tone": "neutral"
74106
}
75107
]
76108
},
@@ -81,6 +113,44 @@
81113
"body": "Newsletters, receipts, automated updates, and promotional messages were excluded from the attention queue.",
82114
"tone": "positive",
83115
"span": "one"
116+
},
117+
{
118+
"id": "reply-plan",
119+
"kind": "timeline",
120+
"title": "Reply plan",
121+
"span": "one",
122+
"items": [
123+
{
124+
"label": "09:50",
125+
"title": "Resolve the scheduling choice",
126+
"description": "Reply before the first focus block closes.",
127+
"tone": "warning"
128+
},
129+
{
130+
"label": "12:15",
131+
"title": "Confirm the renewal",
132+
"description": "A one-line answer clears the only hard deadline.",
133+
"tone": "danger"
134+
},
135+
{ "label": "16:00", "title": "Batch review and follow-up", "description": "Cap the window at 25 minutes.", "tone": "info" }
136+
]
137+
},
138+
{
139+
"id": "attention-register",
140+
"kind": "table",
141+
"title": "Attention register",
142+
"span": "one",
143+
"columns": [
144+
{ "key": "item", "label": "Item" },
145+
{ "key": "reason", "label": "Reason" },
146+
{ "key": "window", "label": "Window" }
147+
],
148+
"rows": [
149+
{ "item": "Planning window", "reason": "Decision", "window": "09:50" },
150+
{ "item": "Renewal choice", "reason": "Deadline", "window": "12:15" },
151+
{ "item": "Revised outline", "reason": "Review", "window": "16:00" },
152+
{ "item": "Research question", "reason": "Follow-up", "window": "16:00" }
153+
]
84154
}
85155
]
86156
}

0 commit comments

Comments
 (0)