snice 7.0.3 → 7.1.1
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/.agents/skills/snice/SKILL.md +4 -0
- package/.agents/skills/snice/references/core-kitchen-sink.ts +39 -1
- package/README.md +64 -14
- package/adapters/react/SniceProvider.js +2 -2
- package/adapters/react/SniceRouter.js +2 -2
- package/adapters/react/matchRoute.js +2 -2
- package/adapters/react/useRequestHandler.js +2 -2
- package/bin/analyzer-contracts.js +6 -1
- package/bin/postinstall.js +59 -0
- package/bin/project-analyzer.js +466 -5
- package/bin/snice.js +3 -0
- package/dist/app-context.d.ts +11 -0
- package/dist/cdn/accordion/snice-accordion.js +2 -2
- package/dist/cdn/action-bar/snice-action-bar.js +2 -2
- package/dist/cdn/activity-feed/snice-activity-feed.js +2 -2
- package/dist/cdn/alert/snice-alert.js +2 -2
- package/dist/cdn/app-tiles/snice-app-tiles.js +2 -2
- package/dist/cdn/approval-flow/snice-approval-flow.js +2 -2
- package/dist/cdn/audio-recorder/snice-audio-recorder.js +2 -2
- package/dist/cdn/availability/snice-availability.js +2 -2
- package/dist/cdn/avatar/snice-avatar.js +2 -2
- package/dist/cdn/avatar-group/snice-avatar-group.js +2 -2
- package/dist/cdn/badge/snice-badge.js +2 -2
- package/dist/cdn/banner/snice-banner.js +2 -2
- package/dist/cdn/binpack/snice-binpack.js +2 -2
- package/dist/cdn/book/snice-book.js +2 -2
- package/dist/cdn/booking/snice-booking.js +2 -2
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +2 -2
- package/dist/cdn/button/snice-button.js +2 -2
- package/dist/cdn/calendar/snice-calendar.js +2 -2
- package/dist/cdn/camera/snice-camera.js +2 -2
- package/dist/cdn/camera-annotate/snice-camera-annotate.js +2 -2
- package/dist/cdn/candlestick/snice-candlestick.js +2 -2
- package/dist/cdn/card/snice-card.js +2 -2
- package/dist/cdn/carousel/snice-carousel.js +2 -2
- package/dist/cdn/cart/snice-cart.js +2 -2
- package/dist/cdn/chart/snice-chart.js +2 -2
- package/dist/cdn/chat/snice-chat.js +2 -2
- package/dist/cdn/checkbox/snice-checkbox.js +2 -2
- package/dist/cdn/chip/snice-chip.js +2 -2
- package/dist/cdn/code-block/snice-code-block.js +2 -2
- package/dist/cdn/color-display/snice-color-display.js +2 -2
- package/dist/cdn/color-picker/snice-color-picker.js +2 -2
- package/dist/cdn/command-palette/snice-command-palette.js +2 -2
- package/dist/cdn/comments/snice-comments.js +2 -2
- package/dist/cdn/countdown/snice-countdown.js +2 -2
- package/dist/cdn/cropper/snice-cropper.js +2 -2
- package/dist/cdn/data-card/snice-data-card.js +2 -2
- package/dist/cdn/date-picker/snice-date-picker.js +2 -2
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +2 -2
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +2 -2
- package/dist/cdn/diff/snice-diff.js +2 -2
- package/dist/cdn/divider/snice-divider.js +2 -2
- package/dist/cdn/doc/snice-doc.js +2 -2
- package/dist/cdn/draw/snice-draw.js +2 -2
- package/dist/cdn/drawer/snice-drawer.js +2 -2
- package/dist/cdn/empty-state/snice-empty-state.js +2 -2
- package/dist/cdn/estimate/snice-estimate.js +2 -2
- package/dist/cdn/file-gallery/snice-file-gallery.js +2 -2
- package/dist/cdn/file-upload/snice-file-upload.js +2 -2
- package/dist/cdn/flip-card/snice-flip-card.js +2 -2
- package/dist/cdn/flow/snice-flow.js +2 -2
- package/dist/cdn/form-layout/snice-form-layout.js +2 -2
- package/dist/cdn/funnel/snice-funnel.js +2 -2
- package/dist/cdn/gantt/snice-gantt.js +2 -2
- package/dist/cdn/gauge/snice-gauge.js +2 -2
- package/dist/cdn/grid/snice-grid.js +2 -2
- package/dist/cdn/heatmap/snice-heatmap.js +2 -2
- package/dist/cdn/image/snice-image.js +2 -2
- package/dist/cdn/input/snice-input.js +2 -2
- package/dist/cdn/invoice/snice-invoice.js +2 -2
- package/dist/cdn/kanban/snice-kanban.js +2 -2
- package/dist/cdn/key-value/snice-key-value.js +2 -2
- package/dist/cdn/kpi/snice-kpi.js +2 -2
- package/dist/cdn/layout/README.md +17 -2
- package/dist/cdn/layout/snice-layout.js +1656 -11
- package/dist/cdn/layout/snice-layout.js.map +1 -1
- package/dist/cdn/layout/snice-layout.min.js +379 -2
- package/dist/cdn/layout/snice-layout.min.js.map +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.js +2 -2
- package/dist/cdn/link/snice-link.js +2 -2
- package/dist/cdn/link-preview/snice-link-preview.js +2 -2
- package/dist/cdn/list/snice-list.js +2 -2
- package/dist/cdn/location/snice-location.js +2 -2
- package/dist/cdn/login/snice-login.js +2 -2
- package/dist/cdn/map/snice-map.js +2 -2
- package/dist/cdn/markdown/snice-markdown.js +2 -2
- package/dist/cdn/masonry/snice-masonry.js +2 -2
- package/dist/cdn/menu/snice-menu.js +2 -2
- package/dist/cdn/message-strip/snice-message-strip.js +2 -2
- package/dist/cdn/modal/snice-modal.js +2 -2
- package/dist/cdn/music-player/snice-music-player.js +2 -2
- package/dist/cdn/nav/snice-nav.js +2 -2
- package/dist/cdn/network-graph/snice-network-graph.js +2 -2
- package/dist/cdn/notification-center/snice-notification-center.js +2 -2
- package/dist/cdn/order-tracker/snice-order-tracker.js +2 -2
- package/dist/cdn/org-chart/snice-org-chart.js +2 -2
- package/dist/cdn/pagination/snice-pagination.js +2 -2
- package/dist/cdn/paint/snice-paint.js +2 -2
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +2 -2
- package/dist/cdn/permission-matrix/snice-permission-matrix.js +2 -2
- package/dist/cdn/podcast-player/snice-podcast-player.js +2 -2
- package/dist/cdn/popover/snice-popover.js +2 -2
- package/dist/cdn/pricing-table/snice-pricing-table.js +2 -2
- package/dist/cdn/product-card/snice-product-card.js +2 -2
- package/dist/cdn/progress/snice-progress.js +2 -2
- package/dist/cdn/progress-ring/snice-progress-ring.js +2 -2
- package/dist/cdn/qr-code/snice-qr-code.js +2 -2
- package/dist/cdn/qr-reader/snice-qr-reader.js +2 -2
- package/dist/cdn/radio/snice-radio.js +2 -2
- package/dist/cdn/range-slider/snice-range-slider.js +2 -2
- package/dist/cdn/rating/snice-rating.js +2 -2
- package/dist/cdn/receipt/snice-receipt.js +2 -2
- package/dist/cdn/recipe/snice-recipe.js +2 -2
- package/dist/cdn/runtime/README.md +2 -2
- package/dist/cdn/runtime/snice-runtime.esm.js +3825 -3337
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +3827 -3336
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
- package/dist/cdn/sankey/snice-sankey.js +2 -2
- package/dist/cdn/segmented-control/snice-segmented-control.js +2 -2
- package/dist/cdn/select/snice-select.js +2 -2
- package/dist/cdn/skeleton/snice-skeleton.js +2 -2
- package/dist/cdn/slider/snice-slider.js +2 -2
- package/dist/cdn/sortable/snice-sortable.js +2 -2
- package/dist/cdn/sparkline/snice-sparkline.js +2 -2
- package/dist/cdn/spinner/snice-spinner.js +2 -2
- package/dist/cdn/split-button/snice-split-button.js +2 -2
- package/dist/cdn/split-pane/snice-split-pane.js +2 -2
- package/dist/cdn/spotlight/snice-spotlight.js +2 -2
- package/dist/cdn/stat-group/snice-stat-group.js +2 -2
- package/dist/cdn/step-input/snice-step-input.js +2 -2
- package/dist/cdn/stepper/snice-stepper.js +2 -2
- package/dist/cdn/switch/snice-switch.js +2 -2
- package/dist/cdn/table/README.md +6 -2
- package/dist/cdn/table/snice-table.esm.js +347 -54
- package/dist/cdn/table/snice-table.esm.js.map +1 -1
- package/dist/cdn/table/snice-table.esm.min.js +105 -44
- package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
- package/dist/cdn/table/snice-table.js +348 -57
- package/dist/cdn/table/snice-table.js.map +1 -1
- package/dist/cdn/table/snice-table.min.js +153 -92
- package/dist/cdn/table/snice-table.min.js.map +1 -1
- package/dist/cdn/tabs/snice-tabs.js +2 -2
- package/dist/cdn/tag/snice-tag.js +2 -2
- package/dist/cdn/tag-input/snice-tag-input.js +2 -2
- package/dist/cdn/terminal/snice-terminal.js +2 -2
- package/dist/cdn/testimonial/snice-testimonial.js +2 -2
- package/dist/cdn/textarea/snice-textarea.js +2 -2
- package/dist/cdn/time-picker/snice-time-picker.js +2 -2
- package/dist/cdn/time-range-picker/snice-time-range-picker.js +2 -2
- package/dist/cdn/timeline/snice-timeline.js +2 -2
- package/dist/cdn/timer/snice-timer.js +2 -2
- package/dist/cdn/toast/snice-toast.js +2 -2
- package/dist/cdn/tooltip/snice-tooltip.js +2 -2
- package/dist/cdn/tree/snice-tree.js +2 -2
- package/dist/cdn/treemap/snice-treemap.js +2 -2
- package/dist/cdn/user-card/snice-user-card.js +2 -2
- package/dist/cdn/video-player/snice-video-player.js +2 -2
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +2 -2
- package/dist/cdn/waterfall/snice-waterfall.js +2 -2
- package/dist/cdn/weather/snice-weather.js +2 -2
- package/dist/cdn/work-order/snice-work-order.js +2 -2
- package/dist/context-provider.d.ts +16 -0
- package/dist/controller.d.ts +5 -0
- package/dist/daemon-target.d.ts +10 -0
- package/dist/daemon.d.ts +10 -0
- package/dist/index.cjs +3821 -3330
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.esm.js +3819 -3331
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +3821 -3330
- package/dist/index.iife.js.map +1 -1
- package/dist/keyboard-filter.d.ts +25 -0
- package/dist/on.d.ts +1 -1
- package/dist/parts.d.ts +2 -19
- package/dist/react/SniceProvider.js +2 -2
- package/dist/react/SniceRouter.js +2 -2
- package/dist/react/index.js +2 -2
- package/dist/react/matchRoute.js +2 -2
- package/dist/react/useRequestHandler.js +2 -2
- package/dist/request-response.d.ts +9 -1
- package/dist/symbols.cjs +19 -2
- package/dist/symbols.cjs.map +1 -1
- package/dist/symbols.d.ts +5 -0
- package/dist/symbols.esm.js +15 -3
- package/dist/symbols.esm.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/transitions.cjs +2 -2
- package/dist/transitions.esm.js +2 -2
- package/dist/types/app-context.d.ts +9 -58
- package/dist/types/daemon.d.ts +8 -0
- package/dist/types/dispatch-options.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/on-options.d.ts +5 -0
- package/dist/types/request-options.d.ts +2 -0
- package/dist/types/respond-options.d.ts +2 -0
- package/docs/ai/DEVELOPMENT.md +15 -1
- package/docs/ai/README.md +5 -1
- package/docs/ai/api.md +13 -4
- package/docs/ai/architecture.md +51 -2
- package/docs/ai/bindings.md +1 -1
- package/docs/ai/cli.md +9 -0
- package/docs/ai/controllers.md +1 -1
- package/docs/ai/daemons.md +80 -0
- package/docs/ai/decorators.md +7 -5
- package/docs/ai/events.md +6 -0
- package/docs/ai/patterns.md +49 -4
- package/docs/ai/request-response.md +26 -9
- package/docs/ai/routing.md +16 -1
- package/docs/bindings.md +1 -1
- package/docs/cli.md +7 -0
- package/docs/controllers.md +8 -2
- package/docs/daemons.md +200 -0
- package/docs/events.md +19 -2
- package/docs/request-response.md +20 -13
- package/docs/routing.md +25 -1
- package/package.json +6 -4
|
@@ -8,6 +8,10 @@ description: Build, modify, debug, or review applications and components that us
|
|
|
8
8
|
Use the documentation shipped with the exact installed Snice version. Do not
|
|
9
9
|
reconstruct Snice APIs from Lit or generic web-component conventions.
|
|
10
10
|
|
|
11
|
+
If a consuming project does not yet contain `.agents/skills/snice/SKILL.md`,
|
|
12
|
+
run `npx snice init-ai` from that project root before writing Snice code. This
|
|
13
|
+
installs version-matched guidance plus `AGENTS.md` and `CLAUDE.md` pointers.
|
|
14
|
+
|
|
11
15
|
## Locate the reference
|
|
12
16
|
|
|
13
17
|
Use the first directory that exists:
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import {
|
|
11
11
|
ContextAwareFetcher,
|
|
12
|
+
type Response,
|
|
12
13
|
SniceElement,
|
|
13
14
|
adopted,
|
|
14
15
|
classMap,
|
|
@@ -19,6 +20,7 @@ import {
|
|
|
19
20
|
controller,
|
|
20
21
|
createRequestHandler,
|
|
21
22
|
css,
|
|
23
|
+
daemon,
|
|
22
24
|
debounce,
|
|
23
25
|
dispatch,
|
|
24
26
|
dispose,
|
|
@@ -81,6 +83,23 @@ interface KitchenContext extends AppContext {
|
|
|
81
83
|
token: string;
|
|
82
84
|
}
|
|
83
85
|
|
|
86
|
+
@daemon
|
|
87
|
+
class KitchenDaemon {
|
|
88
|
+
status = 'ready';
|
|
89
|
+
|
|
90
|
+
@respond('daemon-status')
|
|
91
|
+
currentStatus() {
|
|
92
|
+
return this.status;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@dispatch('daemon-status-changed')
|
|
96
|
+
statusChanged() {
|
|
97
|
+
return this.status;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const kitchenDaemon = new KitchenDaemon();
|
|
102
|
+
|
|
84
103
|
const fetcher = new ContextAwareFetcher();
|
|
85
104
|
fetcher.use('request', function (request, next) {
|
|
86
105
|
const { token } = this.application as KitchenContext;
|
|
@@ -96,7 +115,11 @@ export const { page, navigate, initialize } = Router({
|
|
|
96
115
|
target: '#app',
|
|
97
116
|
type: 'hash',
|
|
98
117
|
layout: 'kitchen-shell',
|
|
99
|
-
context: {
|
|
118
|
+
context: {
|
|
119
|
+
user: null,
|
|
120
|
+
token: '',
|
|
121
|
+
daemons: { kitchen: kitchenDaemon }
|
|
122
|
+
} satisfies KitchenContext,
|
|
100
123
|
fetcher
|
|
101
124
|
});
|
|
102
125
|
|
|
@@ -220,6 +243,21 @@ class KitchenView extends SniceElement {
|
|
|
220
243
|
return user as User;
|
|
221
244
|
}
|
|
222
245
|
|
|
246
|
+
@request('daemon-status', { daemon: 'kitchen' })
|
|
247
|
+
async *loadDaemonStatus(): Response<string> {
|
|
248
|
+
return await (yield {});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async normalizedDaemonStatus() {
|
|
252
|
+
const status: string = await this.loadDaemonStatus();
|
|
253
|
+
return status.toUpperCase();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
@on('daemon-status-changed', { daemon: 'kitchen' })
|
|
257
|
+
daemonStatusChanged(event: CustomEvent<string>) {
|
|
258
|
+
this.status.text = event.detail;
|
|
259
|
+
}
|
|
260
|
+
|
|
223
261
|
@observe('resize', '.panel')
|
|
224
262
|
resized(_entries: ResizeObserverEntry[]) {}
|
|
225
263
|
|
package/README.md
CHANGED
|
@@ -62,7 +62,7 @@ class RealTimeUserLoader { ... }
|
|
|
62
62
|
@on('click', 'button') fn(e: Event) { ... }
|
|
63
63
|
@dispatch('value-changed') fn(val: string) => Event Detail
|
|
64
64
|
@context() fn(ctx: Context) { ... }
|
|
65
|
-
@request('user') fn():
|
|
65
|
+
@request('user') async *fn(): Response<User> { return yield {}; }
|
|
66
66
|
@respond('user') fn(req) => Response;
|
|
67
67
|
```
|
|
68
68
|
|
|
@@ -228,6 +228,11 @@ html`<user-list controller=${RealTimeUserLoader}></user-list>`
|
|
|
228
228
|
html`<user-list controller=${CachedUserLoader}></user-list>`
|
|
229
229
|
```
|
|
230
230
|
|
|
231
|
+
Class bindings reflect the decorator name in the DOM (for example,
|
|
232
|
+
`controller="real-time-user-loader"`) so DevTools still shows which controller
|
|
233
|
+
is active. The class reference remains the attachment authority; the reflected
|
|
234
|
+
attribute is diagnostic and does not cause a second registry attachment.
|
|
235
|
+
|
|
231
236
|
Registry names still work everywhere, and are the channel for raw HTML markup:
|
|
232
237
|
|
|
233
238
|
```html
|
|
@@ -510,8 +515,8 @@ This pattern is useful when:
|
|
|
510
515
|
|
|
511
516
|
```typescript
|
|
512
517
|
// Controller responds to requests
|
|
513
|
-
@
|
|
514
|
-
class AppController
|
|
518
|
+
@controller('app-controller')
|
|
519
|
+
class AppController {
|
|
515
520
|
private currentUser = { name: 'Alice', role: 'admin' };
|
|
516
521
|
|
|
517
522
|
@respond('user')
|
|
@@ -523,32 +528,75 @@ class AppController extends HTMLElement {
|
|
|
523
528
|
// Element makes requests
|
|
524
529
|
@element('user-badge')
|
|
525
530
|
class UserBadge extends HTMLElement {
|
|
531
|
+
@state() private user: User | null = null;
|
|
532
|
+
|
|
526
533
|
@request('user')
|
|
527
|
-
getUser
|
|
534
|
+
async *getUser(): Response<User> {
|
|
535
|
+
return yield {};
|
|
536
|
+
}
|
|
528
537
|
|
|
529
538
|
@ready()
|
|
530
|
-
init() {
|
|
531
|
-
const user = this.getUser();
|
|
539
|
+
async init() {
|
|
540
|
+
const user = await this.getUser();
|
|
541
|
+
this.user = user;
|
|
532
542
|
console.log('Current user:', user);
|
|
533
543
|
}
|
|
534
544
|
|
|
535
545
|
@render()
|
|
536
546
|
renderContent() {
|
|
537
|
-
|
|
538
|
-
return html`<div>Welcome, ${user.name}!</div>`;
|
|
547
|
+
return html`<div>Welcome, ${this.user?.name ?? 'Guest'}!</div>`;
|
|
539
548
|
}
|
|
540
549
|
}
|
|
541
|
-
```
|
|
542
550
|
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
<app-controller>
|
|
546
|
-
<user-badge></user-badge>
|
|
547
|
-
</app-controller>
|
|
551
|
+
// A parent template attaches the responder by class.
|
|
552
|
+
html`<user-badge controller=${AppController}></user-badge>`;
|
|
548
553
|
```
|
|
549
554
|
|
|
550
555
|
See [Request/Response documentation](./docs/request-response.md) for details.
|
|
551
556
|
|
|
557
|
+
### Daemons
|
|
558
|
+
|
|
559
|
+
Daemons are explicitly constructed, app-owned objects with state and a lifecycle.
|
|
560
|
+
They support both request/response and event communication without requiring an
|
|
561
|
+
element or a global singleton:
|
|
562
|
+
|
|
563
|
+
```typescript
|
|
564
|
+
@daemon
|
|
565
|
+
class SessionDaemon {
|
|
566
|
+
@respond('get-session')
|
|
567
|
+
getSession() { return this.session; }
|
|
568
|
+
|
|
569
|
+
@dispatch('session-changed')
|
|
570
|
+
changed() { return this.session; }
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
const session = new SessionDaemon();
|
|
574
|
+
const release = provideContext(appRoot, { daemons: { session } });
|
|
575
|
+
|
|
576
|
+
// Elements/controllers use the context address, not SessionDaemon.
|
|
577
|
+
@request('get-session', { daemon: 'session' })
|
|
578
|
+
async *loadSession(): Response<Session | null> {
|
|
579
|
+
return yield {};
|
|
580
|
+
}
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
Router provides its `context` through the same mechanism. There is no implicit
|
|
584
|
+
construction or global registry, and multiple instances remain independent. See
|
|
585
|
+
[Daemons](./docs/daemons.md) for lifecycle, testing, and both communication models.
|
|
586
|
+
|
|
587
|
+
### Project Organization
|
|
588
|
+
|
|
589
|
+
Keep application roles easy to find: pages in `src/pages/`, reusable visual
|
|
590
|
+
elements in `src/components/`, attached behavior in `src/controllers/`, and
|
|
591
|
+
app-owned services in `src/daemons/`. `src/router.ts` constructs and exports the
|
|
592
|
+
router pieces; `src/main.ts` imports page modules and calls `initialize()`.
|
|
593
|
+
|
|
594
|
+
Pages orchestrate a route. When several storage/server/timer operations collect
|
|
595
|
+
inside one page, or substantial non-visual logic is repeated across pages, move
|
|
596
|
+
that behavior into a controller. `snice check` reports folder and extraction
|
|
597
|
+
guidance as non-blocking suggestions while treating broken Router construction
|
|
598
|
+
as an error.
|
|
599
|
+
|
|
552
600
|
## Template Syntax
|
|
553
601
|
|
|
554
602
|
### Auto-Rendering with Differential Updates
|
|
@@ -939,6 +987,7 @@ See [DEVELOPMENT.md](./DEVELOPMENT.md) for build system details
|
|
|
939
987
|
- [Declarative Rendering](./docs/rendering.md) - Bindings, control flow, reactivity, render roots, and async values
|
|
940
988
|
- [Binding Channels](./docs/bindings.md) - Detailed DOM destinations, value/removal rules, events, spreads, sentinels, and forms
|
|
941
989
|
- [Controllers API](./docs/controllers.md) - Data fetching, business logic, and controller patterns
|
|
990
|
+
- [Daemons](./docs/daemons.md) - Explicit app-context state/lifecycle objects with request/response and event communication
|
|
942
991
|
- [Routing API](./docs/routing.md) - Router setup, pages, route params, and navigation
|
|
943
992
|
- [Guards and Layouts](./docs/guards-and-layouts.md) - Protecting routes, page wrappers, and transitions
|
|
944
993
|
- [Placards API](./docs/placards.md) - Rich page metadata for dynamic navigation and discovery
|
|
@@ -952,6 +1001,7 @@ See [DEVELOPMENT.md](./DEVELOPMENT.md) for build system details
|
|
|
952
1001
|
|
|
953
1002
|
### Developer Documentation
|
|
954
1003
|
- [DEVELOPMENT.md](./DEVELOPMENT.md) - Build system, testing, and contributing to Snice
|
|
1004
|
+
- [Dumb-agent gauntlet](./.ai/gauntlet.md) - Maintainer-only local model loop for hardening `snice check`
|
|
955
1005
|
|
|
956
1006
|
## License
|
|
957
1007
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* snice v7.0
|
|
3
|
-
* A decorator-driven web component library with
|
|
2
|
+
* snice v7.1.0
|
|
3
|
+
* A decorator-driven web component library with routing, controllers, daemons, and 130+ UI components. For better coding-agent results, run npx snice init-ai.
|
|
4
4
|
* (c) 2024
|
|
5
5
|
* Released under the MIT License.
|
|
6
6
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* snice v7.0
|
|
3
|
-
* A decorator-driven web component library with
|
|
2
|
+
* snice v7.1.0
|
|
3
|
+
* A decorator-driven web component library with routing, controllers, daemons, and 130+ UI components. For better coding-agent results, run npx snice init-ai.
|
|
4
4
|
* (c) 2024
|
|
5
5
|
* Released under the MIT License.
|
|
6
6
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* snice v7.0
|
|
3
|
-
* A decorator-driven web component library with
|
|
2
|
+
* snice v7.1.0
|
|
3
|
+
* A decorator-driven web component library with routing, controllers, daemons, and 130+ UI components. For better coding-agent results, run npx snice init-ai.
|
|
4
4
|
* (c) 2024
|
|
5
5
|
* Released under the MIT License.
|
|
6
6
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* snice v7.0
|
|
3
|
-
* A decorator-driven web component library with
|
|
2
|
+
* snice v7.1.0
|
|
3
|
+
* A decorator-driven web component library with routing, controllers, daemons, and 130+ UI components. For better coding-agent results, run npx snice init-ai.
|
|
4
4
|
* (c) 2024
|
|
5
5
|
* Released under the MIT License.
|
|
6
6
|
*
|
|
@@ -18,7 +18,7 @@ export const ANALYZER_CONTRACTS = {
|
|
|
18
18
|
"componentFamilies": 134,
|
|
19
19
|
"componentModules": 188,
|
|
20
20
|
"reactWrappers": 193,
|
|
21
|
-
"rootExports":
|
|
21
|
+
"rootExports": 115
|
|
22
22
|
},
|
|
23
23
|
"rootExports": [
|
|
24
24
|
"AdoptedOptions",
|
|
@@ -29,6 +29,7 @@ export const ANALYZER_CONTRACTS = {
|
|
|
29
29
|
"ContextOptions",
|
|
30
30
|
"ControllerClass",
|
|
31
31
|
"CreateRequestHandlerOptions",
|
|
32
|
+
"DaemonMap",
|
|
32
33
|
"DispatchOptions",
|
|
33
34
|
"Duration",
|
|
34
35
|
"ElementOptions",
|
|
@@ -57,6 +58,7 @@ export const ANALYZER_CONTRACTS = {
|
|
|
57
58
|
"RequestRoute",
|
|
58
59
|
"RequestRouteMap",
|
|
59
60
|
"RespondOptions",
|
|
61
|
+
"Response",
|
|
60
62
|
"ResponseMiddleware",
|
|
61
63
|
"RouteParams",
|
|
62
64
|
"Router",
|
|
@@ -83,6 +85,7 @@ export const ANALYZER_CONTRACTS = {
|
|
|
83
85
|
"controller",
|
|
84
86
|
"createRequestHandler",
|
|
85
87
|
"css",
|
|
88
|
+
"daemon",
|
|
86
89
|
"debounce",
|
|
87
90
|
"detachController",
|
|
88
91
|
"dispatch",
|
|
@@ -91,6 +94,7 @@ export const ANALYZER_CONTRACTS = {
|
|
|
91
94
|
"escapeAttr",
|
|
92
95
|
"escapeHtml",
|
|
93
96
|
"getBodyScrollLockCount",
|
|
97
|
+
"getContext",
|
|
94
98
|
"getController",
|
|
95
99
|
"getSymbol",
|
|
96
100
|
"html",
|
|
@@ -107,6 +111,7 @@ export const ANALYZER_CONTRACTS = {
|
|
|
107
111
|
"once",
|
|
108
112
|
"parseDuration",
|
|
109
113
|
"property",
|
|
114
|
+
"provideContext",
|
|
110
115
|
"query",
|
|
111
116
|
"queryAll",
|
|
112
117
|
"ready",
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { closeSync, openSync, writeSync } from 'node:fs';
|
|
4
|
+
|
|
5
|
+
export const AI_INIT_MESSAGE = [
|
|
6
|
+
'',
|
|
7
|
+
'Snice installed. Add version-matched AI guidance to this project:',
|
|
8
|
+
' npx snice init-ai',
|
|
9
|
+
''
|
|
10
|
+
].join('\n');
|
|
11
|
+
|
|
12
|
+
function isSilent(env) {
|
|
13
|
+
return String(env.npm_config_loglevel ?? '').toLowerCase() === 'silent';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* npm 7+ captures dependency lifecycle output by default. Prefer stdout when
|
|
18
|
+
* it is already visible, otherwise write directly to an interactive terminal.
|
|
19
|
+
* Every terminal operation is best-effort so installation can never fail just
|
|
20
|
+
* because the recommendation could not be displayed.
|
|
21
|
+
*/
|
|
22
|
+
export function showAiInitMessage({
|
|
23
|
+
env = process.env,
|
|
24
|
+
platform = process.platform,
|
|
25
|
+
stdout = process.stdout,
|
|
26
|
+
open = openSync,
|
|
27
|
+
write = writeSync,
|
|
28
|
+
close = closeSync
|
|
29
|
+
} = {}) {
|
|
30
|
+
if (isSilent(env)) return false;
|
|
31
|
+
|
|
32
|
+
if (stdout.isTTY) {
|
|
33
|
+
stdout.write(AI_INIT_MESSAGE);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (!env.CI) {
|
|
38
|
+
let terminal;
|
|
39
|
+
try {
|
|
40
|
+
terminal = open(platform === 'win32' ? '\\\\.\\CONOUT$' : '/dev/tty', 'w');
|
|
41
|
+
write(terminal, AI_INIT_MESSAGE);
|
|
42
|
+
close(terminal);
|
|
43
|
+
return true;
|
|
44
|
+
} catch {
|
|
45
|
+
if (terminal !== undefined) {
|
|
46
|
+
try { close(terminal); } catch {}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
stdout.write(AI_INIT_MESSAGE);
|
|
53
|
+
return true;
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
showAiInitMessage();
|