@passioncode-ai/fabric-agent-adapter 0.58.0 → 0.60.0

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.
Files changed (26) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/README.md +1 -1
  3. package/package.json +1 -1
  4. package/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
  5. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +3 -2
  6. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/operator-channel-and-repository.md +4 -1
  7. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/source-and-instance.md +27 -2
  8. package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +16 -19
  9. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +35 -13
  10. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +1 -1
  11. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md +7 -2
  12. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-session.mjs +9 -2
  13. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-slots.mjs +80 -1
  14. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package.mjs +6 -1
  15. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_session.py +11 -3
  16. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_slots.py +80 -4
  17. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_package.py +14 -6
  18. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +187 -7
  19. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/sample_service.py +2 -2
  20. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +19 -7
  21. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/operator-channel-and-repository.md +4 -1
  22. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/source-and-instance.md +27 -2
  23. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/where-agents-run.md +23 -1
  24. package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +5 -5
  25. package/plugins/fabric-agent-adapter/skills/working-with-fabric/references/project-board.md +21 -7
  26. package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
@@ -16,6 +16,7 @@ The normative rules are the Fabric Agent Contract's, at the commit this plugin p
16
16
  - [Connecting a machine or a cloud to the estate](#connecting-a-machine-or-a-cloud-to-the-estate)
17
17
  - [Sharing an agent into an organization](#sharing-an-agent-into-an-organization)
18
18
  - [Running while the laptop is closed](#running-while-the-laptop-is-closed)
19
+ - [Uptime: A or B](#uptime-a-or-b)
19
20
  - [Selling an agent](#selling-an-agent)
20
21
  - [The checklist](#the-checklist)
21
22
 
@@ -85,13 +86,33 @@ checked, and removes the instance from the next revision.
85
86
  ## Running while the laptop is closed
86
87
 
87
88
  A cloud agent keeps working with the laptop closed only if everything it needs is in the cloud: its worker, its
88
- secrets, its data, and a hub that can admit calls. The local Fabric hub is not a cloud hub. Design for it:
89
+ secrets, its data, and, for the calls Fabric admits, a hub that can admit them. The local Fabric hub is not a cloud hub. Design for it:
89
90
 
90
91
  - Declare what each capability needs and where it is; a capability that needs the person's machine reports
91
92
  `pending` or `unavailable` instead of pretending, and queues within a deadline or declines.
92
93
  - Never charge for work it cannot deliver on the promised terms.
93
94
  - A test that passed on fixtures says nothing about uptime; measure the installed agent in its cloud.
94
95
 
96
+ ## Uptime: A or B
97
+
98
+ Every new agent is given an uptime category on its first day, and the README names it:
99
+
100
+ - **A, around the clock.** A capability must answer while the owner's machine is off or asleep: a schedule, a chat,
101
+ callers outside the machine. A cloud host is required from the first release; Heroku is the default, another host
102
+ only when a reason names it: an instance in the person's PassionCode cloud or an organization's cloud runs there
103
+ (the places above), and a paid agent stays in PassionCode's cloud (selling an agent, below). On a host with no
104
+ Fabric hub it answers what reaches its own origin (its schedule, its chat, its API); a call Fabric admits needs a
105
+ cloud hub, as running while the laptop is closed says. The agent is an online service (building-fabric-services, the remote placement), often
106
+ alongside its local instance, and starts from the cloud Fabric-server template once that template's repository
107
+ exists. Its data lives where the cloud reaches it, in a durable store (a database, an object store, the private
108
+ `<agent>-data` repository), never the host's own folder, which a platform such as Heroku does not keep across a
109
+ restart.
110
+ - **B, local only.** Nothing needs it while the machine sleeps: a local service and no cloud. It reads an A agent's
111
+ data through that agent's MCP or API, never from its store.
112
+
113
+ A B agent that gains a capability that must answer around the clock becomes A for that capability; record the change
114
+ and move only that capability to the cloud.
115
+
95
116
  ## Selling an agent
96
117
 
97
118
  - **A paid agent** runs in PassionCode's cloud inside its developer's organization (`org:<developer>`); each customer
@@ -108,6 +129,7 @@ secrets, its data, and a hub that can admit calls. The local Fabric hub is not a
108
129
  - Where does each instance run, and in which context? Write it in the knowledge pack.
109
130
  - Does any state, secret, log line or cache key cross contexts? It must not.
110
131
  - Which capabilities need the person's machine, and what do they answer when it is off?
132
+ - Which uptime category is it, A (a cloud host from the first release) or B (local only)? The README names it.
111
133
  - Who pays for each call (which grant, which key)? The person's personal key never pays for an organization.
112
134
  - If it joins machines or applies the estate record: tokens from stdin or a 0600 file only, revisions verified with
113
135
  their parent.
@@ -18,7 +18,7 @@ compatibility: >-
18
18
  this plugin; Codex/Kimi use command hooks; Hermes/OpenCode/OpenClaw/Pi use native context plugins after opt-in.
19
19
  metadata:
20
20
  author: PassionCode.ai
21
- version: "0.58.0"
21
+ version: "0.60.0"
22
22
  ---
23
23
 
24
24
  # Working with Fabric
@@ -283,15 +283,15 @@ build or test in flight is not a stall. Note each restart (what stopped, when, a
283
283
 
284
284
  ## Step 6: tasks link to backlog rows, never copy them
285
285
 
286
- A backlog row in a repository stays the status source. File the Fabric task that runs it with the row's address:
286
+ A repository's backlog row stays the status source. File the Fabric task that runs it with the row's address:
287
287
 
288
288
  ```json
289
289
  {"title": "…", "source": {"repository": "passioncode-ai/fabric-agent-adapter", "path": "docs/backlog.md", "id": "FAA-18"}}
290
290
  ```
291
291
 
292
- through `fabric_task_create` (or `fabric_work_claim`, which files one when none exists). Do not paste the row's
293
- text or status into the task; edit the row in its repository under that repository's rules. A row that does not
294
- resolve (a repository the project does not hold) is refused, naming the part that failed.
292
+ through `fabric_task_create` (or `fabric_work_claim`, which files one when none exists); read its answer as Step 4
293
+ item 2 says. Your single live claim links the row (Fabric 0.3.14): file an unrelated row after your release, never linked
294
+ by hand, or say it is linked. Do not paste the row's text or status into the task; edit it in its repository.
295
295
 
296
296
  ## Step 7: at the end
297
297
 
@@ -61,12 +61,12 @@ reply or progress note): the target replied, not that the work was done. Read th
61
61
  still cancel the request. `noResponder` in your `com.submit` receipt says nobody can answer that capability for that
62
62
  Project now: the request is stored, a reply may still answer it and a responder may come later. An `accepted`
63
63
  request can also wait unanswered for its responder's operator: since adapter 0.53.0 a responder whose slot was moved
64
- to another session leaves its accepted work `accepted` and unanswered until the slot is taken back (until Fabric
65
- hands it over, CT-175), which is not the operator's hold below; tell
64
+ to another session leaves its accepted work `accepted` and unanswered until the slot is taken back, or, once Fabric offers the operator's move,
65
+ moved back to it (a responder from adapter 0.60.0 finds that; an older one comes back only by take-back), or until Fabric hands it over (CT-175), which is not the operator's hold below; tell
66
66
  the person, and cancel it if it is past what they can wait. Never resend it under
67
- a new key while it is open; follow "When nobody answers" below. A request without a deadline gets one seven days out
68
- (DEC-0098) and then reads `expired`: if the ask still stands, submit it again with a new key and record the wait on the
69
- new request.
67
+ a new key while it is open; follow "When nobody answers" below. A queued or claimed request without a deadline gets one seven
68
+ days out (DEC-0098) and then reads `expired`: if the ask still stands, submit it again with a new key and record the wait
69
+ on the new request. An accepted one is kept past its deadline (C4) and never expires: follow "When nobody answers".
70
70
  `settledBy: "owner"` on a request (DEC-0081) means the estate owner settled it after its responder was gone: read it as
71
71
  the owner's attestation, not the responder's.
72
72
 
@@ -100,6 +100,20 @@ A request to a Project whose owner is not working now would wait for nobody. Aft
100
100
  the files you would touch (`git ls-remote origin 'refs/agent-sync/leases/*'` in its repository). `noResponder` in
101
101
  the receipt says nobody serves the capability now. A capability or Project that is `held` is the operator's stop,
102
102
  not "nobody live": wait, and make no change there.
103
+ An `active` responder does not prove your request is being worked. A slot moved to another session (the operator's move,
104
+ contract DEC-0140 PR-2, once Fabric offers it, or another session's replacement) keeps the requests the old holder had accepted: they stay `accepted` with the old holder's
105
+ attempt, which nobody works until the new holder takes them over by a transfer or the old service gets the slot back
106
+ (its take-back, or a move back to a responder from adapter 0.60.0), while Fabric's thread view shows the
107
+ new holder as "Answers it" and its "requests no agent answers now" leaves them out (FAA-172). The board shows a
108
+ requester no attempt or generation (`com.get` gives the request's `state`, `effect` and `revision`, never its attempt), so you cannot tell
109
+ this from slow work: when your request has stayed `accepted` with no progress note or reply past what the work
110
+ should take, ask on its thread (`com.reply`) whether it is being worked. If nobody answers, cancel it first: while
111
+ its `effect` is still `not_started`, `com.cancel` moves it to `cancelled` (nothing has happened yet). Only when the
112
+ cancel's receipt shows the request `cancelled`, submit it again and read the new request from this step (an active
113
+ responder is step 2; step 3 only when nobody is live and it stays queued and unclaimed); an
114
+ accepted request never expires, and the old service would carry it out by a transfer once it gets the slot back, so
115
+ it is never adapted while still accepted. `outcome_unknown` means the work began meanwhile: tell the person and
116
+ change nothing.
103
117
  2. **Live:** wait under a watcher (below) and work on independent tasks meanwhile; never touch files a live session
104
118
  holds.
105
119
  3. **Nobody live, and the change is small.** Small means all three:
@@ -114,8 +128,8 @@ A request to a Project whose owner is not working now would wait for nobody. Aft
114
128
  allow. Then reply on the request's thread, one line of body text (not a `reaction`, which only an announcement's
115
129
  reply carries): **adapted by** your Project, the merge commit, and what the owner should look at. The owner's next
116
130
  session reads it and may revert it. One such change per target repository at a time. Your own reply does not answer
117
- your own request: it stays on the board, on its thread and on Fabric's home ("requests no agent answers now"), for
118
- the owner to see until its deadline; do not cancel it.
131
+ your own request: a queued one stays on the board, on its thread and on Fabric's home ("requests no agent answers
132
+ now"), for the owner to see until its deadline; do not cancel it.
119
133
  4. **Not small** (a decision, a contract, a release, a large change): the request stays queued for its owner until its
120
134
  deadline (seven days by default); never take a decision that is the owner's, record the wait in one line (what it
121
135
  waits on, which watcher acts) and go on with your own work. An expiry posts no message, so the mail watcher does
@@ -58,7 +58,7 @@ SESSION_ID = re.compile(r"[A-Za-z0-9._:-]{1,128}")
58
58
  LOOPBACK_ORIGIN = re.compile(r"http://127\.0\.0\.1:(\d{1,5})")
59
59
 
60
60
 
61
- VERSION = "0.58.0"
61
+ VERSION = "0.60.0"
62
62
 
63
63
 
64
64
  HOSTS = {"claude": "Claude Code", "codex": "Codex", "kimi": "Kimi Code",