@codyswann/lisa 3.40.5 → 3.41.1
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/all/copy-overwrite/scripts/lisa-gates.mjs +234 -1
- package/dist/cli/doctor-skip-jobs-migration.d.ts +48 -0
- package/dist/cli/doctor-skip-jobs-migration.d.ts.map +1 -0
- package/dist/cli/doctor-skip-jobs-migration.js +271 -0
- package/dist/cli/doctor-skip-jobs-migration.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +7 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +1 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +7 -0
- package/dist/core/lisa.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +12 -4
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/core/workflow-reference-guard.d.ts +17 -0
- package/dist/core/workflow-reference-guard.d.ts.map +1 -0
- package/dist/core/workflow-reference-guard.js +145 -0
- package/dist/core/workflow-reference-guard.js.map +1 -0
- package/dist/strategies/package-lisa.d.ts +2 -1
- package/dist/strategies/package-lisa.d.ts.map +1 -1
- package/dist/strategies/package-lisa.js +168 -42
- package/dist/strategies/package-lisa.js.map +1 -1
- package/expo/package-lisa/package.lisa.json +3 -3
- package/package.json +3 -3
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/skills/lisa-doctor/SKILL.md +20 -0
- package/typescript/package-lisa/package.lisa.json +2 -2
package/package.json
CHANGED
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
"multer": ">=2.2.0",
|
|
109
109
|
"nanoid": "^3.3.18",
|
|
110
110
|
"postcss": ">=8.5.18",
|
|
111
|
-
"undici": "^6.
|
|
111
|
+
"undici": "^6.28.0",
|
|
112
112
|
"vite": "$vite",
|
|
113
113
|
"ws": ">=8.21.0"
|
|
114
114
|
},
|
|
@@ -127,12 +127,12 @@
|
|
|
127
127
|
"multer": ">=2.2.0",
|
|
128
128
|
"nanoid": "^3.3.18",
|
|
129
129
|
"postcss": ">=8.5.18",
|
|
130
|
-
"undici": "^6.
|
|
130
|
+
"undici": "^6.28.0",
|
|
131
131
|
"vite": "$vite",
|
|
132
132
|
"ws": ">=8.21.0"
|
|
133
133
|
},
|
|
134
134
|
"name": "@codyswann/lisa",
|
|
135
|
-
"version": "3.
|
|
135
|
+
"version": "3.41.1",
|
|
136
136
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
137
137
|
"main": "dist/index.js",
|
|
138
138
|
"exports": {
|
|
@@ -426,6 +426,7 @@ The verdict ladder is:
|
|
|
426
426
|
node scripts/lisa-gates.mjs validate # shape + unknown gate ids
|
|
427
427
|
node scripts/lisa-gates.mjs list --moment=pull-request
|
|
428
428
|
node scripts/lisa-gates.mjs contexts # branch-protection contexts
|
|
429
|
+
node scripts/lisa-gates.mjs skip-jobs # what replaces each skip_jobs token
|
|
429
430
|
```
|
|
430
431
|
|
|
431
432
|
A gate is a **property** — *credential leakage* — not a tool. `gitleaks` is one way to prove
|
|
@@ -437,6 +438,25 @@ would otherwise read as an enabled guarantee and run nothing at all — the same
|
|
|
437
438
|
as a skipped required check. Gates a project invents carry an `x-` prefix, which Lisa runs without
|
|
438
439
|
pretending to understand.
|
|
439
440
|
|
|
441
|
+
`skip-jobs` answers the migration off the `skip_jobs` workflow input. Eleven of the token → gate
|
|
442
|
+
pairs cannot be recovered by transforming the name — `lint` is `code-style`, `sg_scan` is
|
|
443
|
+
`structural-rules`, `work_item_traceability` is `traceability` — and being wrong does not break a
|
|
444
|
+
build: it declares the WRONG gate `off`, so a check silently stops running while the configuration
|
|
445
|
+
reads deliberate. Pass `--moment=` to match the moment the caller passes to `quality.yml`, because a
|
|
446
|
+
gate's legal moments are a closed set and a declaration outside it is refused by `validate` — after
|
|
447
|
+
the token has already been deleted.
|
|
448
|
+
|
|
449
|
+
Four of its six answers are refusals, and they are the point. `unmappable` means the job was never
|
|
450
|
+
converted to a gate façade, so keep the token. `partial` means one job behind the token has a gate
|
|
451
|
+
and the others do not, so the declaration alone would leave work running. `inert` means no job
|
|
452
|
+
honours that token at all. `unknown` means nothing matches it — usually a space after a comma, which
|
|
453
|
+
GitHub matches against nothing, so that job has been RUNNING all along. None of them produce a gate
|
|
454
|
+
id, because a confident wrong answer here is worse than no answer.
|
|
455
|
+
|
|
456
|
+
`lisa doctor` reports the same thing per caller workflow and does NOT edit the workflow. `lisa apply`
|
|
457
|
+
runs on postinstall, and an automated rewrite of a caller that gets it wrong is silent; an agent
|
|
458
|
+
performing the edit can read the surrounding code and confirm afterwards that the same checks ran.
|
|
459
|
+
|
|
440
460
|
`contexts` is the value that replaces a hand-transcribed branch-protection list. It is scoped to
|
|
441
461
|
one environment: a gate required before a production deploy is **not** thereby a merge blocker on a
|
|
442
462
|
pull request, and collapsing the two would promote every deploy-time gate into branch protection.
|
|
@@ -426,6 +426,7 @@ The verdict ladder is:
|
|
|
426
426
|
node scripts/lisa-gates.mjs validate # shape + unknown gate ids
|
|
427
427
|
node scripts/lisa-gates.mjs list --moment=pull-request
|
|
428
428
|
node scripts/lisa-gates.mjs contexts # branch-protection contexts
|
|
429
|
+
node scripts/lisa-gates.mjs skip-jobs # what replaces each skip_jobs token
|
|
429
430
|
```
|
|
430
431
|
|
|
431
432
|
A gate is a **property** — *credential leakage* — not a tool. `gitleaks` is one way to prove
|
|
@@ -437,6 +438,25 @@ would otherwise read as an enabled guarantee and run nothing at all — the same
|
|
|
437
438
|
as a skipped required check. Gates a project invents carry an `x-` prefix, which Lisa runs without
|
|
438
439
|
pretending to understand.
|
|
439
440
|
|
|
441
|
+
`skip-jobs` answers the migration off the `skip_jobs` workflow input. Eleven of the token → gate
|
|
442
|
+
pairs cannot be recovered by transforming the name — `lint` is `code-style`, `sg_scan` is
|
|
443
|
+
`structural-rules`, `work_item_traceability` is `traceability` — and being wrong does not break a
|
|
444
|
+
build: it declares the WRONG gate `off`, so a check silently stops running while the configuration
|
|
445
|
+
reads deliberate. Pass `--moment=` to match the moment the caller passes to `quality.yml`, because a
|
|
446
|
+
gate's legal moments are a closed set and a declaration outside it is refused by `validate` — after
|
|
447
|
+
the token has already been deleted.
|
|
448
|
+
|
|
449
|
+
Four of its six answers are refusals, and they are the point. `unmappable` means the job was never
|
|
450
|
+
converted to a gate façade, so keep the token. `partial` means one job behind the token has a gate
|
|
451
|
+
and the others do not, so the declaration alone would leave work running. `inert` means no job
|
|
452
|
+
honours that token at all. `unknown` means nothing matches it — usually a space after a comma, which
|
|
453
|
+
GitHub matches against nothing, so that job has been RUNNING all along. None of them produce a gate
|
|
454
|
+
id, because a confident wrong answer here is worse than no answer.
|
|
455
|
+
|
|
456
|
+
`lisa doctor` reports the same thing per caller workflow and does NOT edit the workflow. `lisa apply`
|
|
457
|
+
runs on postinstall, and an automated rewrite of a caller that gets it wrong is silent; an agent
|
|
458
|
+
performing the edit can read the surrounding code and confirm afterwards that the same checks ran.
|
|
459
|
+
|
|
440
460
|
`contexts` is the value that replaces a hand-transcribed branch-protection list. It is scoped to
|
|
441
461
|
one environment: a gate required before a production deploy is **not** thereby a merge blocker on a
|
|
442
462
|
pull request, and collapsing the two would promote every deploy-time gate into branch protection.
|
|
@@ -426,6 +426,7 @@ The verdict ladder is:
|
|
|
426
426
|
node scripts/lisa-gates.mjs validate # shape + unknown gate ids
|
|
427
427
|
node scripts/lisa-gates.mjs list --moment=pull-request
|
|
428
428
|
node scripts/lisa-gates.mjs contexts # branch-protection contexts
|
|
429
|
+
node scripts/lisa-gates.mjs skip-jobs # what replaces each skip_jobs token
|
|
429
430
|
```
|
|
430
431
|
|
|
431
432
|
A gate is a **property** — *credential leakage* — not a tool. `gitleaks` is one way to prove
|
|
@@ -437,6 +438,25 @@ would otherwise read as an enabled guarantee and run nothing at all — the same
|
|
|
437
438
|
as a skipped required check. Gates a project invents carry an `x-` prefix, which Lisa runs without
|
|
438
439
|
pretending to understand.
|
|
439
440
|
|
|
441
|
+
`skip-jobs` answers the migration off the `skip_jobs` workflow input. Eleven of the token → gate
|
|
442
|
+
pairs cannot be recovered by transforming the name — `lint` is `code-style`, `sg_scan` is
|
|
443
|
+
`structural-rules`, `work_item_traceability` is `traceability` — and being wrong does not break a
|
|
444
|
+
build: it declares the WRONG gate `off`, so a check silently stops running while the configuration
|
|
445
|
+
reads deliberate. Pass `--moment=` to match the moment the caller passes to `quality.yml`, because a
|
|
446
|
+
gate's legal moments are a closed set and a declaration outside it is refused by `validate` — after
|
|
447
|
+
the token has already been deleted.
|
|
448
|
+
|
|
449
|
+
Four of its six answers are refusals, and they are the point. `unmappable` means the job was never
|
|
450
|
+
converted to a gate façade, so keep the token. `partial` means one job behind the token has a gate
|
|
451
|
+
and the others do not, so the declaration alone would leave work running. `inert` means no job
|
|
452
|
+
honours that token at all. `unknown` means nothing matches it — usually a space after a comma, which
|
|
453
|
+
GitHub matches against nothing, so that job has been RUNNING all along. None of them produce a gate
|
|
454
|
+
id, because a confident wrong answer here is worse than no answer.
|
|
455
|
+
|
|
456
|
+
`lisa doctor` reports the same thing per caller workflow and does NOT edit the workflow. `lisa apply`
|
|
457
|
+
runs on postinstall, and an automated rewrite of a caller that gets it wrong is silent; an agent
|
|
458
|
+
performing the edit can read the surrounding code and confirm afterwards that the same checks ran.
|
|
459
|
+
|
|
440
460
|
`contexts` is the value that replaces a hand-transcribed branch-protection list. It is scoped to
|
|
441
461
|
one environment: a gate required before a production deploy is **not** thereby a merge blocker on a
|
|
442
462
|
pull request, and collapsing the two would promote every deploy-time gate into branch protection.
|
|
@@ -426,6 +426,7 @@ The verdict ladder is:
|
|
|
426
426
|
node scripts/lisa-gates.mjs validate # shape + unknown gate ids
|
|
427
427
|
node scripts/lisa-gates.mjs list --moment=pull-request
|
|
428
428
|
node scripts/lisa-gates.mjs contexts # branch-protection contexts
|
|
429
|
+
node scripts/lisa-gates.mjs skip-jobs # what replaces each skip_jobs token
|
|
429
430
|
```
|
|
430
431
|
|
|
431
432
|
A gate is a **property** — *credential leakage* — not a tool. `gitleaks` is one way to prove
|
|
@@ -437,6 +438,25 @@ would otherwise read as an enabled guarantee and run nothing at all — the same
|
|
|
437
438
|
as a skipped required check. Gates a project invents carry an `x-` prefix, which Lisa runs without
|
|
438
439
|
pretending to understand.
|
|
439
440
|
|
|
441
|
+
`skip-jobs` answers the migration off the `skip_jobs` workflow input. Eleven of the token → gate
|
|
442
|
+
pairs cannot be recovered by transforming the name — `lint` is `code-style`, `sg_scan` is
|
|
443
|
+
`structural-rules`, `work_item_traceability` is `traceability` — and being wrong does not break a
|
|
444
|
+
build: it declares the WRONG gate `off`, so a check silently stops running while the configuration
|
|
445
|
+
reads deliberate. Pass `--moment=` to match the moment the caller passes to `quality.yml`, because a
|
|
446
|
+
gate's legal moments are a closed set and a declaration outside it is refused by `validate` — after
|
|
447
|
+
the token has already been deleted.
|
|
448
|
+
|
|
449
|
+
Four of its six answers are refusals, and they are the point. `unmappable` means the job was never
|
|
450
|
+
converted to a gate façade, so keep the token. `partial` means one job behind the token has a gate
|
|
451
|
+
and the others do not, so the declaration alone would leave work running. `inert` means no job
|
|
452
|
+
honours that token at all. `unknown` means nothing matches it — usually a space after a comma, which
|
|
453
|
+
GitHub matches against nothing, so that job has been RUNNING all along. None of them produce a gate
|
|
454
|
+
id, because a confident wrong answer here is worse than no answer.
|
|
455
|
+
|
|
456
|
+
`lisa doctor` reports the same thing per caller workflow and does NOT edit the workflow. `lisa apply`
|
|
457
|
+
runs on postinstall, and an automated rewrite of a caller that gets it wrong is silent; an agent
|
|
458
|
+
performing the edit can read the surrounding code and confirm afterwards that the same checks ran.
|
|
459
|
+
|
|
440
460
|
`contexts` is the value that replaces a hand-transcribed branch-protection list. It is scoped to
|
|
441
461
|
one environment: a gate required before a production deploy is **not** thereby a merge blocker on a
|
|
442
462
|
pull request, and collapsing the two would promote every deploy-time gate into branch protection.
|
|
@@ -426,6 +426,7 @@ The verdict ladder is:
|
|
|
426
426
|
node scripts/lisa-gates.mjs validate # shape + unknown gate ids
|
|
427
427
|
node scripts/lisa-gates.mjs list --moment=pull-request
|
|
428
428
|
node scripts/lisa-gates.mjs contexts # branch-protection contexts
|
|
429
|
+
node scripts/lisa-gates.mjs skip-jobs # what replaces each skip_jobs token
|
|
429
430
|
```
|
|
430
431
|
|
|
431
432
|
A gate is a **property** — *credential leakage* — not a tool. `gitleaks` is one way to prove
|
|
@@ -437,6 +438,25 @@ would otherwise read as an enabled guarantee and run nothing at all — the same
|
|
|
437
438
|
as a skipped required check. Gates a project invents carry an `x-` prefix, which Lisa runs without
|
|
438
439
|
pretending to understand.
|
|
439
440
|
|
|
441
|
+
`skip-jobs` answers the migration off the `skip_jobs` workflow input. Eleven of the token → gate
|
|
442
|
+
pairs cannot be recovered by transforming the name — `lint` is `code-style`, `sg_scan` is
|
|
443
|
+
`structural-rules`, `work_item_traceability` is `traceability` — and being wrong does not break a
|
|
444
|
+
build: it declares the WRONG gate `off`, so a check silently stops running while the configuration
|
|
445
|
+
reads deliberate. Pass `--moment=` to match the moment the caller passes to `quality.yml`, because a
|
|
446
|
+
gate's legal moments are a closed set and a declaration outside it is refused by `validate` — after
|
|
447
|
+
the token has already been deleted.
|
|
448
|
+
|
|
449
|
+
Four of its six answers are refusals, and they are the point. `unmappable` means the job was never
|
|
450
|
+
converted to a gate façade, so keep the token. `partial` means one job behind the token has a gate
|
|
451
|
+
and the others do not, so the declaration alone would leave work running. `inert` means no job
|
|
452
|
+
honours that token at all. `unknown` means nothing matches it — usually a space after a comma, which
|
|
453
|
+
GitHub matches against nothing, so that job has been RUNNING all along. None of them produce a gate
|
|
454
|
+
id, because a confident wrong answer here is worse than no answer.
|
|
455
|
+
|
|
456
|
+
`lisa doctor` reports the same thing per caller workflow and does NOT edit the workflow. `lisa apply`
|
|
457
|
+
runs on postinstall, and an automated rewrite of a caller that gets it wrong is silent; an agent
|
|
458
|
+
performing the edit can read the surrounding code and confirm afterwards that the same checks ran.
|
|
459
|
+
|
|
440
460
|
`contexts` is the value that replaces a hand-transcribed branch-protection list. It is scoped to
|
|
441
461
|
one environment: a gate required before a production deploy is **not** thereby a merge blocker on a
|
|
442
462
|
pull request, and collapsing the two would promote every deploy-time gate into branch protection.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.41.1",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.41.1",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.41.1",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.41.1",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.41.1",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|