@topogram/template-todo 0.1.32 → 0.1.34

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 CHANGED
@@ -26,10 +26,10 @@ This template includes executable implementation provider JavaScript under `impl
26
26
  may load it later after local trust metadata is recorded. Use it as trusted code
27
27
  from the `@topogram` package scope.
28
28
 
29
- The Topogram source includes reusable UI components for task summary metrics,
30
- task tables, task boards, and task calendars. `proj_ui_shared` owns their
31
- screen and region placement through `ui_components`, so SvelteKit and React web
32
- projections inherit the same component contract metadata.
29
+ The Topogram source includes reusable UI widgets for task summary metrics,
30
+ task tables, task boards, and task calendars. `proj_ui_contract` owns their
31
+ screen and region placement through `widget_bindings`, so SvelteKit and React web
32
+ projections inherit the same widget contract metadata.
33
33
 
34
34
  ## Runtime Semantics
35
35
 
@@ -63,7 +63,7 @@ By default the smoke test installs the `@topogram/cli` version pinned in
63
63
  `topogram-cli.version`. Override it with:
64
64
 
65
65
  ```bash
66
- TOPOGRAM_CLI_PACKAGE_SPEC=/path/to/topogram-cli-0.3.38.tgz npm run pack:check
66
+ TOPOGRAM_CLI_PACKAGE_SPEC=/path/to/topogram-cli.tgz npm run pack:check
67
67
  ```
68
68
 
69
69
  ## Release
@@ -1,6 +1,6 @@
1
1
  import { renderSvelteKitRedirectingAction } from "@topogram/cli/src/generator/surfaces/web/sveltekit-actions.js";
2
2
  import {
3
- renderSvelteKitComponentRegion
3
+ renderSvelteKitWidgetRegion
4
4
  } from "@topogram/cli/template-helpers/sveltekit.js";
5
5
  import { TODO_WEB_SCREEN_REFERENCE } from "./screens-reference.js";
6
6
 
@@ -75,13 +75,13 @@ export function renderTodoTaskRoutes({
75
75
  const editTaskVisibility = taskDetail.visibility?.find((entry) => entry.capability?.id === "cap_update_task") || null;
76
76
  const completeTaskVisibility = taskDetail.visibility?.find((entry) => entry.capability?.id === "cap_complete_task") || null;
77
77
  const deleteTaskVisibility = taskDetail.visibility?.find((entry) => entry.capability?.id === "cap_delete_task") || null;
78
- const taskListHeroComponents = renderSvelteKitComponentRegion(taskList, "hero", {
79
- componentContracts: contract.components,
78
+ const taskListHeroComponents = renderSvelteKitWidgetRegion(taskList, "hero", {
79
+ widgetContracts: contract.widgets,
80
80
  itemsExpression: "data.result.items",
81
81
  useTypescript
82
82
  });
83
- const taskListResultsComponents = renderSvelteKitComponentRegion(taskList, "results", {
84
- componentContracts: contract.components,
83
+ const taskListResultsComponents = renderSvelteKitWidgetRegion(taskList, "results", {
84
+ widgetContracts: contract.widgets,
85
85
  itemsExpression: "data.result.items",
86
86
  useTypescript
87
87
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topogram/template-todo",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "description": "Topogram template pack for starting a generated Todo app.",
5
5
  "private": false,
6
6
  "license": "UNLICENSED",
@@ -27,9 +27,9 @@
27
27
  "release:check": "bash ./scripts/check-release-version.sh"
28
28
  },
29
29
  "devDependencies": {
30
- "@topogram/cli": "^0.3.49",
31
- "@topogram/generator-hono-api": "0.2.7",
32
- "@topogram/generator-postgres-db": "0.1.6",
33
- "@topogram/generator-sveltekit-web": "0.1.15"
30
+ "@topogram/cli": "^0.3.52",
31
+ "@topogram/generator-hono-api": "0.2.8",
32
+ "@topogram/generator-postgres-db": "0.1.7",
33
+ "@topogram/generator-sveltekit-web": "0.1.17"
34
34
  }
35
35
  }
@@ -23,8 +23,8 @@ related_rules:
23
23
  - rule_only_active_users_may_own_tasks
24
24
  related_projections:
25
25
  - proj_api
26
- - proj_ui_shared
27
- - proj_ui_web
26
+ - proj_ui_contract
27
+ - proj_web_surface
28
28
  failure_signals:
29
29
  - The user can create a task in an archived project.
30
30
  - The user can assign a task to an inactive owner.
@@ -1,7 +1,7 @@
1
1
  projection proj_api {
2
2
  name "API"
3
3
  description "HTTP API realization for Todo"
4
- platform dotnet
4
+ type api_contract
5
5
 
6
6
  realizes [cap_create_task, cap_get_task, cap_update_task, cap_complete_task, cap_list_tasks, cap_delete_task, cap_export_tasks, cap_get_task_export_job, cap_download_task_export, cap_list_projects, cap_get_project, cap_create_project, cap_update_project, cap_list_users, cap_get_user, cap_create_user, cap_update_user]
7
7
 
@@ -14,7 +14,7 @@ projection proj_api {
14
14
  endpoints
15
15
  ]
16
16
 
17
- http {
17
+ endpoints {
18
18
  cap_create_task method POST path /tasks success 201 auth user request body
19
19
  cap_get_task method GET path /tasks/:id success 200 auth user request path
20
20
  cap_update_task method PATCH path /tasks/:id success 200 auth user request body
@@ -34,7 +34,7 @@ projection proj_api {
34
34
  cap_download_task_export method GET path /task-exports/:job_id/download success 200 auth user request path
35
35
  }
36
36
 
37
- http_errors {
37
+ error_responses {
38
38
  cap_create_task rule_no_task_creation_in_archived_project 409
39
39
  cap_create_task rule_only_active_users_may_own_tasks 400
40
40
  cap_create_task cap_create_task_invalid_request 400
@@ -49,7 +49,7 @@ projection proj_api {
49
49
  cap_download_task_export cap_download_task_export_not_ready 409
50
50
  }
51
51
 
52
- http_fields {
52
+ wire_fields {
53
53
  cap_create_task input title in body
54
54
  cap_create_task input description in body
55
55
  cap_create_task input priority in body
@@ -112,44 +112,44 @@ projection proj_api {
112
112
  cap_export_tasks input callback_url in body
113
113
  }
114
114
 
115
- http_responses {
115
+ responses {
116
116
  cap_list_tasks mode cursor item shape_output_task_detail cursor request_after after response_next next_cursor limit field limit default 25 max 100 sort by created_at direction desc total included false
117
117
  cap_list_projects mode cursor item shape_output_project_detail cursor request_after after response_next next_cursor limit field limit default 25 max 100 sort by created_at direction desc total included false
118
118
  cap_list_users mode cursor item shape_output_user_detail cursor request_after after response_next next_cursor limit field limit default 25 max 100 sort by created_at direction desc total included false
119
119
  }
120
120
 
121
- http_preconditions {
121
+ preconditions {
122
122
  cap_update_task header If-Match required true error 412 source updated_at code cap_update_task_precondition_failed
123
123
  cap_complete_task header If-Match required true error 412 source updated_at code cap_complete_task_precondition_failed
124
124
  cap_delete_task header If-Match required true error 412 source updated_at code cap_delete_task_precondition_failed
125
125
  }
126
126
 
127
- http_idempotency {
127
+ idempotency {
128
128
  cap_create_task header Idempotency-Key required true error 409 code cap_create_task_idempotency_conflict
129
129
  cap_complete_task header Idempotency-Key required true error 409 code cap_complete_task_idempotency_conflict
130
130
  }
131
131
 
132
- http_cache {
132
+ cache {
133
133
  cap_get_task response_header ETag request_header If-None-Match required false not_modified 304 source updated_at code cap_get_task_not_modified
134
134
  }
135
135
 
136
- http_delete {
136
+ delete_semantics {
137
137
  cap_delete_task mode soft field status value archived response body
138
138
  }
139
139
 
140
- http_async {
140
+ async_jobs {
141
141
  cap_export_tasks mode job accepted 202 location_header Location retry_after_header Retry-After status_path /task-exports/:job_id status_capability cap_get_task_export_job job shape_output_task_export_job
142
142
  }
143
143
 
144
- http_status {
144
+ async_status {
145
145
  cap_get_task_export_job async_for cap_export_tasks state_field status completed completed failed failed expired expired download_capability cap_download_task_export download_field download_url error_field error_message
146
146
  }
147
147
 
148
- http_download {
148
+ downloads {
149
149
  cap_download_task_export async_for cap_export_tasks media application/zip filename task-export.zip disposition attachment
150
150
  }
151
151
 
152
- http_authz {
152
+ authorization {
153
153
  cap_create_task permission tasks.create
154
154
  cap_get_task ownership owner_or_admin ownership_field owner_id
155
155
  cap_update_task ownership owner_or_admin ownership_field owner_id permission tasks.update
@@ -169,7 +169,7 @@ projection proj_api {
169
169
  cap_download_task_export permission tasks.export.download ownership owner_or_admin ownership_field owner_id
170
170
  }
171
171
 
172
- http_callbacks {
172
+ callbacks {
173
173
  cap_export_tasks event export_completed target_field callback_url method POST payload shape_output_task_export_callback success 202
174
174
  }
175
175
 
@@ -2,17 +2,17 @@ projection proj_db_postgres {
2
2
  name "Todo Postgres DB"
3
3
  description "Postgres persistence realization for the Todo domain"
4
4
 
5
- platform db_postgres
5
+ type db_contract
6
6
  realizes [entity_task, entity_project, entity_user]
7
7
  outputs [db_contract, sql_schema]
8
8
 
9
- db_tables {
9
+ tables {
10
10
  entity_task table tasks
11
11
  entity_project table projects
12
12
  entity_user table users
13
13
  }
14
14
 
15
- db_columns {
15
+ columns {
16
16
  entity_task field owner_id column owner_id
17
17
  entity_task field project_id column project_id
18
18
  entity_project field owner_id column owner_id
@@ -20,13 +20,13 @@ projection proj_db_postgres {
20
20
  entity_user field display_name column display_name
21
21
  }
22
22
 
23
- db_keys {
23
+ keys {
24
24
  entity_task primary [id]
25
25
  entity_project primary [id]
26
26
  entity_user primary [id]
27
27
  }
28
28
 
29
- db_indexes {
29
+ indexes {
30
30
  entity_task index [project_id, status]
31
31
  entity_task index [owner_id, status]
32
32
  entity_project unique [name]
@@ -34,13 +34,13 @@ projection proj_db_postgres {
34
34
  entity_user unique [email]
35
35
  }
36
36
 
37
- db_relations {
37
+ relations {
38
38
  entity_task foreign_key owner_id references entity_user.id on_delete set_null
39
39
  entity_task foreign_key project_id references entity_project.id on_delete cascade
40
40
  entity_project foreign_key owner_id references entity_user.id on_delete set_null
41
41
  }
42
42
 
43
- db_lifecycle {
43
+ lifecycle {
44
44
  entity_task soft_delete field status value archived
45
45
  entity_task timestamps created_at created_at updated_at updated_at
46
46
  }
@@ -2,23 +2,23 @@ projection proj_db_sqlite {
2
2
  name "Todo SQLite DB"
3
3
  description "SQLite persistence realization for the Todo domain"
4
4
 
5
- platform db_sqlite
5
+ type db_contract
6
6
  realizes [entity_task, entity_project, entity_user]
7
7
  outputs [db_contract, sql_schema]
8
8
 
9
- db_tables {
9
+ tables {
10
10
  entity_task table tasks
11
11
  entity_project table projects
12
12
  entity_user table users
13
13
  }
14
14
 
15
- db_keys {
15
+ keys {
16
16
  entity_task primary [id]
17
17
  entity_project primary [id]
18
18
  entity_user primary [id]
19
19
  }
20
20
 
21
- db_indexes {
21
+ indexes {
22
22
  entity_task index [project_id, status]
23
23
  entity_task index [owner_id, status]
24
24
  entity_project unique [name]
@@ -26,13 +26,13 @@ projection proj_db_sqlite {
26
26
  entity_user unique [email]
27
27
  }
28
28
 
29
- db_relations {
29
+ relations {
30
30
  entity_task foreign_key owner_id references entity_user.id on_delete set_null
31
31
  entity_task foreign_key project_id references entity_project.id on_delete cascade
32
32
  entity_project foreign_key owner_id references entity_user.id on_delete set_null
33
33
  }
34
34
 
35
- db_lifecycle {
35
+ lifecycle {
36
36
  entity_task soft_delete field status value archived
37
37
  entity_task timestamps created_at created_at updated_at updated_at
38
38
  }
@@ -1,8 +1,8 @@
1
- projection proj_ui_shared {
1
+ projection proj_ui_contract {
2
2
  name "Todo Shared UI"
3
3
  description "Platform-neutral UI semantics for the Todo product"
4
4
 
5
- platform ui_shared
5
+ type ui_contract
6
6
  realizes [
7
7
  cap_list_projects,
8
8
  cap_get_project,
@@ -24,7 +24,7 @@ projection proj_ui_shared {
24
24
  ]
25
25
  outputs [ui_contract]
26
26
 
27
- ui_app_shell {
27
+ app_shell {
28
28
  brand "Topogram Todo"
29
29
  shell bottom_tabs
30
30
  global_search true
@@ -33,7 +33,7 @@ projection proj_ui_shared {
33
33
  footer legal
34
34
  }
35
35
 
36
- ui_design {
36
+ design_tokens {
37
37
  density compact
38
38
  tone operational
39
39
  radius_scale medium
@@ -61,7 +61,7 @@ projection proj_ui_shared {
61
61
  accessibility min_touch_target comfortable
62
62
  }
63
63
 
64
- ui_screens {
64
+ screens {
65
65
  screen project_list kind list title "Projects" load cap_list_projects item_shape shape_output_project_card detail_capability cap_get_project primary_action cap_create_project empty_title "No projects yet" empty_body "Create a project to organize your tasks" loading_state skeleton error_state inline
66
66
  screen project_detail kind detail title "Project Details" load cap_get_project view_shape shape_output_project_detail primary_action cap_update_project loading_state skeleton
67
67
  screen project_create kind form title "Create Project" input_shape shape_input_create_project submit cap_create_project success_navigate project_detail success_state banner
@@ -79,7 +79,7 @@ projection proj_ui_shared {
79
79
  screen task_exports kind job_status title "Export Status" load cap_get_task_export_job view_shape shape_output_task_export_status terminal_action cap_download_task_export
80
80
  }
81
81
 
82
- ui_collections {
82
+ collection_views {
83
83
  screen project_list pagination cursor
84
84
  screen project_list sort created_at desc
85
85
  screen project_list view table
@@ -95,7 +95,7 @@ projection proj_ui_shared {
95
95
  screen task_list view table
96
96
  }
97
97
 
98
- ui_actions {
98
+ screen_actions {
99
99
  screen project_list action cap_create_project prominence primary placement toolbar
100
100
  screen user_list action cap_create_user prominence primary placement toolbar
101
101
  screen task_list action cap_export_tasks prominence secondary placement toolbar
@@ -103,7 +103,7 @@ projection proj_ui_shared {
103
103
  screen task_detail action cap_delete_task prominence destructive placement footer
104
104
  }
105
105
 
106
- ui_visibility {
106
+ visibility_rules {
107
107
  action cap_create_project visible_if permission projects.create
108
108
  action cap_update_project visible_if permission projects.update
109
109
  action cap_create_user visible_if permission users.create
@@ -114,7 +114,7 @@ projection proj_ui_shared {
114
114
  action cap_export_tasks visible_if permission tasks.export
115
115
  }
116
116
 
117
- ui_lookups {
117
+ field_lookups {
118
118
  screen project_create field owner_id entity entity_user label_field display_name empty_label "Unassigned"
119
119
  screen project_edit field owner_id entity entity_user label_field display_name empty_label "Unassigned"
120
120
  screen task_list field project_id entity entity_project label_field name empty_label "All projects"
@@ -124,7 +124,7 @@ projection proj_ui_shared {
124
124
  screen task_edit field owner_id entity entity_user label_field display_name empty_label "Unassigned"
125
125
  }
126
126
 
127
- ui_navigation {
127
+ navigation {
128
128
  group workspace label "Workspace" placement primary pattern bottom_tabs
129
129
  group admin label "Admin" placement primary pattern bottom_tabs
130
130
  screen task_list group workspace label "Tasks" order 10 visible true default true sitemap include pattern bottom_tabs
@@ -136,7 +136,7 @@ projection proj_ui_shared {
136
136
  screen task_detail group workspace label "Task Details" visible false breadcrumb task_list sitemap exclude pattern stack_navigation
137
137
  }
138
138
 
139
- ui_screen_regions {
139
+ screen_regions {
140
140
  screen task_list region hero pattern summary_stats placement primary
141
141
  screen task_list region toolbar pattern action_bar placement primary
142
142
  screen task_list region results pattern resource_table placement primary
@@ -150,11 +150,11 @@ projection proj_ui_shared {
150
150
  screen user_list region results pattern resource_table placement primary
151
151
  }
152
152
 
153
- ui_components {
154
- screen task_list region hero component component_ui_task_summary data metrics from cap_list_tasks
155
- screen task_list region results component component_ui_task_table data rows from cap_list_tasks event row_select navigate task_detail event export_request action cap_export_tasks
156
- screen task_board region results component component_ui_task_board data columns from cap_list_tasks event card_select navigate task_detail event card_move action cap_update_task
157
- screen task_calendar region results component component_ui_task_calendar data events from cap_list_tasks event event_select navigate task_detail
153
+ widget_bindings {
154
+ screen task_list region hero widget widget_ui_task_summary data metrics from cap_list_tasks
155
+ screen task_list region results widget widget_ui_task_table data rows from cap_list_tasks event row_select navigate task_detail event export_request action cap_export_tasks
156
+ screen task_board region results widget widget_ui_task_board data columns from cap_list_tasks event card_select navigate task_detail event card_move action cap_update_task
157
+ screen task_calendar region results widget widget_ui_task_calendar data events from cap_list_tasks event event_select navigate task_detail
158
158
  }
159
159
 
160
160
  status active
@@ -1,8 +1,8 @@
1
- projection proj_ui_web_react {
1
+ projection proj_web_surface_react {
2
2
  name "Todo Web UI (React)"
3
3
  description "Web realization for the shared Todo UI using a React profile"
4
4
 
5
- platform ui_web
5
+ type web_surface
6
6
  realizes [
7
7
  cap_list_projects,
8
8
  cap_get_project,
@@ -12,7 +12,7 @@ projection proj_ui_web_react {
12
12
  cap_get_user,
13
13
  cap_create_user,
14
14
  cap_update_user,
15
- proj_ui_shared,
15
+ proj_ui_contract,
16
16
  cap_list_tasks,
17
17
  cap_get_task,
18
18
  cap_create_task,
@@ -25,7 +25,7 @@ projection proj_ui_web_react {
25
25
  ]
26
26
  outputs [ui_contract, web_app]
27
27
 
28
- ui_routes {
28
+ screen_routes {
29
29
  screen project_list path /projects
30
30
  screen project_detail path /projects/:id
31
31
  screen project_create path /projects/new
@@ -43,7 +43,7 @@ projection proj_ui_web_react {
43
43
  screen task_exports path /task-exports/:job_id
44
44
  }
45
45
 
46
- ui_web {
46
+ web_hints {
47
47
  screen task_list shell bottom_tabs
48
48
  screen project_list layout responsive_collection
49
49
  screen project_list desktop_variant table
@@ -1,8 +1,8 @@
1
- projection proj_ui_web {
1
+ projection proj_web_surface {
2
2
  name "Todo Web UI"
3
3
  description "Web realization for the shared Todo UI using a SvelteKit profile"
4
4
 
5
- platform ui_web
5
+ type web_surface
6
6
  realizes [
7
7
  cap_list_projects,
8
8
  cap_get_project,
@@ -12,7 +12,7 @@ projection proj_ui_web {
12
12
  cap_get_user,
13
13
  cap_create_user,
14
14
  cap_update_user,
15
- proj_ui_shared,
15
+ proj_ui_contract,
16
16
  cap_list_tasks,
17
17
  cap_get_task,
18
18
  cap_create_task,
@@ -25,7 +25,7 @@ projection proj_ui_web {
25
25
  ]
26
26
  outputs [ui_contract, web_app]
27
27
 
28
- ui_routes {
28
+ screen_routes {
29
29
  screen project_list path /projects
30
30
  screen project_detail path /projects/:id
31
31
  screen project_create path /projects/new
@@ -43,7 +43,7 @@ projection proj_ui_web {
43
43
  screen task_exports path /task-exports/:job_id
44
44
  }
45
45
 
46
- ui_web {
46
+ web_hints {
47
47
  screen task_list shell bottom_tabs
48
48
  screen project_list layout responsive_collection
49
49
  screen project_list desktop_variant table
@@ -1,4 +1,4 @@
1
- component component_ui_task_board {
1
+ widget widget_ui_task_board {
2
2
  name "Task Board"
3
3
  description "Reusable kanban-style task board grouped by status"
4
4
  category collection
@@ -1,4 +1,4 @@
1
- component component_ui_task_calendar {
1
+ widget widget_ui_task_calendar {
2
2
  name "Task Calendar"
3
3
  description "Reusable calendar view for scheduled tasks"
4
4
  category collection
@@ -1,4 +1,4 @@
1
- component component_ui_task_summary {
1
+ widget widget_ui_task_summary {
2
2
  name "Task Summary"
3
3
  description "Reusable summary metrics for task workload state"
4
4
  category display
@@ -1,4 +1,4 @@
1
- component component_ui_task_table {
1
+ widget widget_ui_task_table {
2
2
  name "Task Table"
3
3
  description "Reusable tabular task collection with selection, sorting, filtering, and export affordances"
4
4
  category collection
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "id": "@topogram/template-todo",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "kind": "starter",
5
- "description": "Todo/task management starter with generated web, API, and Postgres components.",
5
+ "description": "Todo/task management starter with generated web, API, and Postgres runtimes.",
6
6
  "topogramVersion": "0.1",
7
7
  "includesExecutableImplementation": true,
8
8
  "starterScripts": {
9
- "component:behavior:query": "topogram query component-behavior ./topogram --projection proj_ui_web --json"
9
+ "widget:behavior:query": "topogram query widget-behavior ./topogram --projection proj_web_surface --json"
10
10
  }
11
11
  }
@@ -12,10 +12,9 @@
12
12
  }
13
13
  },
14
14
  "topology": {
15
- "components": [
15
+ "runtimes": [
16
16
  {
17
17
  "id": "app_api",
18
- "type": "api",
19
18
  "projection": "proj_api",
20
19
  "generator": {
21
20
  "id": "@topogram/generator-hono-api",
@@ -23,30 +22,31 @@
23
22
  "package": "@topogram/generator-hono-api"
24
23
  },
25
24
  "port": 3000,
26
- "database": "app_postgres"
25
+ "kind": "api_service",
26
+ "uses_database": "app_postgres"
27
27
  },
28
28
  {
29
29
  "id": "app_sveltekit",
30
- "type": "web",
31
- "projection": "proj_ui_web",
30
+ "projection": "proj_web_surface",
32
31
  "generator": {
33
32
  "id": "@topogram/generator-sveltekit-web",
34
33
  "version": "1",
35
34
  "package": "@topogram/generator-sveltekit-web"
36
35
  },
37
36
  "port": 5173,
38
- "api": "app_api"
37
+ "kind": "web_surface",
38
+ "uses_api": "app_api"
39
39
  },
40
40
  {
41
41
  "id": "app_postgres",
42
- "type": "database",
43
42
  "projection": "proj_db_postgres",
44
43
  "generator": {
45
44
  "id": "@topogram/generator-postgres-db",
46
45
  "version": "1",
47
46
  "package": "@topogram/generator-postgres-db"
48
47
  },
49
- "port": 5432
48
+ "port": 5432,
49
+ "kind": "database"
50
50
  }
51
51
  ]
52
52
  }