halfcycle 0.3.7
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/.claude-plugin/plugin.json +16 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/bin/bin.bundle.mjs +16771 -0
- package/commands/agent-teams-orchestration.md +11 -0
- package/commands/consistency-check.md +11 -0
- package/commands/context-update.md +11 -0
- package/commands/halfcycle-design.md +11 -0
- package/commands/halfcycle-setup.md +11 -0
- package/commands/stack-assembly-worker.md +11 -0
- package/commands/task-execution.md +11 -0
- package/commands/task-graph.md +11 -0
- package/commands/write-spec.md +11 -0
- package/dist/account-credential.d.ts +94 -0
- package/dist/account-credential.d.ts.map +1 -0
- package/dist/bin.d.ts +34 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +3156 -0
- package/dist/bin.js.map +6 -0
- package/dist/build-record/assemble.d.ts +37 -0
- package/dist/build-record/assemble.d.ts.map +1 -0
- package/dist/build-record/index.d.ts +39 -0
- package/dist/build-record/index.d.ts.map +1 -0
- package/dist/build-record/sources.d.ts +80 -0
- package/dist/build-record/sources.d.ts.map +1 -0
- package/dist/build-record/template.d.ts +18 -0
- package/dist/build-record/template.d.ts.map +1 -0
- package/dist/build-record/types.d.ts +163 -0
- package/dist/build-record/types.d.ts.map +1 -0
- package/dist/build-record/write.d.ts +26 -0
- package/dist/build-record/write.d.ts.map +1 -0
- package/dist/cli-contract.d.ts +120 -0
- package/dist/cli-contract.d.ts.map +1 -0
- package/dist/close-phase.d.ts +114 -0
- package/dist/close-phase.d.ts.map +1 -0
- package/dist/create-engagement.d.ts +248 -0
- package/dist/create-engagement.d.ts.map +1 -0
- package/dist/device-signin.d.ts +255 -0
- package/dist/device-signin.d.ts.map +1 -0
- package/dist/engagement-credential.d.ts +267 -0
- package/dist/engagement-credential.d.ts.map +1 -0
- package/dist/identity.d.ts +76 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2083 -0
- package/dist/index.js.map +6 -0
- package/dist/install.d.ts +355 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/loopback-signin.d.ts +173 -0
- package/dist/loopback-signin.d.ts.map +1 -0
- package/dist/mcp-endpoint.d.ts +35 -0
- package/dist/mcp-endpoint.d.ts.map +1 -0
- package/dist/merge-settings.d.ts +57 -0
- package/dist/merge-settings.d.ts.map +1 -0
- package/dist/mint-board-code.d.ts +41 -0
- package/dist/mint-board-code.d.ts.map +1 -0
- package/dist/open-phase.d.ts +107 -0
- package/dist/open-phase.d.ts.map +1 -0
- package/dist/probe-mcp.d.ts +47 -0
- package/dist/probe-mcp.d.ts.map +1 -0
- package/dist/resolve-credential.d.ts +126 -0
- package/dist/resolve-credential.d.ts.map +1 -0
- package/dist/scan.d.ts +131 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/setup/discovery.d.ts +73 -0
- package/dist/setup/discovery.d.ts.map +1 -0
- package/dist/setup/engagement.d.ts +99 -0
- package/dist/setup/engagement.d.ts.map +1 -0
- package/dist/setup/index.d.ts +17 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/manifest.d.ts +155 -0
- package/dist/setup/manifest.d.ts.map +1 -0
- package/dist/setup/rows.d.ts +57 -0
- package/dist/setup/rows.d.ts.map +1 -0
- package/package.json +55 -0
- package/scaffolding/test/fixtures/captured/.gitkeep +0 -0
- package/scaffolding/test/fixtures/captured/manifest.json +4 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Take a plan that already exists and drive ALL of it through to done across several workers at once, rather than handing out the pieces one at a time
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/agent-teams-orchestration` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/agent-teams-orchestration`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or coordinate the workers manually from
|
|
11
|
+
> the phase's approved task graph.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Check a drafted feature spec against the invariants and its adjacent specs, from a session that did not write it
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/consistency-check` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/consistency-check`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or review the spec manually against
|
|
11
|
+
> `docs/invariants.md` and its adjacent specs.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Route recent changes into the repo's context surfaces
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/context-update` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/context-update`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or update the context surfaces manually
|
|
11
|
+
> from this session's changes.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Work out what the product is — the design journey to a PRD and phases
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/halfcycle-design` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/halfcycle-design`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or work the product definition out
|
|
11
|
+
> manually, starting from the problem and who has it.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Set up a repository for a Halfcycle engagement
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/halfcycle-setup` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/halfcycle-setup`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or set the repository up manually from
|
|
11
|
+
> the engagement's onboarding notes.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Verify a phase's assembled stack comes up end to end
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/stack-assembly-worker` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/stack-assembly-worker`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or verify the assembled stack manually
|
|
11
|
+
> against the phase's done-when criteria.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Do ONE piece of the planned work, on its own — not the whole plan
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/task-execution` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/task-execution`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or execute the task manually from its
|
|
11
|
+
> row in the approved task graph.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Break the next chunk of work into ordered pieces that can be handed out — what has to happen before what, and who could take each
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/task-graph` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/task-graph`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or plan the phase manually from the
|
|
11
|
+
> phase document's ready specs.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Draft a Layer 4 feature spec
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Resolve `/write-spec` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
|
|
6
|
+
|
|
7
|
+
If resolution fails, report exactly this and stop:
|
|
8
|
+
|
|
9
|
+
> Couldn't reach Halfcycle to resolve `/write-spec`. **Nothing has run.**
|
|
10
|
+
> Retry when you're back online — or draft the spec manually from the
|
|
11
|
+
> template's required sections.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The PER-USER account credential store — `~/.halfcycle/account.json` (T-08,
|
|
3
|
+
* feature `connect-signup-and-credential`).
|
|
4
|
+
*
|
|
5
|
+
* This is where the credential the browser handoff mints is kept between runs, so
|
|
6
|
+
* that *"an already-signed-in machine skips all of it"* is true. It is a store of
|
|
7
|
+
* ONE secret per control origin, and it lives OUTSIDE every repository.
|
|
8
|
+
*
|
|
9
|
+
* ---------------------------------------------------------------------------
|
|
10
|
+
* WHAT THIS IS NOT, because two credentials with adjacent homes is exactly how a
|
|
11
|
+
* later edit puts the wrong one in the wrong file.
|
|
12
|
+
*
|
|
13
|
+
* - It is NOT the engagement token. That credential authenticates a REPOSITORY,
|
|
14
|
+
* is minted once on create, and today lives in the target repo's `.env.local`
|
|
15
|
+
* (`install.ts`'s `writeDeviceCredential`). T-09 moves it to a machine-level
|
|
16
|
+
* per-engagement env file at `~/.halfcycle/engagements/<id>/env`, because two
|
|
17
|
+
* POSIX shell consumers must SOURCE it. This file is deliberately elsewhere in
|
|
18
|
+
* that layout and deliberately JSON: nothing sources it, only this CLI reads it.
|
|
19
|
+
* - It is NOT keyed on an engagement. An account credential is minted BEFORE any
|
|
20
|
+
* engagement exists — that is the whole reason the create route can require one.
|
|
21
|
+
* It is keyed on the CONTROL ORIGIN that minted it, because a developer pointed
|
|
22
|
+
* at a dev plane and a prod plane holds two different accounts, and a single
|
|
23
|
+
* unkeyed slot would silently hand one plane's secret to the other. That is not
|
|
24
|
+
* a leak (the wrong plane refuses it) but it is an un-debuggable 401.
|
|
25
|
+
*
|
|
26
|
+
* ---------------------------------------------------------------------------
|
|
27
|
+
* OWNER-ONLY, AND WHAT THAT MEANS WHERE IT MEANS NOTHING. The directory is created
|
|
28
|
+
* `0700` and the file written `0600`, matching the Studio layout
|
|
29
|
+
* (`docs/features/mac-workspace-provider.md:27`) this feature adopts. The mode is
|
|
30
|
+
* applied with an explicit `chmodSync` AFTER the write and not left to the `mode`
|
|
31
|
+
* option alone, because `writeFileSync`'s `mode` is honoured only when the file is
|
|
32
|
+
* CREATED — a store that already existed at `0644` would keep those bits forever,
|
|
33
|
+
* which is a permission bug with no symptom.
|
|
34
|
+
*
|
|
35
|
+
* On Windows the POSIX mode bits are meaningless and `chmod` is a near no-op. That
|
|
36
|
+
* is a KNOWN OPEN DECISION (phase decision 6, still open, and T-09's to close for
|
|
37
|
+
* the engagement credential), not something this file pretends to have solved: the
|
|
38
|
+
* call is skipped rather than issued-and-ignored, so nothing here reads as a
|
|
39
|
+
* protection that is not there.
|
|
40
|
+
*
|
|
41
|
+
* ---------------------------------------------------------------------------
|
|
42
|
+
* `expiresAt` IS INFORMATION, NEVER A GATE. Control extends the credential's
|
|
43
|
+
* lifetime silently on every use (`resolveAccountCredential`, the one home of the
|
|
44
|
+
* 30-day window) and no response tells this client the extended value — so the
|
|
45
|
+
* instant stored here is the ISSUE-time expiry and is already stale the first time
|
|
46
|
+
* the credential is used. This module therefore never refuses a credential for
|
|
47
|
+
* being past it, and no caller may: whether a credential is live is CONTROL's
|
|
48
|
+
* question, answered with a 401. A client that decided locally would log a
|
|
49
|
+
* developer out of a credential the server was perfectly happy with, and would be a
|
|
50
|
+
* second home for a lifetime nobody could then change in one place.
|
|
51
|
+
*
|
|
52
|
+
* INV-001: Node builtins only.
|
|
53
|
+
*/
|
|
54
|
+
/** The per-user Halfcycle directory. One home for the path shape. */
|
|
55
|
+
export declare function halfcycleHome(home?: string): string;
|
|
56
|
+
/** The account-credential store's absolute path. */
|
|
57
|
+
export declare function accountStorePath(home?: string): string;
|
|
58
|
+
/** One stored credential — what the poll handed back, plus when it was stored. */
|
|
59
|
+
export interface StoredAccountCredential {
|
|
60
|
+
/** The account the credential speaks for, as control reported it. */
|
|
61
|
+
accountId: string;
|
|
62
|
+
/** The plaintext credential. Presented as `Authorization: Bearer`. */
|
|
63
|
+
credential: string;
|
|
64
|
+
/** Control's issue-time expiry, UTC ISO-8601. Information only — see the header. */
|
|
65
|
+
expiresAt: string;
|
|
66
|
+
/** When this machine stored it, UTC ISO-8601. For the human, not for a check. */
|
|
67
|
+
signedInAt: string;
|
|
68
|
+
}
|
|
69
|
+
/** The credential stored for a control origin, if this machine has signed in to it. */
|
|
70
|
+
export declare function readStoredCredential(serviceUrl: string, home?: string): StoredAccountCredential | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Store the credential for a control origin, replacing any previous one.
|
|
73
|
+
*
|
|
74
|
+
* REPLACES rather than accumulates, and that is not the eviction the additive-token
|
|
75
|
+
* work exists to prevent: control keeps every credential it issued (they are
|
|
76
|
+
* additive by design, `issueAccountCredential`), so a second machine signing in
|
|
77
|
+
* does not invalidate this one. What is replaced is only THIS machine's local copy
|
|
78
|
+
* for THIS origin, which is the newest one it was handed.
|
|
79
|
+
*/
|
|
80
|
+
export declare function writeStoredCredential(serviceUrl: string, entry: Omit<StoredAccountCredential, 'signedInAt'> & {
|
|
81
|
+
signedInAt?: string;
|
|
82
|
+
}, home?: string): void;
|
|
83
|
+
/**
|
|
84
|
+
* Forget the credential for one origin. Returns true iff there was one.
|
|
85
|
+
*
|
|
86
|
+
* The one caller is the refusal path: a stored credential control answers 401 to is
|
|
87
|
+
* dead beyond recovery — there is no grace window on this credential class and
|
|
88
|
+
* nothing rotates it — so keeping it would mean every later run presenting a value
|
|
89
|
+
* that can only ever fail. Forgetting it is what makes the next run's browser
|
|
90
|
+
* handoff the automatic recovery rather than something the developer has to be told
|
|
91
|
+
* to trigger by deleting a file.
|
|
92
|
+
*/
|
|
93
|
+
export declare function forgetStoredCredential(serviceUrl: string, home?: string): boolean;
|
|
94
|
+
//# sourceMappingURL=account-credential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-credential.d.ts","sourceRoot":"","sources":["../src/account-credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAMH,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAC;CACpB;AAsED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,uBAAuB,GAAG,SAAS,CAMrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,YAAY,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5E,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CASN;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAOjF"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `halfcycle` CLI entry point (published bin name; formerly `halfcycle-bundle`).
|
|
4
|
+
*
|
|
5
|
+
* The bare form installs into the CURRENT directory — `npx halfcycle` in a
|
|
6
|
+
* project folder is the primary distribution path (operator decision (an)).
|
|
7
|
+
*
|
|
8
|
+
* Subcommands:
|
|
9
|
+
* halfcycle [install] [target-repo] — install into target (default: cwd)
|
|
10
|
+
* halfcycle check-drift <target> — report bundle drift for the re-sync gate
|
|
11
|
+
* halfcycle build-record <phase> — assemble the phase Build Record (D1)
|
|
12
|
+
* halfcycle open-phase <phase> — open a phase, with its entry decision
|
|
13
|
+
* halfcycle close-phase <phase> — record a phase's acceptance and close it
|
|
14
|
+
*
|
|
15
|
+
* EVERY NON-INSTALL SUBCOMMAND MUST BE NAMED IN `bareTarget` BELOW. The bare form
|
|
16
|
+
* (`npx halfcycle` / `npx halfcycle ./repo`) treats the first positional as an
|
|
17
|
+
* install target, so a subcommand missing from that list is not "unknown command" —
|
|
18
|
+
* it is silently an install into a directory named after the verb.
|
|
19
|
+
*
|
|
20
|
+
* TWO GUARDS ON THAT SHAPE (W3-F-4, walk 4). The bare-form-installs behaviour is
|
|
21
|
+
* deliberate and stays — it is the primary distribution path — but walk 4 ran the
|
|
22
|
+
* bare form intending to print the verb list and installed into the Halfcycle
|
|
23
|
+
* monorepo, mutating tracked files. The person who does that is trying to DISCOVER
|
|
24
|
+
* the CLI, so:
|
|
25
|
+
* - `--help` / `-h` / `help` prints the verbs to stdout and exits 0. Before this
|
|
26
|
+
* there was no non-mutating way to ask: `--help` fell through to the
|
|
27
|
+
* unknown-command path (which does print the usage and exit 1, so discovery was
|
|
28
|
+
* possible — but it framed a reasonable question as an error), and the other
|
|
29
|
+
* thing a person tries is the bare form, which WRITES.
|
|
30
|
+
* - an install whose target is the Halfcycle monorepo is REFUSED before any write.
|
|
31
|
+
* Not a general install gate — the one target that is never legitimate.
|
|
32
|
+
*/
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=bin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG"}
|