toga-ai 1.0.584 → 1.0.586
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.
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
| [ClickUp Sprint Dashboard (tools /clickup/react)](features/clickup-sprint-dashboard.md) | A native **ClickUp sprint dashboard** in the 1.0 `tools` app at route `/clickup/react`, built for a wall-mounted **TV display** ("TOGa IQ" internal sprint metri | tools/_/app/clickup/sprint.php, tools/v2/sprints/tile/index.php, tools/v2/sprints/current/index.php, tools/v2/sprints/status-breakdown/index.php, tools/v2/sprints/worktype-breakdown/index.php, tools/v2/sprints/points-by-dev/index.php, tools/v2/sprints/burndown/index.php, tools/assets/clickup/sprint-dashboard.html, tools/mvc/clickup/react/get.php, tools/mvc/login/get.php, tools/_/app/nav.php |
|
|
7
7
|
| [CloudFront Client Setup](features/cloudfront-client-setup.md) | An SSO-gated admin tool at **`/devops/cloudfront-clients`** in the Tools 1.0 app that onboards a client onto **CloudFront + Route 53 across multiple AWS account | tools/_/app/devops/cloudfront.php, tools/mvc/devops/cloudfront-clients/get.php, tools/mvc/devops/cloudfront-clients/post.php, tools/assets/js/cloudfront-clients.js, tools/assets/css/cloudfront-clients.css, tools/_/app/nav.php, tools/_/app/frameworkindex.php, tools/config.production.ini |
|
|
8
8
|
| [Design Demo Admin](features/design-demo-admin.md) | A self-serve admin UI at **`/design`** in the SSO-protected **Tools** app that lets the design team publish self-contained "Claude Design" HTML exports as **ver | tools/_/app/design/github.php, tools/mvc/design/get.php, tools/mvc/design/post.php, tools/assets/css/design.css, tools/assets/js/design.js, tools/_/app/frameworkindex.php, tools/_/app/nav.php, tools/composer.json |
|
|
9
|
-
| [Tools — Developers Folder (UUID & Password Generators)](features/developer-tools.md) | The first two tools shipped in the Tools app, both under the **Developers** folder and gated to personas **Development Team** / **TOGa Technology**. | tools/mvc/developers/uuid/get.php, tools/mvc/developers/password/get.php |
|
|
9
|
+
| [Tools — Developers Folder (UUID & Password Generators)](features/developer-tools.md) | The first two tools shipped in the Tools app, both under the **Developers** folder and gated to personas **Development Team** / **TOGa Technology**. | tools/mvc/developers/uuid/get.php, tools/mvc/developers/password/get.php, tools/mvc/developers/password/post.php |
|
|
10
10
|
| [/errors Curation Console (Tools → shared Core Logs DB)](features/errors-curation-console.md) | Internal-only triage/curation screen for the 2.0 Issue/Event error-reporting pipeline, built as a 1.0 Tools MVC page reading the **shared Core Logs DB** through | tools/mvc/errors/get.php, tools/mvc/errors/post.php, tools/mvc/errors/issue/get.php, tools/assets/css/style.css, tools/_/app/nav.php, tools/config.production.ini |
|
|
11
11
|
| [Legacy Email Notifier (tools /email-migration/notify)](features/legacy-email-notifier.md) | An SSO-gated admin tool at **`/email-migration/notify`** (nav group **Email Migration** > **Legacy Notifier**, personas `['TOGa Technology','Development Team']` | tools/mvc/email-migration/notify/get.php, tools/mvc/email-migration/notify/post.php, tools/_/app/nav.php |
|
|
12
12
|
| [Tools MVC — Routing, CSRF & App_Database Access Patterns](features/mvc-data-access-patterns.md) | The load-bearing 1.0 (`App_`) framework conventions a developer needs when adding a page to the Tools app — URL routing, CSRF, and DB access through `App_Databa | tools/_/app/nav.php, tools/mvc/get.php, library/app/error.php, library/app/database.php |
|
|
@@ -6,14 +6,16 @@ project: Tools
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-
|
|
9
|
+
updated: 2026-08-14
|
|
10
10
|
owners: [jcardinal]
|
|
11
11
|
files:
|
|
12
12
|
- tools/mvc/developers/uuid/get.php
|
|
13
13
|
- tools/mvc/developers/password/get.php
|
|
14
|
+
- tools/mvc/developers/password/post.php
|
|
14
15
|
related:
|
|
15
16
|
- ../architecture.md
|
|
16
17
|
- ./persona-gated-navigation.md
|
|
18
|
+
- ./mvc-data-access-patterns.md
|
|
17
19
|
---
|
|
18
20
|
|
|
19
21
|
## Summary
|
|
@@ -28,10 +30,28 @@ personas **Development Team** / **TOGa Technology**. They are the reference exam
|
|
|
28
30
|
- Server generates an RFC 4122 **v4** UUID via `random_bytes(16)` with version/variant bits set.
|
|
29
31
|
- UI is click-to-copy, then instant **client-side** regenerate using `crypto.getRandomValues`.
|
|
30
32
|
|
|
31
|
-
### Generate Password (`mvc/developers/password/get.php`)
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
produces the bcrypt hash. The page shows **both** the
|
|
33
|
+
### Generate Password (`mvc/developers/password/get.php` + `post.php`)
|
|
34
|
+
- **Random support-code card (default, on page load):** reproduces the standalone
|
|
35
|
+
`test/team/generate_password.php` script. `App_String::generateSupportCode(8)` produces the
|
|
36
|
+
password; `App_String::passwordHash()` produces the bcrypt hash. The page shows **both** the
|
|
37
|
+
password and the hash, each copyable. Unchanged.
|
|
38
|
+
- **Hash-your-own-password card:** the user types a password and gets its bcrypt hash without a
|
|
39
|
+
full page reload. bcrypt cannot run client-side, so the UI `fetch`es a sibling
|
|
40
|
+
`post.php` — the framework routes any non-GET for `/developers/password` to
|
|
41
|
+
`mvc/developers/password/post.php` (folder == route 1:1). `post.php` exposes one JSON action
|
|
42
|
+
`hash`, guarded with the standard tools pair `App_Auth::requireAuth()` then
|
|
43
|
+
`App_Page::validateCrossSiteRequestForgery()`. That CSRF check is **Origin/Referer-based, not
|
|
44
|
+
a token**, so a same-origin `fetch` passes with no embedded token (see
|
|
45
|
+
[mvc-data-access-patterns](./mvc-data-access-patterns.md)).
|
|
46
|
+
- **Security discipline:** the clear-text password is **never logged or persisted**. A
|
|
47
|
+
`MAX_PASSWORD_BYTES = 4096` guard bounds input, and the endpoint returns a `truncated` flag
|
|
48
|
+
because bcrypt only consumes the first 72 bytes — the UI shows a note when that is exceeded.
|
|
49
|
+
|
|
50
|
+
## Gotcha — bcrypt's 72-byte limit
|
|
51
|
+
`password_hash`/`App_String::passwordHash()` silently ignores everything past the first **72
|
|
52
|
+
bytes** of the input. The hash-your-own card surfaces this to the user (`truncated` flag + UI
|
|
53
|
+
note) rather than letting a longer password appear to "work" while extra characters are dead.
|
|
35
54
|
|
|
36
55
|
## Change history
|
|
56
|
+
- 2026-08-14 — Added a "hash your own password" card to the Generate Password tool: a new sibling `mvc/developers/password/post.php` exposes one JSON `hash` action (requireAuth + Origin/Referer CSRF), so the UI bcrypt-hashes user-typed input via `fetch` without a page reload; clear-text is never logged/persisted, `MAX_PASSWORD_BYTES=4096` guard, and a `truncated` flag surfaces bcrypt's 72-byte limit. Also fixed missing inter-card spacing by adding a `tool--password` wrapper modifier + `.tool--password .card { margin-bottom }` (mirroring `.tool--errors`; note style.scss is dead — edit style.css directly). (jcardinal)
|
|
37
57
|
- 2026-06-25 — Built the first two Developers tools: RFC 4122 v4 UUID generator and a password+bcrypt-hash generator (ported from test/team/generate_password.php), both gated to Development Team / TOGa Technology personas (jcardinal)
|
|
@@ -7,7 +7,7 @@ client: shared
|
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
9
|
updated: 2026-08-14
|
|
10
|
-
owners: [kyalamarthi]
|
|
10
|
+
owners: [kyalamarthi, jcardinal]
|
|
11
11
|
files:
|
|
12
12
|
- tools/assets/clickup/sprint-dashboard.html
|
|
13
13
|
- tools/mvc/clickup/react/get.php
|
|
@@ -168,12 +168,22 @@ stays on the **base** hue, so the dashboard underneath stays readable instead of
|
|
|
168
168
|
bright layer is written `var(--alert-bright, var(--alert-color))` so it **degrades to the base
|
|
169
169
|
colour** if the property never reaches the element.
|
|
170
170
|
|
|
171
|
-
Standing and blinking differ
|
|
172
|
-
distinguishable from "
|
|
171
|
+
Standing and blinking differ in intensity **and in animation tempo**, which is what keeps
|
|
172
|
+
"still broken" distinguishable from "something just changed":
|
|
173
173
|
|
|
174
|
-
- `.alert-flash` (standing) — 12px rim,
|
|
175
|
-
|
|
176
|
-
|
|
174
|
+
- `.alert-flash` (standing) — 12px rim, **slowly breathes** its opacity 0 → 1 → 0 on a
|
|
175
|
+
**7-second ease-in-out loop** (`@keyframes alert-breathe { 0%,100% { opacity: 0 } 50% {
|
|
176
|
+
opacity: 1 } }`, applied `animation: alert-breathe 7s ease-in-out infinite`). It may sit on
|
|
177
|
+
screen for hours, so the gentle 7s breathe draws a distant eye without reading as urgent. The
|
|
178
|
+
tempo is deliberately slow: the values were tuned with the developer (0.5→0.92 over 10s was
|
|
179
|
+
too subtle, full 0→1 over 10s too slow) to settle on full 0→1 over 7s.
|
|
180
|
+
- `.alert-flash.is-blinking` (event) — 20px rim, `opacity: 1`, plus the fast **0.7s** pulse.
|
|
181
|
+
Its compound selector (0,2,0) out-specifies the standing breathe (0,1,0), so a just-changed
|
|
182
|
+
monitor shows the urgent fast blink, not the slow breathe.
|
|
183
|
+
|
|
184
|
+
The base `.alert-flash { opacity: .85 }` is the **reduced-motion fallback**, not the animated
|
|
185
|
+
default — see the `prefers-reduced-motion` gotcha. It is deliberately non-zero so a
|
|
186
|
+
reduced-motion viewer never lands on a fully-invisible (opacity 0) glow.
|
|
177
187
|
|
|
178
188
|
## Gotchas
|
|
179
189
|
|
|
@@ -192,7 +202,9 @@ distinguishable from "pulsing = something just changed":
|
|
|
192
202
|
Once the blink moved to `.alert-flash.is-blinking` (specificity 0,2,0), a reduced-motion rule
|
|
193
203
|
on `.alert-flash` alone (0,1,0) **could no longer override it** and the screen kept pulsing.
|
|
194
204
|
The rule must list both: `.alert-flash, .alert-flash.is-blinking { animation: none; }`. Any
|
|
195
|
-
future state/modifier CSS split has the same trap.
|
|
205
|
+
future state/modifier CSS split has the same trap. Because it already names `.alert-flash`,
|
|
206
|
+
this same rule **also covers the new slow `alert-breathe` breathe** — a reduced-motion viewer
|
|
207
|
+
falls back to the static `opacity: .85` glow with **no separate rule needed**.
|
|
196
208
|
- **A parse failure currently looks calmer than an outage** (known issue, not fixed). If the
|
|
197
209
|
OneUptime call returns HTTP 200 with a malformed or empty body, `buildMonitorModel` yields
|
|
198
210
|
total 0, empty buckets and empty rows. The status pill correctly degrades to "Unknown", but
|
|
@@ -219,6 +231,13 @@ summary, and caches ~5s. Rationale:
|
|
|
219
231
|
alerting really wants (today the baseline resets every time a tab reloads).
|
|
220
232
|
|
|
221
233
|
## Change history
|
|
234
|
+
- 2026-08-14 — The standing (level-triggered) edge tint now **slowly breathes** its opacity
|
|
235
|
+
0→1→0 on a 7s ease-in-out loop (`@keyframes alert-breathe`) instead of holding a static tint,
|
|
236
|
+
so a still-broken screen draws a distant eye. The fast 0.7s `.is-blinking` event pulse still
|
|
237
|
+
out-specifies it, keeping "just changed" (fast) distinct from "still broken" (slow breathe);
|
|
238
|
+
tempo tuned with the developer (0.5→0.92/10s too subtle, 0→1/10s too slow → 0→1/7s). The
|
|
239
|
+
existing `prefers-reduced-motion` compound-selector rule already covers the new animation, so
|
|
240
|
+
reduced-motion falls back to the deliberately non-zero static `opacity: .85` glow. (jcardinal)
|
|
222
241
|
- 2026-08-14 — Built the monitor status column on `/clickup/react` (split layout, solid status
|
|
223
242
|
circle + legend + degraded/offline card) as components in the same document rather than a
|
|
224
243
|
nested iframe, sharing one 5s poll; documented the OneUptime public status-page overview API
|
package/package.json
CHANGED