minutework 0.1.47 → 0.1.50
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/assets/claude-local/skills/README.md +2 -0
- package/assets/claude-local/skills/app-pack-authoring/SKILL.md +4 -2
- package/assets/claude-local/skills/attached-app/SKILL.md +161 -0
- package/assets/claude-local/skills/capability-gap-reporting/SKILL.md +6 -2
- package/assets/claude-local/skills/layering-and-import-modes/SKILL.md +7 -2
- package/assets/claude-local/skills/project-overview-and-strategy/SKILL.md +4 -0
- package/assets/claude-local/skills/solution-router/SKILL.md +124 -0
- package/assets/templates/vuilder-shell/src/app/app/demo/page.tsx +9 -0
- package/assets/templates/vuilder-shell/src/features/demo/components/manifest-demo.tsx +79 -0
- package/package.json +2 -2
- package/vendor/workspace-mcp/types.d.ts +41 -0
|
@@ -53,6 +53,8 @@ Generated-workspace-first guidance should live here, especially:
|
|
|
53
53
|
- `shell-architecture/SKILL.md`
|
|
54
54
|
- `runtime-capability-inventory/SKILL.md`
|
|
55
55
|
- `runtime-primitive-interim-paths/SKILL.md`
|
|
56
|
+
- `solution-router/SKILL.md`
|
|
57
|
+
- `attached-app/SKILL.md`
|
|
56
58
|
- `integration-broker-and-connectors/SKILL.md`
|
|
57
59
|
- `layering-and-import-modes/SKILL.md`
|
|
58
60
|
- `standalone-mobile-client/SKILL.md`
|
|
@@ -93,11 +93,13 @@ An `app pack` is the shipped product unit.
|
|
|
93
93
|
infer access policy from artifact metadata.
|
|
94
94
|
- Public-site authoring should stay CMS/runtime-backed, while anonymous live
|
|
95
95
|
delivery should prefer published snapshots.
|
|
96
|
-
- Prefer this decision order before writing greenfield code
|
|
96
|
+
- Prefer this decision order before writing greenfield code (route a fresh
|
|
97
|
+
request through `solution-router/SKILL.md` first):
|
|
97
98
|
- reuse existing MinuteWork substrate or a reviewed capability skill
|
|
98
99
|
- extend app-pack/schema/flow surfaces
|
|
99
100
|
- adopt a strong OSS library or product when it clearly fits
|
|
100
|
-
- use `attached_app` when the foreign system should stay its own subsystem
|
|
101
|
+
- use `attached_app` when the foreign system should stay its own subsystem;
|
|
102
|
+
see `attached-app/SKILL.md` for the authoring procedure
|
|
101
103
|
- use repo intake or greenfield code only when the cleaner options do not fit
|
|
102
104
|
- If a mature OSS product already solves the problem well, prefer integrating,
|
|
103
105
|
wrapping, or governing it instead of rebuilding it from scratch.
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: attached-app
|
|
3
|
+
description: "Authoring a governed control surface around a mature foreign subsystem the tenant hosts: declare attachment, bridge, projection, and health metadata; compile to a declarative or hybrid app pack plus subordinate metadata; never a new app class."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Attached App
|
|
7
|
+
|
|
8
|
+
Use this skill when a mature foreign subsystem the tenant already hosts should
|
|
9
|
+
stay its own system of record while MinuteWork compiles a governed control
|
|
10
|
+
surface around it -- typed actions, governed reads, policy, federation -- rather
|
|
11
|
+
than rewriting it natively or reshaping it into a sidecar. Reach this skill
|
|
12
|
+
through `solution-router/SKILL.md` once the selected mode is `attached_app`.
|
|
13
|
+
|
|
14
|
+
## The boundary (read first)
|
|
15
|
+
|
|
16
|
+
These rules are non-negotiable; an attach that breaks one has become a second
|
|
17
|
+
install system:
|
|
18
|
+
|
|
19
|
+
- `attached_app` is a deployment and authoring **mode**, not an `app_class`. It
|
|
20
|
+
never becomes `app_class = attached_app`; it compiles to an existing class --
|
|
21
|
+
normally `declarative` or `hybrid` -- plus **subordinate** attachment
|
|
22
|
+
metadata. It is never a parallel activation path.
|
|
23
|
+
- the foreign system may remain the domain-data system of record, but it is not
|
|
24
|
+
itself the trusted install contract. The compiled manifest graph is the only
|
|
25
|
+
authoritative activation surface.
|
|
26
|
+
- generated APIs stay manifest-driven even here: reads come from `QueryManifest`,
|
|
27
|
+
writes from `ActionManifest`, custom routes from `RouteManifest`, and docs
|
|
28
|
+
derive from the active schema and manifests.
|
|
29
|
+
- the foreign subsystem must report healthy through its **declared health
|
|
30
|
+
checks** before the generated manifests may become `active`.
|
|
31
|
+
|
|
32
|
+
## When to use, and when not
|
|
33
|
+
|
|
34
|
+
Use when the upstream system is already mature and intact, rewriting it would be
|
|
35
|
+
wasteful, the tenant wants AI control/governance/federation over it more than a
|
|
36
|
+
deep rewrite, and it can keep its own subsystem boundary while exposing typed
|
|
37
|
+
verbs through a generated adapter.
|
|
38
|
+
|
|
39
|
+
Do not use when:
|
|
40
|
+
|
|
41
|
+
- the system is a remote third-party SaaS reached over its API -- that is a
|
|
42
|
+
`connector`, not an attach.
|
|
43
|
+
- the tenant wants MinuteWork to own the data natively from day one -- that is
|
|
44
|
+
build-native / `native_pack`.
|
|
45
|
+
- the code is unfinished and you would clone it to co-develop it -- that is
|
|
46
|
+
`external_repo_intake` toward a code-backed pack, a different combination on a
|
|
47
|
+
different axis. Attach a system **once it is a working, intact subsystem**
|
|
48
|
+
(build-then-attach), not before.
|
|
49
|
+
|
|
50
|
+
## Authoring procedure
|
|
51
|
+
|
|
52
|
+
The procedure is identical for every domain. All domain identity comes from the
|
|
53
|
+
selected reviewed instance and the manifests the tenant authors -- never from
|
|
54
|
+
this skill.
|
|
55
|
+
|
|
56
|
+
### Step 1 -- Identify the foreign subsystem
|
|
57
|
+
|
|
58
|
+
Confirm it is mature, intact, and tenant-hosted, with a typed surface (an HTTP
|
|
59
|
+
API, a DRF layer, an ORM the adapter can reach). Capture its base location and
|
|
60
|
+
how it authenticates as a **secret reference**, never a literal credential (see
|
|
61
|
+
`secrets-runtime-bridge/SKILL.md`). If credentials, provider writes, spend, or
|
|
62
|
+
audit receipts are involved, route the adapter through broker substrate (see
|
|
63
|
+
`integration-broker-and-connectors/SKILL.md`).
|
|
64
|
+
|
|
65
|
+
### Step 2 -- Declare the subordinate attachment metadata
|
|
66
|
+
|
|
67
|
+
These are subordinate documents and refs inside the standard graph, not a second
|
|
68
|
+
pipeline:
|
|
69
|
+
|
|
70
|
+
- `AttachedApp` -- the foreign base plus its auth reference.
|
|
71
|
+
- `BridgeAdapter` -- how typed verbs reach the foreign system.
|
|
72
|
+
- `ProjectionContract` -- the governed projected read shape: safe summaries,
|
|
73
|
+
receipts, and selected previews. It does not imply a one-to-one mirror of
|
|
74
|
+
every foreign table or endpoint.
|
|
75
|
+
- declared health checks -- the endpoints that define "ready."
|
|
76
|
+
- optional `PolicyLayer` / `ProjectionPolicy` for bounds and redaction.
|
|
77
|
+
|
|
78
|
+
### Step 3 -- Emit the standard governed artifact graph
|
|
79
|
+
|
|
80
|
+
- `AppManifest` with `app_class = declarative` or `hybrid` (`hybrid` when
|
|
81
|
+
runtime-native records or code sit alongside the projection).
|
|
82
|
+
- `ActionManifest` for every write/mutation verb.
|
|
83
|
+
- `QueryManifest` for every read.
|
|
84
|
+
- `RouteManifest` for internal callbacks or bounded adapter routes.
|
|
85
|
+
- `FlowManifest` for sync cadence, retry, and operator-escalation runbooks.
|
|
86
|
+
- `OntologyMappingManifest` mapping foreign objects onto shared URNs.
|
|
87
|
+
- `ProjectionContract` and a `PromotionRule` set.
|
|
88
|
+
- optionally a tenant-facing `SkillManifest` for operator/downstream-agent verbs.
|
|
89
|
+
|
|
90
|
+
### Step 4 -- Wire the health gate
|
|
91
|
+
|
|
92
|
+
Bind the declared health checks so the foreign subsystem must report ready
|
|
93
|
+
before activation. On a failed or unready check the install parks in a retriable
|
|
94
|
+
non-active state -- never a silent activate. An attach into an already-active
|
|
95
|
+
workspace must health-gate the new attached surface without disturbing the
|
|
96
|
+
existing active app.
|
|
97
|
+
|
|
98
|
+
## Worked examples (illustrative instances, not framework)
|
|
99
|
+
|
|
100
|
+
Two different domains run through the **same** Steps 1-4 above; only the selected
|
|
101
|
+
instance and the authored manifests change. These are reviewed-skill instances,
|
|
102
|
+
not part of the framework.
|
|
103
|
+
|
|
104
|
+
### Example A -- a self-hosted commerce backend
|
|
105
|
+
|
|
106
|
+
*Illustrative instance, e.g. the `commerce.medusa_attached_app` reviewed seed --
|
|
107
|
+
not framework.* A tenant self-hosts a mature commerce engine and wants AI to
|
|
108
|
+
operate merchant workflows while the engine stays the system of record. Author:
|
|
109
|
+
`AttachedApp` + `BridgeAdapter` over the engine; a `ProjectionContract` for
|
|
110
|
+
order/inventory summaries and receipts; health checks on the engine; an
|
|
111
|
+
`AppManifest` (`hybrid`); `ActionManifest` writes (e.g. `commerce.create_product`,
|
|
112
|
+
`commerce.issue_refund`) bounded by policy (refunds above a threshold require
|
|
113
|
+
approval); `QueryManifest` reads (e.g. `commerce.list_orders`,
|
|
114
|
+
`commerce.low_inventory_report`); `FlowManifest` recovery runbooks. Compiles
|
|
115
|
+
`hybrid` + subordinate attachment metadata.
|
|
116
|
+
|
|
117
|
+
### Example B -- a self-hosted regulatory data-plane
|
|
118
|
+
|
|
119
|
+
*Illustrative instance, e.g. the `datalake.fmcsa_attached_app` reviewed seed --
|
|
120
|
+
not framework.* A tenant self-hosts a large regulatory dataset subsystem
|
|
121
|
+
(scheduled ingestion, a relational store) and wants other runtimes and agents to
|
|
122
|
+
query it through governed verbs while it stays the system of record. Author:
|
|
123
|
+
`AttachedApp` + `BridgeAdapter` over the data-plane; a `ProjectionContract` for
|
|
124
|
+
freshness, receipts, and safe summaries; health checks on ingestion/query;
|
|
125
|
+
an `AppManifest` (`hybrid`); `ActionManifest` writes (e.g. `datalake.run_sync`,
|
|
126
|
+
`datalake.import_slice`) where broad import/copy requires approval;
|
|
127
|
+
`QueryManifest` reads (e.g. `datalake.lookup_carrier`, `datalake.sync_status`);
|
|
128
|
+
`FlowManifest` sync-cadence runbooks. Compiles `hybrid` + subordinate attachment
|
|
129
|
+
metadata.
|
|
130
|
+
|
|
131
|
+
Swap Example A for Example B and Steps 1-4 are unchanged. If your procedure only
|
|
132
|
+
works for one of them, a domain has leaked into the mechanics -- pull it back
|
|
133
|
+
into the instance and the manifests.
|
|
134
|
+
|
|
135
|
+
## Current status / honest caveat
|
|
136
|
+
|
|
137
|
+
Today the runtime does **not yet** honor subordinate attachment metadata or
|
|
138
|
+
health-gate activation, and the runtime `app_class` set does not yet include
|
|
139
|
+
`hybrid` (it carries `declarative` and `sidecar` only). You can **draft** the
|
|
140
|
+
full governed attach graph now -- `AttachedApp`/`BridgeAdapter`/`ProjectionContract`/
|
|
141
|
+
health checks plus the Action/Query/Route/Flow/Ontology manifests -- but full
|
|
142
|
+
end-to-end execution (the installer consuming the metadata, and activation
|
|
143
|
+
blocking on foreign health) depends on that runtime work landing. State this
|
|
144
|
+
plainly to the tenant: an attach you author now is a governed draft, not a live,
|
|
145
|
+
health-gated integration. If the gap blocks the tenant, record it (see
|
|
146
|
+
`capability-gap-reporting/SKILL.md`).
|
|
147
|
+
|
|
148
|
+
## Related skills
|
|
149
|
+
|
|
150
|
+
- `solution-router/SKILL.md` -- how a request gets routed to `attached_app` in
|
|
151
|
+
the first place, and the connector/sidecar/intake alternatives.
|
|
152
|
+
- `layering-and-import-modes/SKILL.md` -- where attach sits in the configure ->
|
|
153
|
+
app-pack -> overlay -> attach -> intake -> greenfield order.
|
|
154
|
+
- `app-pack-authoring/SKILL.md` -- the shipped app-pack artifact family the
|
|
155
|
+
attach graph compiles into.
|
|
156
|
+
- `secrets-runtime-bridge/SKILL.md` -- referencing the foreign system's
|
|
157
|
+
credentials without embedding them.
|
|
158
|
+
- `ontology-mapping/SKILL.md` -- mapping foreign objects onto shared URNs.
|
|
159
|
+
- If this skill is missing from an older generated workspace, refresh managed
|
|
160
|
+
guidance with `minutework workspace sync-assets`
|
|
161
|
+
(see `workspace-guidance-refresh/SKILL.md`).
|
|
@@ -78,13 +78,17 @@ open GitHub PRs, or require monorepo permissions for capability gaps.
|
|
|
78
78
|
gateway, ingress, workflow, thread, or AI substrate, but not yet a built-in
|
|
79
79
|
baseline product capability.
|
|
80
80
|
- `reviewed_skill` when the missing piece is Builder-side routing or solution
|
|
81
|
-
guidance rather than runtime/platform substrate
|
|
81
|
+
guidance rather than runtime/platform substrate (see
|
|
82
|
+
`solution-router/SKILL.md` for how reviewed skills are ranked and selected).
|
|
82
83
|
- `app_pack` when the missing reusable thing should land as an installable
|
|
83
84
|
product capability rather than a lower-level primitive.
|
|
84
85
|
- `overlay_only` when the gap is presentation, projection, or policy layering
|
|
85
86
|
over existing substrate rather than new execution capability.
|
|
86
87
|
- `attached_app` when the right home is an attached-app integration surface
|
|
87
|
-
rather than shared core substrate.
|
|
88
|
+
rather than shared core substrate (see `attached-app/SKILL.md`). Until the
|
|
89
|
+
runtime honors attachment metadata and health-gated activation, a needed
|
|
90
|
+
attach capability that cannot fully execute yet is itself a valid gap to
|
|
91
|
+
record.
|
|
88
92
|
- Prefer one concrete gap per missing shared capability.
|
|
89
93
|
- Use gap reports to tell MinuteWork where shared substrate may be missing. Do
|
|
90
94
|
not treat them as automatic implementation instructions.
|
|
@@ -6,7 +6,9 @@ description: "Choosing between configuration, app-pack changes, overlays, attach
|
|
|
6
6
|
# Layering And Import Modes
|
|
7
7
|
|
|
8
8
|
Use this skill when choosing between configuration, app-pack changes, overlays,
|
|
9
|
-
`attached_app`, or OSS intake.
|
|
9
|
+
`attached_app`, or OSS intake. For a fresh product request, start at
|
|
10
|
+
`solution-router/SKILL.md`, which classifies the request and ranks reviewed
|
|
11
|
+
capability skills before this layering decision.
|
|
10
12
|
|
|
11
13
|
- Prefer the highest layer that solves the request:
|
|
12
14
|
- configure an existing capability, skill, or baseline substrate first
|
|
@@ -21,7 +23,10 @@ Use this skill when choosing between configuration, app-pack changes, overlays,
|
|
|
21
23
|
`integration-broker-and-connectors/SKILL.md` and use the broker substrate when
|
|
22
24
|
it fits.
|
|
23
25
|
- Use `attached_app` when a mature foreign system should remain its own
|
|
24
|
-
subsystem and MinuteWork should compile a governed control surface around it
|
|
26
|
+
subsystem and MinuteWork should compile a governed control surface around it;
|
|
27
|
+
see `attached-app/SKILL.md` for the authoring procedure and
|
|
28
|
+
`solution-router/SKILL.md` for choosing it over a connector, sidecar, or repo
|
|
29
|
+
intake.
|
|
25
30
|
- Use `external_repo_intake` only when no reviewed capability skill or cleaner
|
|
26
31
|
`attached_app` path fits. Any repo intake must stay inside the bounded Builder
|
|
27
32
|
sandbox.
|
|
@@ -31,6 +31,10 @@ needed:
|
|
|
31
31
|
belongs in governed runtime capabilities instead of browser/provider calls.
|
|
32
32
|
- `layering-and-import-modes/SKILL.md` for build-native vs govern-existing,
|
|
33
33
|
`attached_app`, OSS adoption, and greenfield-last decisions.
|
|
34
|
+
- `solution-router/SKILL.md` for routing a common product request to the right
|
|
35
|
+
reviewed capability skill and deployment mode before open-ended research.
|
|
36
|
+
- `attached-app/SKILL.md` for governing a mature foreign subsystem the tenant
|
|
37
|
+
hosts as an attached control surface, reads via Query and writes via Action.
|
|
34
38
|
- `integration-broker-and-connectors/SKILL.md` for external integrations, paid
|
|
35
39
|
acquisition, ads, brokered connectors, spend/approval governance, and
|
|
36
40
|
`mw.connector.ads`.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: solution-router
|
|
3
|
+
description: "Routing a common product request: classify intent, ask only the clarifying questions that change the choice, rank reviewed/published capability skills, pick the deployment and intake mode, and fall back to OSS research only when nothing fits."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Solution Router
|
|
7
|
+
|
|
8
|
+
Use this skill first when a user asks for a recurring product capability --
|
|
9
|
+
ecommerce, CRM, ingestion, analytics, an integration, "make my existing system
|
|
10
|
+
agentic," "bring in my app." Do not open these with open-ended OSS research.
|
|
11
|
+
Route through the reviewed capability-skill catalog first and only research when
|
|
12
|
+
nothing fits.
|
|
13
|
+
|
|
14
|
+
Neither a reviewed capability skill nor an OSS repo is a runtime install
|
|
15
|
+
contract. Whatever you select, the authoritative output is still the governed
|
|
16
|
+
compiled artifact graph (`AppManifest` plus the manifests and contracts the
|
|
17
|
+
chosen mode requires). The router chooses the path; it never installs anything.
|
|
18
|
+
|
|
19
|
+
Work the steps in order. The domain list is **data-driven from the catalog**:
|
|
20
|
+
rank whatever reviewed/published skills exist, never a hardcoded vertical list.
|
|
21
|
+
|
|
22
|
+
## Step 1 -- Classify the request
|
|
23
|
+
|
|
24
|
+
Name the problem class in horizontal terms (commerce backend, SaaS
|
|
25
|
+
orchestration, dataset reaction, internal API, public site), not a vendor or
|
|
26
|
+
vertical. The same sentence can resolve to different paths -- "bring in my
|
|
27
|
+
existing app" might be a connector, an attached subsystem, a sidecar, or a repo
|
|
28
|
+
intake -- which is exactly why the router exists and a fixed `init` choice does
|
|
29
|
+
not.
|
|
30
|
+
|
|
31
|
+
## Step 2 -- Ask the minimum clarifying questions
|
|
32
|
+
|
|
33
|
+
Ask only the questions whose answers **change the solution choice**, and stop.
|
|
34
|
+
The high-signal axes are almost always:
|
|
35
|
+
|
|
36
|
+
- managed SaaS the tenant already uses, or a system they self-host?
|
|
37
|
+
- should the existing system stay the system of record, or does the tenant want
|
|
38
|
+
MinuteWork to own the data natively?
|
|
39
|
+
- read-only, governed writes, or autonomous workflows -- and what needs human
|
|
40
|
+
approval?
|
|
41
|
+
- is there a mature intact system to govern, or unfinished code to develop?
|
|
42
|
+
|
|
43
|
+
Each reviewed skill declares its own `minimum_clarifying_questions`; prefer
|
|
44
|
+
those over inventing new ones. Do not interrogate when the choice is already
|
|
45
|
+
unambiguous.
|
|
46
|
+
|
|
47
|
+
## Step 3 -- Rank the reviewed capability skills
|
|
48
|
+
|
|
49
|
+
Score the catalog entries against the answers using their declared fields:
|
|
50
|
+
`domain`, `problem_class`, `solution_type`, `source_intake_mode`,
|
|
51
|
+
`hosting_model`, `runtime_relationship`, `autonomy_support`, required infra,
|
|
52
|
+
storage profile, and **disqualifiers**. A single disqualifier hit drops a
|
|
53
|
+
candidate regardless of other fit.
|
|
54
|
+
|
|
55
|
+
Lifecycle gates which candidates you may pick automatically:
|
|
56
|
+
|
|
57
|
+
- auto-select only `reviewed` or `published` skills;
|
|
58
|
+
- `candidate` and `draft` skills may be *suggested*, but require explicit human
|
|
59
|
+
confirmation before they drive a build;
|
|
60
|
+
- a promoted skill keeps its mapping to solution type, intake mode, and governed
|
|
61
|
+
outputs -- carry that mapping into the compile step.
|
|
62
|
+
|
|
63
|
+
## Step 4 -- Select the mode
|
|
64
|
+
|
|
65
|
+
Selection resolves two orthogonal axes; do not collapse them.
|
|
66
|
+
|
|
67
|
+
- `solution_type` (where it runs / system of record):
|
|
68
|
+
- `connector` -- a remote third-party SaaS reached over its API; normally
|
|
69
|
+
compiles `declarative`, often as a ConnectorPack.
|
|
70
|
+
- `attached_app` -- a mature foreign subsystem the tenant hosts stays its own
|
|
71
|
+
system of record while MinuteWork compiles a governed control surface around
|
|
72
|
+
it. Compiles to `declarative`/`hybrid` plus **subordinate** attachment
|
|
73
|
+
metadata, never a new app class. See `attached-app/SKILL.md`.
|
|
74
|
+
- `sidecar` -- a MinuteWork-owned backend process (webhooks, workers,
|
|
75
|
+
schedulers, compute). See `sidecar-generation/SKILL.md`.
|
|
76
|
+
- `native_pack` -- rebuild natively; resolves before compile to
|
|
77
|
+
`declarative`, `hybrid`, or `code_backed`.
|
|
78
|
+
- `source_intake_mode` (does Builder clone code to author?):
|
|
79
|
+
- `catalog_native` -- compile directly from a known shape; no clone. The fast
|
|
80
|
+
path, and what the `attached_app` and connector seeds use.
|
|
81
|
+
- `external_repo_intake` -- clone a pinned repo into the bounded Builder
|
|
82
|
+
sandbox, inspect license/stack/auth/DB/jobs/routes, classify, then compile.
|
|
83
|
+
Choose this only when the selected skill or research result explicitly
|
|
84
|
+
requires source analysis.
|
|
85
|
+
|
|
86
|
+
Cloning an unfinished repo to co-develop it is `external_repo_intake` toward a
|
|
87
|
+
code-backed pack -- a different combination from `attached_app`, and not what
|
|
88
|
+
this router reaches for when a mature system should stay foreign.
|
|
89
|
+
|
|
90
|
+
## Step 5 -- Fall back to research only when nothing fits
|
|
91
|
+
|
|
92
|
+
Reach for `oss_capability_research` only when no reviewed skill matches,
|
|
93
|
+
confidence stays too low after clarifying questions, or the user explicitly
|
|
94
|
+
wants an unsupported stack. Research may compare candidates by fit, license,
|
|
95
|
+
hosting model, and risk, then emit a recommendation, a draft reviewed skill, or
|
|
96
|
+
a draft artifact graph for review. It must not install software directly or
|
|
97
|
+
treat a popular repo as an install contract. Default research output is a
|
|
98
|
+
recommendation, not an activation.
|
|
99
|
+
|
|
100
|
+
## Status (today)
|
|
101
|
+
|
|
102
|
+
The seed catalog
|
|
103
|
+
(`reference/mwv3-dj6-docs/reviewed_capability_skill_seed_catalog.md`) is still
|
|
104
|
+
`draft`, and there is no machine-readable registry to rank over yet -- so every
|
|
105
|
+
catalog entry currently needs explicit human confirmation before it drives a
|
|
106
|
+
build, and ranking is a reading-the-catalog judgement rather than an automated
|
|
107
|
+
score. Treat this skill as the procedure; promotion of concrete instances to
|
|
108
|
+
`reviewed` is a separate, human-gated step.
|
|
109
|
+
|
|
110
|
+
## Related skills
|
|
111
|
+
|
|
112
|
+
- `attached-app/SKILL.md` -- the authoring procedure once the mode is
|
|
113
|
+
`attached_app`.
|
|
114
|
+
- `layering-and-import-modes/SKILL.md` -- the higher-level configure ->
|
|
115
|
+
app-pack -> overlay -> attach -> intake -> greenfield decision order.
|
|
116
|
+
- `integration-broker-and-connectors/SKILL.md` -- credentialed connector and
|
|
117
|
+
brokered-spend solutions.
|
|
118
|
+
- `sidecar-generation/SKILL.md` -- when the answer is a MinuteWork-owned backend
|
|
119
|
+
process rather than a foreign system.
|
|
120
|
+
- `capability-gap-reporting/SKILL.md` -- when no reviewed skill and no clean
|
|
121
|
+
research path fit, record the gap instead of forcing a bespoke build.
|
|
122
|
+
- If this skill is missing from an older generated workspace, refresh managed
|
|
123
|
+
guidance with `minutework workspace sync-assets`
|
|
124
|
+
(see `workspace-guidance-refresh/SKILL.md`).
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Database, RefreshCcw } from "lucide-react";
|
|
5
|
+
|
|
6
|
+
import { PanelFrame } from "@/design-system/patterns/panel-frame";
|
|
7
|
+
import { Button } from "@/design-system/primitives/button";
|
|
8
|
+
import {
|
|
9
|
+
platformSessionSchema,
|
|
10
|
+
type PlatformSession,
|
|
11
|
+
} from "@/lib/platform/contracts";
|
|
12
|
+
|
|
13
|
+
type DemoResult = {
|
|
14
|
+
session?: PlatformSession;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export function ManifestDemo() {
|
|
18
|
+
const [result, setResult] = useState<DemoResult | null>(null);
|
|
19
|
+
const [error, setError] = useState("");
|
|
20
|
+
const [pending, setPending] = useState(false);
|
|
21
|
+
|
|
22
|
+
async function loadSession() {
|
|
23
|
+
setPending(true);
|
|
24
|
+
setError("");
|
|
25
|
+
try {
|
|
26
|
+
const response = await fetch("/api/auth/session", {
|
|
27
|
+
method: "GET",
|
|
28
|
+
cache: "no-store",
|
|
29
|
+
});
|
|
30
|
+
const payload = (await response.json().catch(() => null)) as unknown;
|
|
31
|
+
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
const detail =
|
|
34
|
+
typeof payload === "object" &&
|
|
35
|
+
payload !== null &&
|
|
36
|
+
"detail" in payload &&
|
|
37
|
+
typeof payload.detail === "string"
|
|
38
|
+
? payload.detail
|
|
39
|
+
: "Session request failed.";
|
|
40
|
+
throw new Error(detail);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
setResult({ session: platformSessionSchema.parse(payload) });
|
|
44
|
+
} catch (caught) {
|
|
45
|
+
setError(caught instanceof Error ? caught.message : "Session request failed.");
|
|
46
|
+
} finally {
|
|
47
|
+
setPending(false);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div className="grid gap-6">
|
|
53
|
+
<PanelFrame tone="floating" radius="xl" padding="lg" className="space-y-5">
|
|
54
|
+
<div className="flex items-center gap-2">
|
|
55
|
+
<Database className="size-5 text-primary" />
|
|
56
|
+
<h2 className="text-2xl font-semibold tracking-tight">
|
|
57
|
+
Platform session
|
|
58
|
+
</h2>
|
|
59
|
+
</div>
|
|
60
|
+
<p className="max-w-2xl text-sm leading-7 text-muted-foreground">
|
|
61
|
+
This shell uses the platform member session established by central SSO.
|
|
62
|
+
</p>
|
|
63
|
+
<div className="flex flex-wrap gap-3">
|
|
64
|
+
<Button type="button" variant="outline" onClick={loadSession} disabled={pending}>
|
|
65
|
+
<RefreshCcw className="size-4" />
|
|
66
|
+
Load session
|
|
67
|
+
</Button>
|
|
68
|
+
</div>
|
|
69
|
+
{error ? <p className="text-sm text-destructive">{error}</p> : null}
|
|
70
|
+
</PanelFrame>
|
|
71
|
+
|
|
72
|
+
<PanelFrame tone="raised" radius="xl" padding="lg">
|
|
73
|
+
<pre className="min-h-40 overflow-auto rounded-md bg-muted p-4 text-xs text-muted-foreground">
|
|
74
|
+
{result ? JSON.stringify(result, null, 2) : "No result yet"}
|
|
75
|
+
</pre>
|
|
76
|
+
</PanelFrame>
|
|
77
|
+
</div>
|
|
78
|
+
);
|
|
79
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "minutework",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.50",
|
|
4
4
|
"description": "MinuteWork CLI for workspace scaffolding, local preview workflows, and hosted preview deploys.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"jiti": "^2.6.1",
|
|
26
26
|
"zod": "^4.3.6",
|
|
27
27
|
"@minutework/platform-config": "0.1.3",
|
|
28
|
-
"@minutework/schema-compiler": "0.1.
|
|
28
|
+
"@minutework/schema-compiler": "0.1.12"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^24.9.1",
|
|
@@ -408,12 +408,15 @@ export declare const SchemaStatusSchema: z.ZodObject<{
|
|
|
408
408
|
}>;
|
|
409
409
|
app_id: z.ZodString;
|
|
410
410
|
app_version: z.ZodString;
|
|
411
|
+
attached_apps: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
412
|
+
bridge_adapters: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
411
413
|
description: z.ZodString;
|
|
412
414
|
display_name: z.ZodString;
|
|
413
415
|
flows: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
414
416
|
integration_dependencies: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
415
417
|
ontology_mappings: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
416
418
|
projection_contracts: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
419
|
+
readiness_gates: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
417
420
|
queries: z.ZodArray<z.ZodString>;
|
|
418
421
|
required_secrets: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
419
422
|
description: z.ZodString;
|
|
@@ -424,6 +427,18 @@ export declare const SchemaStatusSchema: z.ZodObject<{
|
|
|
424
427
|
skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
425
428
|
version: z.ZodLiteral<"AppManifestV1">;
|
|
426
429
|
}, z.core.$strict>>;
|
|
430
|
+
attachedApps: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
431
|
+
app_id: z.ZodString;
|
|
432
|
+
attachment_id: z.ZodString;
|
|
433
|
+
definition: z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
434
|
+
version: z.ZodLiteral<"AttachedAppV1">;
|
|
435
|
+
}, z.core.$strict>>>;
|
|
436
|
+
bridgeAdapters: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
437
|
+
adapter_id: z.ZodString;
|
|
438
|
+
app_id: z.ZodString;
|
|
439
|
+
definition: z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
440
|
+
version: z.ZodLiteral<"BridgeAdapterV1">;
|
|
441
|
+
}, z.core.$strict>>>;
|
|
427
442
|
eventSubscriptionManifests: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
428
443
|
app_id: z.ZodString;
|
|
429
444
|
cross_server: z.ZodNullable<z.ZodObject<{
|
|
@@ -506,6 +521,7 @@ export declare const SchemaStatusSchema: z.ZodObject<{
|
|
|
506
521
|
queryManifests: z.ZodArray<z.ZodObject<{
|
|
507
522
|
agent_exposed: z.ZodOptional<z.ZodBoolean>;
|
|
508
523
|
app_id: z.ZodString;
|
|
524
|
+
bridge_adapter_ref: z.ZodOptional<z.ZodString>;
|
|
509
525
|
definition: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
|
|
510
526
|
description: z.ZodString;
|
|
511
527
|
entity_name: z.ZodString;
|
|
@@ -515,11 +531,36 @@ export declare const SchemaStatusSchema: z.ZodObject<{
|
|
|
515
531
|
detail: "detail";
|
|
516
532
|
list: "list";
|
|
517
533
|
}>, z.ZodLiteral<"connector">]>;
|
|
534
|
+
query_resolver: z.ZodOptional<z.ZodString>;
|
|
518
535
|
required_roles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
519
536
|
schema_key: z.ZodString;
|
|
520
537
|
version: z.ZodLiteral<"QueryManifestV1">;
|
|
521
538
|
web_customer_exposed: z.ZodOptional<z.ZodBoolean>;
|
|
522
539
|
}, z.core.$strict>>;
|
|
540
|
+
readinessGateManifests: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
541
|
+
app_id: z.ZodString;
|
|
542
|
+
gate_id: z.ZodString;
|
|
543
|
+
probes: z.ZodArray<z.ZodObject<{
|
|
544
|
+
auth_ref: z.ZodOptional<z.ZodString>;
|
|
545
|
+
expect_status: z.ZodDefault<z.ZodArray<z.ZodNumber>>;
|
|
546
|
+
failure_budget: z.ZodDefault<z.ZodNumber>;
|
|
547
|
+
interval_ms: z.ZodDefault<z.ZodNumber>;
|
|
548
|
+
method: z.ZodDefault<z.ZodEnum<{
|
|
549
|
+
GET: "GET";
|
|
550
|
+
POST: "POST";
|
|
551
|
+
HEAD: "HEAD";
|
|
552
|
+
}>>;
|
|
553
|
+
path: z.ZodDefault<z.ZodString>;
|
|
554
|
+
probe_kind: z.ZodEnum<{
|
|
555
|
+
http_probe: "http_probe";
|
|
556
|
+
}>;
|
|
557
|
+
ready_threshold: z.ZodDefault<z.ZodNumber>;
|
|
558
|
+
timeout_ms: z.ZodDefault<z.ZodNumber>;
|
|
559
|
+
url_ref: z.ZodString;
|
|
560
|
+
}, z.core.$strict>>;
|
|
561
|
+
require_all: z.ZodDefault<z.ZodBoolean>;
|
|
562
|
+
version: z.ZodLiteral<"ReadinessGateManifestV1">;
|
|
563
|
+
}, z.core.$strict>>>;
|
|
523
564
|
releaseMetadata: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
|
|
524
565
|
routeManifests: z.ZodArray<z.ZodObject<{
|
|
525
566
|
action_id: z.ZodNullable<z.ZodString>;
|