@lssm/example.team-hub 0.0.0-canary-20251212004227

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/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # @lssm/example.team-hub
2
+
3
+ Team Hub reference example with spaces/projects, tasks, rituals, and announcements for internal teams.
4
+
5
+ Highlights:
6
+
7
+ - Spaces/projects with members and roles
8
+ - Tasks with status, priority, assignees, and due dates
9
+ - Rituals (recurring meetings/check-ins) with schedules and attendance
10
+ - Announcements with audience targeting
11
+ - Notifications for rituals/reminders and task assignments
12
+ - Jobs hooks for recurring ritual creation
@@ -0,0 +1 @@
1
+ import{ScalarTypeEnum as e,defineSchemaModel as t}from"@lssm/lib.schema";import{defineCommand as n,defineQuery as r}from"@lssm/lib.contracts";const i=[`examples.team-hub`],a=t({name:`Space`,description:`Team space/project`,fields:{id:{type:e.String_unsecure(),isOptional:!1},name:{type:e.String_unsecure(),isOptional:!1},description:{type:e.String_unsecure(),isOptional:!0},orgId:{type:e.String_unsecure(),isOptional:!1},ownerId:{type:e.String_unsecure(),isOptional:!1}}}),o=t({name:`Task`,description:`Task in a space`,fields:{id:{type:e.String_unsecure(),isOptional:!1},spaceId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},priority:{type:e.String_unsecure(),isOptional:!1},assigneeId:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.DateTime(),isOptional:!0}}}),s=t({name:`Ritual`,description:`Recurring ritual`,fields:{id:{type:e.String_unsecure(),isOptional:!1},spaceId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},cadence:{type:e.String_unsecure(),isOptional:!1},dayOfWeek:{type:e.String_unsecure(),isOptional:!0},time:{type:e.String_unsecure(),isOptional:!0}}}),c=t({name:`Announcement`,description:`Announcement to spaces/org`,fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},body:{type:e.String_unsecure(),isOptional:!1},audience:{type:e.String_unsecure(),isOptional:!1},audienceRole:{type:e.String_unsecure(),isOptional:!0},spaceId:{type:e.String_unsecure(),isOptional:!0}}}),l=t({name:`CreateSpaceInput`,description:`Input for creating a space`,fields:{name:{type:e.String_unsecure(),isOptional:!1},description:{type:e.String_unsecure(),isOptional:!0},orgId:{type:e.String_unsecure(),isOptional:!1},ownerId:{type:e.String_unsecure(),isOptional:!1}}}),u=t({name:`CreateTaskInput`,description:`Input for creating a task`,fields:{spaceId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},description:{type:e.String_unsecure(),isOptional:!0},priority:{type:e.String_unsecure(),isOptional:!0},assigneeId:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.DateTime(),isOptional:!0}}}),d=t({name:`UpdateTaskStatusInput`,description:`Update task status`,fields:{taskId:{type:e.String_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1}}}),f=t({name:`ScheduleRitualInput`,description:`Create a ritual`,fields:{spaceId:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},cadence:{type:e.String_unsecure(),isOptional:!1},dayOfWeek:{type:e.String_unsecure(),isOptional:!0},time:{type:e.String_unsecure(),isOptional:!0},facilitatorId:{type:e.String_unsecure(),isOptional:!0}}}),p=t({name:`LogRitualOccurrenceInput`,description:`Record ritual occurrence results`,fields:{ritualId:{type:e.String_unsecure(),isOptional:!1},scheduledFor:{type:e.DateTime(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!0}}}),m=t({name:`PostAnnouncementInput`,description:`Post an announcement`,fields:{title:{type:e.String_unsecure(),isOptional:!1},body:{type:e.String_unsecure(),isOptional:!1},audience:{type:e.String_unsecure(),isOptional:!1},audienceRole:{type:e.String_unsecure(),isOptional:!0},spaceId:{type:e.String_unsecure(),isOptional:!0},expiresAt:{type:e.DateTime(),isOptional:!0}}}),h=n({meta:{name:`team.space.create`,version:1,stability:`stable`,owners:[...i],tags:[`team-hub`,`space`,`create`],description:`Create a new team space.`,goal:`Organize teams/projects.`,context:`Workspace creation.`},io:{input:l,output:a},policy:{auth:`user`}}),g=n({meta:{name:`team.task.create`,version:1,stability:`stable`,owners:[...i],tags:[`team-hub`,`task`,`create`],description:`Create a task inside a space.`,goal:`Track work items.`,context:`Task creation.`},io:{input:u,output:o},policy:{auth:`user`}}),_=n({meta:{name:`team.task.updateStatus`,version:1,stability:`stable`,owners:[...i],tags:[`team-hub`,`task`,`status`],description:`Update a task status.`,goal:`Move tasks across board.`,context:`Kanban updates.`},io:{input:d,output:o},policy:{auth:`user`}}),v=n({meta:{name:`team.ritual.schedule`,version:1,stability:`stable`,owners:[...i],tags:[`team-hub`,`ritual`,`schedule`],description:`Create/schedule a recurring ritual.`,goal:`Establish ceremonies.`,context:`Team ops.`},io:{input:f,output:s},policy:{auth:`user`}}),y=n({meta:{name:`team.ritual.logOccurrence`,version:1,stability:`stable`,owners:[...i],tags:[`team-hub`,`ritual`,`log`],description:`Record a ritual occurrence.`,goal:`Track participation and outcomes.`,context:`After meeting.`},io:{input:p,output:t({name:`RitualOccurrenceResult`,description:`Logged occurrence`,fields:{ritualId:{type:e.String_unsecure(),isOptional:!1},scheduledFor:{type:e.DateTime(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!0}}})},policy:{auth:`user`}}),b=n({meta:{name:`team.announcement.post`,version:1,stability:`stable`,owners:[...i],tags:[`team-hub`,`announcement`,`post`],description:`Post an announcement to spaces or org.`,goal:`Share updates broadly.`,context:`Internal comms.`},io:{input:m,output:c},policy:{auth:`user`}}),x=r({meta:{name:`team.task.list`,version:1,stability:`stable`,owners:[...i],tags:[`team-hub`,`task`,`list`],description:`List tasks in a space with filters.`,goal:`Populate kanban/agenda.`,context:`Dashboard.`},io:{input:t({name:`ListTasksInput`,description:`Task filters`,fields:{spaceId:{type:e.String_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!0},assigneeId:{type:e.String_unsecure(),isOptional:!0}}}),output:t({name:`ListTasksOutput`,description:`Tasks response`,fields:{tasks:{type:o,isArray:!0,isOptional:!1},total:{type:e.Int_unsecure(),isOptional:!1}}})},policy:{auth:`user`}});export{c as AnnouncementModel,h as CreateSpaceContract,g as CreateTaskContract,x as ListTasksContract,y as LogRitualOccurrenceContract,b as PostAnnouncementContract,s as RitualModel,v as ScheduleRitualContract,a as SpaceModel,o as TaskModel,_ as UpdateTaskStatusContract};
@@ -0,0 +1 @@
1
+ import"./team-hub.docblock.js";
@@ -0,0 +1,50 @@
1
+ import{registerDocBlocks as e}from"@lssm/lib.contracts/docs";e([{id:`docs.examples.team-hub`,title:`Team Hub`,summary:`Internal collaboration hub with spaces, tasks, rituals, and announcements.`,kind:`reference`,visibility:`public`,route:`/docs/examples/team-hub`,tags:[`tasks`,`rituals`,`announcements`,`collaboration`],body:`## Domains
2
+
3
+ - Spaces/projects with members and roles.
4
+ - Tasks with status, priority, assignees, due dates.
5
+ - Rituals (standups/retros/planning) with cadence and attendance.
6
+ - Announcements targeted by space or role.
7
+
8
+ ## Modules reused
9
+ - Identity/RBAC for roles and membership
10
+ - Notifications for reminders and announcements
11
+ - Jobs for scheduling rituals/reminders
12
+ - Audit trail for state changes
13
+
14
+ ## Presentations
15
+ - Dashboard, space list, task board/detail, ritual calendar, announcement feed.
16
+ `},{id:`docs.examples.team-hub.goal`,title:`Team Hub — Goal`,summary:`Why this collaboration hub exists and outcomes it targets.`,kind:`goal`,visibility:`public`,route:`/docs/examples/team-hub/goal`,tags:[`collaboration`,`goal`],body:`## Why it matters
17
+ - Provides a regenerable hub for spaces, tasks, rituals, and announcements.
18
+ - Keeps ceremonies and task flows consistent across UI/API/events.
19
+
20
+ ## Business/Product goal
21
+ - Support team rituals with reminders, visibility, and auditability.
22
+ - Enable staged rollouts of new rituals/boards via feature flags.
23
+
24
+ ## Success criteria
25
+ - Tasks/rituals/announcements regenerate safely from spec updates.
26
+ - Notifications and audit hooks fire for key transitions.`},{id:`docs.examples.team-hub.usage`,title:`Team Hub — Usage`,summary:`How to set up spaces, tasks, and rituals and regenerate safely.`,kind:`usage`,visibility:`public`,route:`/docs/examples/team-hub/usage`,tags:[`collaboration`,`usage`],body:`## Setup
27
+ 1) Seed (if available) or create a space; add members and tasks; schedule rituals.
28
+ 2) Configure Notifications for rituals/reminders and announcements; use Jobs for scheduling.
29
+
30
+ ## Extend & regenerate
31
+ 1) Adjust schemas: task priority/status, ritual cadence/attendance, announcement targeting.
32
+ 2) Regenerate to update boards/calendars/feeds; mark PII paths as needed.
33
+ 3) Use Feature Flags to trial new rituals or task views.
34
+
35
+ ## Guardrails
36
+ - Emit events for task/ritual/announcement changes; log in Audit Trail.
37
+ - Keep ritual cadence declarative; avoid hardcoded schedules.
38
+ - Ensure announcements carry title/description for accessibility.`},{id:`docs.examples.team-hub.constraints`,title:`Team Hub — Constraints & Safety`,summary:`Internal guardrails for rituals, tasks, and announcements regeneration.`,kind:`reference`,visibility:`internal`,route:`/docs/examples/team-hub/constraints`,tags:[`collaboration`,`constraints`,`internal`],body:`## Constraints
39
+ - Ritual cadence and task states must stay declarative in spec; no hardcoded schedules.
40
+ - Events to emit: task.created/updated/completed, ritual.scheduled/completed, announcement.published.
41
+ - Regeneration should not drop reminders or announcements routing.
42
+
43
+ ## PII & A11y
44
+ - Mark PII (names/emails) for redaction in presentations.
45
+ - Announcements must include title/description; respect accessibility guidance.
46
+
47
+ ## Verification
48
+ - Add fixtures for ritual cadence changes and announcement targeting.
49
+ - Ensure Notifications/Jobs wiring persists after regeneration.
50
+ - Use Feature Flags to trial new boards/rituals with safe defaults.`}]);
@@ -0,0 +1 @@
1
+ import{defineEntity as e,defineEntityEnum as t,field as n,index as r}from"@lssm/lib.schema";const i=`lssm_team_hub`,a=t({name:`TaskStatus`,schema:i,values:[`BACKLOG`,`IN_PROGRESS`,`BLOCKED`,`DONE`],description:`Task workflow status.`}),o=t({name:`TaskPriority`,schema:i,values:[`LOW`,`MEDIUM`,`HIGH`,`CRITICAL`],description:`Task priority levels.`}),s=t({name:`RitualCadence`,schema:i,values:[`DAILY`,`WEEKLY`,`BIWEEKLY`,`MONTHLY`],description:`Recurrence cadence for rituals.`}),c=t({name:`AnnouncementAudience`,schema:i,values:[`ALL`,`SPACE`,`ROLE`],description:`Targeting scope for announcements.`}),l=e({name:`Space`,description:`Space/project container for a team.`,schema:i,map:`space`,fields:{id:n.id({description:`Unique space identifier`}),name:n.string({description:`Space name`}),description:n.string({description:`Space description`,isOptional:!0}),orgId:n.string({description:`Organization ID`}),ownerId:n.string({description:`Space owner`}),members:n.json({description:`Member roles map`,isOptional:!0}),createdAt:n.createdAt(),updatedAt:n.updatedAt(),tasks:n.hasMany(`Task`),rituals:n.hasMany(`Ritual`),announcements:n.hasMany(`Announcement`)},indexes:[r.on([`orgId`]),r.on([`ownerId`]),r.on([`name`])]}),u=e({name:`Task`,description:`Work item within a space.`,schema:i,map:`task`,fields:{id:n.id({description:`Unique task identifier`}),spaceId:n.foreignKey({description:`Parent space`}),title:n.string({description:`Task title`}),description:n.string({description:`Task details`,isOptional:!0}),status:n.enum(`TaskStatus`,{description:`Task status`,default:`BACKLOG`}),priority:n.enum(`TaskPriority`,{description:`Task priority`,default:`MEDIUM`}),assigneeId:n.string({description:`User assigned`,isOptional:!0}),dueDate:n.dateTime({description:`Due date`,isOptional:!0}),tags:n.json({description:`Labels/tags`,isOptional:!0}),orgId:n.string({description:`Organization ID`}),createdAt:n.createdAt(),updatedAt:n.updatedAt(),space:n.belongsTo(`Space`,[`spaceId`],[`id`],{onDelete:`Cascade`})},enums:[a,o],indexes:[r.on([`spaceId`]),r.on([`orgId`,`status`]),r.on([`assigneeId`,`status`]),r.on([`dueDate`])]}),d=e({name:`Ritual`,description:`Recurring ceremony (standup, retro, planning).`,schema:i,map:`ritual`,fields:{id:n.id({description:`Unique ritual identifier`}),spaceId:n.foreignKey({description:`Parent space`}),title:n.string({description:`Ritual title`}),cadence:n.enum(`RitualCadence`,{description:`Ritual cadence`}),dayOfWeek:n.string({description:`Day of week`,isOptional:!0}),time:n.string({description:`Local time (HH:mm)`,isOptional:!0}),facilitatorId:n.string({description:`Facilitator user ID`,isOptional:!0}),participants:n.json({description:`Participant user IDs`,isOptional:!0}),location:n.string({description:`Location/URL`,isOptional:!0}),agendaTemplate:n.string({description:`Agenda template markdown`,isOptional:!0}),orgId:n.string({description:`Organization ID`}),createdAt:n.createdAt(),updatedAt:n.updatedAt(),occurrences:n.hasMany(`RitualOccurrence`),space:n.belongsTo(`Space`,[`spaceId`],[`id`],{onDelete:`Cascade`})},enums:[s],indexes:[r.on([`spaceId`]),r.on([`orgId`])]}),f=e({name:`RitualOccurrence`,description:`Specific occurrence of a ritual.`,schema:i,map:`ritual_occurrence`,fields:{id:n.id({description:`Unique occurrence identifier`}),ritualId:n.foreignKey({description:`Parent ritual`}),scheduledFor:n.dateTime({description:`Scheduled datetime`}),status:n.string({description:`Occurrence status`,default:`"scheduled"`}),summary:n.string({description:`Summary/notes`,isOptional:!0}),attendance:n.json({description:`Attendance list with responses`,isOptional:!0}),recordingUrl:n.string({description:`Recording link`,isOptional:!0}),orgId:n.string({description:`Organization ID`}),createdAt:n.createdAt(),updatedAt:n.updatedAt(),ritual:n.belongsTo(`Ritual`,[`ritualId`],[`id`],{onDelete:`Cascade`})},indexes:[r.on([`ritualId`]),r.on([`scheduledFor`]),r.on([`orgId`])]}),p=e({name:`Announcement`,description:`Announcement to a space or org.`,schema:i,map:`announcement`,fields:{id:n.id({description:`Unique announcement identifier`}),spaceId:n.string({description:`Target space`,isOptional:!0}),title:n.string({description:`Announcement title`}),body:n.string({description:`Announcement body`}),audience:n.enum(`AnnouncementAudience`,{description:`Audience targeting`,default:`ALL`}),audienceRole:n.string({description:`Role targeted when audience is ROLE`,isOptional:!0}),pinnedUntil:n.dateTime({description:`Pin expiration`,isOptional:!0}),orgId:n.string({description:`Organization ID`}),createdBy:n.string({description:`Creator user ID`}),createdAt:n.createdAt(),expiresAt:n.dateTime({description:`Expiration time`,isOptional:!0})},enums:[c],indexes:[r.on([`orgId`]),r.on([`spaceId`]),r.on([`audience`])]}),m=[l,u,d,f,p],h={moduleId:`@lssm/example.team-hub`,entities:m,enums:[a,o,s,c]};export{c as AnnouncementAudienceEnum,p as AnnouncementEntity,s as RitualCadenceEnum,d as RitualEntity,f as RitualOccurrenceEntity,l as SpaceEntity,u as TaskEntity,o as TaskPriorityEnum,a as TaskStatusEnum,m as teamHubEntities,h as teamHubSchemaContribution};
package/dist/events.js ADDED
@@ -0,0 +1 @@
1
+ import{ScalarTypeEnum as e,defineSchemaModel as t}from"@lssm/lib.schema";import{defineEvent as n}from"@lssm/lib.contracts";const r=t({name:`SpaceEventPayload`,description:`Payload for space events`,fields:{spaceId:{type:e.String_unsecure(),isOptional:!1},orgId:{type:e.String_unsecure(),isOptional:!1},ownerId:{type:e.String_unsecure(),isOptional:!1},timestamp:{type:e.DateTime(),isOptional:!1}}}),i=t({name:`TaskEventPayload`,description:`Payload for task events`,fields:{taskId:{type:e.String_unsecure(),isOptional:!1},spaceId:{type:e.String_unsecure(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},assigneeId:{type:e.String_unsecure(),isOptional:!0},orgId:{type:e.String_unsecure(),isOptional:!1},timestamp:{type:e.DateTime(),isOptional:!1}}}),a=t({name:`RitualEventPayload`,description:`Payload for ritual events`,fields:{ritualId:{type:e.String_unsecure(),isOptional:!1},spaceId:{type:e.String_unsecure(),isOptional:!1},scheduledFor:{type:e.DateTime(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!1},orgId:{type:e.String_unsecure(),isOptional:!1}}}),o=t({name:`AnnouncementPayload`,description:`Payload for announcements`,fields:{announcementId:{type:e.String_unsecure(),isOptional:!1},spaceId:{type:e.String_unsecure(),isOptional:!0},audience:{type:e.String_unsecure(),isOptional:!1},orgId:{type:e.String_unsecure(),isOptional:!1},createdBy:{type:e.String_unsecure(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1}}}),s=n({name:`team.space.created`,version:1,description:`A space was created.`,payload:r}),c=n({name:`team.task.created`,version:1,description:`A task was created.`,payload:i}),l=n({name:`team.task.status_changed`,version:1,description:`A task status changed.`,payload:i}),u=n({name:`team.ritual.scheduled`,version:1,description:`A ritual was scheduled.`,payload:a}),d=n({name:`team.ritual.occurred`,version:1,description:`A ritual occurrence was logged.`,payload:a}),f=n({name:`team.announcement.posted`,version:1,description:`An announcement was posted.`,payload:o}),p={SpaceCreatedEvent:s,TaskCreatedEvent:c,TaskStatusChangedEvent:l,RitualScheduledEvent:u,RitualOccurredEvent:d,AnnouncementPostedEvent:f};export{f as AnnouncementPostedEvent,d as RitualOccurredEvent,u as RitualScheduledEvent,s as SpaceCreatedEvent,c as TaskCreatedEvent,l as TaskStatusChangedEvent,p as TeamHubEvents};
@@ -0,0 +1 @@
1
+ const e={meta:{key:`team-hub`,title:`Team Hub`,description:`Tasks, rituals, and announcements for internal teams with ceremonies.`,domain:`collaboration`,owners:[`team-hub`],tags:[`tasks`,`rituals`,`announcements`],stability:`experimental`},operations:[{name:`team.space.create`,version:1},{name:`team.task.create`,version:1},{name:`team.task.updateStatus`,version:1},{name:`team.task.list`,version:1},{name:`team.ritual.schedule`,version:1},{name:`team.ritual.logOccurrence`,version:1},{name:`team.announcement.post`,version:1}],events:[{name:`team.space.created`,version:1},{name:`team.task.created`,version:1},{name:`team.task.status_changed`,version:1},{name:`team.ritual.scheduled`,version:1},{name:`team.ritual.occurred`,version:1},{name:`team.announcement.posted`,version:1}],presentations:[{name:`team-hub.dashboard`,version:1},{name:`team-hub.space.list`,version:1},{name:`team-hub.task.board`,version:1},{name:`team-hub.task.detail`,version:1},{name:`team-hub.ritual.calendar`,version:1},{name:`team-hub.announcement.feed`,version:1}],presentationsTargets:[{name:`team-hub.dashboard`,version:1,targets:[`react`,`markdown`]},{name:`team-hub.task.board`,version:1,targets:[`react`]},{name:`team-hub.ritual.calendar`,version:1,targets:[`react`]},{name:`team-hub.announcement.feed`,version:1,targets:[`react`,`markdown`]}],capabilities:{requires:[{key:`identity`,version:1},{key:`audit-trail`,version:1},{key:`notifications`,version:1},{key:`feature-flags`,version:1}],provides:[{key:`tasks`,version:1},{key:`rituals`,version:1},{key:`announcements`,version:1}]}};export{e as TeamHubFeature};
@@ -0,0 +1 @@
1
+ function e(){}export{e as registerTeamHubHandlers};
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{AnnouncementPostedEvent as e,RitualOccurredEvent as t,RitualScheduledEvent as n,SpaceCreatedEvent as r,TaskCreatedEvent as i,TaskStatusChangedEvent as a,TeamHubEvents as o}from"./events.js";import{TeamHubFeature as s}from"./feature.js";import{AnnouncementAudienceEnum as c,AnnouncementEntity as l,RitualCadenceEnum as u,RitualEntity as d,RitualOccurrenceEntity as f,SpaceEntity as p,TaskEntity as m,TaskPriorityEnum as h,TaskStatusEnum as g,teamHubEntities as _,teamHubSchemaContribution as v}from"./entities/index.js";import{AnnouncementModel as y,CreateSpaceContract as b,CreateTaskContract as x,ListTasksContract as S,LogRitualOccurrenceContract as C,PostAnnouncementContract as w,RitualModel as T,ScheduleRitualContract as E,SpaceModel as D,TaskModel as O,UpdateTaskStatusContract as k}from"./contracts/index.js";import{TeamHubPresentations as A}from"./presentations/index.js";import{registerTeamHubHandlers as j}from"./handlers/index.js";import"./docs/index.js";import{identityRbacSchemaContribution as M}from"@lssm/lib.identity-rbac";import{auditTrailSchemaContribution as N}from"@lssm/module.audit-trail";import{notificationsSchemaContribution as P}from"@lssm/module.notifications";import{jobsSchemaContribution as F}from"@lssm/lib.jobs";const I={modules:[M,N,P,F,v],provider:`postgresql`,outputPath:`./prisma/schema/generated.prisma`};export{c as AnnouncementAudienceEnum,l as AnnouncementEntity,y as AnnouncementModel,e as AnnouncementPostedEvent,b as CreateSpaceContract,x as CreateTaskContract,S as ListTasksContract,C as LogRitualOccurrenceContract,w as PostAnnouncementContract,u as RitualCadenceEnum,d as RitualEntity,T as RitualModel,t as RitualOccurredEvent,f as RitualOccurrenceEntity,n as RitualScheduledEvent,E as ScheduleRitualContract,r as SpaceCreatedEvent,p as SpaceEntity,D as SpaceModel,i as TaskCreatedEvent,m as TaskEntity,O as TaskModel,h as TaskPriorityEnum,a as TaskStatusChangedEvent,g as TaskStatusEnum,o as TeamHubEvents,s as TeamHubFeature,A as TeamHubPresentations,k as UpdateTaskStatusContract,j as registerTeamHubHandlers,I as schemaComposition,_ as teamHubEntities,v as teamHubSchemaContribution};
@@ -0,0 +1 @@
1
+ const e=[`team-hub.dashboard`,`team-hub.space.list`,`team-hub.task.board`,`team-hub.task.detail`,`team-hub.ritual.calendar`,`team-hub.announcement.feed`];export{e as TeamHubPresentations};
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@lssm/example.team-hub",
3
+ "version": "0.0.0-canary-20251212004227",
4
+ "description": "Team Hub example with spaces, tasks, rituals, and announcements",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "type": "module",
8
+ "scripts": {
9
+ "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
10
+ "build": "bun build:bundle && bun build:types",
11
+ "build:bundle": "tsdown",
12
+ "build:types": "tsc --noEmit",
13
+ "dev": "bun build:bundle --watch",
14
+ "clean": "rimraf dist .turbo",
15
+ "lint": "bun lint:fix",
16
+ "lint:fix": "eslint src --fix",
17
+ "lint:check": "eslint src"
18
+ },
19
+ "dependencies": {
20
+ "@lssm/lib.schema": "workspace:*",
21
+ "@lssm/lib.contracts": "workspace:*",
22
+ "@lssm/lib.bus": "workspace:*",
23
+ "@lssm/lib.identity-rbac": "workspace:*",
24
+ "@lssm/lib.jobs": "workspace:*",
25
+ "@lssm/module.audit-trail": "workspace:*",
26
+ "@lssm/module.notifications": "workspace:*",
27
+ "zod": "^4.1.13"
28
+ },
29
+ "devDependencies": {
30
+ "@lssm/tool.typescript": "workspace:*",
31
+ "@lssm/tool.tsdown": "workspace:*",
32
+ "typescript": "^5.9.3"
33
+ },
34
+ "exports": {
35
+ ".": "./src/index.ts",
36
+ "./contracts": "./src/contracts/index.ts",
37
+ "./docs": "./src/docs/index.ts",
38
+ "./docs/team-hub.docblock": "./src/docs/team-hub.docblock.ts",
39
+ "./entities": "./src/entities/index.ts",
40
+ "./events": "./src/events.ts",
41
+ "./feature": "./src/feature.ts",
42
+ "./handlers": "./src/handlers/index.ts",
43
+ "./presentations": "./src/presentations/index.ts",
44
+ "./*": "./*"
45
+ },
46
+ "module": "./dist/index.js",
47
+ "files": [
48
+ "dist",
49
+ "README.md"
50
+ ],
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "exports": {
54
+ ".": "./dist/index.js",
55
+ "./contracts": "./dist/contracts/index.js",
56
+ "./docs": "./dist/docs/index.js",
57
+ "./docs/team-hub.docblock": "./dist/docs/team-hub.docblock.js",
58
+ "./entities": "./dist/entities/index.js",
59
+ "./events": "./dist/events.js",
60
+ "./feature": "./dist/feature.js",
61
+ "./handlers": "./dist/handlers/index.js",
62
+ "./presentations": "./dist/presentations/index.js",
63
+ "./*": "./*"
64
+ }
65
+ }
66
+ }