@profile-as-code/cli 0.2.0 → 0.3.5

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
@@ -1,6 +1,6 @@
1
1
  # `@profile-as-code/cli` — `pasco`
2
2
 
3
- The `pasco` CLI — `@profile-as-code/cli` **0.2.0**. Consumes `@profile-as-code/core`
3
+ The `pasco` CLI — `@profile-as-code/cli`. Consumes `@profile-as-code/core`
4
4
  (`load`/`driftCheck`/`geoCheck`/`compile`) — it never re-implements them. The
5
5
  contract source is `schema/profile.schema.json` (D3); Zod is generated in core.
6
6
 
@@ -8,18 +8,50 @@ contract source is `schema/profile.schema.json` (D3); Zod is generated in core.
8
8
 
9
9
  ```sh
10
10
  npm i -g @profile-as-code/cli # the package
11
- pasco --version # the bin — expect 0.2.0
11
+ pasco --version # the bin — prints the installed version
12
12
  ```
13
13
 
14
14
  `@profile-as-code/cli` is the **package**; `pasco` is the **bin** it installs.
15
15
  The install adds one global bin and nothing else: no post-install script, no
16
16
  server, no account.
17
17
 
18
- > **Not published yet** [WEB: npm registry, checked 2026-09-30]:
19
- > `npm view @profile-as-code/cli` → `404`. The package is version-ready but the
20
- > first publish is an operator action
21
- > ([#113](https://github.com/ChristianLuciani/profile-as-code/issues/113)).
22
- > Until it lands, install from source — [User Guide §2](../../docs/USER-GUIDE.md#2-install-the-pasco-cli).
18
+ > **Published** [OFICIAL] [WEB: registry.npmjs.org, checked 2026-10-12]:
19
+ > `@profile-as-code/cli` is public on npm — the registry is the source of truth
20
+ > (`npm view @profile-as-code/cli version`). The current release is `0.3.0`
21
+ > (published 2026-10-11T03:43:27Z, dist-tag `latest`; tag `v0.3.0` → `21e4cde`)
22
+ > and the bin was verified running (`node packages/cli/dist/index.js --version`
23
+ > → `pasco 0.3.0` on `main`, 2026-10-12) — a **local-build** check, not a run of the
24
+ > published tarball. No published version carries a
25
+ > provenance attestation while the source repo is private — documented, not pending.
26
+ > Source install: [User Guide §2](../../docs/USER-GUIDE.md#2-install-the-pasco-cli).
27
+
28
+ ## Get a workspace
29
+
30
+ `pasco` reads a **workspace folder** (`content/*.yaml` + `.pascorc`) by configured
31
+ path. That folder does not have to be a git repository, and it does not have to live
32
+ on GitHub — a repo is the **recommended** place to keep it, not a requirement
33
+ ([SPEC §9](../../docs/SPEC.md)). Three on-ramps, each with its capability difference
34
+ stated up front:
35
+
36
+ | On-ramp | What you get | Automation + history | Account + repo |
37
+ |---|---|---|---|
38
+ | **Template repo** *(recommended)* | the complete example workspace, operational docs, licence, repo automation | yes | **required** |
39
+ | **`pasco init`** (this package) | a minimal validating folder in seconds | **no** — nothing runs on a change and nothing versions it | **none** |
40
+ | **Bring your own storage** | the same `pasco init` scaffold, written at a path you choose (local disk, a synced folder, another git host) | same as `pasco init` | **none** |
41
+
42
+ ```sh
43
+ pasco init ~/profile-data-me # person flavor (default); brand: --flavor brand
44
+ pasco validate # run from the workspace root
45
+ ```
46
+
47
+ The two no-account on-ramps keep the whole engine command set except `pasco diff`
48
+ (which needs a git history). What they lose is the template's automation and
49
+ history — `pasco init` is minimal on purpose, and the complete package lives in
50
+ the template. **Where each on-ramp is discovered:** the template repo's own README,
51
+ this package page, and — in the repository — the
52
+ [User Guide §3](../../docs/USER-GUIDE.md#3-create-your-workspace-profile-data-username)
53
+ (EN). Links into `docs/` resolve in the repository, not on this npm page: the two
54
+ commands above are the standalone path.
23
55
 
24
56
  ## Commands
25
57
 
@@ -27,27 +59,64 @@ server, no account.
27
59
  |---|---|---|
28
60
  | `pasco init [dir]` | Scaffold a profile-data workspace (`content/identity.yaml`, `README.md`, `.pascorc`) — `pasco validate`-clean | ✅ |
29
61
  | `pasco validate [--json]` | Schema **fail** (exit 1) + drift/geo **warn** (exit 0) — D12 | ✅ |
30
- | `pasco build [platform] [--lang]` | Deterministic base texts per platform+lang; platforms with a renderer (github-readme, github-org, kofi) also write `profiles/<platform>/README.md` + bundled media in `profiles/<platform>/assets/` with `assets/manifest.json` (M8/§18.6 — public path-locator artifacts, sha256 at compile; see `docs/media-pipeline.md`). Empty render = no-trace unbuild of that platform's output (pure profiles/, §15.1 — v1.7) | ✅ |
62
+ | `pasco build [platform] [--lang]` | Deterministic base texts per platform+lang; platforms with a renderer (the eight registered in the generated renderer map) write `profiles/<platform>/README.md` + bundled media; renderer-less manual surfaces with a bio row write `profiles/<platform>.md` (#239). Empty render = no-trace unbuild of the generated output, preserving `profiles/<platform>/variants/` (chosen-variant input, #238; pure profiles/, §15.1 — v1.7). Media in `profiles/<platform>/assets/` + `assets/manifest.json` (M8/§18.6 — see `docs/media-pipeline.md`) | ✅ |
31
63
  | `pasco diff [--json]` | Changes since the last `release-*` tag (git-based → CHANGELOG hint) | ✅ |
32
- | `pasco status [platform] [--mark <ledgerKey> <surface>] [--write-checklist]` | Per-entry deploy report — origin · surfaces · in-sync/stale/never + ledger write path (D18, §19) | ✅ |
33
- | `pasco refine <platform> [--lang] [--variants N] [--choose <id>]` | Agent-driven variant flow (D10/D11/D13) | 🚧 template + `--choose` (full flow M3) |
34
- | `pasco check [platform]` | User checks from `content/checks.yaml` (schema-validated catalog) + registry rules (M7/§18.8) + media-transport rules (M8/§18.6) | 🚧 offline rules today (catalog M3/M4) |
35
- | `pasco skills:install <agent>` | Skills-studio projection command (AGOS) | 🚧 prints the projection command |
64
+ | `pasco status [platform] [--mark <ledgerKey> <surface>] [--verify] [--write-checklist] [--completeness]` | Per-entry deploy report — origin · surfaces · in-sync/stale/never · **certification** (verified/attested/unverifiable/out-of-band-drift, §19.5) + the derived **publication truth** per surface (§20.1, #242) + ledger write paths (D18, §19) | ✅ |
65
+ | `pasco refine <platform> [--lang] [--variants N] [--choose <id>]` | Agent-driven variant flow (D10/D11/D13); the chosen body is `profiles/<platform>/variants/<id>.md` (a complete platform artifact), rendered by `pasco build` (#238) | 🚧 template + `--choose` (full flow M3) |
66
+ | `pasco check [platform]` | User checks from `content/checks.yaml` (schema-validated catalog) + registry rules (M7/§18.8) + media-transport rules (M8/§18.6) + offline `max-chars`/`min-chars` over headlines/bios (#240) | 🚧 offline rules today (limits + registry + media; remaining catalog M3/M4) |
67
+ | `pasco post <seed\|task\|choose\|check\|export\|import\|list>` | Week-1 post MVP (#264): a seed at `posts/<seed>/seed.md` → task bundle → chosen variant → check → optional Postiz draft payload; the CLI never calls an LLM | 🚧 experiment (not in the v1 contract; `docs/post-mvp.md`) |
68
+ | `pasco skills:export <dir> [--force] [--list]` | Copy the platform skills this package ships into a directory you name (`--list` shows them; no per-agent paths are invented — #254) | ✅ |
36
69
 
37
70
  The partial commands are explicit, and each one says what still owns the rest:
38
71
 
39
72
  - **`refine`** — without `--choose` it emits the **agent task template** the
40
73
  executing agent works from (the CLI never calls an LLM and never wires the hub);
41
- `--choose` records the pick in `content/active.yaml`. The full variant flow is
42
- M3 (`src/commands/refine.ts`).
74
+ `--choose` records the pick in `content/active.yaml`. The platform skill ships
75
+ **inside this package**, so the template prints its real path on an npm install
76
+ (and says `no skill for <platform>` vs `skills not shipped` distinctly —
77
+ #253). The full variant flow is M3 (`src/commands/refine.ts`).
43
78
  - **`check`** — executes the offline rules that exist today: the brand handle
44
- matrix (brand flavor only, D15/§17), the evidence-registry checks (M7/§18.8)
45
- and the media-transport rules (M8/§18.6). The per-platform rows declared in
46
- `content/checks.yaml` are listed and reported as *not executed* — rule
47
- execution for those ships with the skills `checks.yaml` union (M3) and the full
48
- `pasco check` (M4). It prints its `owner` line (`src/commands/check.ts`).
49
- - **`skills:install`** — prints the skills-studio projection command; projecting
50
- is the studio's job (AGOS), not the CLI's (`src/commands/skills-install.ts`).
79
+ matrix (brand flavor only, D15/§17), the evidence-registry checks (M7/§18.8),
80
+ the media-transport rules (M8/§18.6), and the `max-chars` / `min-chars` rows
81
+ declared in `content/checks.yaml` over the headline/bio rows that exist
82
+ (offline, warn-class, #240). The remaining per-platform rules in the catalog
83
+ ship with the skills `checks.yaml` union (M3) and the full `pasco check` (M4).
84
+ It prints its `owner` line (`src/commands/check.ts`).
85
+ - **`skills:export`** — copies the platform skills this package ships into the
86
+ directory the user names (`--list` first; an existing non-empty directory needs
87
+ `--force`). It replaces the earlier projection stub: the CLI never invents a
88
+ per-agent destination and never points at tooling the reader cannot open
89
+ (`src/commands/skills-export.ts`, #254).
90
+ - **`post`** — the week-1 experiment (#264/#265): a CLI subcommand family over
91
+ the `posts/` store; it never calls an LLM, emits the agent task, records the
92
+ choice, checks limits/URLs/refs and exports a Postiz draft. It reads the
93
+ `skills/` bundled with the package (set `PASCO_SKILLS_DIR` only to point at a
94
+ custom tree), and it is **not part of the v1 contract yet** (`docs/post-mvp.md`).
95
+
96
+ ### Publication truth (derived — SPEC §20.1, #242)
97
+
98
+ The `status` report ends with one line per surface that has a ledger record or an
99
+ artifact on disk (`--completeness` prints the coverage phrase only; `--selection`
100
+ is a different view, and `--mark`/`--verify` are the write paths):
101
+
102
+ ```
103
+ github-readme: in-sync · artifact: matches-SSOT · limits: ok
104
+ ```
105
+
106
+ - `sync` — the §19 ledger (`in-sync` / `stale` / `never`), unchanged.
107
+ - `artifact` — the artifact on disk vs what the SSOT renders **today**
108
+ (`matches-SSOT` / `diverges` / `absent`). Offline: no fetch. `pasco build`
109
+ repairs a divergence; §19.5's `out-of-band-drift` (a live page that no longer
110
+ matches) forces `diverges` and is found by the opt-in `--verify`.
111
+ - `limits` — the offline `max-chars` catalog (§18.8/#240); the finding is printed
112
+ under the line with its cited source.
113
+
114
+ It is **derived and never stored**: `--json` carries it as the additive
115
+ `publication` array, `--completeness` folds it in as *coverage of publication*
116
+ (the weighted percentage never moves because a surface drifted), and
117
+ `--write-checklist` writes the coverage phrase into the generated `CHECKLIST.md`.
118
+ The path is `src/publication.ts` (one home for artifact resolution and the three
119
+ axes) and `src/limits.ts` (the cap executor `check` and `status` share).
51
120
 
52
121
  ## Usage
53
122
 
@@ -59,12 +128,23 @@ pasco build github-readme --lang en
59
128
  pasco diff
60
129
  pasco status # what's published where — per entry
61
130
  pasco status linkedin # filter one surface
62
- pasco status --mark identity linkedin # confirm a paste (records the current contentHash)
131
+ pasco status --mark identity linkedin # confirm a paste (records the current contentHash + attested)
132
+ pasco status --verify # §19.5 C1: does the live page still match? (the only network path)
133
+ # a surface with no extractor reports unverifiable: no-extractor
134
+ # (a DECLARED reason is stated, never written: only an attempt is recorded)
63
135
  pasco status --write-checklist # regenerate CHECKLIST.md from the ledger
136
+ pasco status # …also prints the derived publication-truth line:
137
+ # github-readme: in-sync · artifact: matches-SSOT · limits: ok
64
138
  pasco refine linkedin --variants 3 # emits the agent task template (full flow M3)
65
139
  pasco refine linkedin --choose li-en-2 # records the chosen variant in content/active.yaml
66
140
  pasco check github-readme
67
- pasco skills:install pi
141
+ pasco post seed demo --text seed.md # week-1 experiment: posts/<seed>/seed.md
142
+ pasco post task demo --channel linkedin,x # task bundles (no LLM call)
143
+ pasco post choose demo --channel linkedin --variant linkedin-1
144
+ pasco post check demo # limits + URLs + {{fact:...}} refs
145
+ pasco post export demo --target postiz # POST /posts draft payload
146
+ pasco skills:export --list # skill channels shipped with this package
147
+ pasco skills:export ./pasco-skills # copy them to a directory you choose
68
148
  ```
69
149
 
70
150
  ## Workspace resolution (D14)
@@ -78,10 +158,25 @@ file) > current directory.
78
158
  {
79
159
  "workspace": ".",
80
160
  "defaults": { "lang": "en", "variants": 3 },
81
- "diff": { "tagPattern": "release-*" }
161
+ "diff": { "tagPattern": "release-*" },
162
+ "completeness": {
163
+ "target": "github-milestone",
164
+ "langs": ["en", "es"],
165
+ "items": [
166
+ { "id": "deployment", "weight": 0 },
167
+ { "id": "geoAnchors", "weight": 0.4 }
168
+ ]
169
+ }
82
170
  }
83
171
  ```
84
172
 
173
+ The `completeness` block is the policy for `pasco status --completeness` (issue
174
+ #102): `target` names the milestone; `langs` sets which languages text coverage is
175
+ measured in; `items` overrides the shipped weights per catalog id (a weight of `0`
176
+ drops the item from the percentage). Every field is optional — omitted fields use
177
+ `DEFAULT_COMPLETENESS_POLICY`. The percentage itself is **derived** and never
178
+ written to the workspace; only this policy is stored.
179
+
85
180
  ## Exit codes
86
181
 
87
182
  | Code | Meaning |